2022-08-20 17:49:33 +08:00
|
|
|
|
#!/usr/bin/env php
|
|
|
|
|
|
<?php
|
|
|
|
|
|
/** For Swoole coroutine tests */
|
|
|
|
|
|
|
|
|
|
|
|
// 如果改成 true,则会在终端显示所有炸毛框架的 Log
|
|
|
|
|
|
const ZM_TEST_LOG_DEBUG = false;
|
|
|
|
|
|
|
|
|
|
|
|
use OneBot\Driver\Event\Process\WorkerStartEvent;
|
|
|
|
|
|
use PHPUnit\TextUI\Command;
|
2022-08-22 20:54:14 +08:00
|
|
|
|
use Swoole\Atomic;
|
2022-08-28 13:03:58 +08:00
|
|
|
|
use Tests\ZMResultPrinter;
|
2022-08-20 17:49:33 +08:00
|
|
|
|
use ZM\Command\Server\ServerStartCommand;
|
2022-08-22 20:54:14 +08:00
|
|
|
|
use ZM\Event\EventProvider;
|
2022-08-20 17:49:33 +08:00
|
|
|
|
use ZM\Framework;
|
|
|
|
|
|
use ZM\Logger\ConsoleLogger;
|
2022-08-22 20:54:14 +08:00
|
|
|
|
use ZM\Store\MockAtomic;
|
2022-08-20 17:49:33 +08:00
|
|
|
|
|
2022-08-22 20:54:14 +08:00
|
|
|
|
// 引入自动加载
|
2022-12-27 15:39:36 +08:00
|
|
|
|
require $_composer_autoload_path ?? dirname(__DIR__) . '/vendor/autoload.php';
|
2022-08-20 17:49:33 +08:00
|
|
|
|
|
2022-08-22 20:54:14 +08:00
|
|
|
|
// 声明一个全局的原子计数,用于保存整个进程的退出状态码
|
2022-08-20 17:49:33 +08:00
|
|
|
|
global $_swoole_atomic;
|
2022-08-22 20:54:14 +08:00
|
|
|
|
// Windows 没有 Swoole,所以就使用了一个假的原子计数器,反正 Windows 只有单进程
|
|
|
|
|
|
$_swoole_atomic = class_exists('\\Swoole\\Atomic') ? new Atomic() : new MockAtomic();
|
|
|
|
|
|
|
|
|
|
|
|
// 注册 Logger 等级
|
|
|
|
|
|
ob_logger_register(new ConsoleLogger(ZM_TEST_LOG_DEBUG ? 'debug' : 'error'));
|
2022-08-20 17:49:33 +08:00
|
|
|
|
|
2022-08-22 20:54:14 +08:00
|
|
|
|
// 使用框架自身的 EventProvider
|
2022-08-20 17:49:33 +08:00
|
|
|
|
global $ob_event_provider;
|
2022-08-22 20:54:14 +08:00
|
|
|
|
$ob_event_provider = new EventProvider();
|
2022-08-20 17:49:33 +08:00
|
|
|
|
|
2022-08-22 20:54:14 +08:00
|
|
|
|
// 注册一个最低级别的 WorkerStart 事件,用于在框架的事件初始化之后开始运行 PHPUnit
|
2022-08-20 17:49:33 +08:00
|
|
|
|
ob_event_provider()->addEventListener(WorkerStartEvent::getName(), function () {
|
2022-08-27 19:39:02 +08:00
|
|
|
|
register_shutdown_function(function () {
|
|
|
|
|
|
$error = error_get_last();
|
|
|
|
|
|
// 下面这段代码的作用就是,不是错误引发的退出时照常退出即可
|
|
|
|
|
|
if (($error['type'] ?? 0) != 0) {
|
|
|
|
|
|
logger()->emergency(zm_internal_errcode('E00027') . 'Internal fatal error: ' . $error['message'] . ' at ' . $error['file'] . "({$error['line']})");
|
|
|
|
|
|
}
|
|
|
|
|
|
Framework::getInstance()->stop();
|
|
|
|
|
|
});
|
2022-08-28 13:03:58 +08:00
|
|
|
|
$_SERVER['argv'][] = '--printer';
|
|
|
|
|
|
$_SERVER['argv'][] = ZMResultPrinter::class;
|
2022-08-20 17:49:33 +08:00
|
|
|
|
try {
|
2022-08-22 20:54:14 +08:00
|
|
|
|
// 不退出,而是返回 code
|
2022-08-20 17:49:33 +08:00
|
|
|
|
$retcode = Command::main(false);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
global $_swoole_atomic;
|
|
|
|
|
|
$_swoole_atomic->set($retcode ?? 0);
|
2022-08-22 21:32:00 +08:00
|
|
|
|
Framework::getInstance()->stop($retcode ?? 0);
|
2022-08-20 17:49:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
}, 1);
|
|
|
|
|
|
|
2023-02-18 21:04:36 +08:00
|
|
|
|
$options = ServerStartCommand::exportOptionArray();
|
|
|
|
|
|
$options['driver'] = 'workerman';
|
|
|
|
|
|
$options['worker-num'] = 1;
|
|
|
|
|
|
$options['private-mode'] = true;
|
|
|
|
|
|
|
2023-02-24 17:00:40 +08:00
|
|
|
|
$kernel = \ZM\Kernel::getInstance();
|
|
|
|
|
|
$kernel->setEnvironment('development');
|
|
|
|
|
|
$kernel->setTestMode(true);
|
|
|
|
|
|
$kernel->setConfigDir(dirname(__DIR__) . '/config');
|
|
|
|
|
|
$kernel->bootstrap();
|
2023-02-18 21:04:36 +08:00
|
|
|
|
|
2022-08-20 17:49:33 +08:00
|
|
|
|
try {
|
|
|
|
|
|
(new Framework($options))->init()->start();
|
|
|
|
|
|
exit($_swoole_atomic->get());
|
|
|
|
|
|
} catch (Throwable $e) {
|
|
|
|
|
|
echo $e->getMessage() . PHP_EOL;
|
|
|
|
|
|
exit(1);
|
|
|
|
|
|
}
|