1
0
Fork 0

Add workaround for PHPUnit process isolation issues for PHPUnit <6.5 as well, fixes #10387

pull/10409/head
Jordi Boggiano 2021-12-30 10:42:35 +01:00
parent 0a85c3fb01
commit 2a731ef798
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC
1 changed files with 13 additions and 4 deletions

View File

@ -264,13 +264,20 @@ class BinaryInstaller
$binPathExported = $this->filesystem->findShortestPathCode($link, $bin, false, true); $binPathExported = $this->filesystem->findShortestPathCode($link, $bin, false, true);
$streamProxyCode = $streamHint = ''; $streamProxyCode = $streamHint = '';
$globalsCode = '$GLOBALS[\'_composer_bin_dir\'] = __DIR__;'."\n"; $globalsCode = '$GLOBALS[\'_composer_bin_dir\'] = __DIR__;'."\n";
$phpunitHack1 = $phpunitHack2 = '';
// Don't expose autoload path when vendor dir was not set in custom installers // Don't expose autoload path when vendor dir was not set in custom installers
if ($this->vendorDir) { if ($this->vendorDir) {
$globalsCode .= '$GLOBALS[\'_composer_autoload_path\'] = ' . $this->filesystem->findShortestPathCode($link, $this->vendorDir . '/autoload.php', false, true).";\n"; $globalsCode .= '$GLOBALS[\'_composer_autoload_path\'] = ' . $this->filesystem->findShortestPathCode($link, $this->vendorDir . '/autoload.php', false, true).";\n";
} }
// Add workaround for PHPUnit process isolation on PHPUnit 6+ // Add workaround for PHPUnit process isolation
if ($this->filesystem->normalizePath($bin) === $this->filesystem->normalizePath($this->vendorDir.'/phpunit/phpunit/phpunit')) { if ($this->filesystem->normalizePath($bin) === $this->filesystem->normalizePath($this->vendorDir.'/phpunit/phpunit/phpunit')) {
// workaround issue on PHPUnit 6.5+ running on PHP 8+
$globalsCode .= '$GLOBALS[\'__PHPUNIT_ISOLATION_EXCLUDE_LIST\'] = $GLOBALS[\'__PHPUNIT_ISOLATION_BLACKLIST\'] = array(realpath('.$binPathExported.'));'."\n"; $globalsCode .= '$GLOBALS[\'__PHPUNIT_ISOLATION_EXCLUDE_LIST\'] = $GLOBALS[\'__PHPUNIT_ISOLATION_BLACKLIST\'] = array(realpath('.$binPathExported.'));'."\n";
// workaround issue on all PHPUnit versions running on PHP <8
$phpunitHack1 = "'phpvfs1://'.";
$phpunitHack2 = '
$data = str_replace(\'__DIR__\', var_export(dirname($this->realpath), true), $data);
$data = str_replace(\'__FILE__\', var_export($this->realpath, true), $data);';
} }
if (trim($match[0]) !== '<?php') { if (trim($match[0]) !== '<?php') {
$streamHint = ' using a stream wrapper to prevent the shebang from being output on PHP<8'."\n *"; $streamHint = ' using a stream wrapper to prevent the shebang from being output on PHP<8'."\n *";
@ -284,13 +291,15 @@ if (PHP_VERSION_ID < 80000) {
{ {
private \$handle; private \$handle;
private \$position; private \$position;
private \$realpath;
public function stream_open(\$path, \$mode, \$options, &\$opened_path) public function stream_open(\$path, \$mode, \$options, &\$opened_path)
{ {
// get rid of composer-bin-proxy:// prefix for __FILE__ & __DIR__ resolution // get rid of composer-bin-proxy:// prefix for __FILE__ & __DIR__ resolution
\$opened_path = substr(\$path, 21); \$opened_path = substr(\$path, 21);
\$opened_path = realpath(\$opened_path) ?: \$opened_path; \$this->realpath = realpath(\$opened_path) ?: \$opened_path;
\$this->handle = fopen(\$opened_path, \$mode); \$opened_path = $phpunitHack1\$this->realpath;
\$this->handle = fopen(\$this->realpath, \$mode);
\$this->position = 0; \$this->position = 0;
// remove all traces of this stream wrapper once it has been used // remove all traces of this stream wrapper once it has been used
@ -305,7 +314,7 @@ if (PHP_VERSION_ID < 80000) {
if (\$this->position === 0) { if (\$this->position === 0) {
\$data = preg_replace('{^#!.*\\r?\\n}', '', \$data); \$data = preg_replace('{^#!.*\\r?\\n}', '', \$data);
} }$phpunitHack2
\$this->position += strlen(\$data); \$this->position += strlen(\$data);