Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. AbstractPhpProcess.php

class AbstractPhpProcess

@no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit

@internal This class is not covered by the backward compatibility promise for PHPUnit

Hierarchy

  • class \PHPUnit\Util\PHP\AbstractPhpProcess

Expanded class hierarchy of AbstractPhpProcess

2 files declare their use of AbstractPhpProcess
PhptTestCase.php in vendor/phpunit/phpunit/src/Runner/PhptTestCase.php
TestRunner.php in vendor/phpunit/phpunit/src/Framework/TestRunner.php

File

vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php, line 45

Namespace

PHPUnit\Util\PHP
View source
abstract class AbstractPhpProcess {
    protected bool $stderrRedirection = false;
    protected string $stdin = '';
    protected string $arguments = '';
    
    /**
     * @psalm-var array<string, string>
     */
    protected array $env = [];
    public static function factory() : self {
        return new DefaultPhpProcess();
    }
    
    /**
     * Defines if should use STDERR redirection or not.
     *
     * Then $stderrRedirection is TRUE, STDERR is redirected to STDOUT.
     */
    public function setUseStderrRedirection(bool $stderrRedirection) : void {
        $this->stderrRedirection = $stderrRedirection;
    }
    
    /**
     * Returns TRUE if uses STDERR redirection or FALSE if not.
     */
    public function useStderrRedirection() : bool {
        return $this->stderrRedirection;
    }
    
    /**
     * Sets the input string to be sent via STDIN.
     */
    public function setStdin(string $stdin) : void {
        $this->stdin = $stdin;
    }
    
    /**
     * Returns the input string to be sent via STDIN.
     */
    public function getStdin() : string {
        return $this->stdin;
    }
    
    /**
     * Sets the string of arguments to pass to the php job.
     */
    public function setArgs(string $arguments) : void {
        $this->arguments = $arguments;
    }
    
    /**
     * Returns the string of arguments to pass to the php job.
     */
    public function getArgs() : string {
        return $this->arguments;
    }
    
    /**
     * Sets the array of environment variables to start the child process with.
     *
     * @psalm-param array<string, string> $env
     */
    public function setEnv(array $env) : void {
        $this->env = $env;
    }
    
    /**
     * Returns the array of environment variables to start the child process with.
     */
    public function getEnv() : array {
        return $this->env;
    }
    
    /**
     * Runs a single test in a separate PHP process.
     *
     * @throws \PHPUnit\Runner\Exception
     * @throws Exception
     * @throws MoreThanOneDataSetFromDataProviderException
     * @throws NoPreviousThrowableException
     */
    public function runTestJob(string $job, Test $test, string $processResultFile) : void {
        $_result = $this->runJob($job);
        $processResult = '';
        if (file_exists($processResultFile)) {
            $processResult = file_get_contents($processResultFile);
            @unlink($processResultFile);
        }
        $this->processChildResult($test, $processResult, $_result['stderr']);
    }
    
    /**
     * Returns the command based into the configurations.
     *
     * @return string[]
     */
    public function getCommand(array $settings, ?string $file = null) : array {
        $runtime = new Runtime();
        $command = [];
        $command[] = PHP_BINARY;
        if ($runtime->hasPCOV()) {
            $settings = array_merge($settings, $runtime->getCurrentSettings(array_keys(ini_get_all('pcov'))));
        }
        elseif ($runtime->hasXdebug()) {
            $settings = array_merge($settings, $runtime->getCurrentSettings(array_keys(ini_get_all('xdebug'))));
        }
        $command = array_merge($command, $this->settingsToParameters($settings));
        if (PHP_SAPI === 'phpdbg') {
            $command[] = '-qrr';
            if (!$file) {
                $command[] = 's=';
            }
        }
        if ($file) {
            $command[] = '-f';
            $command[] = $file;
        }
        if ($this->arguments) {
            if (!$file) {
                $command[] = '--';
            }
            foreach (explode(' ', $this->arguments) as $arg) {
                $command[] = trim($arg);
            }
        }
        return $command;
    }
    
