Skip to content

Commit 508f111

Browse files
committed
#53: fix sock_async_poll
1 parent 840d4f1 commit 508f111

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
--TEST--
2+
UDP timeout operations with stream_socket_recvfrom in async context
3+
--FILE--
4+
<?php
5+
6+
use function Async\spawn;
7+
use function Async\awaitAll;
8+
use function Async\delay;
9+
10+
$output = [];
11+
12+
$output['1'] = "Start UDP timeout operations test";
13+
14+
$server_address = null;
15+
16+
// Server coroutine that tests timeout
17+
$server = spawn(function() use (&$server_address, &$output) {
18+
$output['2'] = "Server: creating UDP socket";
19+
$socket = stream_socket_server("udp://127.0.0.1:0", $errno, $errstr, STREAM_SERVER_BIND);
20+
if (!$socket) {
21+
$output['2a'] = "Server: failed to create socket: $errstr";
22+
return;
23+
}
24+
25+
$address = stream_socket_get_name($socket, false);
26+
$server_address = "udp://$address";
27+
$output['3'] = "Server: listening on $server_address";
28+
29+
// Set timeout to 2 seconds
30+
stream_set_timeout($socket, 2, 0);
31+
$output['4'] = "Server: set timeout to 2 seconds";
32+
33+
// Try to receive data (should timeout)
34+
$output['5'] = "Server: waiting for UDP data (should timeout)";
35+
$start_time = microtime(true);
36+
$data = stream_socket_recvfrom($socket, 1024, 0, $peer);
37+
$end_time = microtime(true);
38+
39+
$meta = stream_get_meta_data($socket);
40+
$elapsed = round($end_time - $start_time, 1);
41+
42+
if ($meta['timed_out']) {
43+
$output['6'] = "Server: operation timed out after $elapsed seconds";
44+
} else {
45+
$output['6'] = "Server: received data (unexpected): '$data'";
46+
}
47+
48+
fclose($socket);
49+
return $server_address;
50+
});
51+
52+
awaitAll([$server]);
53+
$output['z'] = "End UDP timeout operations test";
54+
55+
// Sort output by keys to ensure deterministic test results
56+
ksort($output);
57+
58+
// Output sorted results
59+
foreach ($output as $line) {
60+
echo $line . "\n";
61+
}
62+
63+
?>
64+
--EXPECTF--
65+
Warning: stream_socket_recvfrom(): Socket operation timed out after 2.000000 seconds in %s on line %d
66+
Start UDP timeout operations test
67+
Server: creating UDP socket
68+
Server: listening on udp://127.0.0.1:%d
69+
Server: set timeout to 2 seconds
70+
Server: waiting for UDP data (should timeout)
71+
Server: operation timed out after %s seconds
72+
End UDP timeout operations test

0 commit comments

Comments
 (0)