From 87fdc090562f51f414ffc5bfa3416b2585b6d113 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 24 Jul 2014 17:31:32 +0200 Subject: [PATCH] [interim] Fix process isolation infinitely blocks on Windows. https://github.com/sebastianbergmann/phpunit/pull/1340 --- .../phpunit/phpunit/src/Util/PHP/Windows.php | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/core/vendor/phpunit/phpunit/src/Util/PHP/Windows.php b/core/vendor/phpunit/phpunit/src/Util/PHP/Windows.php index 17d97687563f..1a53479b7d1b 100644 --- a/core/vendor/phpunit/phpunit/src/Util/PHP/Windows.php +++ b/core/vendor/phpunit/phpunit/src/Util/PHP/Windows.php @@ -43,6 +43,8 @@ * @since File available since Release 3.5.12 */ +use SebastianBergmann\Environment\Runtime; + /** * Windows utility for PHP sub-processes. * @@ -61,6 +63,58 @@ class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP_Default */ private $tempFile; + /** + * {@inheritdoc} + * + * Reading from STDOUT or STDERR hangs forever on Windows if the output is + * too large. + * + * @see https://bugs.php.net/bug.php?id=51800 + * @see https://github.com/sebastianbergmann/phpunit/pull/1340 + */ + public function runJob($job, array $settings = array()) + { + $runtime = new Runtime; + + if (false === $stdout_handle = tmpfile()) { + throw new PHPUnit_Framework_Exception( + 'A temporary file could not be created; verify that your TEMP environment variable is writable' + ); + } + + $process = proc_open( + $runtime->getBinary() . $this->settingsToParameters($settings), + array( + 0 => array('pipe', 'r'), + 1 => $stdout_handle, + 2 => array('pipe', 'w') + ), + $pipes + ); + + if (!is_resource($process)) { + throw new PHPUnit_Framework_Exception( + 'Unable to spawn worker process' + ); + } + + $this->process($pipes[0], $job); + fclose($pipes[0]); + + $stderr = stream_get_contents($pipes[2]); + fclose($pipes[2]); + + proc_close($process); + + rewind($stdout_handle); + $stdout = stream_get_contents($stdout_handle); + fclose($stdout_handle); + + $this->cleanup(); + + return array('stdout' => $stdout, 'stderr' => $stderr); + } + /** * @param resource $pipe * @param string $job