name: HttpCacheTest
class_comment: '# * @group time-sensitive'
dependencies:
- name: EventDispatcher
  type: class
  source: Symfony\Component\EventDispatcher\EventDispatcher
- name: Request
  type: class
  source: Symfony\Component\HttpFoundation\Request
- name: Response
  type: class
  source: Symfony\Component\HttpFoundation\Response
- name: TerminateEvent
  type: class
  source: Symfony\Component\HttpKernel\Event\TerminateEvent
- name: Esi
  type: class
  source: Symfony\Component\HttpKernel\HttpCache\Esi
- name: HttpCache
  type: class
  source: Symfony\Component\HttpKernel\HttpCache\HttpCache
- name: StoreInterface
  type: class
  source: Symfony\Component\HttpKernel\HttpCache\StoreInterface
- name: HttpKernelInterface
  type: class
  source: Symfony\Component\HttpKernel\HttpKernelInterface
- name: Kernel
  type: class
  source: Symfony\Component\HttpKernel\Kernel
properties: []
methods:
- name: testHttpCacheIsSetAsATrustedProxy
  visibility: public
  parameters:
  - name: existing
  comment: "# * @group time-sensitive\n# */\n# class HttpCacheTest extends HttpCacheTestCase\n\
    # {\n# public function testTerminateDelegatesTerminationOnlyForTerminableInterface()\n\
    # {\n# $storeMock = $this->getMockBuilder(StoreInterface::class)\n# ->disableOriginalConstructor()\n\
    # ->getMock();\n# \n# // does not implement TerminableInterface\n# $kernel = new\
    \ TestKernel();\n# $httpCache = new HttpCache($kernel, $storeMock);\n# $httpCache->terminate(Request::create('/'),\
    \ new Response());\n# \n# $this->assertFalse($kernel->terminateCalled, 'terminate()\
    \ is never called if the kernel class does not implement TerminableInterface');\n\
    # \n# // implements TerminableInterface\n# $kernelMock = $this->getMockBuilder(Kernel::class)\n\
    # ->disableOriginalConstructor()\n# ->onlyMethods(['terminate', 'registerBundles',\
    \ 'registerContainerConfiguration'])\n# ->getMock();\n# \n# $kernelMock->expects($this->once())\n\
    # ->method('terminate');\n# \n# $kernel = new HttpCache($kernelMock, $storeMock);\n\
    # $kernel->terminate(Request::create('/'), new Response());\n# }\n# \n# public\
    \ function testDoesNotCallTerminateOnFreshResponse()\n# {\n# $terminateEvents\
    \ = [];\n# \n# $eventDispatcher = $this->createMock(EventDispatcher::class);\n\
    # $eventDispatcher\n# ->expects($this->any())\n# ->method('dispatch')\n# ->with($this->callback(function\
    \ ($event) use (&$terminateEvents) {\n# if ($event instanceof TerminateEvent)\
    \ {\n# $terminateEvents[] = $event;\n# }\n# \n# return true;\n# }));\n# \n# $this->setNextResponse(\n\
    # 200,\n# [\n# 'ETag' => '1234',\n# 'Cache-Control' => 'public, s-maxage=60',\n\
    # ],\n# 'Hello World',\n# null,\n# $eventDispatcher\n# );\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # $this->cache->terminate($this->request, $this->response);\n# \n# sleep(2);\n\
    # \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
    \ $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
    # $this->assertEquals(2, $this->response->headers->get('Age'));\n# $this->cache->terminate($this->request,\
    \ $this->response);\n# \n# $this->assertCount(1, $terminateEvents);\n# }\n# \n\
    # public function testPassesOnNonGetHeadRequests()\n# {\n# $this->setNextResponse(200);\n\
    # $this->request('POST', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n\
    # $this->assertTraceContains('pass');\n# $this->assertFalse($this->response->headers->has('Age'));\n\
    # }\n# \n# public function testInvalidatesOnPostPutDeleteRequests()\n# {\n# foreach\
    \ (['post', 'put', 'delete'] as $method) {\n# $this->setNextResponse(200);\n#\
    \ $this->request($method, '/');\n# \n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n\
    # $this->assertTraceContains('invalidate');\n# $this->assertTraceContains('pass');\n\
    # }\n# }\n# \n# public function testDoesNotCacheWithAuthorizationRequestHeaderAndNonPublicResponse()\n\
    # {\n# $this->setNextResponse(200, ['ETag' => '\"Foo\"']);\n# $this->request('GET',\
    \ '/', ['HTTP_AUTHORIZATION' => 'basic foobarbaz']);\n# \n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertResponseOk();\n# $this->assertEquals('private', $this->response->headers->get('Cache-Control'));\n\
    # \n# $this->assertTraceContains('miss');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
    \ function testDoesCacheWithAuthorizationRequestHeaderAndPublicResponse()\n# {\n\
    # $this->setNextResponse(200, ['Cache-Control' => 'public', 'ETag' => '\"Foo\"\
    ']);\n# $this->request('GET', '/', ['HTTP_AUTHORIZATION' => 'basic foobarbaz']);\n\
    # \n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertTrue($this->response->headers->has('Age'));\n\
    # $this->assertEquals('public', $this->response->headers->get('Cache-Control'));\n\
    # }\n# \n# public function testDoesNotCacheWithCookieHeaderAndNonPublicResponse()\n\
    # {\n# $this->setNextResponse(200, ['ETag' => '\"Foo\"']);\n# $this->request('GET',\
    \ '/', [], ['foo' => 'bar']);\n# \n# $this->assertHttpKernelIsCalled();\n# $this->assertResponseOk();\n\
    # $this->assertEquals('private', $this->response->headers->get('Cache-Control'));\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
    \ function testDoesNotCacheRequestsWithACookieHeader()\n# {\n# $this->setNextResponse(200);\n\
    # $this->request('GET', '/', [], ['foo' => 'bar']);\n# \n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertResponseOk();\n# $this->assertEquals('private', $this->response->headers->get('Cache-Control'));\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
    \ function testRespondsWith304WhenIfModifiedSinceMatchesLastModified()\n# {\n\
    # $time = \\DateTimeImmutable::createFromFormat('U', time());\n# \n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public', 'Last-Modified' => $time->format(\\DATE_RFC2822),\
    \ 'Content-Type' => 'text/plain'], 'Hello World');\n# $this->request('GET', '/',\
    \ ['HTTP_IF_MODIFIED_SINCE' => $time->format(\\DATE_RFC2822)]);\n# \n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(304, $this->response->getStatusCode());\n# $this->assertEquals('',\
    \ $this->response->headers->get('Content-Type'));\n# $this->assertEmpty($this->response->getContent());\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # }\n# \n# public function testRespondsWith304WhenIfNoneMatchMatchesETag()\n#\
    \ {\n# $this->setNextResponse(200, ['Cache-Control' => 'public', 'ETag' => '12345',\
    \ 'Content-Type' => 'text/plain'], 'Hello World');\n# $this->request('GET', '/',\
    \ ['HTTP_IF_NONE_MATCH' => '12345']);\n# \n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(304, $this->response->getStatusCode());\n# $this->assertEquals('',\
    \ $this->response->headers->get('Content-Type'));\n# $this->assertTrue($this->response->headers->has('ETag'));\n\
    # $this->assertEmpty($this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# }\n# \n# public function testRespondsWith304WhenIfNoneMatchAndIfModifiedSinceBothMatch()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# \n# $this->setNextResponse(200,\
    \ [], '', function ($request, $response) use ($time) {\n# $response->setStatusCode(200);\n\
    # $response->headers->set('ETag', '12345');\n# $response->headers->set('Last-Modified',\
    \ $time->format(\\DATE_RFC2822));\n# $response->headers->set('Content-Type', 'text/plain');\n\
    # $response->setContent('Hello World');\n# });\n# \n# // only ETag matches\n#\
    \ $t = \\DateTimeImmutable::createFromFormat('U', time() - 3600);\n# $this->request('GET',\
    \ '/', ['HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $t->format(\\\
    DATE_RFC2822)]);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(304,\
    \ $this->response->getStatusCode());\n# \n# // only Last-Modified matches\n# $this->request('GET',\
    \ '/', ['HTTP_IF_NONE_MATCH' => '1234', 'HTTP_IF_MODIFIED_SINCE' => $time->format(\\\
    DATE_RFC2822)]);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# \n# // Both matches\n# $this->request('GET',\
    \ '/', ['HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $time->format(\\\
    DATE_RFC2822)]);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(304,\
    \ $this->response->getStatusCode());\n# }\n# \n# public function testIncrementsMaxAgeWhenNoDateIsSpecifiedEventWhenUsingETag()\n\
    # {\n# $this->setNextResponse(\n# 200,\n# [\n# 'ETag' => '1234',\n# 'Cache-Control'\
    \ => 'public, s-maxage=60',\n# ]\n# );\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# \n# sleep(2);\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('fresh');\n# $this->assertEquals(2, $this->response->headers->get('Age'));\n\
    # }\n# \n# public function testValidatesPrivateResponsesCachedOnTheClient()\n\
    # {\n# $this->setNextResponse(200, [], '', function (Request $request, $response)\
    \ {\n# $etags = preg_split('/\\s*,\\s*/', $request->headers->get('IF_NONE_MATCH',\
    \ ''));\n# if ($request->cookies->has('authenticated')) {\n# $response->headers->set('Cache-Control',\
    \ 'private, no-store');\n# $response->setETag('\"private tag\"');\n# if (\\in_array('\"\
    private tag\"', $etags, true)) {\n# $response->setStatusCode(304);\n# } else {\n\
    # $response->setStatusCode(200);\n# $response->headers->set('Content-Type', 'text/plain');\n\
    # $response->setContent('private data');\n# }\n# } else {\n# $response->headers->set('Cache-Control',\
    \ 'public');\n# $response->setETag('\"public tag\"');\n# if (\\in_array('\"public\
    \ tag\"', $etags, true)) {\n# $response->setStatusCode(304);\n# } else {\n# $response->setStatusCode(200);\n\
    # $response->headers->set('Content-Type', 'text/plain');\n# $response->setContent('public\
    \ data');\n# }\n# }\n# });\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('\"\
    public tag\"', $this->response->headers->get('ETag'));\n# $this->assertEquals('public\
    \ data', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# \n# $this->request('GET', '/', [], ['authenticated'\
    \ => '']);\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('\"private tag\"', $this->response->headers->get('ETag'));\n\
    # $this->assertEquals('private data', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
    # $this->assertTraceContains('invalid');\n# $this->assertTraceNotContains('store');\n\
    # }\n# \n# public function testStoresResponsesWhenNoCacheRequestDirectivePresent()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# \n#\
    \ $this->setNextResponse(200, ['Cache-Control' => 'public', 'Expires' => $time->format(\\\
    DATE_RFC2822)]);\n# $this->request('GET', '/', ['HTTP_CACHE_CONTROL' => 'no-cache']);\n\
    # \n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('store');\n\
    # $this->assertTrue($this->response->headers->has('Age'));\n# }\n# \n# public\
    \ function testReloadsResponsesWhenCacheHitsButNoCacheRequestDirectivePresentWhenAllowReloadIsSetTrue()\n\
    # {\n# $count = 0;\n# \n# $this->setNextResponse(200, ['Cache-Control' => 'public,\
    \ max-age=10000'], '', function ($request, $response) use (&$count) {\n# ++$count;\n\
    # $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');\n# });\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
    # \n# $this->cacheConfig['allow_reload'] = true;\n# $this->request('GET', '/',\
    \ ['HTTP_CACHE_CONTROL' => 'no-cache']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Goodbye World', $this->response->getContent());\n# $this->assertTraceContains('reload');\n\
    # $this->assertTraceContains('store');\n# }\n# \n# public function testDoesNotReloadResponsesWhenAllowReloadIsSetFalseDefault()\n\
    # {\n# $count = 0;\n# \n# $this->setNextResponse(200, ['Cache-Control' => 'public,\
    \ max-age=10000'], '', function ($request, $response) use (&$count) {\n# ++$count;\n\
    # $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');\n# });\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
    # \n# $this->cacheConfig['allow_reload'] = false;\n# $this->request('GET', '/',\
    \ ['HTTP_CACHE_CONTROL' => 'no-cache']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceNotContains('reload');\n\
    # \n# $this->request('GET', '/', ['HTTP_CACHE_CONTROL' => 'no-cache']);\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # $this->assertTraceNotContains('reload');\n# }\n# \n# public function testRevalidatesFreshCacheEntryWhenMaxAgeRequestDirectiveIsExceededWhenAllowRevalidateOptionIsSetTrue()\n\
    # {\n# $count = 0;\n# \n# $this->setNextResponse(200, [], '', function ($request,\
    \ $response) use (&$count) {\n# ++$count;\n# $response->headers->set('Cache-Control',\
    \ 'public, max-age=10000');\n# $response->setETag($count);\n# $response->setContent(1\
    \ == $count ? 'Hello World' : 'Goodbye World');\n# });\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
    # \n# $this->cacheConfig['allow_revalidate'] = true;\n# $this->request('GET',\
    \ '/', ['HTTP_CACHE_CONTROL' => 'max-age=0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Goodbye World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
    # $this->assertTraceContains('invalid');\n# $this->assertTraceContains('store');\n\
    # }\n# \n# public function testDoesNotRevalidateFreshCacheEntryWhenEnableRevalidateOptionIsSetFalseDefault()\n\
    # {\n# $count = 0;\n# \n# $this->setNextResponse(200, [], '', function ($request,\
    \ $response) use (&$count) {\n# ++$count;\n# $response->headers->set('Cache-Control',\
    \ 'public, max-age=10000');\n# $response->setETag($count);\n# $response->setContent(1\
    \ == $count ? 'Hello World' : 'Goodbye World');\n# });\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertTraceContains('store');\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
    # \n# $this->cacheConfig['allow_revalidate'] = false;\n# $this->request('GET',\
    \ '/', ['HTTP_CACHE_CONTROL' => 'max-age=0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceNotContains('stale');\n\
    # $this->assertTraceNotContains('invalid');\n# $this->assertTraceContains('fresh');\n\
    # \n# $this->request('GET', '/', ['HTTP_CACHE_CONTROL' => 'max-age=0']);\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # $this->assertTraceNotContains('stale');\n# $this->assertTraceNotContains('invalid');\n\
    # $this->assertTraceContains('fresh');\n# }\n# \n# public function testFetchesResponseFromBackendWhenCacheMisses()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public', 'Expires' => $time->format(\\DATE_RFC2822)]);\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('miss');\n# $this->assertTrue($this->response->headers->has('Age'));\n\
    # }\n# \n# public function testDoesNotCacheSomeStatusCodeResponses()\n# {\n# foreach\
    \ (array_merge(range(201, 202), range(204, 206), range(303, 305), range(400, 403),\
    \ range(405, 409), range(411, 417), range(500, 505)) as $code) {\n# $time = \\\
    DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse($code,\
    \ ['Expires' => $time->format(\\DATE_RFC2822)]);\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertEquals($code, $this->response->getStatusCode());\n# $this->assertTraceNotContains('store');\n\
    # $this->assertFalse($this->response->headers->has('Age'));\n# }\n# }\n# \n# public\
    \ function testDoesNotCacheResponsesWithExplicitNoStoreDirective()\n# {\n# $time\
    \ = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
    \ ['Expires' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 'no-store']);\n\
    # \n# $this->request('GET', '/');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertFalse($this->response->headers->has('Age'));\n# }\n# \n# public\
    \ function testDoesNotCacheResponsesWithoutFreshnessInformationOrAValidator()\n\
    # {\n# $this->setNextResponse();\n# \n# $this->request('GET', '/');\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertTraceNotContains('store');\n\
    # }\n# \n# public function testCachesResponsesWithExplicitNoCacheDirective()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
    \ ['Expires' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 'public, no-cache']);\n\
    # \n# $this->request('GET', '/');\n# $this->assertTraceContains('store');\n# $this->assertTrue($this->response->headers->has('Age'));\n\
    # }\n# \n# public function testRevalidatesResponsesWithNoCacheDirectiveEvenIfFresh()\n\
    # {\n# $this->setNextResponse(200, ['Cache-Control' => 'public, no-cache, max-age=10',\
    \ 'ETag' => 'some-etag'], 'OK');\n# $this->request('GET', '/'); // warm the cache\n\
    # \n# sleep(5);\n# \n# $this->setNextResponse(304, ['Cache-Control' => 'public,\
    \ no-cache, max-age=10', 'ETag' => 'some-etag']);\n# $this->request('GET', '/');\n\
    # \n# $this->assertHttpKernelIsCalled(); // no-cache -> MUST have revalidated\
    \ at origin\n# $this->assertTraceContains('valid');\n# $this->assertEquals('OK',\
    \ $this->response->getContent());\n# $this->assertEquals(0, $this->response->getAge());\n\
    # }\n# \n# public function testCachesResponsesWithAnExpirationHeader()\n# {\n\
    # $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public', 'Expires' => $time->format(\\DATE_RFC2822)]);\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # \n# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
    # }\n# \n# public function testCachesResponsesWithAMaxAgeDirective()\n# {\n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public, max-age=5']);\n# \n# $this->request('GET', '/');\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # \n# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
    # }\n# \n# public function testCachesResponsesWithASMaxAgeDirective()\n# {\n#\
    \ $this->setNextResponse(200, ['Cache-Control' => 's-maxage=5']);\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # \n# $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
    # }\n# \n# public function testCachesResponsesWithALastModifiedValidatorButNoFreshnessInformation()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public', 'Last-Modified' => $time->format(\\DATE_RFC2822)]);\n\
    # \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# }\n# \n# public function testCachesResponsesWithAnETagValidatorButNoFreshnessInformation()\n\
    # {\n# $this->setNextResponse(200, ['Cache-Control' => 'public', 'ETag' => '\"\
    123456\"']);\n# \n# $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# }\n# \n# public function testHitsCachedResponsesWithExpiresHeader()\n\
    # {\n# $time1 = \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $time2\
    \ = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public', 'Date' => $time1->format(\\DATE_RFC2822), 'Expires'\
    \ => $time2->format(\\DATE_RFC2822)]);\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertLessThan(2, strtotime($this->responses[0]->headers->get('Date'))\
    \ - strtotime($this->response->headers->get('Date')));\n# $this->assertGreaterThan(0,\
    \ $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
    # $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
    # public function testHitsCachedResponseWithMaxAgeDirective()\n# {\n# $time =\
    \ \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $this->setNextResponse(200,\
    \ ['Date' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 'public, max-age=10']);\n\
    # \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertLessThan(2, strtotime($this->responses[0]->headers->get('Date'))\
    \ - strtotime($this->response->headers->get('Date')));\n# $this->assertGreaterThan(0,\
    \ $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
    # $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
    # public function testDegradationWhenCacheLocked()\n# {\n# if ('\\\\' === \\DIRECTORY_SEPARATOR)\
    \ {\n# $this->markTestSkipped('Skips on windows to avoid permissions issues.');\n\
    # }\n# \n# $this->cacheConfig['stale_while_revalidate'] = 10;\n# \n# // The presence\
    \ of Last-Modified makes this cacheable (because Response::isValidateable() then).\n\
    # $this->setNextResponse(200, ['Cache-Control' => 'public, s-maxage=5', 'Last-Modified'\
    \ => 'some while ago'], 'Old response');\n# $this->request('GET', '/'); // warm\
    \ the cache\n# \n# // Now, lock the cache\n# $concurrentRequest = Request::create('/',\
    \ 'GET');\n# $this->store->lock($concurrentRequest);\n# \n# /*\n# *  After 10s,\
    \ the cached response has become stale. Yet, we're still within the \"stale_while_revalidate\"\
    \n# *  timeout so we may serve the stale response.\n# */\n# sleep(10);\n# \n#\
    \ $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertTraceContains('stale-while-revalidate');\n\
    # $this->assertEquals('Old response', $this->response->getContent());\n# \n# /*\n\
    # * Another 10s later, stale_while_revalidate is over. Resort to serving the old\
    \ response, but\n# * do so with a \"server unavailable\" message.\n# */\n# sleep(10);\n\
    # \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
    \ $this->assertEquals(503, $this->response->getStatusCode());\n# $this->assertEquals('Old\
    \ response', $this->response->getContent());\n# }\n# \n# public function testHitsCachedResponseWithSMaxAgeDirective()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $this->setNextResponse(200,\
    \ ['Date' => $time->format(\\DATE_RFC2822), 'Cache-Control' => 's-maxage=10, max-age=0']);\n\
    # \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertTraceContains('miss');\n# $this->assertTraceContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertLessThan(2, strtotime($this->responses[0]->headers->get('Date'))\
    \ - strtotime($this->response->headers->get('Date')));\n# $this->assertGreaterThan(0,\
    \ $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
    # $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
    # public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformation()\n\
    # {\n# $this->setNextResponse();\n# \n# $this->cacheConfig['default_ttl'] = 10;\n\
    # $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # $this->assertMatchesRegularExpression('/s-maxage=10/', $this->response->headers->get('Cache-Control'));\n\
    # \n# $this->cacheConfig['default_ttl'] = 10;\n# $this->request('GET', '/');\n\
    # $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=10/',\
    \ $this->response->headers->get('Cache-Control'));\n# }\n# \n# public function\
    \ testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAfterTtlWasExpired()\n\
    # {\n# $this->setNextResponse();\n# \n# $this->cacheConfig['default_ttl'] = 2;\n\
    # $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # $this->assertMatchesRegularExpression('/s-maxage=(2|3)/', $this->response->headers->get('Cache-Control'));\n\
    # \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
    \ $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
    # $this->assertTraceNotContains('store');\n# $this->assertEquals('Hello World',\
    \ $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
    \ $this->response->headers->get('Cache-Control'));\n# \n# // expires the cache\n\
    # $values = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n\
    # $tmp = unserialize($values[0]);\n# $time = \\DateTimeImmutable::createFromFormat('U',\
    \ time() - 5);\n# $tmp[0][1]['date'] = $time->format(\\DATE_RFC2822);\n# $r =\
    \ new \\ReflectionObject($this->store);\n# $m = $r->getMethod('save');\n# $m->invoke($this->store,\
    \ 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('stale');\n# $this->assertTraceContains('invalid');\n\
    # $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # $this->assertMatchesRegularExpression('/s-maxage=(2|3)/', $this->response->headers->get('Cache-Control'));\n\
    # \n# $this->setNextResponse();\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
    # $this->assertTraceNotContains('store');\n# $this->assertEquals('Hello World',\
    \ $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
    \ $this->response->headers->get('Cache-Control'));\n# }\n# \n# public function\
    \ testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAfterTtlWasExpiredWithStatus304()\n\
    # {\n# $this->setNextResponse();\n# \n# $this->cacheConfig['default_ttl'] = 2;\n\
    # $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # $this->assertMatchesRegularExpression('/s-maxage=(2|3)/', $this->response->headers->get('Cache-Control'));\n\
    # \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n#\
    \ $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('fresh');\n\
    # $this->assertTraceNotContains('store');\n# $this->assertEquals('Hello World',\
    \ $this->response->getContent());\n# \n# // expires the cache\n# $values = $this->getMetaStorageValues();\n\
    # $this->assertCount(1, $values);\n# $tmp = unserialize($values[0]);\n# $time\
    \ = \\DateTimeImmutable::createFromFormat('U', time() - 5);\n# $tmp[0][1]['date']\
    \ = $time->format(\\DATE_RFC2822);\n# $r = new \\ReflectionObject($this->store);\n\
    # $m = $r->getMethod('save');\n# $m->invoke($this->store, 'md'.hash('sha256',\
    \ 'http://localhost/'), serialize($tmp));\n# \n# $this->request('GET', '/');\n\
    # $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('stale');\n# $this->assertTraceContains('valid');\n\
    # $this->assertTraceContains('store');\n# $this->assertTraceNotContains('miss');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
    \ $this->response->headers->get('Cache-Control'));\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertMatchesRegularExpression('/s-maxage=(2|3)/',\
    \ $this->response->headers->get('Cache-Control'));\n# }\n# \n# public function\
    \ testDoesNotAssignDefaultTtlWhenResponseHasMustRevalidateDirective()\n# {\n#\
    \ $this->setNextResponse(200, ['Cache-Control' => 'must-revalidate']);\n# \n#\
    \ $this->cacheConfig['default_ttl'] = 10;\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceNotContains('store');\n# $this->assertDoesNotMatchRegularExpression('/s-maxage/',\
    \ $this->response->headers->get('Cache-Control'));\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# }\n# \n# public function testFetchesFullResponseWhenCacheStaleAndNoValidatorsPresent()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time() + 5);\n# $this->setNextResponse(200,\
    \ ['Cache-Control' => 'public', 'Expires' => $time->format(\\DATE_RFC2822)]);\n\
    # \n# // build initial request\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Date'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertNotNull($this->response->headers->get('Age'));\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertEquals('Hello World', $this->response->getContent());\n\
    # \n# // go in and play around with the cached metadata directly ...\n# $values\
    \ = $this->getMetaStorageValues();\n# $this->assertCount(1, $values);\n# $tmp\
    \ = unserialize($values[0]);\n# $time = \\DateTimeImmutable::createFromFormat('U',\
    \ time());\n# $tmp[0][1]['expires'] = $time->format(\\DATE_RFC2822);\n# $r = new\
    \ \\ReflectionObject($this->store);\n# $m = $r->getMethod('save');\n# $m->invoke($this->store,\
    \ 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));\n# \n# // build\
    \ subsequent request; should be found but miss due to freshness\n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertLessThanOrEqual(1, $this->response->headers->get('Age'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
    # $this->assertTraceContains('stale');\n# $this->assertTraceNotContains('fresh');\n\
    # $this->assertTraceNotContains('miss');\n# $this->assertTraceContains('store');\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# }\n# \n\
    # public function testValidatesCachedResponsesWithLastModifiedAndNoFreshnessInformation()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# $this->setNextResponse(200,\
    \ [], 'Hello World', function ($request, $response) use ($time) {\n# $response->headers->set('Cache-Control',\
    \ 'public');\n# $response->headers->set('Last-Modified', $time->format(\\DATE_RFC2822));\n\
    # if ($time->format(\\DATE_RFC2822) == $request->headers->get('IF_MODIFIED_SINCE'))\
    \ {\n# $response->setStatusCode(304);\n# $response->setContent('');\n# }\n# });\n\
    # \n# // build initial request\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Last-Modified'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertTraceNotContains('stale');\n\
    # \n# // build subsequent request; should be found but miss due to freshness\n\
    # $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('Last-Modified'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertLessThanOrEqual(1, $this->response->headers->get('Age'));\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
    # $this->assertTraceContains('valid');\n# $this->assertTraceContains('store');\n\
    # $this->assertTraceNotContains('miss');\n# }\n# \n# public function testValidatesCachedResponsesUseSameHttpMethod()\n\
    # {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
    \ {\n# $this->assertSame('OPTIONS', $request->getMethod());\n# });\n# \n# // build\
    \ initial request\n# $this->request('OPTIONS', '/');\n# \n# // build subsequent\
    \ request\n# $this->request('OPTIONS', '/');\n# }\n# \n# public function testValidatesCachedResponsesWithETagAndNoFreshnessInformation()\n\
    # {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
    \ {\n# $this->assertFalse($request->headers->has('If-Modified-Since'));\n# $response->headers->set('Cache-Control',\
    \ 'public');\n# $response->headers->set('ETag', '\"12345\"');\n# if ($response->getETag()\
    \ == $request->headers->get('IF_NONE_MATCH')) {\n# $response->setStatusCode(304);\n\
    # $response->setContent('');\n# }\n# });\n# \n# // build initial request\n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertNotNull($this->response->headers->get('ETag'));\n# $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# \n# // build subsequent request; should\
    \ be found but miss due to freshness\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertNotNull($this->response->headers->get('ETag'));\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ $this->assertLessThanOrEqual(1, $this->response->headers->get('Age'));\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
    # $this->assertTraceContains('valid');\n# $this->assertTraceContains('store');\n\
    # $this->assertTraceNotContains('miss');\n# }\n# \n# public function testServesResponseWhileFreshAndRevalidatesWithLastModifiedInformation()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# \n# $this->setNextResponse(200,\
    \ [], 'Hello World', function (Request $request, Response $response) use ($time)\
    \ {\n# $response->setSharedMaxAge(10);\n# $response->headers->set('Last-Modified',\
    \ $time->format(\\DATE_RFC2822));\n# });\n# \n# // prime the cache\n# $this->request('GET',\
    \ '/');\n# \n# // next request before s-maxage has expired: Serve from cache\n\
    # // without hitting the backend\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsNotCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
    # \n# sleep(15); // expire the cache\n# \n# $this->setNextResponse(304, [], '',\
    \ function (Request $request, Response $response) use ($time) {\n# $this->assertEquals($time->format(\\\
    DATE_RFC2822), $request->headers->get('IF_MODIFIED_SINCE'));\n# });\n# \n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
    # $this->assertTraceContains('valid');\n# }\n# \n# public function testReplacesCachedResponsesWhenValidationResultsInNon304Response()\n\
    # {\n# $time = \\DateTimeImmutable::createFromFormat('U', time());\n# $count =\
    \ 0;\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
    \ use ($time, &$count) {\n# $response->headers->set('Last-Modified', $time->format(\\\
    DATE_RFC2822));\n# $response->headers->set('Cache-Control', 'public');\n# switch\
    \ (++$count) {\n# case 1:\n# $response->setContent('first response');\n# break;\n\
    # case 2:\n# $response->setContent('second response');\n# break;\n# case 3:\n\
    # $response->setContent('');\n# $response->setStatusCode(304);\n# break;\n# }\n\
    # });\n# \n# // first request should fetch from backend and store in cache\n#\
    \ $this->request('GET', '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('first response', $this->response->getContent());\n# \n\
    # // second request is validated, is invalid, and replaces cached entry\n# $this->request('GET',\
    \ '/');\n# $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('second\
    \ response', $this->response->getContent());\n# \n# // third response is validated,\
    \ valid, and returns cached entry\n# $this->request('GET', '/');\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertEquals('second response',\
    \ $this->response->getContent());\n# \n# $this->assertEquals(3, $count);\n# }\n\
    # \n# public function testPassesHeadRequestsThroughDirectlyOnPass()\n# {\n# $this->setNextResponse(200,\
    \ [], 'Hello World', function ($request, $response) {\n# $response->setContent('');\n\
    # $response->setStatusCode(200);\n# $this->assertEquals('HEAD', $request->getMethod());\n\
    # });\n# \n# $this->request('HEAD', '/', ['HTTP_EXPECT' => 'something ...']);\n\
    # $this->assertHttpKernelIsCalled();\n# $this->assertEquals('', $this->response->getContent());\n\
    # }\n# \n# public function testUsesCacheToRespondToHeadRequestsWhenFresh()\n#\
    \ {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
    \ {\n# $response->headers->set('Cache-Control', 'public, max-age=10');\n# $response->setContent('Hello\
    \ World');\n# $response->setStatusCode(200);\n# $this->assertNotEquals('HEAD',\
    \ $request->getMethod());\n# });\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('HEAD',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('', $this->response->getContent());\n# $this->assertEquals(\\\
    strlen('Hello World'), $this->response->headers->get('Content-Length'));\n# }\n\
    # \n# public function testSendsNoContentWhenFresh()\n# {\n# $time = \\DateTimeImmutable::createFromFormat('U',\
    \ time());\n# $this->setNextResponse(200, [], 'Hello World', function ($request,\
    \ $response) use ($time) {\n# $response->headers->set('Cache-Control', 'public,\
    \ max-age=10');\n# $response->headers->set('Last-Modified', $time->format(\\DATE_RFC2822));\n\
    # });\n# \n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# \n# $this->request('GET',\
    \ '/', ['HTTP_IF_MODIFIED_SINCE' => $time->format(\\DATE_RFC2822)]);\n# $this->assertHttpKernelIsNotCalled();\n\
    # $this->assertEquals(304, $this->response->getStatusCode());\n# $this->assertEquals('',\
    \ $this->response->getContent());\n# }\n# \n# public function testInvalidatesCachedResponsesOnPost()\n\
    # {\n# $this->setNextResponse(200, [], 'Hello World', function ($request, $response)\
    \ {\n# if ('GET' == $request->getMethod()) {\n# $response->setStatusCode(200);\n\
    # $response->headers->set('Cache-Control', 'public, max-age=500');\n# $response->setContent('Hello\
    \ World');\n# } elseif ('POST' == $request->getMethod()) {\n# $response->setStatusCode(303);\n\
    # $response->headers->set('Location', '/');\n# $response->headers->remove('Cache-Control');\n\
    # $response->setContent('');\n# }\n# });\n# \n# // build initial request to enter\
    \ into the cache\n# $this->request('GET', '/');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals(200, $this->response->getStatusCode());\n# $this->assertEquals('Hello\
    \ World', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# \n# // make sure it is valid\n# $this->request('GET',\
    \ '/');\n# $this->assertHttpKernelIsNotCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('fresh');\n\
    # \n# // now POST to same URL\n# $this->request('POST', '/helloworld');\n# $this->assertHttpKernelIsCalled();\n\
    # $this->assertEquals('/', $this->response->headers->get('Location'));\n# $this->assertTraceContains('invalidate');\n\
    # $this->assertTraceContains('pass');\n# $this->assertEquals('', $this->response->getContent());\n\
    # \n# // now make sure it was actually invalidated\n# $this->request('GET', '/');\n\
    # $this->assertHttpKernelIsCalled();\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Hello World', $this->response->getContent());\n# $this->assertTraceContains('stale');\n\
    # $this->assertTraceContains('invalid');\n# $this->assertTraceContains('store');\n\
    # }\n# \n# public function testServesFromCacheWhenHeadersMatch()\n# {\n# $count\
    \ = 0;\n# $this->setNextResponse(200, ['Cache-Control' => 'max-age=10000'], '',\
    \ function ($request, $response) use (&$count) {\n# $response->headers->set('Vary',\
    \ 'Accept User-Agent Foo');\n# $response->headers->set('Cache-Control', 'public,\
    \ max-age=10');\n# $response->headers->set('X-Response-Count', ++$count);\n# $response->setContent($request->headers->get('USER_AGENT'));\n\
    # });\n# \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
    \ => 'Bob/1.0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Bob/1.0', $this->response->getContent());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# \n# $this->request('GET', '/', ['HTTP_ACCEPT'\
    \ => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0']);\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertEquals('Bob/1.0', $this->response->getContent());\n\
    # $this->assertTraceContains('fresh');\n# $this->assertTraceNotContains('store');\n\
    # $this->assertNotNull($this->response->headers->get('X-Content-Digest'));\n#\
    \ }\n# \n# public function testStoresMultipleResponsesWhenHeadersDiffer()\n# {\n\
    # $count = 0;\n# $this->setNextResponse(200, ['Cache-Control' => 'max-age=10000'],\
    \ '', function ($request, $response) use (&$count) {\n# $response->headers->set('Vary',\
    \ 'Accept User-Agent Foo');\n# $response->headers->set('Cache-Control', 'public,\
    \ max-age=10');\n# $response->headers->set('X-Response-Count', ++$count);\n# $response->setContent($request->headers->get('USER_AGENT'));\n\
    # });\n# \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
    \ => 'Bob/1.0']);\n# $this->assertEquals(200, $this->response->getStatusCode());\n\
    # $this->assertEquals('Bob/1.0', $this->response->getContent());\n# $this->assertEquals(1,\
    \ $this->response->headers->get('X-Response-Count'));\n# \n# $this->request('GET',\
    \ '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/2.0']);\n# $this->assertEquals(200,\
    \ $this->response->getStatusCode());\n# $this->assertTraceContains('miss');\n\
    # $this->assertTraceContains('store');\n# $this->assertEquals('Bob/2.0', $this->response->getContent());\n\
    # $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));\n\
    # \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
    \ => 'Bob/1.0']);\n# $this->assertTraceContains('fresh');\n# $this->assertEquals('Bob/1.0',\
    \ $this->response->getContent());\n# $this->assertEquals(1, $this->response->headers->get('X-Response-Count'));\n\
    # \n# $this->request('GET', '/', ['HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT'\
    \ => 'Bob/2.0']);\n# $this->assertTraceContains('fresh');\n# $this->assertEquals('Bob/2.0',\
    \ $this->response->getContent());\n# $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));\n\
    # \n# $this->request('GET', '/', ['HTTP_USER_AGENT' => 'Bob/2.0']);\n# $this->assertTraceContains('miss');\n\
    # $this->assertEquals('Bob/2.0', $this->response->getContent());\n# $this->assertEquals(3,\
    \ $this->response->headers->get('X-Response-Count'));\n# }\n# \n# public function\
    \ testShouldCatchExceptions()\n# {\n# $this->catchExceptions();\n# \n# $this->setNextResponse();\n\
    # $this->request('GET', '/');\n# \n# $this->assertExceptionsAreCaught();\n# }\n\
    # \n# public function testShouldCatchExceptionsWhenReloadingAndNoCacheRequest()\n\
    # {\n# $this->catchExceptions();\n# \n# $this->setNextResponse();\n# $this->cacheConfig['allow_reload']\
    \ = true;\n# $this->request('GET', '/', [], [], false, ['Pragma' => 'no-cache']);\n\
    # \n# $this->assertExceptionsAreCaught();\n# }\n# \n# public function testShouldNotCatchExceptions()\n\
    # {\n# $this->catchExceptions(false);\n# \n# $this->setNextResponse();\n# $this->request('GET',\
    \ '/');\n# \n# $this->assertExceptionsAreNotCaught();\n# }\n# \n# public function\
    \ testEsiCacheSendsTheLowestTtl()\n# {\n# $responses = [\n# [\n# 'status' => 200,\n\
    # 'body' => '<esi:include src=\"/foo\" /> <esi:include src=\"/bar\" />',\n# 'headers'\
    \ => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control' => 'content=\"\
    ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' => 'Hello World!',\n\
    # 'headers' => ['Cache-Control' => 's-maxage=200'],\n# ],\n# [\n# 'status' =>\
    \ 200,\n# 'body' => 'My name is Bobby.',\n# 'headers' => ['Cache-Control' => 's-maxage=100'],\n\
    # ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n# $this->request('GET',\
    \ '/', [], [], true);\n# $this->assertEquals('Hello World! My name is Bobby.',\
    \ $this->response->getContent());\n# \n# $this->assertEquals(100, $this->response->getTtl());\n\
    # }\n# \n# public function testEsiCacheSendsTheLowestTtlForHeadRequests()\n# {\n\
    # $responses = [\n# [\n# 'status' => 200,\n# 'body' => 'I am a long-lived main\
    \ response, but I embed a short-lived resource: <esi:include src=\"/foo\" />',\n\
    # 'headers' => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control'\
    \ => 'content=\"ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' =>\
    \ 'I am a short-lived resource',\n# 'headers' => ['Cache-Control' => 's-maxage=100'],\n\
    # ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n# $this->request('HEAD',\
    \ '/', [], [], true);\n# \n# $this->assertEmpty($this->response->getContent());\n\
    # $this->assertEquals(100, $this->response->getTtl());\n# }\n# \n# public function\
    \ testEsiCacheForceValidation()\n# {\n# $responses = [\n# [\n# 'status' => 200,\n\
    # 'body' => '<esi:include src=\"/foo\" /> <esi:include src=\"/bar\" />',\n# 'headers'\
    \ => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control' => 'content=\"\
    ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' => 'Hello World!',\n\
    # 'headers' => ['ETag' => 'foobar'],\n# ],\n# [\n# 'status' => 200,\n# 'body'\
    \ => 'My name is Bobby.',\n# 'headers' => ['Cache-Control' => 's-maxage=100'],\n\
    # ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n# $this->request('GET',\
    \ '/', [], [], true);\n# $this->assertEquals('Hello World! My name is Bobby.',\
    \ $this->response->getContent());\n# $this->assertNull($this->response->getTtl());\n\
    # $this->assertTrue($this->response->headers->hasCacheControlDirective('private'));\n\
    # $this->assertTrue($this->response->headers->hasCacheControlDirective('no-cache'));\n\
    # }\n# \n# public function testEsiCacheForceValidationForHeadRequests()\n# {\n\
    # $responses = [\n# [\n# 'status' => 200,\n# 'body' => 'I am the main response\
    \ and use expiration caching, but I embed another resource: <esi:include src=\"\
    /foo\" />',\n# 'headers' => [\n# 'Cache-Control' => 's-maxage=300',\n# 'Surrogate-Control'\
    \ => 'content=\"ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' =>\
    \ 'I am the embedded resource and use validation caching',\n# 'headers' => ['ETag'\
    \ => 'foobar'],\n# ],\n# ];\n# \n# $this->setNextResponses($responses);\n# \n\
    # $this->request('HEAD', '/', [], [], true);\n# \n# // The response has been assembled\
    \ from expiration and validation based resources\n# // This can neither be cached\
    \ nor revalidated, so it should be private/no cache\n# $this->assertEmpty($this->response->getContent());\n\
    # $this->assertNull($this->response->getTtl());\n# $this->assertTrue($this->response->headers->hasCacheControlDirective('private'));\n\
    # $this->assertTrue($this->response->headers->hasCacheControlDirective('no-cache'));\n\
    # }\n# \n# public function testEsiRecalculateContentLengthHeader()\n# {\n# $responses\
    \ = [\n# [\n# 'status' => 200,\n# 'body' => '<esi:include src=\"/foo\" />',\n\
    # 'headers' => [\n# 'Content-Length' => 26,\n# 'Surrogate-Control' => 'content=\"\
    ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' => 'Hello World!',\n\
    # 'headers' => [],\n# ],\n# ];\n# \n# $this->setNextResponses($responses);\n#\
    \ \n# $this->request('GET', '/', [], [], true);\n# $this->assertEquals('Hello\
    \ World!', $this->response->getContent());\n# $this->assertEquals(12, $this->response->headers->get('Content-Length'));\n\
    # }\n# \n# public function testEsiRecalculateContentLengthHeaderForHeadRequest()\n\
    # {\n# $responses = [\n# [\n# 'status' => 200,\n# 'body' => '<esi:include src=\"\
    /foo\" />',\n# 'headers' => [\n# 'Content-Length' => 26,\n# 'Surrogate-Control'\
    \ => 'content=\"ESI/1.0\"',\n# ],\n# ],\n# [\n# 'status' => 200,\n# 'body' =>\
    \ 'Hello World!',\n# 'headers' => [],\n# ],\n# ];\n# \n# $this->setNextResponses($responses);\n\
    # \n# $this->request('HEAD', '/', [], [], true);\n# \n# // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13\n\
    # // \"The Content-Length entity-header field indicates the size of the entity-body,\n\
    # // in decimal number of OCTETs, sent to the recipient or, in the case of the\
    \ HEAD\n# // method, the size of the entity-body that would have been sent had\
    \ the request\n# // been a GET.\"\n# $this->assertEmpty($this->response->getContent());\n\
    # $this->assertEquals(12, $this->response->headers->get('Content-Length'));\n\
    # }\n# \n# public function testClientIpIsAlwaysLocalhostForForwardedRequests()\n\
    # {\n# $this->setNextResponse();\n# $this->request('GET', '/', ['REMOTE_ADDR'\
    \ => '10.0.0.1']);\n# \n# $this->kernel->assert(function ($backendRequest) {\n\
    # $this->assertSame('127.0.0.1', $backendRequest->server->get('REMOTE_ADDR'));\n\
    # });\n# }\n# \n# /**\n# * @dataProvider getTrustedProxyData"
