Skip to content

Commit afdf7ed

Browse files
committed
fix flaky socket tests
1 parent 7410155 commit afdf7ed

File tree

2 files changed

+108
-83
lines changed

2 files changed

+108
-83
lines changed

ext/sockets/tests/socket_sentto_recvfrom_ipv4_udp.phpt

Lines changed: 53 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,54 +5,66 @@ Test if socket_recvfrom() receives data sent by socket_sendto() via IPv4 UDP
55
if (!extension_loaded('sockets')) {
66
die('SKIP The sockets extension is not loaded.');
77
}
8+
?>
89
--FILE--
910
<?php
10-
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
11-
if (!$socket) {
12-
die('Unable to create AF_INET socket');
13-
}
14-
if (!socket_set_nonblock($socket)) {
15-
die('Unable to set nonblocking mode for socket');
16-
}
11+
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
12+
if (!$socket) {
13+
die('Unable to create AF_INET socket');
14+
}
1715

18-
$address = '127.0.0.1';
19-
socket_sendto($socket, '', 1, 0, $address); // cause warning
20-
if (!socket_bind($socket, $address, 1223)) {
21-
die("Unable to bind to $address:1223");
22-
}
16+
if (!socket_bind($socket, '127.0.0.1', 0)) {
17+
die(sprintf(
18+
'An error occurred while binding socket: %s',
19+
socket_strerror(socket_last_error($socket))));
20+
}
2321

24-
var_dump(socket_recvfrom($socket, $buf, 12, 0, $from, $port)); //false (EAGAIN - no warning)
22+
socket_getsockname($socket, $address, $port);
2523

26-
$msg = "Ping!";
27-
$len = strlen($msg);
28-
$bytes_sent = socket_sendto($socket, $msg, $len, 0, $address, 1223);
29-
if ($bytes_sent == -1) {
30-
die('An error occurred while sending to the socket');
31-
} else if ($bytes_sent != $len) {
32-
die($bytes_sent . ' bytes have been sent instead of the ' . $len . ' bytes expected');
33-
}
24+
$msg = "Ping!";
25+
$len = strlen($msg);
26+
$sent = socket_sendto($socket, $msg, $len, 0, $address, $port);
27+
if ($sent === false) {
28+
die(sprintf(
29+
'An error occurred while sending to the socket: %s',
30+
socket_strerror(socket_last_error($socket))));
31+
} else if ($sent != $len) {
32+
die(sprintf(
33+
'%d bytes have been sent instead of the %d bytes expected',
34+
$sent, $len));
35+
}
3436

35-
$from = "";
36-
$port = 0;
37-
socket_recvfrom($socket, $buf, 12, 0); // cause warning
38-
socket_recvfrom($socket, $buf, 12, 0, $from); // cause warning
39-
$bytes_received = socket_recvfrom($socket, $buf, 12, 0, $from, $port);
40-
if ($bytes_received == -1) {
41-
die('An error occurred while receiving from the socket');
42-
} else if ($bytes_received != $len) {
43-
die($bytes_received . ' bytes have been received instead of the ' . $len . ' bytes expected');
37+
$wants = $len;
38+
$recvd = 0;
39+
$buf = null;
40+
41+
while ($recvd < $len) {
42+
$bytes = socket_recvfrom(
43+
$socket, $buffering, $wants, 0, $address, $port);
44+
45+
if (($bytes === false) && ($errno = socket_last_error($socket))) {
46+
if ($errno = SOCKET_EAGAIN) {
47+
socket_clear_error($socket);
48+
continue;
49+
}
50+
51+
die(sprintf(
52+
'An error occurred while sending to the socket: %s',
53+
socket_strerror($errno)));
4454
}
45-
echo "Received $buf from remote address $from and remote port $port" . PHP_EOL;
4655

47-
socket_close($socket);
48-
--EXPECTF--
49-
Warning: Wrong parameter count for socket_sendto() in %s on line %d
50-
bool(false)
56+
$recvd += $bytes;
57+
$wants -= $bytes;
58+
$buf .= $buffering;
59+
}
5160

52-
Warning: socket_recvfrom() expects at least 5 parameters, 4 given in %s on line %d
61+
if ($recvd != $len) {
62+
die(sprintf(
63+
'%d bytes have been received instead of the %d bytes expected',
64+
$recvd, $len));
65+
}
5366

54-
Warning: Wrong parameter count for socket_recvfrom() in %s on line %d
55-
Received Ping! from remote address 127.0.0.1 and remote port 1223
56-
--CREDITS--
57-
Falko Menge <mail at falko-menge dot de>
58-
PHP Testfest Berlin 2009-05-09
67+
echo "Received $buf from remote address $address and remote port $port" . PHP_EOL;
68+
?>
69+
--EXPECTF--
70+
Received Ping! from remote address %s and remote port %d

ext/sockets/tests/socket_sentto_recvfrom_ipv6_udp.phpt

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,53 +9,66 @@ if (substr(PHP_OS, 0, 3) == 'WIN') {
99
die('skip Not valid for Windows');
1010
}
1111
require 'ipv6_skipif.inc';
12+
?>
1213
--FILE--
1314
<?php
14-
$socket = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
15-
if (!$socket) {
16-
die('Unable to create AF_INET6 socket');
17-
}
18-
if (!socket_set_nonblock($socket)) {
19-
die('Unable to set nonblocking mode for socket');
20-
}
21-
var_dump(socket_recvfrom($socket, $buf, 12, 0, $from, $port)); // false (EAGAIN, no warning)
22-
$address = '::1';
23-
socket_sendto($socket, '', 1, 0, $address); // cause warning
24-
if (!socket_bind($socket, $address, 1223)) {
25-
die("Unable to bind to $address:1223");
26-
}
15+
$socket = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP);
16+
if (!$socket) {
17+
die('Unable to create AF_INET6 socket');
18+
}
2719

