Вход Регистрация
Файл: gapps/vendor/symfony/http-kernel/Tests/HttpCache/StoreTest.php
Строк: 270
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentHttpKernelTestsHttpCache;

use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationResponse;
use 
SymfonyComponentHttpKernelHttpCacheStore;

class 
StoreTest extends PHPUnit_Framework_TestCase
{
    protected 
$request;
    protected 
$response;

    
/**
     * @var Store
     */
    
protected $store;

    protected function 
setUp()
    {
        
$this->request Request::create('/');
        
$this->response = new Response('hello world'200, array());

        
HttpCacheTestCase::clearDirectory(sys_get_temp_dir().'/http_cache');

        
$this->store = new Store(sys_get_temp_dir().'/http_cache');
    }

    protected function 
tearDown()
    {
        
$this->store null;
        
$this->request null;
        
$this->response null;

        
HttpCacheTestCase::clearDirectory(sys_get_temp_dir().'/http_cache');
    }

    public function 
testReadsAnEmptyArrayWithReadWhenNothingCachedAtKey()
    {
        
$this->assertEmpty($this->getStoreMetadata('/nothing'));
    }

    public function 
testUnlockFileThatDoesExist()
    {
        
$cacheKey $this->storeSimpleEntry();
        
$this->store->lock($this->request);

        
$this->assertTrue($this->store->unlock($this->request));
    }

    public function 
testUnlockFileThatDoesNotExist()
    {
        
$this->assertFalse($this->store->unlock($this->request));
    }

    public function 
testRemovesEntriesForKeyWithPurge()
    {
        
$request Request::create('/foo');
        
$this->store->write($request, new Response('foo'));

        
$metadata $this->getStoreMetadata($request);
        
$this->assertNotEmpty($metadata);

        
$this->assertTrue($this->store->purge('/foo'));
        
$this->assertEmpty($this->getStoreMetadata($request));

        
// cached content should be kept after purging
        
$path $this->store->getPath($metadata[0][1]['x-content-digest'][0]);
        
$this->assertTrue(is_file($path));

        
$this->assertFalse($this->store->purge('/bar'));
    }

    public function 
testStoresACacheEntry()
    {
        
$cacheKey $this->storeSimpleEntry();

        
$this->assertNotEmpty($this->getStoreMetadata($cacheKey));
    }

    public function 
testSetsTheXContentDigestResponseHeaderBeforeStoring()
    {
        
$cacheKey $this->storeSimpleEntry();
        
$entries $this->getStoreMetadata($cacheKey);
        list(
$req$res) = $entries[0];

        
$this->assertEquals('en9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'$res['x-content-digest'][0]);
    }

    public function 
testFindsAStoredEntryWithLookup()
    {
        
$this->storeSimpleEntry();
        
$response $this->store->lookup($this->request);

        
$this->assertNotNull($response);
        
$this->assertInstanceOf('SymfonyComponentHttpFoundationResponse'$response);
    }

    public function 
testDoesNotFindAnEntryWithLookupWhenNoneExists()
    {
        
$request Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));

        
$this->assertNull($this->store->lookup($request));
    }

    public function 
testCanonizesUrlsForCacheKeys()
    {
        
$this->storeSimpleEntry($path '/test?x=y&p=q');
        
$hitsReq Request::create($path);
        
$missReq Request::create('/test?p=x');

        
$this->assertNotNull($this->store->lookup($hitsReq));
        
$this->assertNull($this->store->lookup($missReq));
    }

    public function 
testDoesNotFindAnEntryWithLookupWhenTheBodyDoesNotExist()
    {
        
$this->storeSimpleEntry();
        
$this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        
$path $this->getStorePath($this->response->headers->get('X-Content-Digest'));
        @
unlink($path);
        
$this->assertNull($this->store->lookup($this->request));
    }

    public function 
testRestoresResponseHeadersProperlyWithLookup()
    {
        
$this->storeSimpleEntry();
        
$response $this->store->lookup($this->request);

        
$this->assertEquals($response->headers->all(), array_merge(array('content-length' => 4'x-body-file' => array($this->getStorePath($response->headers->get('X-Content-Digest')))), $this->response->headers->all()));
    }

    public function 
testRestoresResponseContentFromEntityStoreWithLookup()
    {
        
$this->storeSimpleEntry();
        
$response $this->store->lookup($this->request);
        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test')), $response->getContent());
    }

    public function 
