function pfsockopen_random_port(&$fsock, $address) { $fsock = false; for ($i = 0; $i < 100; $i++) { $port = get_random_port(); $fsock = @pfsockopen($address, $port); if ($fsock !== false) { return $port; } } return 0; }
function retry_bind_server() { for ($i = 0; $i < 20; ++$i) { $port = get_random_port(); $address = "tcp://127.0.0.1:" . $port; $server = @stream_socket_server($address); if ($server !== false) { return array($port, $address, $server); } } throw new Exception("Couldn't bind server"); }
function retry_bind_server6($udp = false) { for ($i = 0; $i < 20; ++$i) { $port = get_random_port(); $scheme = $udp ? "udp://" : "tcp://"; $address = $scheme . "[::1]:" . $port; if ($udp) { $server = @stream_socket_server($address, $errno, $errstr, STREAM_SERVER_BIND); } else { $server = @stream_socket_server($address); } if ($server !== false) { return array($port, $address, $server); } } throw new Exception("Couldn't bind server"); }
function runTest($testName, $testController) { try { $serverPort = get_random_port(); $adminPort = get_random_port(); while ($adminPort === $serverPort) { $adminPort = get_random_port(); } $debugPort = get_random_port(); while ($debugPort === $serverPort || $debugPort === $adminPort) { $debugPort = get_random_port(); } $pid = posix_getpid(); $serverProc = null; $clientProcessId = 0; $serverProc = startServer($serverPort, $adminPort, $debugPort); waitForServerToGetGoing($serverPort); startDebuggerClient($debugPort, "/debugger/{$testName}.in", $pipes); $clientProcessId = getClientProcessId($pipes[1]); if (!$clientProcessId || ($clientProcessId = intval($clientProcessId)) <= 0) { tlog('Failed to communicate with the debugger client process'); dumpLogFilesToStdoutAndDie(); } tlog("Debugger client process id = {$clientProcessId}"); $testController($pipes[1], $clientProcessId, $serverPort); // Echo stderr, just in case. // (It was redirected to stdout, so this should be empty). echo stream_get_contents($pipes[2]); stopServer($adminPort); } catch (Exception $e) { error_log("Caught exception, test failed, pid={$pid}"); killChildren(posix_getpid()); error_log('test failed'); } }