4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\HttpKernel\Tests\HttpCache;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpFoundation\Response;
17 use Symfony\Component\HttpKernel\HttpCache\Ssi;
19 class SsiTest extends TestCase
21 public function testHasSurrogateSsiCapability()
25 $request = Request::create('/');
26 $request->headers->set('Surrogate-Capability', 'abc="SSI/1.0"');
27 $this->assertTrue($ssi->hasSurrogateCapability($request));
29 $request = Request::create('/');
30 $request->headers->set('Surrogate-Capability', 'foobar');
31 $this->assertFalse($ssi->hasSurrogateCapability($request));
33 $request = Request::create('/');
34 $this->assertFalse($ssi->hasSurrogateCapability($request));
37 public function testAddSurrogateSsiCapability()
41 $request = Request::create('/');
42 $ssi->addSurrogateCapability($request);
43 $this->assertEquals('symfony="SSI/1.0"', $request->headers->get('Surrogate-Capability'));
45 $ssi->addSurrogateCapability($request);
46 $this->assertEquals('symfony="SSI/1.0", symfony="SSI/1.0"', $request->headers->get('Surrogate-Capability'));
49 public function testAddSurrogateControl()
53 $response = new Response('foo <!--#include virtual="" -->');
54 $ssi->addSurrogateControl($response);
55 $this->assertEquals('content="SSI/1.0"', $response->headers->get('Surrogate-Control'));
57 $response = new Response('foo');
58 $ssi->addSurrogateControl($response);
59 $this->assertEquals('', $response->headers->get('Surrogate-Control'));
62 public function testNeedsSsiParsing()
66 $response = new Response();
67 $response->headers->set('Surrogate-Control', 'content="SSI/1.0"');
68 $this->assertTrue($ssi->needsParsing($response));
70 $response = new Response();
71 $this->assertFalse($ssi->needsParsing($response));
74 public function testRenderIncludeTag()
78 $this->assertEquals('<!--#include virtual="/" -->', $ssi->renderIncludeTag('/', '/alt', true));
79 $this->assertEquals('<!--#include virtual="/" -->', $ssi->renderIncludeTag('/', '/alt', false));
80 $this->assertEquals('<!--#include virtual="/" -->', $ssi->renderIncludeTag('/'));
83 public function testProcessDoesNothingIfContentTypeIsNotHtml()
87 $request = Request::create('/');
88 $response = new Response();
89 $response->headers->set('Content-Type', 'text/plain');
90 $ssi->process($request, $response);
92 $this->assertFalse($response->headers->has('x-body-eval'));
95 public function testProcess()
99 $request = Request::create('/');
100 $response = new Response('foo <!--#include virtual="..." -->');
101 $ssi->process($request, $response);
103 $this->assertEquals('foo <?php echo $this->surrogate->handle($this, \'...\', \'\', false) ?>'."\n", $response->getContent());
104 $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
106 $response = new Response('foo <!--#include virtual="foo\'" -->');
107 $ssi->process($request, $response);
109 $this->assertEquals("foo <?php echo \$this->surrogate->handle(\$this, 'foo\\'', '', false) ?>"."\n", $response->getContent());
112 public function testProcessEscapesPhpTags()
116 $request = Request::create('/');
117 $response = new Response('<?php <? <% <script language=php>');
118 $ssi->process($request, $response);
120 $this->assertEquals('<?php echo "<?"; ?>php <?php echo "<?"; ?> <?php echo "<%"; ?> <?php echo "<s"; ?>cript language=php>', $response->getContent());
124 * @expectedException \RuntimeException
126 public function testProcessWhenNoSrcInAnSsi()
130 $request = Request::create('/');
131 $response = new Response('foo <!--#include -->');
132 $ssi->process($request, $response);
135 public function testProcessRemoveSurrogateControlHeader()
139 $request = Request::create('/');
140 $response = new Response('foo <!--#include virtual="..." -->');
141 $response->headers->set('Surrogate-Control', 'content="SSI/1.0"');
142 $ssi->process($request, $response);
143 $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
145 $response->headers->set('Surrogate-Control', 'no-store, content="SSI/1.0"');
146 $ssi->process($request, $response);
147 $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
148 $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
150 $response->headers->set('Surrogate-Control', 'content="SSI/1.0", no-store');
151 $ssi->process($request, $response);
152 $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
153 $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
156 public function testHandle()
159 $cache = $this->getCache(Request::create('/'), new Response('foo'));
160 $this->assertEquals('foo', $ssi->handle($cache, '/', '/alt', true));
164 * @expectedException \RuntimeException
166 public function testHandleWhenResponseIsNot200()
169 $response = new Response('foo');
170 $response->setStatusCode(404);
171 $cache = $this->getCache(Request::create('/'), $response);
172 $ssi->handle($cache, '/', '/alt', false);
175 public function testHandleWhenResponseIsNot200AndErrorsAreIgnored()
178 $response = new Response('foo');
179 $response->setStatusCode(404);
180 $cache = $this->getCache(Request::create('/'), $response);
181 $this->assertEquals('', $ssi->handle($cache, '/', '/alt', true));
184 public function testHandleWhenResponseIsNot200AndAltIsPresent()
187 $response1 = new Response('foo');
188 $response1->setStatusCode(404);
189 $response2 = new Response('bar');
190 $cache = $this->getCache(Request::create('/'), array($response1, $response2));
191 $this->assertEquals('bar', $ssi->handle($cache, '/', '/alt', false));
194 protected function getCache($request, $response)
196 $cache = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpCache\HttpCache')->setMethods(array('getRequest', 'handle'))->disableOriginalConstructor()->getMock();
197 $cache->expects($this->any())
198 ->method('getRequest')
199 ->will($this->returnValue($request))
201 if (\is_array($response)) {
202 $cache->expects($this->any())
204 ->will(\call_user_func_array(array($this, 'onConsecutiveCalls'), $response))
207 $cache->expects($this->any())
209 ->will($this->returnValue($response))