    /**
     * Runs a single job (PHP code) using a separate PHP process.
     */
    public abstract function runJob(string $job, array $settings = []) : array;
    
    /**
     * @return list<string>
     */
    protected function settingsToParameters(array $settings) : array {
        $buffer = [];
        foreach ($settings as $setting) {
            $buffer[] = '-d';
            $buffer[] = $setting;
        }
        return $buffer;
    }
    
    /**
     * @throws \PHPUnit\Runner\Exception
     * @throws Exception
     * @throws MoreThanOneDataSetFromDataProviderException
     * @throws NoPreviousThrowableException
     */
    private function processChildResult(Test $test, string $stdout, string $stderr) : void {
        if (!empty($stderr)) {
            $exception = new Exception(trim($stderr));
            assert($test instanceof TestCase);
            Facade::emitter()->testErrored(TestMethodBuilder::fromTestCase($test), ThrowableBuilder::from($exception));
            return;
        }
        set_error_handler(static function (int $errno, string $errstr, string $errfile, int $errline) : never {
            throw new ErrorException($errstr, $errno, $errno, $errfile, $errline);
        });
        try {
            $childResult = unserialize($stdout);
            restore_error_handler();
            if ($childResult === false) {
                $exception = new AssertionFailedError('Test was run in child process and ended unexpectedly');
                assert($test instanceof TestCase);
                Facade::emitter()->testErrored(TestMethodBuilder::fromTestCase($test), ThrowableBuilder::from($exception));
                Facade::emitter()->testFinished(TestMethodBuilder::fromTestCase($test), 0);
            }
        } catch (ErrorException $e) {
            restore_error_handler();
            $childResult = false;
            $exception = new Exception(trim($stdout), 0, $e);
            assert($test instanceof TestCase);
            Facade::emitter()->testErrored(TestMethodBuilder::fromTestCase($test), ThrowableBuilder::from($exception));
        }
        if ($childResult !== false) {
            if (!empty($childResult['output'])) {
                $output = $childResult['output'];
            }
            Facade::instance()->forward($childResult['events']);
            PassedTests::instance()->import($childResult['passedTests']);
            assert($test instanceof TestCase);
            $test->setResult($childResult['testResult']);
            $test->addToAssertionCount($childResult['numAssertions']);
            if (CodeCoverage::instance()->isActive() && $childResult['codeCoverage'] instanceof \SebastianBergmann\CodeCoverage\CodeCoverage) {
                CodeCoverage::instance()->codeCoverage()
                    ->merge($childResult['codeCoverage']);
            }
        }
        if (!empty($output)) {
            print $output;
        }
    }

}

Members

Title Sort descending Modifiers Object type Summary Overrides
AbstractPhpProcess::$arguments protected property
AbstractPhpProcess::$env protected property @psalm-var array&lt;string, string&gt;
AbstractPhpProcess::$stderrRedirection protected property
AbstractPhpProcess::$stdin protected property
AbstractPhpProcess::factory public static function
AbstractPhpProcess::getArgs public function Returns the string of arguments to pass to the php job.
AbstractPhpProcess::getCommand public function Returns the command based into the configurations.
AbstractPhpProcess::getEnv public function Returns the array of environment variables to start the child process with.
AbstractPhpProcess::getStdin public function Returns the input string to be sent via STDIN.
AbstractPhpProcess::processChildResult private function
AbstractPhpProcess::runJob abstract public function Runs a single job (PHP code) using a separate PHP process. 1
AbstractPhpProcess::runTestJob public function Runs a single test in a separate PHP process.
AbstractPhpProcess::setArgs public function Sets the string of arguments to pass to the php job.
AbstractPhpProcess::setEnv public function Sets the array of environment variables to start the child process with.
AbstractPhpProcess::setStdin public function Sets the input string to be sent via STDIN.
AbstractPhpProcess::settingsToParameters protected function
AbstractPhpProcess::setUseStderrRedirection public function Defines if should use STDERR redirection or not.
AbstractPhpProcess::useStderrRedirection public function Returns TRUE if uses STDERR redirection or FALSE if not.
RSS feed
Powered by Drupal