From 78d18c8da8be4c5d9457c9ae0f0a36871c323259 Mon Sep 17 00:00:00 2001
From: Nathaniel Catchpole <catch@35733.no-reply.drupal.org>
Date: Thu, 5 Jun 2014 11:24:16 +0100
Subject: [PATCH] Issue #2229011 by chx, tstoeckler: Fixed Tests are no longer
 modifiable.

---
 .../modules/simpletest/src/KernelTestBase.php |  7 +++
 core/modules/simpletest/src/TestBase.php      |  7 +++
 .../simpletest/src/Tests/SimpleTestTest.php   | 63 +++++++++++++++++--
 core/modules/simpletest/src/WebTestBase.php   | 20 +++++-
 4 files changed, 89 insertions(+), 8 deletions(-)

diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php
index 409c1b95a8ea..5f0183ab9729 100644
--- a/core/modules/simpletest/src/KernelTestBase.php
+++ b/core/modules/simpletest/src/KernelTestBase.php
@@ -126,6 +126,13 @@ protected function prepareConfigDirectories() {
   protected function setUp() {
     $this->keyValueFactory = new KeyValueMemoryFactory();
 
+    // Allow for test-specific overrides.
+    $settings_services_file = DRUPAL_ROOT . '/' . $this->originalSite . '/testing.services.yml';
+    if (file_exists($settings_services_file)) {
+      // Copy the testing-specific service overrides in place.
+      copy($settings_services_file, DRUPAL_ROOT . '/' . $this->siteDirectory . '/services.yml');
+    }
+
     parent::setUp();
 
     // Create and set new configuration directories.
diff --git a/core/modules/simpletest/src/TestBase.php b/core/modules/simpletest/src/TestBase.php
index 023cf8e53bcc..4b1c4668fd36 100644
--- a/core/modules/simpletest/src/TestBase.php
+++ b/core/modules/simpletest/src/TestBase.php
@@ -53,6 +53,13 @@ abstract class TestBase {
    */
   protected $databasePrefix = NULL;
 
+  /**
+   * The site directory of the original parent site.
+   *
+   * @var string
+   */
+  protected $originalSite;
+
   /**
    * The original file directory, before it was changed for testing purposes.
    *
diff --git a/core/modules/simpletest/src/Tests/SimpleTestTest.php b/core/modules/simpletest/src/Tests/SimpleTestTest.php
index e46051da7ae2..a0e57381d16c 100755
--- a/core/modules/simpletest/src/Tests/SimpleTestTest.php
+++ b/core/modules/simpletest/src/Tests/SimpleTestTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\simpletest\Tests;
 
-use Drupal\Core\Database\Driver\pgsql\Select;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -34,6 +33,9 @@ class SimpleTestTest extends WebTestBase {
    */
   protected $test_ids = array();
 
+  /**
+   * {@inheritdoc}
+   */
   public static function getInfo() {
     return array(
       'name' => 'SimpleTest functionality',
@@ -44,11 +46,41 @@ public static function getInfo() {
 
   function setUp() {
     if (!$this->isInChildSite()) {
+      $php = <<<'EOD'
+<?php
+
+# Make sure that the $test_class variable is defined when this file is included.
+if ($test_class) {
+}
+
+# Define a function to be able to check that this file was loaded with
+# function_exists().
+if (!function_exists('simpletest_test_stub_settings_function')) {
+  function simpletest_test_stub_settings_function() {}
+}
+EOD;
+
+      file_put_contents($this->siteDirectory. '/' . 'settings.testing.php', $php);
+      // @see \Drupal\system\Tests\DrupalKernel\DrupalKernelSiteTest
+      $class = __CLASS__;
+      $yaml = <<<EOD
+services:
+  # Add a new service.
+  site.service.yml:
+    class: $class
+  # Swap out a core service.
+  cache.backend.database:
+    class: Drupal\Core\Cache\MemoryBackendFactory
+EOD;
+      file_put_contents($this->siteDirectory . '/testing.services.yml', $yaml);
+
       parent::setUp();
       // Create and log in an admin user.
       $this->drupalLogin($this->drupalCreateUser(array('administer unit tests')));
     }
     else {
+      // This causes three of the five fails that are asserted in
+      // confirmStubResults().
       self::$modules = array('non_existent_module');
       parent::setUp();
     }
@@ -184,23 +216,42 @@ function testWebTestRunner() {
    * Test to be run and the results confirmed.
    */
   function stubTest() {
+    // This causes the first of the ten passes asserted in confirmStubResults().
     $this->pass($this->pass);
+    // The first three fails are caused by enabling a non-existent module in
+    // setUp(). This causes the fourth of the five fails asserted in
+    // confirmStubResults().
     $this->fail($this->fail);
 
+    // This causes the second to fourth of the ten passes asserted in
+    // confirmStubResults().
     $this->drupalCreateUser(array($this->valid_permission));
+    // This causes the fifth of the five fails asserted in confirmStubResults().
     $this->drupalCreateUser(array($this->invalid_permission));
 
+    // This causes the fifth of the ten passes asserted in confirmStubResults().
     $this->pass(t('Test ID is @id.', array('@id' => $this->testId)));
 
+    // These cause the sixth to ninth of the ten passes asserted in
+    // confirmStubResults().
+    $this->assertTrue(file_exists(conf_path() . '/settings.testing.php'));
+    // Check the settings.testing.php file got included.
+    $this->assertTrue(function_exists('simpletest_test_stub_settings_function'));
+    // Check that the test-specific service file got loaded.
+    $this->assertTrue($this->container->has('site.service.yml'));
+    $this->assertIdentical(get_class($this->container->get('cache.backend.database')), 'Drupal\Core\Cache\MemoryBackendFactory');
+
+    // These cause the two exceptions asserted in confirmStubResults().
     // Call trigger_error() without the required argument to trigger an E_WARNING.
     trigger_error();
-
-    // Call an assert function specific to that class.
-    $this->assertNothing();
-
     // Generates a warning inside a PHP function.
     array_key_exists(NULL, NULL);
 
+    // This causes the tenth of the ten passes asserted in
+    // confirmStubResults().
+    $this->assertNothing();
+
+    // This causes the debug message asserted in confirmStubResults().
     debug('Foo', 'Debug');
   }
 
@@ -237,7 +288,7 @@ function confirmStubTestResults() {
 
     $this->assertAssertion("Debug: 'Foo'", 'Debug', 'Fail', 'SimpleTestTest.php', 'Drupal\simpletest\Tests\SimpleTestTest->stubTest()');
 
-    $this->assertEqual('6 passes, 5 fails, 2 exceptions, 1 debug message', $this->childTestResults['summary']);
+    $this->assertEqual('10 passes, 5 fails, 2 exceptions, 1 debug message', $this->childTestResults['summary']);
 
     $this->test_ids[] = $test_id = $this->getTestIdFromResults();
     $this->assertTrue($test_id, 'Found test ID in results.');
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index ec50d4dd70f3..4072158c30d7 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -819,7 +819,8 @@ protected function setUp() {
     // Copy and prepare an actual settings.php, so as to resemble a regular
     // installation.
     // Not using File API; a potential error must trigger a PHP warning.
-    copy(DRUPAL_ROOT . '/sites/default/default.settings.php', DRUPAL_ROOT . '/' . $this->siteDirectory . '/settings.php');
+    $directory = DRUPAL_ROOT . '/' . $this->siteDirectory;
+    copy(DRUPAL_ROOT . '/sites/default/default.settings.php', $directory . '/settings.php');
 
     // All file system paths are created by System module during installation.
     // @see system_requirements()
@@ -844,6 +845,21 @@ protected function setUp() {
     );
     $this->writeSettings($settings);
 
+    // Allow for test-specific overrides.
+    $settings_testing_file = DRUPAL_ROOT . '/' . $this->originalSite . '/settings.testing.php';
+    if (file_exists($settings_testing_file)) {
+      // Copy the testing-specific settings.php overrides in place.
+      copy($settings_testing_file, $directory . '/settings.testing.php');
+      // Add the name of the testing class to settings.php and include the
+      // testing specific overrides
+      file_put_contents($directory . '/settings.php', "\n\$test_class = '" . get_class($this) ."';\n" . 'include DRUPAL_ROOT . \'/\' . $conf_path . \'/settings.testing.php\';' ."\n", FILE_APPEND);
+    }
+    $settings_services_file = DRUPAL_ROOT . '/' . $this->originalSite . '/testing.services.yml';
+    if (file_exists($settings_services_file)) {
+      // Copy the testing-specific service overrides in place.
+      copy($settings_services_file, $directory . '/services.yml');
+    }
+
     // Since Drupal is bootstrapped already, install_begin_request() will not
     // bootstrap into DRUPAL_BOOTSTRAP_CONFIGURATION (again). Hence, we have to
     // reload the newly written custom settings.php manually.
@@ -865,7 +881,7 @@ protected function setUp() {
     // directory has to be writable.
     // TestBase::restoreEnvironment() will delete the entire site directory.
     // Not using File API; a potential error must trigger a PHP warning.
-    chmod(DRUPAL_ROOT . '/' . $this->siteDirectory, 0777);
+    chmod($directory, 0777);
 
     $this->rebuildContainer();
 
-- 
GitLab