From a857ef37f07adf5a2bcd45d178646ba3ba7948c9 Mon Sep 17 00:00:00 2001 From: catch <catch@35733.no-reply.drupal.org> Date: Fri, 13 Nov 2020 11:21:23 +0000 Subject: [PATCH] Issue #2987980 by alexpott, longwave, Lendude, jibran: Refactor UncaughtExceptionTest to not use cUrl --- .../Bootstrap/UncaughtExceptionTest.php | 147 ++++-------------- 1 file changed, 33 insertions(+), 114 deletions(-) diff --git a/core/tests/Drupal/FunctionalTests/Bootstrap/UncaughtExceptionTest.php b/core/tests/Drupal/FunctionalTests/Bootstrap/UncaughtExceptionTest.php index e044ac371809..9ca45897f39a 100644 --- a/core/tests/Drupal/FunctionalTests/Bootstrap/UncaughtExceptionTest.php +++ b/core/tests/Drupal/FunctionalTests/Bootstrap/UncaughtExceptionTest.php @@ -12,20 +12,6 @@ */ class UncaughtExceptionTest extends BrowserTestBase { - /** - * Last cURL response. - * - * @var string - */ - protected $response = ''; - - /** - * Last cURL info. - * - * @var array - */ - protected $info = []; - /** * Exceptions thrown by site under test that contain this text are ignored. * @@ -56,6 +42,9 @@ protected function setUp(): void { $settings_php = file_get_contents($settings_filename); $settings_php .= "\ninclude_once 'core/tests/Drupal/FunctionalTests/Bootstrap/ErrorContainer.php';\n"; $settings_php .= "\ninclude_once 'core/tests/Drupal/FunctionalTests/Bootstrap/ExceptionContainer.php';\n"; + // Ensure we can test errors rather than being caught in + // \Drupal\Core\Test\HttpClientMiddleware\TestHttpClientMiddleware. + $settings_php .= "\ndefine('SIMPLETEST_COLLECT_ERRORS', FALSE);\n"; file_put_contents($settings_filename, $settings_php); $settings = []; @@ -73,9 +62,6 @@ public function testUncaughtException() { $this->expectedExceptionMessage = 'Oh oh, bananas in the instruments.'; \Drupal::state()->set('error_service_test.break_bare_html_renderer', TRUE); - $this->config('system.logging') - ->set('error_level', ERROR_REPORTING_HIDE) - ->save(); $settings = []; $settings['config']['system.logging']['error_level'] = (object) [ 'value' => ERROR_REPORTING_HIDE, @@ -84,13 +70,10 @@ public function testUncaughtException() { $this->writeSettings($settings); $this->drupalGet(''); - $this->assertResponse(500); - $this->assertText('The website encountered an unexpected error. Please try again later.'); - $this->assertNoText($this->expectedExceptionMessage); + $this->assertSession()->statusCodeEquals(500); + $this->assertSession()->pageTextContains('The website encountered an unexpected error. Please try again later.'); + $this->assertSession()->pageTextNotContains($this->expectedExceptionMessage); - $this->config('system.logging') - ->set('error_level', ERROR_REPORTING_DISPLAY_ALL) - ->save(); $settings = []; $settings['config']['system.logging']['error_level'] = (object) [ 'value' => ERROR_REPORTING_DISPLAY_ALL, @@ -99,9 +82,9 @@ public function testUncaughtException() { $this->writeSettings($settings); $this->drupalGet(''); - $this->assertResponse(500); - $this->assertText('The website encountered an unexpected error. Please try again later.'); - $this->assertText($this->expectedExceptionMessage); + $this->assertSession()->statusCodeEquals(500); + $this->assertSession()->pageTextContains('The website encountered an unexpected error. Please try again later.'); + $this->assertSession()->pageTextContains($this->expectedExceptionMessage); $this->assertErrorLogged($this->expectedExceptionMessage); } @@ -117,13 +100,13 @@ public function testUncaughtFatalError() { '%function' => 'Drupal\error_test\Controller\ErrorTestController->Drupal\error_test\Controller\{closure}()', ]; $this->drupalGet('error-test/generate-fatals'); - $this->assertResponse(500); + $this->assertSession()->statusCodeEquals(500); $message = new FormattableMarkup('%type: @message in %function (line ', $fatal_error); - $this->assertRaw((string) $message); - $this->assertRaw('<pre class="backtrace">'); + $this->assertSession()->responseContains((string) $message); + $this->assertSession()->responseContains('<pre class="backtrace">'); // Ensure we are escaping but not double escaping. - $this->assertRaw('''); - $this->assertNoRaw('&#039;'); + $this->assertSession()->responseContains('''); + $this->assertSession()->responseNotContains('&#039;'); } /** @@ -143,10 +126,10 @@ public function testUncaughtExceptionCustomExceptionHandler() { \Drupal::state()->set('error_service_test.break_bare_html_renderer', TRUE); $this->drupalGet(''); - $this->assertResponse(418); - $this->assertNoText('The website encountered an unexpected error. Please try again later.'); - $this->assertNoText('Oh oh, bananas in the instruments'); - $this->assertText('Oh oh, flying teapots'); + $this->assertSession()->statusCodeEquals(418); + $this->assertSession()->pageTextNotContains('The website encountered an unexpected error. Please try again later.'); + $this->assertSession()->pageTextNotContains('Oh oh, bananas in the instruments'); + $this->assertSession()->pageTextContains('Oh oh, flying teapots'); } /** @@ -160,10 +143,10 @@ public function testMissingDependency() { $this->expectedExceptionMessage = 'Too few arguments to function Drupal\error_service_test\LonelyMonkeyClass::__construct(), 0 passed'; } $this->drupalGet('broken-service-class'); - $this->assertResponse(500); + $this->assertSession()->statusCodeEquals(500); - $this->assertRaw('The website encountered an unexpected error.'); - $this->assertRaw($this->expectedExceptionMessage); + $this->assertSession()->pageTextContains('The website encountered an unexpected error.'); + $this->assertSession()->pageTextContains($this->expectedExceptionMessage); $this->assertErrorLogged($this->expectedExceptionMessage); } @@ -184,8 +167,8 @@ public function testMissingDependencyCustomErrorHandler() { file_put_contents($settings_filename, $settings_php); $this->drupalGet('broken-service-class'); - $this->assertResponse(418); - $this->assertSame('Oh oh, flying teapots', $this->response); + $this->assertSession()->statusCodeEquals(418); + $this->assertSession()->responseContains('Oh oh, flying teapots'); } /** @@ -204,9 +187,9 @@ public function testErrorContainer() { 'Drupal\FunctionalTests\Bootstrap\ErrorContainer::Drupal\FunctionalTests\Bootstrap\{closure}(): Argument #1 ($container) must be of type Drupal\FunctionalTests\Bootstrap\ErrorContainer' : 'Argument 1 passed to Drupal\FunctionalTests\Bootstrap\ErrorContainer::Drupal\FunctionalTests\Bootstrap\{closur'; $this->drupalGet(''); - $this->assertResponse(500); + $this->assertSession()->statusCodeEquals(500); - $this->assertRaw($this->expectedExceptionMessage); + $this->assertSession()->pageTextContains($this->expectedExceptionMessage); $this->assertErrorLogged($this->expectedExceptionMessage); } @@ -224,10 +207,10 @@ public function testExceptionContainer() { $this->expectedExceptionMessage = 'Thrown exception during Container::get'; $this->drupalGet(''); - $this->assertResponse(500); + $this->assertSession()->statusCodeEquals(500); - $this->assertRaw('The website encountered an unexpected error'); - $this->assertRaw($this->expectedExceptionMessage); + $this->assertSession()->pageTextContains('The website encountered an unexpected error'); + $this->assertSession()->pageTextContains($this->expectedExceptionMessage); $this->assertErrorLogged($this->expectedExceptionMessage); } @@ -261,8 +244,8 @@ public function testLostDatabaseConnection() { $this->writeSettings($settings); $this->drupalGet(''); - $this->assertResponse(500); - $this->assertRaw('DatabaseAccessDeniedException'); + $this->assertSession()->statusCodeEquals(500); + $this->assertSession()->pageTextContains('DatabaseAccessDeniedException'); $this->assertErrorLogged($this->expectedExceptionMessage); } @@ -277,9 +260,9 @@ public function testLoggerException() { \Drupal::state()->set('error_service_test.break_logger', TRUE); $this->drupalGet(''); - $this->assertResponse(500); - $this->assertText('The website encountered an unexpected error. Please try again later.'); - $this->assertRaw($this->expectedExceptionMessage); + $this->assertSession()->statusCodeEquals(500); + $this->assertSession()->pageTextContains('The website encountered an unexpected error. Please try again later.'); + $this->assertSession()->pageTextContains($this->expectedExceptionMessage); // Find fatal error logged to the error.log $errors = file(\Drupal::root() . '/' . $this->siteDirectory . '/error.log'); @@ -339,68 +322,4 @@ protected function assertNoErrorsLogged() { $this->assertFileNotExists(DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'); } - /** - * Retrieves a Drupal path or an absolute path. - * - * Executes a cURL request for processing errors and exceptions. - * - * @param string|\Drupal\Core\Url $path - * Request path. - * @param array $extra_options - * (optional) Curl options to pass to curl_setopt() - * @param array $headers - * (optional) Not used. - */ - protected function drupalGet($path, array $extra_options = [], array $headers = []) { - $url = $this->buildUrl($path, ['absolute' => TRUE]); - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_HEADER, FALSE); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); - curl_setopt($ch, CURLOPT_USERAGENT, drupal_generate_test_ua($this->databasePrefix)); - $this->response = curl_exec($ch); - $this->info = curl_getinfo($ch); - curl_close($ch); - } - - /** - * Asserts the page responds with the specified response code. - * - * @param int $code - * Response code. For example 200 is a successful page request. For a list - * of all codes see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. - */ - protected function assertResponse($code) { - $this->assertSame($code, $this->info['http_code']); - } - - /** - * {@inheritdoc} - */ - protected function assertText($text) { - $this->assertStringContainsString($text, $this->response); - } - - /** - * {@inheritdoc} - */ - protected function assertNoText($text) { - $this->assertStringNotContainsString($text, $this->response); - } - - /** - * {@inheritdoc} - */ - protected function assertRaw($text) { - $this->assertText($text); - } - - /** - * {@inheritdoc} - */ - protected function assertNoRaw($text) { - $this->assertNoText($text); - } - } -- GitLab