Skip to content
Snippets Groups Projects
Verified Commit b8a5017e authored by Dave Long's avatar Dave Long
Browse files

Issue #3417805 by mondrake: Use Symfony Process to spawn subprocesses in PhpUnitTestRunner

parent b35de78f
No related branches found
No related tags found
26 merge requests!8528Issue #3456871 by Tim Bozeman: Support NULL services,!3878Removed unused condition head title for views,!38582585169-10.1.x,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3668Resolve #3347842 "Deprecate the trusted",!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3133core/modules/system/css/components/hidden.module.css,!2964Issue #2865710 : Dependencies from only one instance of a widget are used in display modes,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!877Issue #2708101: Default value for link text is not saved,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493
Pipeline #87108 passed
Pipeline: drupal

#87109

    ......@@ -6,6 +6,7 @@
    use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Symfony\Component\Process\PhpExecutableFinder;
    use Symfony\Component\Process\Process;
    /**
    * Run PHPUnit-based tests.
    ......@@ -106,37 +107,36 @@ public function phpUnitCommand(): string {
    * (optional) The output by running the phpunit command. If provided, this
    * array will contain the lines output by the command.
    *
    * @return string
    * The results as returned by exec().
    *
    * @internal
    */
    public function runCommand(array $unescaped_test_classnames, string $phpunit_file, int &$status = NULL, array &$output = NULL): string {
    public function runCommand(array $unescaped_test_classnames, string $phpunit_file, int &$status = NULL, array &$output = NULL): void {
    global $base_url;
    // Setup an environment variable containing the database connection so that
    // functional tests can connect to the database.
    putenv('SIMPLETEST_DB=' . Database::getConnectionInfoAsUrl());
    $process_environment_variables = [
    'SIMPLETEST_DB' => Database::getConnectionInfoAsUrl(),
    ];
    // Setup an environment variable containing the base URL, if it is available.
    // This allows functional tests to browse the site under test. When running
    // tests via CLI, core/phpunit.xml.dist or core/scripts/run-tests.sh can set
    // this variable.
    if ($base_url) {
    putenv('SIMPLETEST_BASE_URL=' . $base_url);
    putenv('BROWSERTEST_OUTPUT_DIRECTORY=' . $this->workingDirectory);
    $process_environment_variables['SIMPLETEST_BASE_URL'] = $base_url;
    $process_environment_variables['BROWSERTEST_OUTPUT_DIRECTORY'] = $this->workingDirectory;
    }
    $phpunit_bin = $this->phpUnitCommand();
    $command = [
    $phpunit_bin,
    '--log-junit',
    escapeshellarg($phpunit_file),
    $phpunit_file,
    ];
    // Optimized for running a single test.
    if (count($unescaped_test_classnames) == 1) {
    $class = new \ReflectionClass($unescaped_test_classnames[0]);
    $command[] = escapeshellarg($class->getFileName());
    $command[] = $class->getFileName();
    }
    else {
    // Double escape namespaces so they'll work in a regexp.
    ......@@ -147,25 +147,15 @@ public function runCommand(array $unescaped_test_classnames, string $phpunit_fil
    $filter_string = implode("|", $escaped_test_classnames);
    $command = array_merge($command, [
    '--filter',
    escapeshellarg($filter_string),
    $filter_string,
    ]);
    }
    // Need to change directories before running the command so that we can use
    // relative paths in the configuration file's exclusions.
    $old_cwd = getcwd();
    chdir($this->appRoot . "/core");
    // exec in a subshell so that the environment is isolated.
    $ret = exec(implode(" ", $command), $output, $status);
    chdir($old_cwd);
    putenv('SIMPLETEST_DB=');
    if ($base_url) {
    putenv('SIMPLETEST_BASE_URL=');
    putenv('BROWSERTEST_OUTPUT_DIRECTORY=');
    }
    return $ret;
    $process = new Process($command, \Drupal::root() . "/core", $process_environment_variables);
    $process->setTimeout(300);
    $process->run();
    $output = explode("\n", $process->getOutput());
    $status = $process->getExitCode();
    }
    /**
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment