mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-09 07:20:15 +00:00
the only use for this class is to facilitate random runtime plugin loading, and it's not complete even for that purpose. Since nothing but PM uses pocketmine/classloader anyway, it doesn't make sense to have it outside the core. As with LogPthreads, it's just adding more maintenance work.
93 lines
2.8 KiB
PHP
93 lines
2.8 KiB
PHP
<?php
|
|
|
|
/*
|
|
*
|
|
* ____ _ _ __ __ _ __ __ ____
|
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* @author PocketMine Team
|
|
* @link http://www.pocketmine.net/
|
|
*
|
|
*
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace pocketmine\scheduler;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use pmmp\thread\ThreadSafeArray;
|
|
use pocketmine\promise\PromiseResolver;
|
|
use pocketmine\snooze\SleeperHandler;
|
|
use pocketmine\thread\ThreadSafeClassLoader;
|
|
use pocketmine\utils\MainLogger;
|
|
use function define;
|
|
use function dirname;
|
|
use function microtime;
|
|
use function sys_get_temp_dir;
|
|
use function tempnam;
|
|
use function usleep;
|
|
|
|
class AsyncPoolTest extends TestCase{
|
|
|
|
/** @var AsyncPool */
|
|
private $pool;
|
|
/** @var MainLogger */
|
|
private $mainLogger;
|
|
|
|
public function setUp() : void{
|
|
@define('pocketmine\\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__, 3) . '/vendor/autoload.php');
|
|
$this->mainLogger = new MainLogger(tempnam(sys_get_temp_dir(), "pmlog"), false, "Main", new \DateTimeZone('UTC'));
|
|
$this->pool = new AsyncPool(2, 1024, new ThreadSafeClassLoader(), $this->mainLogger, new SleeperHandler());
|
|
}
|
|
|
|
public function tearDown() : void{
|
|
$this->pool->shutdown();
|
|
$this->mainLogger->shutdownLogWriterThread();
|
|
}
|
|
|
|
public function testTaskLeak() : void{
|
|
$start = microtime(true);
|
|
$this->pool->submitTask(new LeakTestAsyncTask());
|
|
while(!LeakTestAsyncTask::$destroyed && microtime(true) < $start + 30){
|
|
usleep(50 * 1000);
|
|
$this->pool->collectTasks();
|
|
}
|
|
self::assertTrue(LeakTestAsyncTask::$destroyed, "Task was not destroyed after 30 seconds");
|
|
}
|
|
|
|
public function testPublishProgressRace() : void{
|
|
$task = new PublishProgressRaceAsyncTask();
|
|
$this->pool->submitTask($task);
|
|
while($this->pool->collectTasks()){
|
|
usleep(50 * 1000);
|
|
}
|
|
self::assertTrue(PublishProgressRaceAsyncTask::$success, "Progress was not reported before task completion");
|
|
}
|
|
|
|
public function testThreadSafeSetResult() : void{
|
|
$resolver = new PromiseResolver();
|
|
$resolver->getPromise()->onCompletion(
|
|
function(ThreadSafeArray $result) : void{
|
|
self::assertCount(1, $result);
|
|
self::assertSame(["foo"], (array) $result);
|
|
},
|
|
function() : void{
|
|
self::fail("Promise failed");
|
|
}
|
|
);
|
|
$this->pool->submitTask(new ThreadSafeResultAsyncTask($resolver));
|
|
while($this->pool->collectTasks()){
|
|
usleep(50 * 1000);
|
|
}
|
|
}
|
|
}
|