diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php index 409c1b95a8e..5f0183ab972 100644 --- a/core/modules/simpletest/src/KernelTestBase.php +++ b/core/modules/simpletest/src/KernelTestBase.php @@ -126,6 +126,13 @@ abstract class KernelTestBase extends UnitTestBase { 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 023cf8e53bc..4b1c4668fd3 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 e46051da7ae..a0e57381d16 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 @@ class SimpleTestTest extends WebTestBase { function setUp() { if (!$this->isInChildSite()) { + $php = <<<'EOD' +siteDirectory. '/' . 'settings.testing.php', $php); + // @see \Drupal\system\Tests\DrupalKernel\DrupalKernelSiteTest + $class = __CLASS__; + $yaml = <<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 @@ class SimpleTestTest extends WebTestBase { * 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 @@ class SimpleTestTest extends WebTestBase { $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 ec50d4dd70f..4072158c30d 100644 --- a/core/modules/simpletest/src/WebTestBase.php +++ b/core/modules/simpletest/src/WebTestBase.php @@ -819,7 +819,8 @@ abstract class WebTestBase extends TestBase { // 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 @@ abstract class WebTestBase extends TestBase { ); $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 @@ abstract class WebTestBase extends TestBase { // 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();