Open Journal Systems  3.3.0
DefaultRevalidationTest.php
1 <?php
2 
4 
14 use Doctrine\Common\Cache\ArrayCache;
18 
24 {
25  protected function getHttpDate($time)
26  {
27  return gmdate(ClientInterface::HTTP_DATE, strtotime($time));
28  }
29 
36  {
37  return array(
38  // Forces revalidation that passes
39  array(
40  true,
41  "Pragma: no-cache\r\n\r\n",
42  "HTTP/1.1 200 OK\r\nDate: " . $this->getHttpDate('-100 hours') . "\r\nContent-Length: 4\r\n\r\nData",
43  "HTTP/1.1 304 NOT MODIFIED\r\nCache-Control: max-age=2000000\r\nContent-Length: 0\r\n\r\n",
44  ),
45  // Forces revalidation that overwrites what is in cache
46  array(
47  false,
48  "\r\n",
49  "HTTP/1.1 200 OK\r\nCache-Control: must-revalidate, no-cache\r\nDate: " . $this->getHttpDate('-10 hours') . "\r\nContent-Length: 4\r\n\r\nData",
50  "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nDatas",
51  "HTTP/1.1 200 OK\r\nContent-Length: 5\r\nDate: " . $this->getHttpDate('now') . "\r\n\r\nDatas"
52  ),
53  // Throws an exception during revalidation
54  array(
55  false,
56  "\r\n",
57  "HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nDate: " . $this->getHttpDate('-3 hours') . "\r\n\r\nData",
58  "HTTP/1.1 500 INTERNAL SERVER ERROR\r\nContent-Length: 0\r\n\r\n"
59  ),
60  // ETag mismatch
61  array(
62  false,
63  "\r\n",
64  "HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nETag: \"123\"\r\nDate: " . $this->getHttpDate('-10 hours') . "\r\n\r\nData",
65  "HTTP/1.1 304 NOT MODIFIED\r\nETag: \"123456\"\r\n\r\n",
66  ),
67  );
68  }
69 
73  public function testRevalidatesResponsesAgainstOriginServer($can, $request, $response, $validate = null, $result = null)
74  {
75  // Send some responses to the test server for cache validation
76  $server = $this->getServer();
77  $server->flush();
78 
79  if ($validate) {
80  $server->enqueue($validate);
81  }
82 
83  $request = RequestFactory::getInstance()->fromMessage("GET / HTTP/1.1\r\nHost: 127.0.0.1:" . $server->getPort() . "\r\n" . $request);
84  $response = Response::fromMessage($response);
85  $request->setClient(new Client());
86 
87  $plugin = new CachePlugin(new DoctrineCacheAdapter(new ArrayCache()));
88  $this->assertEquals(
89  $can,
90  $plugin->canResponseSatisfyRequest($request, $response),
91  '-> ' . $request . "\n" . $response
92  );
93 
94  if ($result) {
95  $result = Response::fromMessage($result);
96  $result->removeHeader('Date');
97  $request->getResponse()->removeHeader('Date');
98  $request->getResponse()->removeHeader('Connection');
99  // Get rid of dates
100  $this->assertEquals((string) $result, (string) $request->getResponse());
101  }
102 
103  if ($validate) {
104  $this->assertEquals(1, count($server->getReceivedRequests()));
105  }
106  }
107 
109  {
110  $request = new Request('GET', 'http://foo.com');
111  $request->setClient(new Client());
112  $badResponse = new Response(404, array(), 'Oh no!');
113  $badRequest = clone $request;
114  $badRequest->setResponse($badResponse, true);
115  $response = new Response(200, array(), 'foo');
116 
117  // Seed the cache
118  $s = new DefaultCacheStorage(new DoctrineCacheAdapter(new ArrayCache()));
119  $s->cache($request, $response);
120  $this->assertNotNull($s->fetch($request));
121 
122  $rev = $this->getMockBuilder('Guzzle\Plugin\Cache\DefaultRevalidation')
123  ->setConstructorArgs(array($s))
124  ->setMethods(array('createRevalidationRequest'))
125  ->getMock();
126 
127  $rev->expects($this->once())
128  ->method('createRevalidationRequest')
129  ->will($this->returnValue($badRequest));
130 
131  try {
132  $rev->revalidate($request, $response);
133  $this->fail('Should have thrown an exception');
134  } catch (BadResponseException $e) {
135  $this->assertSame($badResponse, $e->getResponse());
136  $this->assertNull($s->fetch($request));
137  }
138  }
139 
140  public function testCanRevalidateWithPlugin()
141  {
142  $this->getServer()->flush();
143  $this->getServer()->enqueue(array(
144  "HTTP/1.1 200 OK\r\n" .
145  "Date: Mon, 12 Nov 2012 03:06:37 GMT\r\n" .
146  "Cache-Control: private, s-maxage=0, max-age=0, must-revalidate\r\n" .
147  "Last-Modified: Mon, 12 Nov 2012 02:53:38 GMT\r\n" .
148  "Content-Length: 2\r\n\r\nhi",
149  "HTTP/1.0 304 Not Modified\r\n" .
150  "Date: Mon, 12 Nov 2012 03:06:38 GMT\r\n" .
151  "Content-Type: text/html; charset=UTF-8\r\n" .
152  "Last-Modified: Mon, 12 Nov 2012 02:53:38 GMT\r\n" .
153  "Age: 6302\r\n\r\n",
154  "HTTP/1.0 304 Not Modified\r\n" .
155  "Date: Mon, 12 Nov 2012 03:06:38 GMT\r\n" .
156  "Content-Type: text/html; charset=UTF-8\r\n" .
157  "Last-Modified: Mon, 12 Nov 2012 02:53:38 GMT\r\n" .
158  "Age: 6302\r\n\r\n",
159  ));
160  $client = new Client($this->getServer()->getUrl());
161  $client->addSubscriber(new CachePlugin());
162  $this->assertEquals(200, $client->get()->send()->getStatusCode());
163  $this->assertEquals(200, $client->get()->send()->getStatusCode());
164  $this->assertEquals(200, $client->get()->send()->getStatusCode());
165  $this->assertEquals(3, count($this->getServer()->getReceivedRequests()));
166  }
167 
169  {
170  $client = new Client($this->getServer()->getUrl());
171  $lm = gmdate('c', time() - 60);
172  $mock = new MockPlugin(array(
173  new Response(200, array(
174  'Date' => $lm,
175  'Cache-Control' => 'max-age=100, must-revalidate, stale-if-error=9999',
176  'Last-Modified' => $lm,
177  'Content-Length' => 2
178  ), 'hi'),
179  new CurlException('Bleh'),
180  new CurlException('Bleh')
181  ));
182  $client->addSubscriber(new CachePlugin());
183  $client->addSubscriber($mock);
184  $client->get()->send();
185  $response = $client->get()->send();
186  $this->assertEquals(200, $response->getStatusCode());
187  $this->assertEquals('hi', $response->getBody(true));
188  $this->assertEquals(3, count($mock->getReceivedRequests()));
189  $this->assertEquals(0, count($mock->getQueue()));
190  }
191 
193  {
194  $lm = gmdate('c', time() - 60);
195  $mock = new MockPlugin(array(
196  new Response(200, array(
197  'Date' => $lm,
198  'Cache-Control' => 'must-revalidate, max-age=0, stale-if-error=1200',
199  'Last-Modified' => $lm,
200  'Content-Length' => 2
201  ), 'hi'),
202  new CurlException('Oh no!'),
203  new CurlException('Oh no!')
204  ));
205  $cache = new CachePlugin();
206  $client = new Client('http://www.example.com');
207  $client->addSubscriber($cache);
208  $client->addSubscriber($mock);
209  $this->assertEquals(200, $client->get()->send()->getStatusCode());
210  $response = $client->get()->send();
211  $this->assertEquals(200, $response->getStatusCode());
212  $this->assertCount(0, $mock);
213  $this->assertEquals('HIT from GuzzleCache', (string) $response->getHeader('X-Cache-Lookup'));
214  $this->assertEquals('HIT_ERROR from GuzzleCache', (string) $response->getHeader('X-Cache'));
215  }
216 
221  {
222  $this->getServer()->flush();
223  $this->getServer()->enqueue(array(
224  "HTTP/1.1 200 OK\r\n" .
225  "Date: Mon, 12 Nov 2012 03:06:37 GMT\r\n" .
226  "Cache-Control: private, s-maxage=0, max-age=0, must-revalidate\r\n" .
227  "Last-Modified: Mon, 12 Nov 2012 02:53:38 GMT\r\n" .
228  "Content-Length: 2\r\n\r\nhi",
229  "HTTP/1.0 304 Not Modified\r\n" .
230  "Date: Mon, 12 Nov 2012 03:06:38 GMT\r\n" .
231  "Content-Type: text/html; charset=UTF-8\r\n" .
232  "Last-Modified: Mon, 12 Nov 2012 02:53:38 GMT\r\n" .
233  "Age: 6302\r\n\r\n",
234  "HTTP/1.0 304 Not Modified\r\n" .
235  "Date: Mon, 12 Nov 2012 03:06:38 GMT\r\n" .
236  "Content-Type: text/html; charset=UTF-8\r\n" .
237  "Last-Modified: Mon, 12 Nov 2012 02:53:38 GMT\r\n" .
238  "Age: 6302\r\n\r\n",
239  ));
240  $client = new Client($this->getServer()->getUrl());
241  $client->addSubscriber(new CachePlugin());
242  $client->getEventDispatcher()->addListener('command.after_send', function(){});
243  $this->assertEquals(200, $client->get()->send()->getStatusCode());
244  $this->assertEquals(200, $client->get()->send()->getStatusCode());
245  $this->assertEquals(200, $client->get()->send()->getStatusCode());
246  }
247 
248 }
Guzzle\Tests\Plugin\Cache
Definition: CachePluginTest.php:3
Guzzle\Http\Exception\CurlException
Definition: CurlException.php:10
Guzzle\Tests\GuzzleTestCase
Definition: GuzzleTestCase.php:22
Guzzle\Http\Message\Response
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Response.php:17
Guzzle\Plugin\Cache\DefaultCacheStorage
Definition: DefaultCacheStorage.php:16
Guzzle\Http\Message\Response\fromMessage
static fromMessage($message)
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Response.php:123
Guzzle\Cache\DoctrineCacheAdapter
Definition: DoctrineCacheAdapter.php:12
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\testHandles404RevalidationResponses
testHandles404RevalidationResponses()
Definition: DefaultRevalidationTest.php:108
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\getHttpDate
getHttpDate($time)
Definition: DefaultRevalidationTest.php:25
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\testDoesNotTouchClosureListeners
testDoesNotTouchClosureListeners()
Definition: DefaultRevalidationTest.php:220
Guzzle\Tests\Http\Server
Definition: Server.php:27
Guzzle\Http\Message\Request
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php:25
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\testCanHandleStaleIfErrorWhenRevalidating
testCanHandleStaleIfErrorWhenRevalidating()
Definition: DefaultRevalidationTest.php:192
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest
Definition: DefaultRevalidationTest.php:23
Guzzle\Http\ClientInterface
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php:14
Guzzle\Http\Message\RequestFactory
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php:14
Guzzle\Http\Exception\BadResponseException\getResponse
getResponse()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php:68
Guzzle\Tests\GuzzleTestCase\$server
static $server
Definition: GuzzleTestCase.php:26
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\cacheRevalidationDataProvider
cacheRevalidationDataProvider()
Definition: DefaultRevalidationTest.php:35
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\testCanHandleRevalidationFailures
testCanHandleRevalidationFailures()
Definition: DefaultRevalidationTest.php:168
Guzzle\Http\Client
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Client.php:24
Guzzle\Plugin\Mock\MockPlugin
Definition: MockPlugin.php:17
Guzzle\Http\Exception\BadResponseException
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php:11
Guzzle\Http\Message\RequestFactory\getInstance
static getInstance()
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php:42
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\testRevalidatesResponsesAgainstOriginServer
testRevalidatesResponsesAgainstOriginServer($can, $request, $response, $validate=null, $result=null)
Definition: DefaultRevalidationTest.php:73
Guzzle\Tests\Plugin\Cache\DefaultRevalidationTest\testCanRevalidateWithPlugin
testCanRevalidateWithPlugin()
Definition: DefaultRevalidationTest.php:140
Guzzle\Tests\GuzzleTestCase\getServer
static getServer()
Definition: GuzzleTestCase.php:36
Guzzle\Plugin\Cache\CachePlugin
Definition: CachePlugin.php:27
Guzzle\Http\ClientInterface\HTTP_DATE
const HTTP_DATE
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php:19