186 lines
5.2 KiB
PHP
186 lines
5.2 KiB
PHP
<?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 Symfony\Component\HttpKernel\Tests\HttpCache;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpKernel\HttpCache\Esi;
|
|
use Symfony\Component\HttpKernel\HttpCache\HttpCache;
|
|
use Symfony\Component\HttpKernel\HttpCache\Store;
|
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
|
|
|
class HttpCacheTestCase extends TestCase
|
|
{
|
|
protected $kernel;
|
|
protected $cache;
|
|
protected $caches;
|
|
protected $cacheConfig;
|
|
protected $request;
|
|
protected $response;
|
|
protected $responses;
|
|
protected $catch;
|
|
protected $esi;
|
|
|
|
/**
|
|
* @var Store
|
|
*/
|
|
protected $store;
|
|
|
|
protected function setUp()
|
|
{
|
|
$this->kernel = null;
|
|
|
|
$this->cache = null;
|
|
$this->esi = null;
|
|
$this->caches = array();
|
|
$this->cacheConfig = array();
|
|
|
|
$this->request = null;
|
|
$this->response = null;
|
|
$this->responses = array();
|
|
|
|
$this->catch = false;
|
|
|
|
$this->clearDirectory(sys_get_temp_dir().'/http_cache');
|
|
}
|
|
|
|
protected function tearDown()
|
|
{
|
|
if ($this->cache) {
|
|
$this->cache->getStore()->cleanup();
|
|
}
|
|
$this->kernel = null;
|
|
$this->cache = null;
|
|
$this->caches = null;
|
|
$this->request = null;
|
|
$this->response = null;
|
|
$this->responses = null;
|
|
$this->cacheConfig = null;
|
|
$this->catch = null;
|
|
$this->esi = null;
|
|
|
|
$this->clearDirectory(sys_get_temp_dir().'/http_cache');
|
|
}
|
|
|
|
public function assertHttpKernelIsCalled()
|
|
{
|
|
$this->assertTrue($this->kernel->hasBeenCalled());
|
|
}
|
|
|
|
public function assertHttpKernelIsNotCalled()
|
|
{
|
|
$this->assertFalse($this->kernel->hasBeenCalled());
|
|
}
|
|
|
|
public function assertResponseOk()
|
|
{
|
|
$this->assertEquals(200, $this->response->getStatusCode());
|
|
}
|
|
|
|
public function assertTraceContains($trace)
|
|
{
|
|
$traces = $this->cache->getTraces();
|
|
$traces = current($traces);
|
|
|
|
$this->assertRegExp('/'.$trace.'/', implode(', ', $traces));
|
|
}
|
|
|
|
public function assertTraceNotContains($trace)
|
|
{
|
|
$traces = $this->cache->getTraces();
|
|
$traces = current($traces);
|
|
|
|
$this->assertNotRegExp('/'.$trace.'/', implode(', ', $traces));
|
|
}
|
|
|
|
public function assertExceptionsAreCaught()
|
|
{
|
|
$this->assertTrue($this->kernel->isCatchingExceptions());
|
|
}
|
|
|
|
public function assertExceptionsAreNotCaught()
|
|
{
|
|
$this->assertFalse($this->kernel->isCatchingExceptions());
|
|
}
|
|
|
|
public function request($method, $uri = '/', $server = array(), $cookies = array(), $esi = false, $headers = array())
|
|
{
|
|
if (null === $this->kernel) {
|
|
throw new \LogicException('You must call setNextResponse() before calling request().');
|
|
}
|
|
|
|
$this->kernel->reset();
|
|
|
|
$this->store = new Store(sys_get_temp_dir().'/http_cache');
|
|
|
|
$this->cacheConfig['debug'] = true;
|
|
|
|
$this->esi = $esi ? new Esi() : null;
|
|
$this->cache = new HttpCache($this->kernel, $this->store, $this->esi, $this->cacheConfig);
|
|
$this->request = Request::create($uri, $method, array(), $cookies, array(), $server);
|
|
$this->request->headers->add($headers);
|
|
|
|
$this->response = $this->cache->handle($this->request, HttpKernelInterface::MASTER_REQUEST, $this->catch);
|
|
|
|
$this->responses[] = $this->response;
|
|
}
|
|
|
|
public function getMetaStorageValues()
|
|
{
|
|
$values = array();
|
|
foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(sys_get_temp_dir().'/http_cache/md', \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
|
|
$values[] = file_get_contents($file);
|
|
}
|
|
|
|
return $values;
|
|
}
|
|
|
|
// A basic response with 200 status code and a tiny body.
|
|
public function setNextResponse($statusCode = 200, array $headers = array(), $body = 'Hello World', \Closure $customizer = null)
|
|
{
|
|
$this->kernel = new TestHttpKernel($body, $statusCode, $headers, $customizer);
|
|
}
|
|
|
|
public function setNextResponses($responses)
|
|
{
|
|
$this->kernel = new TestMultipleHttpKernel($responses);
|
|
}
|
|
|
|
public function catchExceptions($catch = true)
|
|
{
|
|
$this->catch = $catch;
|
|
}
|
|
|
|
public static function clearDirectory($directory)
|
|
{
|
|
if (!is_dir($directory)) {
|
|
return;
|
|
}
|
|
|
|
$fp = opendir($directory);
|
|
while (false !== $file = readdir($fp)) {
|
|
if (!\in_array($file, array('.', '..'))) {
|
|
if (is_link($directory.'/'.$file)) {
|
|
unlink($directory.'/'.$file);
|
|
} elseif (is_dir($directory.'/'.$file)) {
|
|
self::clearDirectory($directory.'/'.$file);
|
|
rmdir($directory.'/'.$file);
|
|
} else {
|
|
unlink($directory.'/'.$file);
|
|
}
|
|
}
|
|
}
|
|
|
|
closedir($fp);
|
|
}
|
|
}
|