1--TEST--
2swoole_socket_coro: shutdown
3--SKIPIF--
4<?php require __DIR__ . '/../include/skipif.inc'; ?>
5--FILE--
6<?php
7require __DIR__ . '/../include/bootstrap.php';
8for ($n = 2; $n--;) {
9    $randoms[] = get_safe_random();
10}
11go(function () use ($randoms) {
12    $server = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
13    Assert::true($server->bind('127.0.0.1', 9601));
14    Assert::true($server->listen(512));
15    $conn = $server->accept();
16    Assert::isInstanceOf($conn, Swoole\Coroutine\Socket::class);
17    Assert::same($conn->recv(), array_shift($randoms));
18    Assert::greaterThan($conn->send(array_shift($randoms)), 0);
19    $conn->close();
20    $server->close();
21});
22go(function () use ($randoms) {
23    $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
24    Assert::true($socket->connect('127.0.0.1', 9601));
25    Assert::greaterThan($socket->send(array_shift($randoms)), 0);
26    Assert::same($socket->recv(), array_shift($randoms));
27    Assert::true($socket->shutdown(STREAM_SHUT_WR));
28    for ($n = MAX_REQUESTS; $n--;) {
29        Assert::false($socket->send(array_shift($randoms)));
30        Assert::same($socket->errCode, SOCKET_EPIPE);
31    }
32    Assert::assert($socket->shutdown(STREAM_SHUT_RD));
33    for ($n = MAX_REQUESTS; $n--;) {
34        Assert::assert(!$socket->recv());
35    }
36    Assert::false($socket->shutdown());
37    Assert::same($socket->errCode, SOCKET_ENOTCONN);
38    Assert::true($socket->close());
39    Assert::false($socket->send(''));
40    Assert::false($socket->recv());
41    Assert::same($socket->errCode, SOCKET_EBADF);
42});
43Swoole\Event::wait();
44echo "DONE\n";
45?>
46--EXPECT--
47DONE
48