28-
$msg = "Ping!";
29-
$len = strlen($msg);
30-
$bytes_sent = socket_sendto($socket, $msg, $len, 0, $address, 1223);
31-
if ($bytes_sent == -1) {
32-
die('An error occurred while sending to the socket');
33-
} else if ($bytes_sent != $len) {
34-
die($bytes_sent . ' bytes have been sent instead of the ' . $len . ' bytes expected');
35-
}
20+
if (!socket_bind($socket, '::1', 0)) {
21+
die(sprintf(
22+
'An error occurred while binding socket: %s',
23+
socket_strerror(socket_last_error($socket))));
24+
}
3625

37-
$from = "";
38-
$port = 0;
39-
socket_recvfrom($socket, $buf, 12, 0); // cause warning
40-
socket_recvfrom($socket, $buf, 12, 0, $from); // cause warning
41-
$bytes_received = socket_recvfrom($socket, $buf, 12, 0, $from, $port);
42-
if ($bytes_received == -1) {
43-
die('An error occurred while receiving from the socket');
44-
} else if ($bytes_received != $len) {
45-
die($bytes_received . ' bytes have been received instead of the ' . $len . ' bytes expected');
46-
}
47-
echo "Received $buf from remote address $from and remote port $port" . PHP_EOL;
26+
socket_getsockname($socket, $address, $port);
4827

49-
socket_close($socket);
50-
--EXPECTF--
51-
bool(false)
28+
$msg = "Ping!";
29+
$len = strlen($msg);
30+
$sent = socket_sendto($socket, $msg, $len, 0, $address, $port);
31+
if ($sent === false) {
32+
die(sprintf(
33+
'An error occurred while sending to the socket: %s',
34+
socket_strerror(socket_last_error($socket))));
35+
} else if ($sent != $len) {
36+
die(sprintf(
37+
'%d bytes have been sent instead of the %d bytes expected',
38+
$sent, $len));
39+
}
5240

53-
Warning: Wrong parameter count for socket_sendto() in %s on line %d
41+
$wants = $len;
42+
$recvd = 0;
43+
$buf = null;
5444

55-
Warning: socket_recvfrom() expects at least 5 parameters, 4 given in %s on line %d
45+
while ($recvd < $len) {
46+
$bytes = socket_recvfrom(
47+
$socket, $buffering, $wants, 0, $address, $port);
5648

57-
Warning: Wrong parameter count for socket_recvfrom() in %s on line %d
58-
Received Ping! from remote address ::1 and remote port 1223
59-
--CREDITS--
60-
Falko Menge <mail at falko-menge dot de>
61-
PHP Testfest Berlin 2009-05-09
49+
if (($bytes === false) && ($errno = socket_last_error($socket))) {
50+
if ($errno = SOCKET_EAGAIN) {
51+
socket_clear_error($socket);
52+
continue;
53+
}
54+
55+
die(sprintf(
56+
'An error occurred while sending to the socket: %s',
57+
socket_strerror($errno)));
58+
}
59+
60+
$recvd += $bytes;
61+
$wants -= $bytes;
62+
$buf .= $buffering;
63+
}
64+
65+
if ($recvd != $len) {
66+
die(sprintf(
67+
'%d bytes have been received instead of the %d bytes expected',
68+
$recvd, $len));
69+
}
70+
71+
echo "Received $buf from remote address $address and remote port $port" . PHP_EOL;
72+
?>
73+
--EXPECTF--
74+
Received Ping! from remote address %s and remote port %d

0 commit comments

Comments
 (0)