1--TEST--
2swoole_socket_coro: writev with eagain
3--SKIPIF--
4<?php require __DIR__ . '/../include/skipif.inc'; ?>
5--FILE--
6<?php
7
8use Swoole\Coroutine;
9use Swoole\Coroutine\Socket;
10
11use function Swoole\Coroutine\run;
12
13require __DIR__ . '/../include/bootstrap.php';
14
15$totalLength = 0;
16$iovector = [];
17$packedStr = '';
18
19for ($i = 0; $i < 10; $i++) {
20    $iovector[$i] = str_repeat(get_safe_random(1024), 128);
21    $totalLength += strlen($iovector[$i]);
22    $packedStr .= $iovector[$i];
23}
24
25run(function () {
26    $server = new Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
27    $port = get_one_free_port();
28
29    go(function () use ($server, $port) {
30        Assert::assert($server->bind('127.0.0.1', $port));
31        Assert::assert($server->listen(512));
32        $conn = $server->accept();
33        Assert::assert($conn instanceof  Socket);
34        Assert::assert($conn->fd > 0);
35
36        global $totalLength, $packedStr;
37        Assert::assert($conn instanceof Socket);
38
39        // Let writeVectorAll trigger EAGAIN (verify the correctness of the error returned by writeVectorAll)
40        Coroutine::sleep(0.5);
41        Assert::eq($conn->recvAll($totalLength), $packedStr);
42    });
43
44    go(function () use ($server, $port) {
45        global $iovector, $totalLength;
46
47        $conn = new Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
48        Assert::assert($conn->connect('127.0.0.1', $port));
49        $ret = $conn->writeVectorAll($iovector);
50        Assert::eq($ret, $totalLength);
51        $server->close();
52    });
53});
54
55echo "DONE\n";
56?>
57--EXPECT--
58DONE
59