- name: getTrustedProxyData
  visibility: public
  parameters: []
  comment: null
- name: testForwarderHeaderForForwardedRequests
  visibility: public
  parameters:
  - name: forwarded
  - name: expected
  comment: '# * @dataProvider getForwardedData'
- name: getForwardedData
  visibility: public
  parameters: []
  comment: null
- name: testEsiCacheRemoveValidationHeadersIfEmbeddedResponses
  visibility: public
  parameters: []
  comment: null
- name: testEsiCacheRemoveValidationHeadersIfEmbeddedResponsesAndHeadRequest
  visibility: public
  parameters: []
  comment: null
- name: testDoesNotCacheOptionsRequest
  visibility: public
  parameters: []
  comment: null
- name: testUsesOriginalRequestForSurrogate
  visibility: public
  parameters: []
  comment: null
- name: testStaleIfErrorMustNotResetLifetime
  visibility: public
  parameters: []
  comment: null
- name: testResponsesThatMayBeUsedStaleIfError
  visibility: public
  parameters:
  - name: responseHeaders
  - name: sleepBetweenRequests
    default: 'null'
  comment: '# * @dataProvider getResponseDataThatMayBeServedStaleIfError'
- name: getResponseDataThatMayBeServedStaleIfError
  visibility: public
  parameters: []
  comment: null
