diff --git a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php b/core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php similarity index 96% rename from core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php rename to core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php index be704d16ed..5f84a3478d 100644 --- a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php +++ b/core/modules/page_cache/tests/src/Functional/PageCacheTagsIntegrationTest.php @@ -1,22 +1,22 @@ setHttpResponseDebugCacheabilityHeaders(FALSE); + // Disable the cacheability headers. + $this->setContainerParameter('http.response.debug_cacheability_headers', FALSE); + $this->rebuildContainer(); + $this->resetAll(); $path = 'system-test/cache_tags_page'; $tags = ['system_test_cache_tags_page']; @@ -185,33 +191,42 @@ public function testConditionalRequests() { // Verify the page is not printed twice when the cache is cold. $this->assertNoPattern('#drupalHead(''); + $this->drupalGet(''); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.'); $etag = $this->drupalGetHeader('ETag'); $last_modified = $this->drupalGetHeader('Last-Modified'); - $this->drupalGet('', [], ['If-Modified-Since: ' . $last_modified, 'If-None-Match: ' . $etag]); + $this->drupalGet('', [], ['If-Modified-Since' => $last_modified, 'If-None-Match' => $etag]); $this->assertResponse(304, 'Conditional request returned 304 Not Modified.'); - $this->drupalGet('', [], ['If-Modified-Since: ' . gmdate(DATE_RFC822, strtotime($last_modified)), 'If-None-Match: ' . $etag]); + $this->drupalGet('', [], [ + 'If-Modified-Since' => gmdate(DATE_RFC822, strtotime($last_modified)), + 'If-None-Match' => $etag, + ]); $this->assertResponse(304, 'Conditional request with obsolete If-Modified-Since date returned 304 Not Modified.'); - $this->drupalGet('', [], ['If-Modified-Since: ' . gmdate(DATE_RFC850, strtotime($last_modified)), 'If-None-Match: ' . $etag]); + $this->drupalGet('', [], [ + 'If-Modified-Since' => gmdate(DATE_RFC850, strtotime($last_modified)), + 'If-None-Match' => $etag, + ]); $this->assertResponse(304, 'Conditional request with obsolete If-Modified-Since date returned 304 Not Modified.'); - $this->drupalGet('', [], ['If-Modified-Since: ' . $last_modified]); + $this->drupalGet('', [], ['If-Modified-Since' => $last_modified, 'If-None-Match' => NULL]); // Verify the page is not printed twice when the cache is warm. $this->assertNoPattern('#assertResponse(200, 'Conditional request without If-None-Match returned 200 OK.'); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.'); - $this->drupalGet('', [], ['If-Modified-Since: ' . gmdate(DateTimePlus::RFC7231, strtotime($last_modified) + 1), 'If-None-Match: ' . $etag]); + $this->drupalGet('', [], [ + 'If-Modified-Since' => gmdate(DateTimePlus::RFC7231, strtotime($last_modified) + 1), + 'If-None-Match' => $etag, + ]); $this->assertResponse(200, 'Conditional request with new a If-Modified-Since date newer than Last-Modified returned 200 OK.'); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.'); $user = $this->drupalCreateUser(); $this->drupalLogin($user); - $this->drupalGet('', [], ['If-Modified-Since: ' . $last_modified, 'If-None-Match: ' . $etag]); + $this->drupalGet('', [], ['If-Modified-Since' => $last_modified, 'If-None-Match' => $etag]); $this->assertResponse(200, 'Conditional request returned 200 OK for authenticated user.'); $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'), 'Absence of Page was not cached.'); } @@ -515,24 +530,27 @@ public function testCacheableResponseResponses() { * Tests that HEAD requests are treated the same as GET requests. */ public function testHead() { + /** @var \GuzzleHttp\ClientInterface $client */ + $client = $this->getSession()->getDriver()->getClient()->getClient(); + // GET, then HEAD. $url_a = $this->buildUrl('system-test/set-header', ['query' => ['name' => 'Foo', 'value' => 'bar']]); - $response_body = $this->curlExec([CURLOPT_HTTPGET => TRUE, CURLOPT_URL => $url_a, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_NOBODY => FALSE]); + $response_body = $this->drupalGet($url_a); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.'); $this->assertEqual($this->drupalGetHeader('Foo'), 'bar', 'Custom header was sent.'); $this->assertEqual('The following header was set: Foo: bar', $response_body); - $response_body = $this->curlExec([CURLOPT_HTTPGET => FALSE, CURLOPT_URL => $url_a, CURLOPT_CUSTOMREQUEST => 'HEAD', CURLOPT_NOBODY => FALSE]); - $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.'); - $this->assertEqual($this->drupalGetHeader('Foo'), 'bar', 'Custom header was sent.'); - $this->assertEqual('', $response_body); + $response = $client->request('HEAD', $url_a); + $this->assertEqual($response->getHeaderLine('X-Drupal-Cache'), 'HIT', 'Page was cached.'); + $this->assertEqual($response->getHeaderLine('Foo'), 'bar', 'Custom header was sent.'); + $this->assertEqual('', $response->getBody()->getContents()); // HEAD, then GET. $url_b = $this->buildUrl('system-test/set-header', ['query' => ['name' => 'Foo', 'value' => 'baz']]); - $response_body = $this->curlExec([CURLOPT_HTTPGET => FALSE, CURLOPT_URL => $url_b, CURLOPT_CUSTOMREQUEST => 'HEAD', CURLOPT_NOBODY => FALSE]); - $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.'); - $this->assertEqual($this->drupalGetHeader('Foo'), 'baz', 'Custom header was sent.'); - $this->assertEqual('', $response_body); - $response_body = $this->curlExec([CURLOPT_HTTPGET => TRUE, CURLOPT_URL => $url_b, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_NOBODY => FALSE]); + $response = $client->request('HEAD', $url_b); + $this->assertEqual($response->getHeaderLine('X-Drupal-Cache'), 'MISS', 'Page was not cached.'); + $this->assertEqual($response->getHeaderLine('Foo'), 'baz', 'Custom header was sent.'); + $this->assertEqual('', $response->getBody()->getContents()); + $response_body = $this->drupalGet($url_b); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.'); $this->assertEqual($this->drupalGetHeader('Foo'), 'baz', 'Custom header was sent.'); $this->assertEqual('The following header was set: Foo: baz', $response_body); @@ -564,18 +582,60 @@ public function testNoUrlNormalization() { ]; foreach ($tests as list($url_raw, $url_normalized)) { - // Initialize cache on raw URL. - $this->drupalGet($url_raw); - $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS'); + $this->assertResponseHeader('X-Drupal-Cache', 'MISS', $url_raw); // Ensure cache was set. - $this->drupalGet($url_raw); - $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', "Cache was set for {$url_raw} URL."); - + $this->assertResponseHeader('X-Drupal-Cache', 'HIT', $url_raw, "Cache was set for {$url_raw} URL."); // Check if the normalized URL is not cached. - $this->drupalGet($url_normalized); - $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', "Cache is missing for {$url_normalized} URL."); + $this->assertResponseHeader('X-Drupal-Cache', 'MISS', $url_normalized, "Cache is missing for {$url_normalized} URL."); } } + /** + * Asserts that the response header has the expected value. + * + * @param string $header + * Header name. + * @param string $expected + * Expected value of the header. + * @param string $url + * The url to test. + * @param string $message + * (optional) A message to display with the assertion. + */ + protected function assertResponseHeader($header, $expected, $url, $message = '') { + $headers = $this->getHeaders($url); + $this->assertSame($expected, $headers[$header], $message); + } + + /** + * Helper to get headers from pure request without any url modifications. + * + * @param string $url + * The URL to request. + * + * @return array + * Array of headers. + */ + protected function getHeaders($url) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HEADER, TRUE); + curl_setopt($ch, CURLOPT_NOBODY, TRUE); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ch, CURLOPT_USERAGENT, drupal_generate_test_ua($this->databasePrefix)); + $output = curl_exec($ch); + curl_close($ch); + + $headers = []; + foreach (explode("\n", $output) as $header) { + if (strpos($header, ':')) { + list($key, $value) = explode(':', $header, 2); + $headers[trim($key)] = trim($value); + } + } + + return $headers; + } + }