diff --git a/core/modules/system/src/Tests/Bootstrap/ErrorContainer.php b/core/tests/Drupal/FunctionalTests/Bootstrap/ErrorContainer.php similarity index 92% rename from core/modules/system/src/Tests/Bootstrap/ErrorContainer.php rename to core/tests/Drupal/FunctionalTests/Bootstrap/ErrorContainer.php index e8afa4b1d0..e88cc88c90 100644 --- a/core/modules/system/src/Tests/Bootstrap/ErrorContainer.php +++ b/core/tests/Drupal/FunctionalTests/Bootstrap/ErrorContainer.php @@ -1,6 +1,6 @@ siteDirectory . '/settings.php'; chmod($settings_filename, 0777); $settings_php = file_get_contents($settings_filename); - $settings_php .= "\ninclude_once 'core/modules/system/src/Tests/Bootstrap/ErrorContainer.php';\n"; - $settings_php .= "\ninclude_once 'core/modules/system/src/Tests/Bootstrap/ExceptionContainer.php';\n"; + $settings_php .= "\ninclude_once 'core/tests/Drupal/FunctionalTests/Bootstrap/ErrorContainer.php';\n"; + $settings_php .= "\ninclude_once 'core/tests/Drupal/FunctionalTests/Bootstrap/ExceptionContainer.php';\n"; file_put_contents($settings_filename, $settings_php); $settings = []; @@ -142,25 +142,13 @@ public function testMissingDependencyCustomErrorHandler() { $settings_php .= "\$settings['teapots'] = TRUE;\n"; file_put_contents($settings_filename, $settings_php); + $message = 'Argument 1 passed to Drupal\error_service_test\LonelyMonkeyClass::__construct() must be an instance of Drupal\Core\Database\Connection, non'; $this->drupalGet('broken-service-class'); $this->assertResponse(418); $this->assertRaw('Oh oh, flying teapots'); - $message = 'Argument 1 passed to Drupal\error_service_test\LonelyMonkeyClass::__construct() must be an instance of Drupal\Core\Database\Connection, non'; - $this->assertNoRaw('The website encountered an unexpected error.'); $this->assertNoRaw($message); - - $found_exception = FALSE; - foreach ($this->assertions as &$assertion) { - if (strpos($assertion['message'], $message) !== FALSE) { - $found_exception = TRUE; - $this->deleteAssert($assertion['message_id']); - unset($assertion); - } - } - - $this->assertTrue($found_exception, 'Ensure that the exception of a missing constructor argument was triggered.'); } /** @@ -169,13 +157,13 @@ public function testMissingDependencyCustomErrorHandler() { public function testErrorContainer() { $settings = []; $settings['settings']['container_base_class'] = (object) [ - 'value' => '\Drupal\system\Tests\Bootstrap\ErrorContainer', + 'value' => '\Drupal\FunctionalTests\Bootstrap\ErrorContainer', 'required' => TRUE, ]; $this->writeSettings($settings); \Drupal::service('kernel')->invalidateContainer(); - $this->expectedExceptionMessage = 'Argument 1 passed to Drupal\system\Tests\Bootstrap\ErrorContainer::Drupal\system\Tests\Bootstrap\{closur'; + $this->expectedExceptionMessage = 'Argument 1 passed to Drupal\FunctionalTests\Bootstrap\ErrorContainer::Drupal\FunctionalTests\Bootstrap\{closur'; $this->drupalGet(''); $this->assertResponse(500); @@ -189,7 +177,7 @@ public function testErrorContainer() { public function testExceptionContainer() { $settings = []; $settings['settings']['container_base_class'] = (object) [ - 'value' => '\Drupal\system\Tests\Bootstrap\ExceptionContainer', + 'value' => '\Drupal\FunctionalTests\Bootstrap\ExceptionContainer', 'required' => TRUE, ]; $this->writeSettings($settings); @@ -254,7 +242,7 @@ public function testLoggerException() { $this->assertText('The website encountered an unexpected error. Please try again later.'); $this->assertRaw($this->expectedExceptionMessage); - // Find fatal error logged to the simpletest error.log + // Find fatal error logged to the error.log $errors = file(\Drupal::root() . '/' . $this->siteDirectory . '/error.log'); $this->assertIdentical(count($errors), 8, 'The error + the error that the logging service is broken has been written to the error log.'); $this->assertTrue(strpos($errors[0], 'Failed to log error') !== FALSE, 'The error handling logs when an error could not be logged to the logger.'); @@ -270,14 +258,48 @@ public function testLoggerException() { } /** - * {@inheritdoc} + * Asserts that a specific error has been logged to the PHP error log. + * + * @param string $error_message + * The expected error message. + * + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see \Drupal\Core\DrupalKernel::bootConfiguration() */ - protected function error($message = '', $group = 'Other', array $caller = NULL) { - if (!empty($this->expectedExceptionMessage) && strpos($message, $this->expectedExceptionMessage) !== FALSE) { - // We're expecting this error. - return FALSE; + protected function assertErrorLogged($error_message) { + $error_log_filename = DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'; + if (!file_exists($error_log_filename)) { + $this->fail('No error logged yet.'); } - return parent::error($message, $group, $caller); + + $content = file_get_contents($error_log_filename); + $rows = explode(PHP_EOL, $content); + + // We iterate over the rows in order to be able to remove the logged error + // afterwards. + $found = FALSE; + foreach ($rows as $row_index => $row) { + if (strpos($content, $error_message) !== FALSE) { + $found = TRUE; + unset($rows[$row_index]); + } + } + + file_put_contents($error_log_filename, implode("\n", $rows)); + + $this->assertTrue($found, sprintf('The %s error message was logged.', $error_message)); + } + + /** + * Asserts that no errors have been logged to the PHP error.log thus far. + * + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see \Drupal\Core\DrupalKernel::bootConfiguration() + */ + protected function assertNoErrorsLogged() { + // Since PHP only creates the error.log file when an actual error is + // triggered, it is sufficient to check whether the file exists. + $this->assertFalse(file_exists(DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'), 'PHP error.log is empty.'); } }