- name: testResponsesThatMustNotBeUsedStaleIfError
  visibility: public
  parameters:
  - name: responseHeaders
  - name: sleepBetweenRequests
    default: 'null'
  comment: '# * @dataProvider getResponseDataThatMustNotBeServedStaleIfError'
- name: testSkipsConfiguredResponseHeadersForStore
  visibility: public
  parameters: []
  comment: null
- name: getResponseDataThatMustNotBeServedStaleIfError
  visibility: public
  parameters: []
  comment: null
- name: testStaleIfErrorWhenStrictSmaxageDisabled
  visibility: public
  parameters: []
  comment: null
- name: testTraceHeaderNameCanBeChanged
  visibility: public
  parameters: []
  comment: null
- name: testTraceLevelDefaultsToFullIfDebug
  visibility: public
  parameters: []
  comment: null
- name: testTraceLevelDefaultsToNoneIfNotDebug
  visibility: public
  parameters: []
  comment: null
- name: testTraceLevelShort
  visibility: public
  parameters: []
  comment: null
- name: terminate
  visibility: public
  parameters:
  - name: request
  - name: response
  comment: null
- name: handle
  visibility: public
  parameters:
  - name: request
  - name: type
    default: self::MAIN_REQUEST
  - name: catch
    default: 'true'
  comment: null
traits:
- Symfony\Component\EventDispatcher\EventDispatcher
- Symfony\Component\HttpFoundation\Request
- Symfony\Component\HttpFoundation\Response
- Symfony\Component\HttpKernel\Event\TerminateEvent
- Symfony\Component\HttpKernel\HttpCache\Esi
- Symfony\Component\HttpKernel\HttpCache\HttpCache
- Symfony\Component\HttpKernel\HttpCache\StoreInterface
- Symfony\Component\HttpKernel\HttpKernelInterface
- Symfony\Component\HttpKernel\Kernel
interfaces:
- TerminableInterface
- HttpKernelInterface