Вход Регистрация
Файл: vkolhoze.com/vendor/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultRevalidationTest.php
Строк: 371
<?php

namespace GuzzleTestsPluginCache;

use 
GuzzleHttpClient;
use 
GuzzleHttpClientInterface;
use 
GuzzleHttpExceptionBadResponseException;
use 
GuzzleHttpExceptionCurlException;
use 
GuzzleHttpMessageRequest;
use 
GuzzleHttpMessageResponse;
use 
GuzzleHttpMessageRequestFactory;
use 
GuzzlePluginCacheCachePlugin;
use 
GuzzleCacheDoctrineCacheAdapter;
use 
DoctrineCommonCacheArrayCache;
use 
GuzzlePluginCacheDefaultCacheStorage;
use 
GuzzlePluginMockMockPlugin;
use 
GuzzleTestsHttpServer;

/**
 * @covers GuzzlePluginCacheDefaultRevalidation
 * @group server
 */
class DefaultRevalidationTest extends GuzzleTestsGuzzleTestCase
{
    protected function 
getHttpDate($time)
    {
        return 
gmdate(ClientInterface::HTTP_DATEstrtotime($time));
    }

    
/**
     * Data provider to test cache revalidation
     *
     * @return array
     */
    
public function cacheRevalidationDataProvider()
    {
        return array(
            
// Forces revalidation that passes
            
array(
                
true,
                
"Pragma: no-cachernrn",
                
"HTTP/1.1 200 OKrnDate: " $this->getHttpDate('-100 hours') . "rnContent-Length: 4rnrnData",
                
"HTTP/1.1 304 NOT MODIFIEDrnCache-Control: max-age=2000000rnContent-Length: 0rnrn",
            ),
            
// Forces revalidation that overwrites what is in cache
            
array(
                
false,
                
"rn",
                
"HTTP/1.1 200 OKrnCache-Control: must-revalidate, no-cachernDate: " $this->getHttpDate('-10 hours') . "rnContent-Length: 4rnrnData",
                
"HTTP/1.1 200 OKrnContent-Length: 5rnrnDatas",
                
"HTTP/1.1 200 OKrnContent-Length: 5rnDate: " $this->getHttpDate('now') . "rnrnDatas"
            
),
            
// Throws an exception during revalidation
            
array(
                
false,
                
"rn",
                
"HTTP/1.1 200 OKrnCache-Control: no-cachernDate: " $this->getHttpDate('-3 hours') . "rnrnData",
                
"HTTP/1.1 500 INTERNAL SERVER ERRORrnContent-Length: 0rnrn"
            
),
            
// ETag mismatch
            
array(
                
false,
                
"rn",
                
"HTTP/1.1 200 OKrnCache-Control: no-cachernETag: "123"rnDate: " $this->getHttpDate('-10 hours') . "rnrnData",
                
"HTTP/1.1 304 NOT MODIFIEDrnETag: "123456"rnrn",
            ),
        );
    }

    
/**
     * @dataProvider cacheRevalidationDataProvider
     */
    
public function testRevalidatesResponsesAgainstOriginServer($can$request$response$validate null$result null)
    {
        
// Send some responses to the test server for cache validation
        
$server $this->getServer();
        
$server->flush();

        if (
$validate) {
            
$server->enqueue($validate);
        }

        
$request RequestFactory::getInstance()->fromMessage("GET / HTTP/1.1rnHost: 127.0.0.1:" $server->getPort() . "rn" $request);
        
$response Response::fromMessage($response);
        
$request->setClient(new Client());

        
$plugin = new CachePlugin(new DoctrineCacheAdapter(new ArrayCache()));
        
$this->assertEquals(
            
$can,
            
$plugin->canResponseSatisfyRequest($request$response),
            
'-> ' $request "n" $response
        
);

        if (
$result) {
            
$result Response::fromMessage($result);
            
$result->removeHeader('Date');
            
$request->getResponse()->removeHeader('Date');
            
$request->getResponse()->removeHeader('Connection');
            
// Get rid of dates
            
$this->assertEquals((string) $result, (string) $request->getResponse());
        }

        if (
$validate) {
            
$this->assertEquals(1count($server->getReceivedRequests()));
        }
    }

    public function 
testHandles404RevalidationResponses()
    {
        
$request = new Request('GET''http://foo.com');
        
$request->setClient(new Client());
        
$badResponse = new Response(404, array(), 'Oh no!');
        
$badRequest = clone $request;
        
$badRequest->setResponse($badResponsetrue);
        
$response = new Response(200, array(), 'foo');

        
// Seed the cache
        
$s = new DefaultCacheStorage(new DoctrineCacheAdapter(new ArrayCache()));
        
$s->cache($request$response);
        
$this->assertNotNull($s->fetch($request));

        
$rev $this->getMockBuilder('GuzzlePluginCacheDefaultRevalidation')
            ->
setConstructorArgs(array($s))
            ->
setMethods(array('createRevalidationRequest'))
            ->
getMock();

        
$rev->expects($this->once())
            ->
method('createRevalidationRequest')
            ->
will($this->returnValue($badRequest));

        try {
            
$rev->revalidate($request$response);
            
$this->fail('Should have thrown an exception');
        } catch (
BadResponseException $e) {
            
$this->assertSame($badResponse$e->getResponse());
            
$this->assertNull($s->fetch($request));
        }
    }

