1--TEST--
2swoole_socket_coro: complete test server&&client&&timeout(millisecond)
3--SKIPIF--
4<?php require __DIR__ . '/../include/skipif.inc'; ?>
5--FILE--
6<?php
7require __DIR__ . '/../include/bootstrap.php';
8$pm = new ProcessManager;
9$port = get_one_free_port();
10$pm->parentFunc = function ($pid) use ($pm, $port) {
11    $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0);
12    Assert::isInstanceOf($socket, Swoole\Coroutine\Socket::class);
13    Assert::same($socket->errCode, 0);
14    go(function () use ($socket, $port) {
15        Assert::assert($socket->connect('localhost', $port));
16        $i = 0.000;
17        while (true) {
18            $socket->send("hello");
19            $server_reply = $socket->recv(1024, 0.1);
20            Assert::same($server_reply, 'swoole');
21            co::sleep($i += .001); // after 10 times we sleep 0.01s to trigger server timeout
22            if ($i > .01) {
23                break;
24            }
25        }
26        co::sleep(0.5);
27        echo("client exit\n");
28        $socket->close();
29    });
30    swoole_event_wait();
31};
32
33$pm->childFunc = function () use ($pm, $port) {
34    $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0);
35    Assert::assert($socket->bind('127.0.0.1', $port));
36    Assert::assert($socket->listen(128));
37    go(function () use ($socket, $pm) {
38        $client = $socket->accept();
39        Assert::isInstanceOf($client, Swoole\Coroutine\Socket::class);
40        $i = 0;
41        while (true) {
42            $client_data = $client->recv(1024, 0.1);
43            if ($client->errCode > 0) {
44                Assert::same($client->errCode, SOCKET_ETIMEDOUT);
45                break;
46            } else {
47                $i++;
48                Assert::same($client_data, 'hello');
49                $client->send('swoole');
50            }
51        }
52        echo "$i\n";
53        echo("sever exit\n");
54        usleep(1);
55        $client->close();
56        $socket->close();
57    });
58};
59
60$pm->childFirst();
61$pm->run();
62?>
63--EXPECT--
6410
65sever exit
66client exit
67