Skip to content

Commit

Permalink
[interim] Fix process isolation infinitely blocks on Windows.
Browse files Browse the repository at this point in the history
  • Loading branch information
sun committed Jul 24, 2014
1 parent e5c29c0 commit 87fdc09
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions core/vendor/phpunit/phpunit/src/Util/PHP/Windows.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
* @since File available since Release 3.5.12
*/

use SebastianBergmann\Environment\Runtime;

/**
* Windows utility for PHP sub-processes.
*
Expand All @@ -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
Expand Down

0 comments on commit 87fdc09

Please sign in to comment.