1--TEST--
2swoole_http_server/task: use async io and coroutine in task process
3--SKIPIF--
4<?php require __DIR__ . '/../../include/skipif.inc'; ?>
5--FILE--
6<?php
7require __DIR__ . '/../../include/bootstrap.php';
8$randoms = [];
9for ($n = MAX_REQUESTS; $n--;) {
10    $randoms[] = get_safe_random(mt_rand(0, 65536));
11}
12$pm = new ProcessManager;
13$pm->parentFunc = function ($pid) use ($pm) {
14    go(function () use ($pm) {
15        for ($n = MAX_REQUESTS; $n--;) {
16            if (!Assert::assert(($res = httpGetBody("http://127.0.0.1:{$pm->getFreePort()}/task?n={$n}")) === 'OK')) {
17                echo "{$res}\n";
18                break;
19            }
20        }
21    });
22    Swoole\Event::wait();
23    $pm->kill();
24    echo "DONE\n";
25};
26$pm->childFunc = function () use ($pm) {
27    $server = new swoole_http_server('127.0.0.1', $pm->getFreePort(), SWOOLE_PROCESS);
28    $server->set([
29        'log_file' => '/dev/null',
30        'task_worker_num' => 1,
31        'task_enable_coroutine' => true
32    ]);
33    $server->on('workerStart', function ($serv, $wid) use ($pm) {
34        $pm->wakeup();
35    });
36    $server->on('request', function (swoole_http_request $request, swoole_http_response $response) use ($server) {
37        global $randoms;
38        $n = $request->get['n'];
39        switch ($request->server['path_info']) {
40            case '/task':
41                {
42                    list($ret_n, $ret_random) = $server->taskCo([$n], 1)[0];
43                    if ($ret_n !== $n) {
44                        $response->end("ERROR MATCH {$ret_n} with {$n}");
45                        return;
46                    } elseif ($ret_random !== $randoms[$n]) {
47                        $response->end("ERROR EQUAL {$ret_n}(" . strlen($ret_random) . ") with {$n}(" . strlen($randoms[$n]) . ")");
48                        return;
49                    }
50                    $response->end('OK');
51                    break;
52                }
53            case '/random':
54                {
55                    $response->end($randoms[$n]);
56                    break;
57                }
58        }
59    });
60    $server->on('task', function (swoole_http_server $server, swoole_server_task $task) use ($pm) {
61        $cli = new Swoole\Coroutine\Http\Client('127.0.0.1', $pm->getFreePort());
62        $cli->get("/random?n={$task->data}");
63        $task->finish([$task->data, $cli->body]);
64    });
65    $server->on('finish', function () { });
66    $server->start();
67};
68$pm->childFirst();
69$pm->run();
70?>
71--EXPECT--
72DONE
73