From c7c01dbdeb55cb3686fcfd9e9e31578dc1a98da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Fri, 3 May 2019 15:49:13 +0200 Subject: [PATCH] Avoid race condition for forked process in test suite There's a very short race condition where the forked php process first has to `dup()` the file descriptor specs before invoking `exec()` to switch to the actual `ssh` child process. We don't need to wait for the child process to be ready, but only for the forked process to close the file descriptors. This happens ~80% of times on single core machines and almost never on multi core systems, so simply wait 5ms (plenty of time!) and retry again. Builds on top of #7 --- tests/FunctionalDatabaseTest.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/FunctionalDatabaseTest.php b/tests/FunctionalDatabaseTest.php index 04a7a4f..e53eef2 100644 --- a/tests/FunctionalDatabaseTest.php +++ b/tests/FunctionalDatabaseTest.php @@ -85,7 +85,20 @@ public function testOpenMemoryDatabaseShouldNotInheritActiveFileDescriptors() // close server and ensure we can start a new server on the previous address // the pending SQLite process should not inherit the existing server socket fclose($server); - $server = stream_socket_server('tcp://' . $address); + + $server = @stream_socket_server('tcp://' . $address); + if ($server === false) { + // There's a very short race condition where the forked php process + // first has to `dup()` the file descriptor specs before invoking + // `exec()` to switch to the actual `ssh` child process. We don't + // need to wait for the child process to be ready, but only for the + // forked process to close the file descriptors. This happens ~80% + // of times on single core machines and almost never on multi core + // systems, so simply wait 5ms (plenty of time!) and retry again. + usleep(5000); + $server = stream_socket_server('tcp://' . $address); + } + $this->assertTrue(is_resource($server)); fclose($server);