    public function 
testCanRevalidateWithPlugin()
    {
        
$this->getServer()->flush();
        
$this->getServer()->enqueue(array(
            
"HTTP/1.1 200 OKrn" .
            
"Date: Mon, 12 Nov 2012 03:06:37 GMTrn" .
            
"Cache-Control: private, s-maxage=0, max-age=0, must-revalidatern" .
            
"Last-Modified: Mon, 12 Nov 2012 02:53:38 GMTrn" .
            
"Content-Length: 2rnrnhi",
            
"HTTP/1.0 304 Not Modifiedrn" .
            
"Date: Mon, 12 Nov 2012 03:06:38 GMTrn" .
            
"Content-Type: text/html; charset=UTF-8rn" .
            
"Last-Modified: Mon, 12 Nov 2012 02:53:38 GMTrn" .
            
"Age: 6302rnrn",
            
"HTTP/1.0 304 Not Modifiedrn" .
            
"Date: Mon, 12 Nov 2012 03:06:38 GMTrn" .
            
"Content-Type: text/html; charset=UTF-8rn" .
            
"Last-Modified: Mon, 12 Nov 2012 02:53:38 GMTrn" .
            
"Age: 6302rnrn",
        ));
        
$client = new Client($this->getServer()->getUrl());
        
$client->addSubscriber(new CachePlugin());
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
        
$this->assertEquals(3count($this->getServer()->getReceivedRequests()));
    }

    public function 
testCanHandleRevalidationFailures()
    {
        
$client = new Client($this->getServer()->getUrl());
        
$lm gmdate('c'time() - 60);
        
$mock = new MockPlugin(array(
            new 
Response(200, array(
                
'Date'           => $lm,
                
'Cache-Control'  => 'max-age=100, must-revalidate, stale-if-error=9999',
                
'Last-Modified'  => $lm,
                
'Content-Length' => 2
            
), 'hi'),
            new 
CurlException('Bleh'),
            new 
CurlException('Bleh')
        ));
        
$client->addSubscriber(new CachePlugin());
        
$client->addSubscriber($mock);
        
$client->get()->send();
        
$response $client->get()->send();
        
$this->assertEquals(200$response->getStatusCode());
        
$this->assertEquals('hi'$response->getBody(true));
        
$this->assertEquals(3count($mock->getReceivedRequests()));
        
$this->assertEquals(0count($mock->getQueue()));
    }

    public function 
testCanHandleStaleIfErrorWhenRevalidating()
    {
        
$lm gmdate('c'time() - 60);
        
$mock = new MockPlugin(array(
            new 
Response(200, array(
                
'Date' => $lm,
                
'Cache-Control' => 'must-revalidate, max-age=0, stale-if-error=1200',
                
'Last-Modified' => $lm,
                
'Content-Length' => 2
            
), 'hi'),
            new 
CurlException('Oh no!'),
            new 
CurlException('Oh no!')
        ));
        
$cache = new CachePlugin();
        
$client = new Client('http://www.example.com');
        
$client->addSubscriber($cache);
        
$client->addSubscriber($mock);
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
        
$response $client->get()->send();
        
$this->assertEquals(200$response->getStatusCode());
        
$this->assertCount(0$mock);
        
$this->assertEquals('HIT from GuzzleCache', (string) $response->getHeader('X-Cache-Lookup'));
        
$this->assertEquals('HIT_ERROR from GuzzleCache', (string) $response->getHeader('X-Cache'));
    }

    
/**
     * @group issue-437
     */
    
public function testDoesNotTouchClosureListeners()
    {
        
$this->getServer()->flush();
        
$this->getServer()->enqueue(array(
            
"HTTP/1.1 200 OKrn" .
            
"Date: Mon, 12 Nov 2012 03:06:37 GMTrn" .
            
"Cache-Control: private, s-maxage=0, max-age=0, must-revalidatern" .
            
"Last-Modified: Mon, 12 Nov 2012 02:53:38 GMTrn" .
            
"Content-Length: 2rnrnhi",
            
"HTTP/1.0 304 Not Modifiedrn" .
            
"Date: Mon, 12 Nov 2012 03:06:38 GMTrn" .
            
"Content-Type: text/html; charset=UTF-8rn" .
            
"Last-Modified: Mon, 12 Nov 2012 02:53:38 GMTrn" .
            
"Age: 6302rnrn",
            
"HTTP/1.0 304 Not Modifiedrn" .
            
"Date: Mon, 12 Nov 2012 03:06:38 GMTrn" .
            
"Content-Type: text/html; charset=UTF-8rn" .
            
"Last-Modified: Mon, 12 Nov 2012 02:53:38 GMTrn" .
            
"Age: 6302rnrn",
        ));
        
$client = new Client($this->getServer()->getUrl());
        
$client->addSubscriber(new CachePlugin());
        
$client->getEventDispatcher()->addListener('command.after_send', function(){});
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
        
$this->assertEquals(200$client->get()->send()->getStatusCode());
    }

}
Онлайн: 0
Реклама