1--TEST--
2swoole_server/task: task [enable_coroutine]
3--SKIPIF--
4<?php require __DIR__ . '/../../include/skipif.inc'; ?>
5--FILE--
6<?php
7require __DIR__ . '/../../include/bootstrap.php';
8Swoole\Runtime::enableCoroutine();
9$pm = new SwooleTest\ProcessManager;
10
11$randoms = [];
12for ($n = MAX_REQUESTS; $n--;)
13{
14    $randoms[] = random_bytes(mt_rand(0, 65536));
15}
16
17$pm->parentFunc = function ($pid) use ($pm) {
18    for ($n = MAX_REQUESTS; $n--;) {
19        go(function () use ($pm, $n) {
20            $c = new Swoole\Coroutine\Http\Client('127.0.0.1', $pm->getFreePort());
21            $c->set(['timeout' => 5,]);
22            Assert::assert($c->get('/task?n='.$n));
23            Assert::same($c->body, "OK");
24        });
25    }
26    swoole_event_wait();
27    echo "DONE\n";
28    $pm->kill();
29};
30$pm->childFunc = function () use ($pm, $randoms) {
31    $server = new swoole_http_server('127.0.0.1', $pm->getFreePort(), SWOOLE_PROCESS);
32    $server->set([
33        'log_file' => '/dev/null',
34        'worker_num' => 1,
35        'task_worker_num' => 1,
36        'task_enable_coroutine' => true,
37    ]);
38    $server->on('workerStart', function ($serv, $wid) use ($pm) {
39        $pm->wakeup();
40    });
41    $server->on('request', function (swoole_http_request $request, swoole_http_response $response) use ($server, $randoms) {
42        $n = $request->get['n'];
43        list($ret_n, $ret_random) = $server->taskwait($n, 1);
44        if ($ret_n !== $n) {
45            $response->end("ERROR MATCH {$ret_n} with {$n}");
46            return;
47        } elseif ($ret_random !== $randoms[$n]) {
48            $response->end("ERROR EQUAL {$ret_n}(" . strlen($ret_random) . ") with {$n}(" . strlen($randoms[$n]) . ")");
49            return;
50        }
51        $response->end('OK');
52    });
53    $server->on('task', function (swoole_http_server $server, Swoole\Server\Task $task) use ($pm, $randoms) {
54        Assert::same($task->worker_id, 0);
55        Assert::assert($task->flags > 0);
56        Assert::assert($task->id >= 0);
57        $n = $task->data;
58        co::sleep(0.002);
59        $task->finish([$n, $randoms[$n]]);
60    });
61    $server->start();
62};
63$pm->childFirst();
64$pm->run();
65?>
66--EXPECT--
67DONE
68