testInvalidatesMetaAndEntityStoreEntriesWithInvalidate()
    {
        
$this->storeSimpleEntry();
        
$this->store->invalidate($this->request);
        
$response $this->store->lookup($this->request);
        
$this->assertInstanceOf('SymfonyComponentHttpFoundationResponse'$response);
        
$this->assertFalse($response->isFresh());
    }

    public function 
testSucceedsQuietlyWhenInvalidateCalledWithNoMatchingEntries()
    {
        
$req Request::create('/test');
        
$this->store->invalidate($req);
        
$this->assertNull($this->store->lookup($this->request));
    }

    public function 
testDoesNotReturnEntriesThatVaryWithLookup()
    {
        
$req1 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));
        
$req2 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Bling''HTTP_BAR' => 'Bam'));
        
$res = new Response('test'200, array('Vary' => 'Foo Bar'));
        
$this->store->write($req1$res);

        
$this->assertNull($this->store->lookup($req2));
    }

    public function 
testDoesNotReturnEntriesThatSlightlyVaryWithLookup()
    {
        
$req1 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));
        
$req2 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bam'));
        
$res = new Response('test'200, array('Vary' => array('Foo''Bar')));
        
$this->store->write($req1$res);

        
$this->assertNull($this->store->lookup($req2));
    }

    public function 
testStoresMultipleResponsesForEachVaryCombination()
    {
        
$req1 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));
        
$res1 = new Response('test 1'200, array('Vary' => 'Foo Bar'));
        
$key $this->store->write($req1$res1);

        
$req2 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Bling''HTTP_BAR' => 'Bam'));
        
$res2 = new Response('test 2'200, array('Vary' => 'Foo Bar'));
        
$this->store->write($req2$res2);

        
$req3 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Baz''HTTP_BAR' => 'Boom'));
        
$res3 = new Response('test 3'200, array('Vary' => 'Foo Bar'));
        
$this->store->write($req3$res3);

        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test 3')), $this->store->lookup($req3)->getContent());
        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test 2')), $this->store->lookup($req2)->getContent());
        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test 1')), $this->store->lookup($req1)->getContent());

        
$this->assertCount(3$this->getStoreMetadata($key));
    }

    public function 
testOverwritesNonVaryingResponseWithStore()
    {
        
$req1 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));
        
$res1 = new Response('test 1'200, array('Vary' => 'Foo Bar'));
        
$key $this->store->write($req1$res1);
        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test 1')), $this->store->lookup($req1)->getContent());

        
$req2 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Bling''HTTP_BAR' => 'Bam'));
        
$res2 = new Response('test 2'200, array('Vary' => 'Foo Bar'));
        
$this->store->write($req2$res2);
        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test 2')), $this->store->lookup($req2)->getContent());

        
$req3 Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));
        
$res3 = new Response('test 3'200, array('Vary' => 'Foo Bar'));
        
$key $this->store->write($req3$res3);
        
$this->assertEquals($this->getStorePath('en'.hash('sha256''test 3')), $this->store->lookup($req3)->getContent());

        
$this->assertCount(2$this->getStoreMetadata($key));
    }

    public function 
testLocking()
    {
        
$req Request::create('/test''get', array(), array(), array(), array('HTTP_FOO' => 'Foo''HTTP_BAR' => 'Bar'));
        
$this->assertTrue($this->store->lock($req));

        
$path $this->store->lock($req);
        
$this->assertTrue($this->store->isLocked($req));

        
$this->store->unlock($req);
        
$this->assertFalse($this->store->isLocked($req));
    }

    protected function 
storeSimpleEntry($path null$headers = array())
    {
        if (
null === $path) {
            
$path '/test';
        }

        
$this->request Request::create($path'get', array(), array(), array(), $headers);
        
$this->response = new Response('test'200, array('Cache-Control' => 'max-age=420'));

        return 
$this->store->write($this->request$this->response);
    }

    protected function 
getStoreMetadata($key)
    {
        
$r = new ReflectionObject($this->store);
        
$m $r->getMethod('getMetadata');
        
$m->setAccessible(true);

        if (
$key instanceof Request) {
            
$m1 $r->getMethod('getCacheKey');
            
$m1->setAccessible(true);
            
$key $m1->invoke($this->store$key);
        }

        return 
$m->invoke($this->store$key);
    }

    protected function 
getStorePath($key)
    {
        
$r = new ReflectionObject($this->store);
        
$m $r->getMethod('getPath');
        
$m->setAccessible(true);

        return 
$m->invoke($this->store$key);
    }
}
Онлайн: 1
Реклама