summaryrefslogtreecommitdiff
path: root/vendor/symfony/http-kernel/Tests
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/symfony/http-kernel/Tests')
-rw-r--r--vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php100
-rw-r--r--vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php58
-rw-r--r--vendor/symfony/http-kernel/Tests/CacheClearer/Psr6CacheClearerTest.php69
-rw-r--r--vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php101
-rw-r--r--vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php68
-rw-r--r--vendor/symfony/http-kernel/Tests/ClientTest.php183
-rw-r--r--vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php107
-rw-r--r--vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php48
-rw-r--r--vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php349
-rw-r--r--vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php148
-rw-r--r--vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php331
-rw-r--r--vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php148
-rw-r--r--vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php46
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/Compiler.log4
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php66
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php38
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php115
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/ExceptionDataCollectorTest.php40
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/LoggerDataCollectorTest.php126
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/MemoryDataCollectorTest.php59
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php287
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/TimeDataCollectorTest.php55
-rw-r--r--vendor/symfony/http-kernel/Tests/DataCollector/Util/ValueExporterTest.php51
-rw-r--r--vendor/symfony/http-kernel/Tests/Debug/FileLinkFormatterTest.php67
-rw-r--r--vendor/symfony/http-kernel/Tests/Debug/TraceableEventDispatcherTest.php121
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/AddAnnotatedClassesToCachePassTest.php99
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php67
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php105
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php66
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php55
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php329
-rw-r--r--vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php148
-rw-r--r--vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php27
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php84
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php135
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/DumpListenerTest.php81
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php149
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/FragmentListenerTest.php122
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/LocaleListenerTest.php103
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/ProfilerListenerTest.php71
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/ResponseListenerTest.php95
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/RouterListenerTest.php188
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/SurrogateListenerTest.php67
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php145
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php118
-rw-r--r--vendor/symfony/http-kernel/Tests/EventListener/ValidateRequestListenerTest.php43
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/AccessDeniedHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/BadRequestHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/ConflictHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/GoneHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/HttpExceptionTest.php53
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/LengthRequiredHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/MethodNotAllowedHttpExceptionTest.php24
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/NotAcceptableHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/NotFoundHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/PreconditionFailedHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/PreconditionRequiredHttpExceptionTest.php13
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/ServiceUnavailableHttpExceptionTest.php29
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/TooManyRequestsHttpExceptionTest.php29
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/UnauthorizedHttpExceptionTest.php24
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/UnprocessableEntityHttpExceptionTest.php28
-rw-r--r--vendor/symfony/http-kernel/Tests/Exception/UnsupportedMediaTypeHttpExceptionTest.php23
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php37
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/hide.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/bar.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php19
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php18
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php18
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Controller/NullableController.php19
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Controller/VariadicController.php19
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/DataCollector/CloneVarDataCollector.php41
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php18
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php22
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php18
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php20
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php18
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php17
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php22
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php22
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php18
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php28
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php37
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php33
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/Resources/FooBundle/foo.txt0
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/TestClient.php31
-rw-r--r--vendor/symfony/http-kernel/Tests/Fixtures/TestEventDispatcher.php28
-rw-r--r--vendor/symfony/http-kernel/Tests/Fragment/EsiFragmentRendererTest.php110
-rw-r--r--vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php99
-rw-r--r--vendor/symfony/http-kernel/Tests/Fragment/HIncludeFragmentRendererTest.php89
-rw-r--r--vendor/symfony/http-kernel/Tests/Fragment/InlineFragmentRendererTest.php250
-rw-r--r--vendor/symfony/http-kernel/Tests/Fragment/RoutableFragmentRendererTest.php94
-rw-r--r--vendor/symfony/http-kernel/Tests/Fragment/SsiFragmentRendererTest.php97
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php248
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTest.php1367
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTestCase.php185
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/ResponseCacheStrategyTest.php222
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php215
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/StoreTest.php301
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php92
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php81
-rw-r--r--vendor/symfony/http-kernel/Tests/HttpKernelTest.php403
-rw-r--r--vendor/symfony/http-kernel/Tests/KernelTest.php900
-rw-r--r--vendor/symfony/http-kernel/Tests/Logger.php88
-rw-r--r--vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php350
-rw-r--r--vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php91
-rw-r--r--vendor/symfony/http-kernel/Tests/TestHttpKernel.php42
-rw-r--r--vendor/symfony/http-kernel/Tests/UriSignerTest.php64
116 files changed, 11300 insertions, 0 deletions
diff --git a/vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php b/vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php
new file mode 100644
index 0000000000..eeefccab81
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Bundle/BundleTest.php
@@ -0,0 +1,100 @@
+<?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\Bundle;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionNotValidBundle\ExtensionNotValidBundle;
+use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\ExtensionPresentBundle;
+use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionAbsentBundle\ExtensionAbsentBundle;
+use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command\FooCommand;
+
+class BundleTest extends TestCase
+{
+ public function testGetContainerExtension()
+ {
+ $bundle = new ExtensionPresentBundle();
+
+ $this->assertInstanceOf(
+ 'Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\DependencyInjection\ExtensionPresentExtension',
+ $bundle->getContainerExtension()
+ );
+ }
+
+ public function testRegisterCommands()
+ {
+ $cmd = new FooCommand();
+ $app = $this->getMockBuilder('Symfony\Component\Console\Application')->getMock();
+ $app->expects($this->once())->method('add')->with($this->equalTo($cmd));
+
+ $bundle = new ExtensionPresentBundle();
+ $bundle->registerCommands($app);
+
+ $bundle2 = new ExtensionAbsentBundle();
+
+ $this->assertNull($bundle2->registerCommands($app));
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface
+ */
+ public function testGetContainerExtensionWithInvalidClass()
+ {
+ $bundle = new ExtensionNotValidBundle();
+ $bundle->getContainerExtension();
+ }
+
+ public function testHttpKernelRegisterCommandsIgnoresCommandsThatAreRegisteredAsServices()
+ {
+ $container = new ContainerBuilder();
+ $container->register('console.command.symfony_component_httpkernel_tests_fixtures_extensionpresentbundle_command_foocommand', 'Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command\FooCommand');
+
+ $application = $this->getMockBuilder('Symfony\Component\Console\Application')->getMock();
+ // add() is never called when the found command classes are already registered as services
+ $application->expects($this->never())->method('add');
+
+ $bundle = new ExtensionPresentBundle();
+ $bundle->setContainer($container);
+ $bundle->registerCommands($application);
+ }
+
+ public function testBundleNameIsGuessedFromClass()
+ {
+ $bundle = new GuessedNameBundle();
+
+ $this->assertSame('Symfony\Component\HttpKernel\Tests\Bundle', $bundle->getNamespace());
+ $this->assertSame('GuessedNameBundle', $bundle->getName());
+ }
+
+ public function testBundleNameCanBeExplicitlyProvided()
+ {
+ $bundle = new NamedBundle();
+
+ $this->assertSame('ExplicitlyNamedBundle', $bundle->getName());
+ $this->assertSame('Symfony\Component\HttpKernel\Tests\Bundle', $bundle->getNamespace());
+ $this->assertSame('ExplicitlyNamedBundle', $bundle->getName());
+ }
+}
+
+class NamedBundle extends Bundle
+{
+ public function __construct()
+ {
+ $this->name = 'ExplicitlyNamedBundle';
+ }
+}
+
+class GuessedNameBundle extends Bundle
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php b/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php
new file mode 100644
index 0000000000..1bc853349f
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/CacheClearer/ChainCacheClearerTest.php
@@ -0,0 +1,58 @@
+<?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\CacheClearer;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\CacheClearer\ChainCacheClearer;
+
+class ChainCacheClearerTest extends TestCase
+{
+ protected static $cacheDir;
+
+ public static function setUpBeforeClass()
+ {
+ self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf2_cache_clearer_dir');
+ }
+
+ public static function tearDownAfterClass()
+ {
+ @unlink(self::$cacheDir);
+ }
+
+ public function testInjectClearersInConstructor()
+ {
+ $clearer = $this->getMockClearer();
+ $clearer
+ ->expects($this->once())
+ ->method('clear');
+
+ $chainClearer = new ChainCacheClearer(array($clearer));
+ $chainClearer->clear(self::$cacheDir);
+ }
+
+ public function testInjectClearerUsingAdd()
+ {
+ $clearer = $this->getMockClearer();
+ $clearer
+ ->expects($this->once())
+ ->method('clear');
+
+ $chainClearer = new ChainCacheClearer();
+ $chainClearer->add($clearer);
+ $chainClearer->clear(self::$cacheDir);
+ }
+
+ protected function getMockClearer()
+ {
+ return $this->getMockBuilder('Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface')->getMock();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/CacheClearer/Psr6CacheClearerTest.php b/vendor/symfony/http-kernel/Tests/CacheClearer/Psr6CacheClearerTest.php
new file mode 100644
index 0000000000..a5d9b6ef4d
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/CacheClearer/Psr6CacheClearerTest.php
@@ -0,0 +1,69 @@
+<?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\CacheClearer;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
+use Psr\Cache\CacheItemPoolInterface;
+
+class Psr6CacheClearerTest extends TestCase
+{
+ public function testClearPoolsInjectedInConstructor()
+ {
+ $pool = $this->getMockBuilder(CacheItemPoolInterface::class)->getMock();
+ $pool
+ ->expects($this->once())
+ ->method('clear');
+
+ (new Psr6CacheClearer(array('pool' => $pool)))->clear('');
+ }
+
+ public function testClearPool()
+ {
+ $pool = $this->getMockBuilder(CacheItemPoolInterface::class)->getMock();
+ $pool
+ ->expects($this->once())
+ ->method('clear');
+
+ (new Psr6CacheClearer(array('pool' => $pool)))->clearPool('pool');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Cache pool not found: unknown
+ */
+ public function testClearPoolThrowsExceptionOnUnreferencedPool()
+ {
+ (new Psr6CacheClearer())->clearPool('unknown');
+ }
+
+ /**
+ * @group legacy
+ * @expectedDeprecation The Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer::addPool() method is deprecated since version 3.3 and will be removed in 4.0. Pass an array of pools indexed by name to the constructor instead.
+ */
+ public function testClearPoolsInjectedByAdder()
+ {
+ $pool1 = $this->getMockBuilder(CacheItemPoolInterface::class)->getMock();
+ $pool1
+ ->expects($this->once())
+ ->method('clear');
+
+ $pool2 = $this->getMockBuilder(CacheItemPoolInterface::class)->getMock();
+ $pool2
+ ->expects($this->once())
+ ->method('clear');
+
+ $clearer = new Psr6CacheClearer(array('pool1' => $pool1));
+ $clearer->addPool($pool2);
+ $clearer->clear('');
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php
new file mode 100644
index 0000000000..d07ade303f
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php
@@ -0,0 +1,101 @@
+<?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\CacheWarmer;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate;
+
+class CacheWarmerAggregateTest extends TestCase
+{
+ protected static $cacheDir;
+
+ public static function setUpBeforeClass()
+ {
+ self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf2_cache_warmer_dir');
+ }
+
+ public static function tearDownAfterClass()
+ {
+ @unlink(self::$cacheDir);
+ }
+
+ public function testInjectWarmersUsingConstructor()
+ {
+ $warmer = $this->getCacheWarmerMock();
+ $warmer
+ ->expects($this->once())
+ ->method('warmUp');
+ $aggregate = new CacheWarmerAggregate(array($warmer));
+ $aggregate->warmUp(self::$cacheDir);
+ }
+
+ public function testInjectWarmersUsingAdd()
+ {
+ $warmer = $this->getCacheWarmerMock();
+ $warmer
+ ->expects($this->once())
+ ->method('warmUp');
+ $aggregate = new CacheWarmerAggregate();
+ $aggregate->add($warmer);
+ $aggregate->warmUp(self::$cacheDir);
+ }
+
+ public function testInjectWarmersUsingSetWarmers()
+ {
+ $warmer = $this->getCacheWarmerMock();
+ $warmer
+ ->expects($this->once())
+ ->method('warmUp');
+ $aggregate = new CacheWarmerAggregate();
+ $aggregate->setWarmers(array($warmer));
+ $aggregate->warmUp(self::$cacheDir);
+ }
+
+ public function testWarmupDoesCallWarmupOnOptionalWarmersWhenEnableOptionalWarmersIsEnabled()
+ {
+ $warmer = $this->getCacheWarmerMock();
+ $warmer
+ ->expects($this->never())
+ ->method('isOptional');
+ $warmer
+ ->expects($this->once())
+ ->method('warmUp');
+
+ $aggregate = new CacheWarmerAggregate(array($warmer));
+ $aggregate->enableOptionalWarmers();
+ $aggregate->warmUp(self::$cacheDir);
+ }
+
+ public function testWarmupDoesNotCallWarmupOnOptionalWarmersWhenEnableOptionalWarmersIsNotEnabled()
+ {
+ $warmer = $this->getCacheWarmerMock();
+ $warmer
+ ->expects($this->once())
+ ->method('isOptional')
+ ->will($this->returnValue(true));
+ $warmer
+ ->expects($this->never())
+ ->method('warmUp');
+
+ $aggregate = new CacheWarmerAggregate(array($warmer));
+ $aggregate->warmUp(self::$cacheDir);
+ }
+
+ protected function getCacheWarmerMock()
+ {
+ $warmer = $this->getMockBuilder('Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ return $warmer;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php
new file mode 100644
index 0000000000..05666cb0dc
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/CacheWarmer/CacheWarmerTest.php
@@ -0,0 +1,68 @@
+<?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\CacheWarmer;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;
+
+class CacheWarmerTest extends TestCase
+{
+ protected static $cacheFile;
+
+ public static function setUpBeforeClass()
+ {
+ self::$cacheFile = tempnam(sys_get_temp_dir(), 'sf2_cache_warmer_dir');
+ }
+
+ public static function tearDownAfterClass()
+ {
+ @unlink(self::$cacheFile);
+ }
+
+ public function testWriteCacheFileCreatesTheFile()
+ {
+ $warmer = new TestCacheWarmer(self::$cacheFile);
+ $warmer->warmUp(dirname(self::$cacheFile));
+
+ $this->assertFileExists(self::$cacheFile);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testWriteNonWritableCacheFileThrowsARuntimeException()
+ {
+ $nonWritableFile = '/this/file/is/very/probably/not/writable';
+ $warmer = new TestCacheWarmer($nonWritableFile);
+ $warmer->warmUp(dirname($nonWritableFile));
+ }
+}
+
+class TestCacheWarmer extends CacheWarmer
+{
+ protected $file;
+
+ public function __construct($file)
+ {
+ $this->file = $file;
+ }
+
+ public function warmUp($cacheDir)
+ {
+ $this->writeCacheFile($this->file, 'content');
+ }
+
+ public function isOptional()
+ {
+ return false;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/ClientTest.php b/vendor/symfony/http-kernel/Tests/ClientTest.php
new file mode 100644
index 0000000000..1ac72c7359
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/ClientTest.php
@@ -0,0 +1,183 @@
+<?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;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Client;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\StreamedResponse;
+use Symfony\Component\HttpFoundation\Cookie;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+use Symfony\Component\HttpKernel\Tests\Fixtures\TestClient;
+
+/**
+ * @group time-sensitive
+ */
+class ClientTest extends TestCase
+{
+ public function testDoRequest()
+ {
+ $client = new Client(new TestHttpKernel());
+
+ $client->request('GET', '/');
+ $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
+ $this->assertInstanceOf('Symfony\Component\BrowserKit\Request', $client->getInternalRequest());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\Request', $client->getRequest());
+ $this->assertInstanceOf('Symfony\Component\BrowserKit\Response', $client->getInternalResponse());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $client->getResponse());
+
+ $client->request('GET', 'http://www.example.com/');
+ $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
+ $this->assertEquals('www.example.com', $client->getRequest()->getHost(), '->doRequest() uses the request handler to make the request');
+
+ $client->request('GET', 'http://www.example.com/?parameter=http://google.com');
+ $this->assertEquals('http://www.example.com/?parameter='.urlencode('http://google.com'), $client->getRequest()->getUri(), '->doRequest() uses the request handler to make the request');
+ }
+
+ public function testGetScript()
+ {
+ $client = new TestClient(new TestHttpKernel());
+ $client->insulate();
+ $client->request('GET', '/');
+
+ $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->getScript() returns a script that uses the request handler to make the request');
+ }
+
+ public function testFilterResponseConvertsCookies()
+ {
+ $client = new Client(new TestHttpKernel());
+
+ $r = new \ReflectionObject($client);
+ $m = $r->getMethod('filterResponse');
+ $m->setAccessible(true);
+
+ $expected = array(
+ 'foo=bar; expires=Sun, 15-Feb-2009 20:00:00 GMT; max-age='.(strtotime('Sun, 15-Feb-2009 20:00:00 GMT') - time()).'; path=/foo; domain=http://example.com; secure; httponly',
+ 'foo1=bar1; expires=Sun, 15-Feb-2009 20:00:00 GMT; max-age='.(strtotime('Sun, 15-Feb-2009 20:00:00 GMT') - time()).'; path=/foo; domain=http://example.com; secure; httponly',
+ );
+
+ $response = new Response();
+ $response->headers->setCookie(new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true));
+ $domResponse = $m->invoke($client, $response);
+ $this->assertEquals($expected[0], $domResponse->getHeader('Set-Cookie'));
+
+ $response = new Response();
+ $response->headers->setCookie(new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true));
+ $response->headers->setCookie(new Cookie('foo1', 'bar1', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true));
+ $domResponse = $m->invoke($client, $response);
+ $this->assertEquals($expected[0], $domResponse->getHeader('Set-Cookie'));
+ $this->assertEquals($expected, $domResponse->getHeader('Set-Cookie', false));
+ }
+
+ public function testFilterResponseSupportsStreamedResponses()
+ {
+ $client = new Client(new TestHttpKernel());
+
+ $r = new \ReflectionObject($client);
+ $m = $r->getMethod('filterResponse');
+ $m->setAccessible(true);
+
+ $response = new StreamedResponse(function () {
+ echo 'foo';
+ });
+
+ $domResponse = $m->invoke($client, $response);
+ $this->assertEquals('foo', $domResponse->getContent());
+ }
+
+ public function testUploadedFile()
+ {
+ $source = tempnam(sys_get_temp_dir(), 'source');
+ $target = sys_get_temp_dir().'/sf.moved.file';
+ @unlink($target);
+
+ $kernel = new TestHttpKernel();
+ $client = new Client($kernel);
+
+ $files = array(
+ array('tmp_name' => $source, 'name' => 'original', 'type' => 'mime/original', 'size' => 123, 'error' => UPLOAD_ERR_OK),
+ new UploadedFile($source, 'original', 'mime/original', 123, UPLOAD_ERR_OK, true),
+ );
+
+ $file = null;
+ foreach ($files as $file) {
+ $client->request('POST', '/', array(), array('foo' => $file));
+
+ $files = $client->getRequest()->files->all();
+
+ $this->assertCount(1, $files);
+
+ $file = $files['foo'];
+
+ $this->assertEquals('original', $file->getClientOriginalName());
+ $this->assertEquals('mime/original', $file->getClientMimeType());
+ $this->assertEquals('123', $file->getClientSize());
+ $this->assertTrue($file->isValid());
+ }
+
+ $file->move(dirname($target), basename($target));
+
+ $this->assertFileExists($target);
+ unlink($target);
+ }
+
+ public function testUploadedFileWhenNoFileSelected()
+ {
+ $kernel = new TestHttpKernel();
+ $client = new Client($kernel);
+
+ $file = array('tmp_name' => '', 'name' => '', 'type' => '', 'size' => 0, 'error' => UPLOAD_ERR_NO_FILE);
+
+ $client->request('POST', '/', array(), array('foo' => $file));
+
+ $files = $client->getRequest()->files->all();
+
+ $this->assertCount(1, $files);
+ $this->assertNull($files['foo']);
+ }
+
+ public function testUploadedFileWhenSizeExceedsUploadMaxFileSize()
+ {
+ $source = tempnam(sys_get_temp_dir(), 'source');
+
+ $kernel = new TestHttpKernel();
+ $client = new Client($kernel);
+
+ $file = $this
+ ->getMockBuilder('Symfony\Component\HttpFoundation\File\UploadedFile')
+ ->setConstructorArgs(array($source, 'original', 'mime/original', 123, UPLOAD_ERR_OK, true))
+ ->setMethods(array('getSize'))
+ ->getMock()
+ ;
+
+ $file->expects($this->once())
+ ->method('getSize')
+ ->will($this->returnValue(INF))
+ ;
+
+ $client->request('POST', '/', array(), array($file));
+
+ $files = $client->getRequest()->files->all();
+
+ $this->assertCount(1, $files);
+
+ $file = $files[0];
+
+ $this->assertFalse($file->isValid());
+ $this->assertEquals(UPLOAD_ERR_INI_SIZE, $file->getError());
+ $this->assertEquals('mime/original', $file->getClientMimeType());
+ $this->assertEquals('original', $file->getClientOriginalName());
+ $this->assertEquals(0, $file->getClientSize());
+
+ unlink($source);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php b/vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php
new file mode 100644
index 0000000000..6fe8a67568
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Config/EnvParametersResourceTest.php
@@ -0,0 +1,107 @@
+<?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\Config;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Config\EnvParametersResource;
+
+class EnvParametersResourceTest extends TestCase
+{
+ protected $prefix = '__DUMMY_';
+ protected $initialEnv;
+ protected $resource;
+
+ protected function setUp()
+ {
+ $this->initialEnv = array(
+ $this->prefix.'1' => 'foo',
+ $this->prefix.'2' => 'bar',
+ );
+
+ foreach ($this->initialEnv as $key => $value) {
+ $_SERVER[$key] = $value;
+ }
+
+ $this->resource = new EnvParametersResource($this->prefix);
+ }
+
+ protected function tearDown()
+ {
+ foreach ($_SERVER as $key => $value) {
+ if (0 === strpos($key, $this->prefix)) {
+ unset($_SERVER[$key]);
+ }
+ }
+ }
+
+ public function testGetResource()
+ {
+ $this->assertSame(
+ array('prefix' => $this->prefix, 'variables' => $this->initialEnv),
+ $this->resource->getResource(),
+ '->getResource() returns the resource'
+ );
+ }
+
+ public function testToString()
+ {
+ $this->assertSame(
+ serialize(array('prefix' => $this->prefix, 'variables' => $this->initialEnv)),
+ (string) $this->resource
+ );
+ }
+
+ public function testIsFreshNotChanged()
+ {
+ $this->assertTrue(
+ $this->resource->isFresh(time()),
+ '->isFresh() returns true if the variables have not changed'
+ );
+ }
+
+ public function testIsFreshValueChanged()
+ {
+ reset($this->initialEnv);
+ $_SERVER[key($this->initialEnv)] = 'baz';
+
+ $this->assertFalse(
+ $this->resource->isFresh(time()),
+ '->isFresh() returns false if a variable has been changed'
+ );
+ }
+
+ public function testIsFreshValueRemoved()
+ {
+ reset($this->initialEnv);
+ unset($_SERVER[key($this->initialEnv)]);
+
+ $this->assertFalse(
+ $this->resource->isFresh(time()),
+ '->isFresh() returns false if a variable has been removed'
+ );
+ }
+
+ public function testIsFreshValueAdded()
+ {
+ $_SERVER[$this->prefix.'3'] = 'foo';
+
+ $this->assertFalse(
+ $this->resource->isFresh(time()),
+ '->isFresh() returns false if a variable has been added'
+ );
+ }
+
+ public function testSerializeUnserialize()
+ {
+ $this->assertEquals($this->resource, unserialize(serialize($this->resource)));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php b/vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php
new file mode 100644
index 0000000000..6265f02755
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Config/FileLocatorTest.php
@@ -0,0 +1,48 @@
+<?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\Config;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Config\FileLocator;
+
+class FileLocatorTest extends TestCase
+{
+ public function testLocate()
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\KernelInterface')->getMock();
+ $kernel
+ ->expects($this->atLeastOnce())
+ ->method('locateResource')
+ ->with('@BundleName/some/path', null, true)
+ ->will($this->returnValue('/bundle-name/some/path'));
+ $locator = new FileLocator($kernel);
+ $this->assertEquals('/bundle-name/some/path', $locator->locate('@BundleName/some/path'));
+
+ $kernel
+ ->expects($this->never())
+ ->method('locateResource');
+ $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('LogicException');
+ $locator->locate('/some/path');
+ }
+
+ public function testLocateWithGlobalResourcePath()
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\KernelInterface')->getMock();
+ $kernel
+ ->expects($this->atLeastOnce())
+ ->method('locateResource')
+ ->with('@BundleName/some/path', '/global/resource/path', false);
+
+ $locator = new FileLocator($kernel, '/global/resource/path');
+ $locator->locate('@BundleName/some/path', null, false);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php b/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php
new file mode 100644
index 0000000000..0804139030
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Controller/ArgumentResolverTest.php
@@ -0,0 +1,349 @@
+<?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\Controller;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
+use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
+use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingSession;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
+use Symfony\Component\HttpFoundation\Request;
+
+class ArgumentResolverTest extends TestCase
+{
+ /** @var ArgumentResolver */
+ private static $resolver;
+
+ public static function setUpBeforeClass()
+ {
+ $factory = new ArgumentMetadataFactory();
+
+ self::$resolver = new ArgumentResolver($factory);
+ }
+
+ public function testDefaultState()
+ {
+ $this->assertEquals(self::$resolver, new ArgumentResolver());
+ $this->assertNotEquals(self::$resolver, new ArgumentResolver(null, array(new RequestAttributeValueResolver())));
+ }
+
+ public function testGetArguments()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = array(new self(), 'controllerWithFoo');
+
+ $this->assertEquals(array('foo'), self::$resolver->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method');
+ }
+
+ public function testGetArgumentsReturnsEmptyArrayWhenNoArguments()
+ {
+ $request = Request::create('/');
+ $controller = array(new self(), 'controllerWithoutArguments');
+
+ $this->assertEquals(array(), self::$resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments');
+ }
+
+ public function testGetArgumentsUsesDefaultValue()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = array(new self(), 'controllerWithFooAndDefaultBar');
+
+ $this->assertEquals(array('foo', null), self::$resolver->getArguments($request, $controller), '->getArguments() uses default values if present');
+ }
+
+ public function testGetArgumentsOverrideDefaultValueByRequestAttribute()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', 'bar');
+ $controller = array(new self(), 'controllerWithFooAndDefaultBar');
+
+ $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes');
+ }
+
+ public function testGetArgumentsFromClosure()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = function ($foo) {};
+
+ $this->assertEquals(array('foo'), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetArgumentsUsesDefaultValueFromClosure()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = function ($foo, $bar = 'bar') {};
+
+ $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetArgumentsFromInvokableObject()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = new self();
+
+ $this->assertEquals(array('foo', null), self::$resolver->getArguments($request, $controller));
+
+ // Test default bar overridden by request attribute
+ $request->attributes->set('bar', 'bar');
+
+ $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetArgumentsFromFunctionName()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('foobar', 'foobar');
+ $controller = __NAMESPACE__.'\controller_function';
+
+ $this->assertEquals(array('foo', 'foobar'), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetArgumentsFailsOnUnresolvedValue()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('foobar', 'foobar');
+ $controller = array(new self(), 'controllerWithFooBarFoobar');
+
+ try {
+ self::$resolver->getArguments($request, $controller);
+ $this->fail('->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
+ } catch (\Exception $e) {
+ $this->assertInstanceOf('\RuntimeException', $e, '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
+ }
+ }
+
+ public function testGetArgumentsInjectsRequest()
+ {
+ $request = Request::create('/');
+ $controller = array(new self(), 'controllerWithRequest');
+
+ $this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request');
+ }
+
+ public function testGetArgumentsInjectsExtendingRequest()
+ {
+ $request = ExtendingRequest::create('/');
+ $controller = array(new self(), 'controllerWithExtendingRequest');
+
+ $this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request when extended');
+ }
+
+ /**
+ * @requires PHP 5.6
+ */
+ public function testGetVariadicArguments()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', array('foo', 'bar'));
+ $controller = array(new VariadicController(), 'action');
+
+ $this->assertEquals(array('foo', 'foo', 'bar'), self::$resolver->getArguments($request, $controller));
+ }
+
+ /**
+ * @requires PHP 5.6
+ * @expectedException \InvalidArgumentException
+ */
+ public function testGetVariadicArgumentsWithoutArrayInRequest()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', 'foo');
+ $controller = array(new VariadicController(), 'action');
+
+ self::$resolver->getArguments($request, $controller);
+ }
+
+ /**
+ * @requires PHP 5.6
+ * @expectedException \InvalidArgumentException
+ */
+ public function testGetArgumentWithoutArray()
+ {
+ $factory = new ArgumentMetadataFactory();
+ $valueResolver = $this->getMockBuilder(ArgumentValueResolverInterface::class)->getMock();
+ $resolver = new ArgumentResolver($factory, array($valueResolver));
+
+ $valueResolver->expects($this->any())->method('supports')->willReturn(true);
+ $valueResolver->expects($this->any())->method('resolve')->willReturn('foo');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', 'foo');
+ $controller = array($this, 'controllerWithFooAndDefaultBar');
+ $resolver->getArguments($request, $controller);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testIfExceptionIsThrownWhenMissingAnArgument()
+ {
+ $request = Request::create('/');
+ $controller = array($this, 'controllerWithFoo');
+
+ self::$resolver->getArguments($request, $controller);
+ }
+
+ /**
+ * @requires PHP 7.1
+ */
+ public function testGetNullableArguments()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', new \stdClass());
+ $request->attributes->set('mandatory', 'mandatory');
+ $controller = array(new NullableController(), 'action');
+
+ $this->assertEquals(array('foo', new \stdClass(), 'value', 'mandatory'), self::$resolver->getArguments($request, $controller));
+ }
+
+ /**
+ * @requires PHP 7.1
+ */
+ public function testGetNullableArgumentsWithDefaults()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('mandatory', 'mandatory');
+ $controller = array(new NullableController(), 'action');
+
+ $this->assertEquals(array(null, null, 'value', 'mandatory'), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetSessionArguments()
+ {
+ $session = new Session(new MockArraySessionStorage());
+ $request = Request::create('/');
+ $request->setSession($session);
+ $controller = array($this, 'controllerWithSession');
+
+ $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetSessionArgumentsWithExtendedSession()
+ {
+ $session = new ExtendingSession(new MockArraySessionStorage());
+ $request = Request::create('/');
+ $request->setSession($session);
+ $controller = array($this, 'controllerWithExtendingSession');
+
+ $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller));
+ }
+
+ public function testGetSessionArgumentsWithInterface()
+ {
+ $session = $this->getMockBuilder(SessionInterface::class)->getMock();
+ $request = Request::create('/');
+ $request->setSession($session);
+ $controller = array($this, 'controllerWithSessionInterface');
+
+ $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller));
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testGetSessionMissMatchWithInterface()
+ {
+ $session = $this->getMockBuilder(SessionInterface::class)->getMock();
+ $request = Request::create('/');
+ $request->setSession($session);
+ $controller = array($this, 'controllerWithExtendingSession');
+
+ self::$resolver->getArguments($request, $controller);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testGetSessionMissMatchWithImplementation()
+ {
+ $session = new Session(new MockArraySessionStorage());
+ $request = Request::create('/');
+ $request->setSession($session);
+ $controller = array($this, 'controllerWithExtendingSession');
+
+ self::$resolver->getArguments($request, $controller);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testGetSessionMissMatchOnNull()
+ {
+ $request = Request::create('/');
+ $controller = array($this, 'controllerWithExtendingSession');
+
+ self::$resolver->getArguments($request, $controller);
+ }
+
+ public function __invoke($foo, $bar = null)
+ {
+ }
+
+ public function controllerWithFoo($foo)
+ {
+ }
+
+ public function controllerWithoutArguments()
+ {
+ }
+
+ protected function controllerWithFooAndDefaultBar($foo, $bar = null)
+ {
+ }
+
+ protected function controllerWithFooBarFoobar($foo, $bar, $foobar)
+ {
+ }
+
+ protected function controllerWithRequest(Request $request)
+ {
+ }
+
+ protected function controllerWithExtendingRequest(ExtendingRequest $request)
+ {
+ }
+
+ protected function controllerWithSession(Session $session)
+ {
+ }
+
+ protected function controllerWithSessionInterface(SessionInterface $session)
+ {
+ }
+
+ protected function controllerWithExtendingSession(ExtendingSession $session)
+ {
+ }
+}
+
+function controller_function($foo, $foobar)
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php b/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php
new file mode 100644
index 0000000000..30b535e825
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Controller/ContainerControllerResolverTest.php
@@ -0,0 +1,148 @@
+<?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\Controller;
+
+use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Controller\ContainerControllerResolver;
+
+class ContainerControllerResolverTest extends ControllerResolverTest
+{
+ public function testGetControllerService()
+ {
+ $container = $this->createMockContainer();
+ $container->expects($this->once())
+ ->method('get')
+ ->with('foo')
+ ->will($this->returnValue($this))
+ ;
+
+ $resolver = $this->createControllerResolver(null, $container);
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'foo:controllerMethod1');
+
+ $controller = $resolver->getController($request);
+
+ $this->assertInstanceOf(get_class($this), $controller[0]);
+ $this->assertSame('controllerMethod1', $controller[1]);
+ }
+
+ public function testGetControllerInvokableService()
+ {
+ $invokableController = new InvokableController('bar');
+
+ $container = $this->createMockContainer();
+ $container->expects($this->once())
+ ->method('has')
+ ->with('foo')
+ ->will($this->returnValue(true))
+ ;
+ $container->expects($this->once())
+ ->method('get')
+ ->with('foo')
+ ->will($this->returnValue($invokableController))
+ ;
+
+ $resolver = $this->createControllerResolver(null, $container);
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'foo');
+
+ $controller = $resolver->getController($request);
+
+ $this->assertEquals($invokableController, $controller);
+ }
+
+ public function testGetControllerInvokableServiceWithClassNameAsName()
+ {
+ $invokableController = new InvokableController('bar');
+ $className = __NAMESPACE__.'\InvokableController';
+
+ $container = $this->createMockContainer();
+ $container->expects($this->once())
+ ->method('has')
+ ->with($className)
+ ->will($this->returnValue(true))
+ ;
+ $container->expects($this->once())
+ ->method('get')
+ ->with($className)
+ ->will($this->returnValue($invokableController))
+ ;
+
+ $resolver = $this->createControllerResolver(null, $container);
+ $request = Request::create('/');
+ $request->attributes->set('_controller', $className);
+
+ $controller = $resolver->getController($request);
+
+ $this->assertEquals($invokableController, $controller);
+ }
+
+ /**
+ * @dataProvider getUndefinedControllers
+ */
+ public function testGetControllerOnNonUndefinedFunction($controller, $exceptionName = null, $exceptionMessage = null)
+ {
+ // All this logic needs to be duplicated, since calling parent::testGetControllerOnNonUndefinedFunction will override the expected excetion and not use the regex
+ $resolver = $this->createControllerResolver();
+ if (method_exists($this, 'expectException')) {
+ $this->expectException($exceptionName);
+ $this->expectExceptionMessageRegExp($exceptionMessage);
+ } else {
+ $this->setExpectedExceptionRegExp($exceptionName, $exceptionMessage);
+ }
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', $controller);
+ $resolver->getController($request);
+ }
+
+ public function getUndefinedControllers()
+ {
+ return array(
+ array('foo', \LogicException::class, '/Unable to parse the controller name "foo"\./'),
+ array('oof::bar', \InvalidArgumentException::class, '/Class "oof" does not exist\./'),
+ array('stdClass', \LogicException::class, '/Unable to parse the controller name "stdClass"\./'),
+ array(
+ 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::bar',
+ \InvalidArgumentException::class,
+ '/.?[cC]ontroller(.*?) for URI "\/" is not callable\.( Expected method(.*) Available methods)?/',
+ ),
+ );
+ }
+
+ protected function createControllerResolver(LoggerInterface $logger = null, ContainerInterface $container = null)
+ {
+ if (!$container) {
+ $container = $this->createMockContainer();
+ }
+
+ return new ContainerControllerResolver($container, $logger);
+ }
+
+ protected function createMockContainer()
+ {
+ return $this->getMockBuilder(ContainerInterface::class)->getMock();
+ }
+}
+
+class InvokableController
+{
+ public function __construct($bar) // mandatory argument to prevent automatic instantiation
+ {
+ }
+
+ public function __invoke()
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php b/vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php
new file mode 100644
index 0000000000..190e15ad67
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Controller/ControllerResolverTest.php
@@ -0,0 +1,331 @@
+<?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\Controller;
+
+use PHPUnit\Framework\TestCase;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\HttpKernel\Controller\ControllerResolver;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
+use Symfony\Component\HttpFoundation\Request;
+
+class ControllerResolverTest extends TestCase
+{
+ public function testGetControllerWithoutControllerParameter()
+ {
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $logger->expects($this->once())->method('warning')->with('Unable to look for the controller as the "_controller" parameter is missing.');
+ $resolver = $this->createControllerResolver($logger);
+
+ $request = Request::create('/');
+ $this->assertFalse($resolver->getController($request), '->getController() returns false when the request has no _controller attribute');
+ }
+
+ public function testGetControllerWithLambda()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', $lambda = function () {});
+ $controller = $resolver->getController($request);
+ $this->assertSame($lambda, $controller);
+ }
+
+ public function testGetControllerWithObjectAndInvokeMethod()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', $this);
+ $controller = $resolver->getController($request);
+ $this->assertSame($this, $controller);
+ }
+
+ public function testGetControllerWithObjectAndMethod()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', array($this, 'controllerMethod1'));
+ $controller = $resolver->getController($request);
+ $this->assertSame(array($this, 'controllerMethod1'), $controller);
+ }
+
+ public function testGetControllerWithClassAndMethod()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'));
+ $controller = $resolver->getController($request);
+ $this->assertSame(array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'), $controller);
+ }
+
+ public function testGetControllerWithObjectAndMethodAsString()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::controllerMethod1');
+ $controller = $resolver->getController($request);
+ $this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller[0], '->getController() returns a PHP callable');
+ }
+
+ public function testGetControllerWithClassAndInvokeMethod()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest');
+ $controller = $resolver->getController($request);
+ $this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testGetControllerOnObjectWithoutInvokeMethod()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', new \stdClass());
+ $resolver->getController($request);
+ }
+
+ public function testGetControllerWithFunction()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\some_controller_function');
+ $controller = $resolver->getController($request);
+ $this->assertSame('Symfony\Component\HttpKernel\Tests\Controller\some_controller_function', $controller);
+ }
+
+ /**
+ * @dataProvider getUndefinedControllers
+ */
+ public function testGetControllerOnNonUndefinedFunction($controller, $exceptionName = null, $exceptionMessage = null)
+ {
+ $resolver = $this->createControllerResolver();
+ if (method_exists($this, 'expectException')) {
+ $this->expectException($exceptionName);
+ $this->expectExceptionMessage($exceptionMessage);
+ } else {
+ $this->setExpectedException($exceptionName, $exceptionMessage);
+ }
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', $controller);
+ $resolver->getController($request);
+ }
+
+ public function getUndefinedControllers()
+ {
+ return array(
+ array(1, 'InvalidArgumentException', 'Unable to find controller "1".'),
+ array('foo', 'InvalidArgumentException', 'Unable to find controller "foo".'),
+ array('oof::bar', 'InvalidArgumentException', 'Class "oof" does not exist.'),
+ array('stdClass', 'InvalidArgumentException', 'Unable to find controller "stdClass".'),
+ array('Symfony\Component\HttpKernel\Tests\Controller\ControllerTest::staticsAction', 'InvalidArgumentException', 'The controller for URI "/" is not callable. Expected method "staticsAction" on class "Symfony\Component\HttpKernel\Tests\Controller\ControllerTest", did you mean "staticAction"?'),
+ array('Symfony\Component\HttpKernel\Tests\Controller\ControllerTest::privateAction', 'InvalidArgumentException', 'The controller for URI "/" is not callable. Method "privateAction" on class "Symfony\Component\HttpKernel\Tests\Controller\ControllerTest" should be public and non-abstract'),
+ array('Symfony\Component\HttpKernel\Tests\Controller\ControllerTest::protectedAction', 'InvalidArgumentException', 'The controller for URI "/" is not callable. Method "protectedAction" on class "Symfony\Component\HttpKernel\Tests\Controller\ControllerTest" should be public and non-abstract'),
+ array('Symfony\Component\HttpKernel\Tests\Controller\ControllerTest::undefinedAction', 'InvalidArgumentException', 'The controller for URI "/" is not callable. Expected method "undefinedAction" on class "Symfony\Component\HttpKernel\Tests\Controller\ControllerTest". Available methods: "publicAction", "staticAction"'),
+ );
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testGetArguments()
+ {
+ $resolver = $this->createControllerResolver();
+
+ $request = Request::create('/');
+ $controller = array(new self(), 'testGetArguments');
+ $this->assertEquals(array(), $resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = array(new self(), 'controllerMethod1');
+ $this->assertEquals(array('foo'), $resolver->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = array(new self(), 'controllerMethod2');
+ $this->assertEquals(array('foo', null), $resolver->getArguments($request, $controller), '->getArguments() uses default values if present');
+
+ $request->attributes->set('bar', 'bar');
+ $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = function ($foo) {};
+ $this->assertEquals(array('foo'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = function ($foo, $bar = 'bar') {};
+ $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = new self();
+ $this->assertEquals(array('foo', null), $resolver->getArguments($request, $controller));
+ $request->attributes->set('bar', 'bar');
+ $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('foobar', 'foobar');
+ $controller = 'Symfony\Component\HttpKernel\Tests\Controller\some_controller_function';
+ $this->assertEquals(array('foo', 'foobar'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('foobar', 'foobar');
+ $controller = array(new self(), 'controllerMethod3');
+
+ try {
+ $resolver->getArguments($request, $controller);
+ $this->fail('->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
+ } catch (\Exception $e) {
+ $this->assertInstanceOf('\RuntimeException', $e, '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
+ }
+
+ $request = Request::create('/');
+ $controller = array(new self(), 'controllerMethod5');
+ $this->assertEquals(array($request), $resolver->getArguments($request, $controller), '->getArguments() injects the request');
+ }
+
+ /**
+ * @requires PHP 5.6
+ * @group legacy
+ */
+ public function testGetVariadicArguments()
+ {
+ $resolver = new ControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', array('foo', 'bar'));
+ $controller = array(new VariadicController(), 'action');
+ $this->assertEquals(array('foo', 'foo', 'bar'), $resolver->getArguments($request, $controller));
+ }
+
+ public function testCreateControllerCanReturnAnyCallable()
+ {
+ $mock = $this->getMockBuilder('Symfony\Component\HttpKernel\Controller\ControllerResolver')->setMethods(array('createController'))->getMock();
+ $mock->expects($this->once())->method('createController')->will($this->returnValue('Symfony\Component\HttpKernel\Tests\Controller\some_controller_function'));
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'foobar');
+ $mock->getController($request);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ * @group legacy
+ */
+ public function testIfExceptionIsThrownWhenMissingAnArgument()
+ {
+ $resolver = new ControllerResolver();
+ $request = Request::create('/');
+
+ $controller = array($this, 'controllerMethod1');
+
+ $resolver->getArguments($request, $controller);
+ }
+
+ /**
+ * @requires PHP 7.1
+ * @group legacy
+ */
+ public function testGetNullableArguments()
+ {
+ $resolver = new ControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', new \stdClass());
+ $request->attributes->set('mandatory', 'mandatory');
+ $controller = array(new NullableController(), 'action');
+ $this->assertEquals(array('foo', new \stdClass(), 'value', 'mandatory'), $resolver->getArguments($request, $controller));
+ }
+
+ /**
+ * @requires PHP 7.1
+ * @group legacy
+ */
+ public function testGetNullableArgumentsWithDefaults()
+ {
+ $resolver = new ControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('mandatory', 'mandatory');
+ $controller = array(new NullableController(), 'action');
+ $this->assertEquals(array(null, null, 'value', 'mandatory'), $resolver->getArguments($request, $controller));
+ }
+
+ protected function createControllerResolver(LoggerInterface $logger = null)
+ {
+ return new ControllerResolver($logger);
+ }
+
+ public function __invoke($foo, $bar = null)
+ {
+ }
+
+ public function controllerMethod1($foo)
+ {
+ }
+
+ protected function controllerMethod2($foo, $bar = null)
+ {
+ }
+
+ protected function controllerMethod3($foo, $bar, $foobar)
+ {
+ }
+
+ protected static function controllerMethod4()
+ {
+ }
+
+ protected function controllerMethod5(Request $request)
+ {
+ }
+}
+
+function some_controller_function($foo, $foobar)
+{
+}
+
+class ControllerTest
+{
+ public function publicAction()
+ {
+ }
+
+ private function privateAction()
+ {
+ }
+
+ protected function protectedAction()
+ {
+ }
+
+ public static function staticAction()
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php b/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php
new file mode 100644
index 0000000000..b4b449f358
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataFactoryTest.php
@@ -0,0 +1,148 @@
+<?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\ControllerMetadata;
+
+use Fake\ImportedAndFake;
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
+use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\BasicTypesController;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
+
+class ArgumentMetadataFactoryTest extends TestCase
+{
+ /**
+ * @var ArgumentMetadataFactory
+ */
+ private $factory;
+
+ protected function setUp()
+ {
+ $this->factory = new ArgumentMetadataFactory();
+ }
+
+ public function testSignature1()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array($this, 'signature1'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', self::class, false, false, null),
+ new ArgumentMetadata('bar', 'array', false, false, null),
+ new ArgumentMetadata('baz', 'callable', false, false, null),
+ ), $arguments);
+ }
+
+ public function testSignature2()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array($this, 'signature2'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', self::class, false, true, null, true),
+ new ArgumentMetadata('bar', __NAMESPACE__.'\FakeClassThatDoesNotExist', false, true, null, true),
+ new ArgumentMetadata('baz', 'Fake\ImportedAndFake', false, true, null, true),
+ ), $arguments);
+ }
+
+ public function testSignature3()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array($this, 'signature3'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('bar', __NAMESPACE__.'\FakeClassThatDoesNotExist', false, false, null),
+ new ArgumentMetadata('baz', 'Fake\ImportedAndFake', false, false, null),
+ ), $arguments);
+ }
+
+ public function testSignature4()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array($this, 'signature4'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', null, false, true, 'default'),
+ new ArgumentMetadata('bar', null, false, true, 500),
+ new ArgumentMetadata('baz', null, false, true, array()),
+ ), $arguments);
+ }
+
+ public function testSignature5()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array($this, 'signature5'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', 'array', false, true, null, true),
+ new ArgumentMetadata('bar', null, false, false, null),
+ ), $arguments);
+ }
+
+ /**
+ * @requires PHP 5.6
+ */
+ public function testVariadicSignature()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array(new VariadicController(), 'action'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', null, false, false, null),
+ new ArgumentMetadata('bar', null, true, false, null),
+ ), $arguments);
+ }
+
+ /**
+ * @requires PHP 7.0
+ */
+ public function testBasicTypesSignature()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array(new BasicTypesController(), 'action'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', 'string', false, false, null),
+ new ArgumentMetadata('bar', 'int', false, false, null),
+ new ArgumentMetadata('baz', 'float', false, false, null),
+ ), $arguments);
+ }
+
+ /**
+ * @requires PHP 7.1
+ */
+ public function testNullableTypesSignature()
+ {
+ $arguments = $this->factory->createArgumentMetadata(array(new NullableController(), 'action'));
+
+ $this->assertEquals(array(
+ new ArgumentMetadata('foo', 'string', false, false, null, true),
+ new ArgumentMetadata('bar', \stdClass::class, false, false, null, true),
+ new ArgumentMetadata('baz', 'string', false, true, 'value', true),
+ new ArgumentMetadata('mandatory', null, false, false, null, true),
+ ), $arguments);
+ }
+
+ private function signature1(ArgumentMetadataFactoryTest $foo, array $bar, callable $baz)
+ {
+ }
+
+ private function signature2(ArgumentMetadataFactoryTest $foo = null, FakeClassThatDoesNotExist $bar = null, ImportedAndFake $baz = null)
+ {
+ }
+
+ private function signature3(FakeClassThatDoesNotExist $bar, ImportedAndFake $baz)
+ {
+ }
+
+ private function signature4($foo = 'default', $bar = 500, $baz = array())
+ {
+ }
+
+ private function signature5(array $foo = null, $bar)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php b/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php
new file mode 100644
index 0000000000..05351445e0
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/ControllerMetadata/ArgumentMetadataTest.php
@@ -0,0 +1,46 @@
+<?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\ControllerMetadata;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
+
+class ArgumentMetadataTest extends TestCase
+{
+ public function testWithBcLayerWithDefault()
+ {
+ $argument = new ArgumentMetadata('foo', 'string', false, true, 'default value');
+
+ $this->assertFalse($argument->isNullable());
+ }
+
+ public function testDefaultValueAvailable()
+ {
+ $argument = new ArgumentMetadata('foo', 'string', false, true, 'default value', true);
+
+ $this->assertTrue($argument->isNullable());
+ $this->assertTrue($argument->hasDefaultValue());
+ $this->assertSame('default value', $argument->getDefaultValue());
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testDefaultValueUnavailable()
+ {
+ $argument = new ArgumentMetadata('foo', 'string', false, false, null, false);
+
+ $this->assertFalse($argument->isNullable());
+ $this->assertFalse($argument->hasDefaultValue());
+ $argument->getDefaultValue();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/Compiler.log b/vendor/symfony/http-kernel/Tests/DataCollector/Compiler.log
new file mode 100644
index 0000000000..88b6840eae
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/Compiler.log
@@ -0,0 +1,4 @@
+Symfony\Component\DependencyInjection\Compiler\RemovePrivateAliasesPass: Removed service "Psr\Container\ContainerInterface"; reason: private alias.
+Symfony\Component\DependencyInjection\Compiler\RemovePrivateAliasesPass: Removed service "Symfony\Component\DependencyInjection\ContainerInterface"; reason: private alias.
+Some custom logging message
+With ending :
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php
new file mode 100644
index 0000000000..4fb36afda2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/ConfigDataCollectorTest.php
@@ -0,0 +1,66 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector;
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class ConfigDataCollectorTest extends TestCase
+{
+ public function testCollect()
+ {
+ $kernel = new KernelForTest('test', true);
+ $c = new ConfigDataCollector();
+ $c->setKernel($kernel);
+ $c->collect(new Request(), new Response());
+
+ $this->assertSame('test', $c->getEnv());
+ $this->assertTrue($c->isDebug());
+ $this->assertSame('config', $c->getName());
+ $this->assertSame('testkernel', $c->getAppName());
+ $this->assertRegExp('~^'.preg_quote($c->getPhpVersion(), '~').'~', PHP_VERSION);
+ $this->assertRegExp('~'.preg_quote((string) $c->getPhpVersionExtra(), '~').'$~', PHP_VERSION);
+ $this->assertSame(PHP_INT_SIZE * 8, $c->getPhpArchitecture());
+ $this->assertSame(class_exists('Locale', false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a', $c->getPhpIntlLocale());
+ $this->assertSame(date_default_timezone_get(), $c->getPhpTimezone());
+ $this->assertSame(Kernel::VERSION, $c->getSymfonyVersion());
+ $this->assertNull($c->getToken());
+ $this->assertSame(extension_loaded('xdebug'), $c->hasXDebug());
+ $this->assertSame(extension_loaded('Zend OPcache') && ini_get('opcache.enable'), $c->hasZendOpcache());
+ $this->assertSame(extension_loaded('apcu') && ini_get('apc.enabled'), $c->hasApcu());
+ }
+}
+
+class KernelForTest extends Kernel
+{
+ public function getName()
+ {
+ return 'testkernel';
+ }
+
+ public function registerBundles()
+ {
+ }
+
+ public function getBundles()
+ {
+ return array();
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php
new file mode 100644
index 0000000000..54fd39e0d8
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/DataCollectorTest.php
@@ -0,0 +1,38 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Tests\Fixtures\DataCollector\CloneVarDataCollector;
+use Symfony\Component\VarDumper\Cloner\VarCloner;
+
+class DataCollectorTest extends TestCase
+{
+ public function testCloneVarStringWithScheme()
+ {
+ $c = new CloneVarDataCollector('scheme://foo');
+ $c->collect(new Request(), new Response());
+ $cloner = new VarCloner();
+
+ $this->assertEquals($cloner->cloneVar('scheme://foo'), $c->getData());
+ }
+
+ public function testCloneVarExistingFilePath()
+ {
+ $c = new CloneVarDataCollector(array($filePath = tempnam(sys_get_temp_dir(), 'clone_var_data_collector_')));
+ $c->collect(new Request(), new Response());
+
+ $this->assertSame($filePath, $c->getData()[0]);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php
new file mode 100644
index 0000000000..e642e3c337
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/DumpDataCollectorTest.php
@@ -0,0 +1,115 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DataCollector\DumpDataCollector;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\VarDumper\Cloner\Data;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DumpDataCollectorTest extends TestCase
+{
+ public function testDump()
+ {
+ $data = new Data(array(array(123)));
+
+ $collector = new DumpDataCollector();
+
+ $this->assertSame('dump', $collector->getName());
+
+ $collector->dump($data);
+ $line = __LINE__ - 1;
+ $this->assertSame(1, $collector->getDumpsCount());
+
+ $dump = $collector->getDumps('html');
+ $this->assertTrue(isset($dump[0]['data']));
+ $dump[0]['data'] = preg_replace('/^.*?<pre/', '<pre', $dump[0]['data']);
+ $dump[0]['data'] = preg_replace('/sf-dump-\d+/', 'sf-dump', $dump[0]['data']);
+
+ $xDump = array(
+ array(
+ 'data' => "<pre class=sf-dump id=sf-dump data-indent-pad=\" \"><span class=sf-dump-num>123</span>\n</pre><script>Sfdump(\"sf-dump\")</script>\n",
+ 'name' => 'DumpDataCollectorTest.php',
+ 'file' => __FILE__,
+ 'line' => $line,
+ 'fileExcerpt' => false,
+ ),
+ );
+ $this->assertEquals($xDump, $dump);
+
+ $this->assertStringMatchesFormat('a:3:{i:0;a:5:{s:4:"data";%c:39:"Symfony\Component\VarDumper\Cloner\Data":%a', $collector->serialize());
+ $this->assertSame(0, $collector->getDumpsCount());
+ $this->assertSame('a:2:{i:0;b:0;i:1;s:5:"UTF-8";}', $collector->serialize());
+ }
+
+ public function testCollectDefault()
+ {
+ $data = new Data(array(array(123)));
+
+ $collector = new DumpDataCollector();
+
+ $collector->dump($data);
+ $line = __LINE__ - 1;
+
+ ob_start();
+ $collector->collect(new Request(), new Response());
+ $output = ob_get_clean();
+
+ $this->assertSame("DumpDataCollectorTest.php on line {$line}:\n123\n", $output);
+ $this->assertSame(1, $collector->getDumpsCount());
+ $collector->serialize();
+ }
+
+ public function testCollectHtml()
+ {
+ $data = new Data(array(array(123)));
+
+ $collector = new DumpDataCollector(null, 'test://%f:%l');
+
+ $collector->dump($data);
+ $line = __LINE__ - 1;
+ $file = __FILE__;
+ $xOutput = <<<EOTXT
+<pre class=sf-dump id=sf-dump data-indent-pad=" "><a href="test://{$file}:{$line}" title="{$file}"><span class=sf-dump-meta>DumpDataCollectorTest.php</span></a> on line <span class=sf-dump-meta>{$line}</span>:
+<span class=sf-dump-num>123</span>
+</pre>
+EOTXT;
+
+ ob_start();
+ $response = new Response();
+ $response->headers->set('Content-Type', 'text/html');
+ $collector->collect(new Request(), $response);
+ $output = ob_get_clean();
+ $output = preg_replace('#<(script|style).*?</\1>#s', '', $output);
+ $output = preg_replace('/sf-dump-\d+/', 'sf-dump', $output);
+
+ $this->assertSame($xOutput, trim($output));
+ $this->assertSame(1, $collector->getDumpsCount());
+ $collector->serialize();
+ }
+
+ public function testFlush()
+ {
+ $data = new Data(array(array(456)));
+ $collector = new DumpDataCollector();
+ $collector->dump($data);
+ $line = __LINE__ - 1;
+
+ ob_start();
+ $collector->__destruct();
+ $this->assertSame("DumpDataCollectorTest.php on line {$line}:\n456\n", ob_get_clean());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/ExceptionDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/ExceptionDataCollectorTest.php
new file mode 100644
index 0000000000..afad9f58af
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/ExceptionDataCollectorTest.php
@@ -0,0 +1,40 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Debug\Exception\FlattenException;
+use Symfony\Component\HttpKernel\DataCollector\ExceptionDataCollector;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class ExceptionDataCollectorTest extends TestCase
+{
+ public function testCollect()
+ {
+ $e = new \Exception('foo', 500);
+ $c = new ExceptionDataCollector();
+ $flattened = FlattenException::create($e);
+ $trace = $flattened->getTrace();
+
+ $this->assertFalse($c->hasException());
+
+ $c->collect(new Request(), new Response(), $e);
+
+ $this->assertTrue($c->hasException());
+ $this->assertEquals($flattened, $c->getException());
+ $this->assertSame('foo', $c->getMessage());
+ $this->assertSame(500, $c->getCode());
+ $this->assertSame('exception', $c->getName());
+ $this->assertSame($trace, $c->getTrace());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/LoggerDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/LoggerDataCollectorTest.php
new file mode 100644
index 0000000000..62bf2c00c7
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/LoggerDataCollectorTest.php
@@ -0,0 +1,126 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Debug\Exception\SilencedErrorContext;
+use Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector;
+
+class LoggerDataCollectorTest extends TestCase
+{
+ public function testCollectWithUnexpectedFormat()
+ {
+ $logger = $this->getMockBuilder('Symfony\Component\HttpKernel\Log\DebugLoggerInterface')->getMock();
+ $logger->expects($this->once())->method('countErrors')->will($this->returnValue('foo'));
+ $logger->expects($this->exactly(2))->method('getLogs')->will($this->returnValue(array()));
+
+ $c = new LoggerDataCollector($logger, __DIR__.'/');
+ $c->lateCollect();
+ $compilerLogs = $c->getCompilerLogs()->getValue('message');
+
+ $this->assertSame(array(
+ array('message' => 'Removed service "Psr\Container\ContainerInterface"; reason: private alias.'),
+ array('message' => 'Removed service "Symfony\Component\DependencyInjection\ContainerInterface"; reason: private alias.'),
+ ), $compilerLogs['Symfony\Component\DependencyInjection\Compiler\RemovePrivateAliasesPass']);
+
+ $this->assertSame(array(
+ array('message' => 'Some custom logging message'),
+ array('message' => 'With ending :'),
+ ), $compilerLogs['Unknown Compiler Pass']);
+ }
+
+ /**
+ * @dataProvider getCollectTestData
+ */
+ public function testCollect($nb, $logs, $expectedLogs, $expectedDeprecationCount, $expectedScreamCount, $expectedPriorities = null)
+ {
+ $logger = $this->getMockBuilder('Symfony\Component\HttpKernel\Log\DebugLoggerInterface')->getMock();
+ $logger->expects($this->once())->method('countErrors')->will($this->returnValue($nb));
+ $logger->expects($this->exactly(2))->method('getLogs')->will($this->returnValue($logs));
+
+ $c = new LoggerDataCollector($logger);
+ $c->lateCollect();
+
+ $this->assertEquals('logger', $c->getName());
+ $this->assertEquals($nb, $c->countErrors());
+
+ $logs = array_map(function ($v) {
+ if (isset($v['context']['exception'])) {
+ $e = &$v['context']['exception'];
+ $e = isset($e["\0*\0message"]) ? array($e["\0*\0message"], $e["\0*\0severity"]) : array($e["\0Symfony\Component\Debug\Exception\SilencedErrorContext\0severity"]);
+ }
+
+ return $v;
+ }, $c->getLogs()->getValue(true));
+ $this->assertEquals($expectedLogs, $logs);
+ $this->assertEquals($expectedDeprecationCount, $c->countDeprecations());
+ $this->assertEquals($expectedScreamCount, $c->countScreams());
+
+ if (isset($expectedPriorities)) {
+ $this->assertSame($expectedPriorities, $c->getPriorities()->getValue(true));
+ }
+ }
+
+ public function getCollectTestData()
+ {
+ yield 'simple log' => array(
+ 1,
+ array(array('message' => 'foo', 'context' => array(), 'priority' => 100, 'priorityName' => 'DEBUG')),
+ array(array('message' => 'foo', 'context' => array(), 'priority' => 100, 'priorityName' => 'DEBUG')),
+ 0,
+ 0,
+ );
+
+ yield 'log with a context' => array(
+ 1,
+ array(array('message' => 'foo', 'context' => array('foo' => 'bar'), 'priority' => 100, 'priorityName' => 'DEBUG')),
+ array(array('message' => 'foo', 'context' => array('foo' => 'bar'), 'priority' => 100, 'priorityName' => 'DEBUG')),
+ 0,
+ 0,
+ );
+
+ if (!class_exists(SilencedErrorContext::class)) {
+ return;
+ }
+
+ yield 'logs with some deprecations' => array(
+ 1,
+ array(
+ array('message' => 'foo3', 'context' => array('exception' => new \ErrorException('warning', 0, E_USER_WARNING)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ array('message' => 'foo', 'context' => array('exception' => new \ErrorException('deprecated', 0, E_DEPRECATED)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ array('message' => 'foo2', 'context' => array('exception' => new \ErrorException('deprecated', 0, E_USER_DEPRECATED)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ ),
+ array(
+ array('message' => 'foo3', 'context' => array('exception' => array('warning', E_USER_WARNING)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ array('message' => 'foo', 'context' => array('exception' => array('deprecated', E_DEPRECATED)), 'priority' => 100, 'priorityName' => 'DEBUG', 'errorCount' => 1, 'scream' => false),
+ array('message' => 'foo2', 'context' => array('exception' => array('deprecated', E_USER_DEPRECATED)), 'priority' => 100, 'priorityName' => 'DEBUG', 'errorCount' => 1, 'scream' => false),
+ ),
+ 2,
+ 0,
+ array(100 => array('count' => 3, 'name' => 'DEBUG')),
+ );
+
+ yield 'logs with some silent errors' => array(
+ 1,
+ array(
+ array('message' => 'foo3', 'context' => array('exception' => new \ErrorException('warning', 0, E_USER_WARNING)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ array('message' => 'foo3', 'context' => array('exception' => new SilencedErrorContext(E_USER_WARNING, __FILE__, __LINE__)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ ),
+ array(
+ array('message' => 'foo3', 'context' => array('exception' => array('warning', E_USER_WARNING)), 'priority' => 100, 'priorityName' => 'DEBUG'),
+ array('message' => 'foo3', 'context' => array('exception' => array(E_USER_WARNING)), 'priority' => 100, 'priorityName' => 'DEBUG', 'errorCount' => 1, 'scream' => true),
+ ),
+ 0,
+ 1,
+ );
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/MemoryDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/MemoryDataCollectorTest.php
new file mode 100644
index 0000000000..ab78e9e8e1
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/MemoryDataCollectorTest.php
@@ -0,0 +1,59 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class MemoryDataCollectorTest extends TestCase
+{
+ public function testCollect()
+ {
+ $collector = new MemoryDataCollector();
+ $collector->collect(new Request(), new Response());
+
+ $this->assertInternalType('integer', $collector->getMemory());
+ $this->assertInternalType('integer', $collector->getMemoryLimit());
+ $this->assertSame('memory', $collector->getName());
+ }
+
+ /** @dataProvider getBytesConversionTestData */
+ public function testBytesConversion($limit, $bytes)
+ {
+ $collector = new MemoryDataCollector();
+ $method = new \ReflectionMethod($collector, 'convertToBytes');
+ $method->setAccessible(true);
+ $this->assertEquals($bytes, $method->invoke($collector, $limit));
+ }
+
+ public function getBytesConversionTestData()
+ {
+ return array(
+ array('2k', 2048),
+ array('2 k', 2048),
+ array('8m', 8 * 1024 * 1024),
+ array('+2 k', 2048),
+ array('+2???k', 2048),
+ array('0x10', 16),
+ array('0xf', 15),
+ array('010', 8),
+ array('+0x10 k', 16 * 1024),
+ array('1g', 1024 * 1024 * 1024),
+ array('1G', 1024 * 1024 * 1024),
+ array('-1', -1),
+ array('0', 0),
+ array('2mk', 2048), // the unit must be the last char, so in this case 'k', not 'm'
+ );
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php
new file mode 100644
index 0000000000..93767b9684
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/RequestDataCollectorTest.php
@@ -0,0 +1,287 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\ParameterBag;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;
+use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Cookie;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class RequestDataCollectorTest extends TestCase
+{
+ public function testCollect()
+ {
+ $c = new RequestDataCollector();
+
+ $c->collect($request = $this->createRequest(), $this->createResponse());
+ $c->lateCollect();
+
+ $attributes = $c->getRequestAttributes();
+
+ $this->assertSame('request', $c->getName());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestHeaders());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestServer());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestCookies());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $attributes);
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestRequest());
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestQuery());
+ $this->assertInstanceOf(ParameterBag::class, $c->getResponseCookies());
+ $this->assertSame('html', $c->getFormat());
+ $this->assertEquals('foobar', $c->getRoute());
+ $this->assertEquals(array('name' => 'foo'), $c->getRouteParams());
+ $this->assertSame(array(), $c->getSessionAttributes());
+ $this->assertSame('en', $c->getLocale());
+ $this->assertContains(__FILE__, $attributes->get('resource'));
+ $this->assertSame('stdClass', $attributes->get('object')->getType());
+
+ $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getResponseHeaders());
+ $this->assertSame('OK', $c->getStatusText());
+ $this->assertSame(200, $c->getStatusCode());
+ $this->assertSame('application/json', $c->getContentType());
+ }
+
+ public function testCollectWithoutRouteParams()
+ {
+ $request = $this->createRequest(array());
+
+ $c = new RequestDataCollector();
+ $c->collect($request, $this->createResponse());
+ $c->lateCollect();
+
+ $this->assertEquals(array(), $c->getRouteParams());
+ }
+
+ public function testKernelResponseDoesNotStartSession()
+ {
+ $kernel = $this->getMockBuilder(HttpKernelInterface::class)->getMock();
+ $request = new Request();
+ $session = new Session(new MockArraySessionStorage());
+ $request->setSession($session);
+ $response = new Response();
+
+ $c = new RequestDataCollector();
+ $c->onKernelResponse(new FilterResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST, $response));
+
+ $this->assertFalse($session->isStarted());
+ }
+
+ /**
+ * @dataProvider provideControllerCallables
+ */
+ public function testControllerInspection($name, $callable, $expected)
+ {
+ $c = new RequestDataCollector();
+ $request = $this->createRequest();
+ $response = $this->createResponse();
+ $this->injectController($c, $callable, $request);
+ $c->collect($request, $response);
+ $c->lateCollect();
+
+ $this->assertSame($expected, $c->getController()->getValue(true), sprintf('Testing: %s', $name));
+ }
+
+ public function provideControllerCallables()
+ {
+ // make sure we always match the line number
+ $r1 = new \ReflectionMethod($this, 'testControllerInspection');
+ $r2 = new \ReflectionMethod($this, 'staticControllerMethod');
+ $r3 = new \ReflectionClass($this);
+
+ // test name, callable, expected
+ return array(
+ array(
+ '"Regular" callable',
+ array($this, 'testControllerInspection'),
+ array(
+ 'class' => __NAMESPACE__.'\RequestDataCollectorTest',
+ 'method' => 'testControllerInspection',
+ 'file' => __FILE__,
+ 'line' => $r1->getStartLine(),
+ ),
+ ),
+
+ array(
+ 'Closure',
+ function () { return 'foo'; },
+ array(
+ 'class' => __NAMESPACE__.'\{closure}',
+ 'method' => null,
+ 'file' => __FILE__,
+ 'line' => __LINE__ - 5,
+ ),
+ ),
+
+ array(
+ 'Static callback as string',
+ __NAMESPACE__.'\RequestDataCollectorTest::staticControllerMethod',
+ array(
+ 'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
+ 'method' => 'staticControllerMethod',
+ 'file' => __FILE__,
+ 'line' => $r2->getStartLine(),
+ ),
+ ),
+
+ array(
+ 'Static callable with instance',
+ array($this, 'staticControllerMethod'),
+ array(
+ 'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
+ 'method' => 'staticControllerMethod',
+ 'file' => __FILE__,
+ 'line' => $r2->getStartLine(),
+ ),
+ ),
+
+ array(
+ 'Static callable with class name',
+ array('Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest', 'staticControllerMethod'),
+ array(
+ 'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
+ 'method' => 'staticControllerMethod',
+ 'file' => __FILE__,
+ 'line' => $r2->getStartLine(),
+ ),
+ ),
+
+ array(
+ 'Callable with instance depending on __call()',
+ array($this, 'magicMethod'),
+ array(
+ 'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
+ 'method' => 'magicMethod',
+ 'file' => 'n/a',
+ 'line' => 'n/a',
+ ),
+ ),
+
+ array(
+ 'Callable with class name depending on __callStatic()',
+ array('Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest', 'magicMethod'),
+ array(
+ 'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
+ 'method' => 'magicMethod',
+ 'file' => 'n/a',
+ 'line' => 'n/a',
+ ),
+ ),
+
+ array(
+ 'Invokable controller',
+ $this,
+ array(
+ 'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
+ 'method' => null,
+ 'file' => __FILE__,
+ 'line' => $r3->getStartLine(),
+ ),
+ ),
+ );
+ }
+
+ public function testItIgnoresInvalidCallables()
+ {
+ $request = $this->createRequestWithSession();
+ $response = new RedirectResponse('/');
+
+ $c = new RequestDataCollector();
+ $c->collect($request, $response);
+
+ $this->assertSame('n/a', $c->getController());
+ }
+
+ protected function createRequest($routeParams = array('name' => 'foo'))
+ {
+ $request = Request::create('http://test.com/foo?bar=baz');
+ $request->attributes->set('foo', 'bar');
+ $request->attributes->set('_route', 'foobar');
+ $request->attributes->set('_route_params', $routeParams);
+ $request->attributes->set('resource', fopen(__FILE__, 'r'));
+ $request->attributes->set('object', new \stdClass());
+
+ return $request;
+ }
+
+ private function createRequestWithSession()
+ {
+ $request = $this->createRequest();
+ $request->attributes->set('_controller', 'Foo::bar');
+ $request->setSession(new Session(new MockArraySessionStorage()));
+ $request->getSession()->start();
+
+ return $request;
+ }
+
+ protected function createResponse()
+ {
+ $response = new Response();
+ $response->setStatusCode(200);
+ $response->headers->set('Content-Type', 'application/json');
+ $response->headers->set('X-Foo-Bar', null);
+ $response->headers->setCookie(new Cookie('foo', 'bar', 1, '/foo', 'localhost', true, true));
+ $response->headers->setCookie(new Cookie('bar', 'foo', new \DateTime('@946684800')));
+ $response->headers->setCookie(new Cookie('bazz', 'foo', '2000-12-12'));
+
+ return $response;
+ }
+
+ /**
+ * Inject the given controller callable into the data collector.
+ */
+ protected function injectController($collector, $controller, $request)
+ {
+ $resolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface')->getMock();
+ $httpKernel = new HttpKernel(new EventDispatcher(), $resolver, null, $this->getMockBuilder(ArgumentResolverInterface::class)->getMock());
+ $event = new FilterControllerEvent($httpKernel, $controller, $request, HttpKernelInterface::MASTER_REQUEST);
+ $collector->onKernelController($event);
+ }
+
+ /**
+ * Dummy method used as controller callable.
+ */
+ public static function staticControllerMethod()
+ {
+ throw new \LogicException('Unexpected method call');
+ }
+
+ /**
+ * Magic method to allow non existing methods to be called and delegated.
+ */
+ public function __call($method, $args)
+ {
+ throw new \LogicException('Unexpected method call');
+ }
+
+ /**
+ * Magic method to allow non existing methods to be called and delegated.
+ */
+ public static function __callStatic($method, $args)
+ {
+ throw new \LogicException('Unexpected method call');
+ }
+
+ public function __invoke()
+ {
+ throw new \LogicException('Unexpected method call');
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/TimeDataCollectorTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/TimeDataCollectorTest.php
new file mode 100644
index 0000000000..8048cc37a5
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/TimeDataCollectorTest.php
@@ -0,0 +1,55 @@
+<?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\DataCollector;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DataCollector\TimeDataCollector;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * @group time-sensitive
+ */
+class TimeDataCollectorTest extends TestCase
+{
+ public function testCollect()
+ {
+ $c = new TimeDataCollector();
+
+ $request = new Request();
+ $request->server->set('REQUEST_TIME', 1);
+
+ $c->collect($request, new Response());
+
+ $this->assertEquals(0, $c->getStartTime());
+
+ $request->server->set('REQUEST_TIME_FLOAT', 2);
+
+ $c->collect($request, new Response());
+
+ $this->assertEquals(2000, $c->getStartTime());
+
+ $request = new Request();
+ $c->collect($request, new Response());
+ $this->assertEquals(0, $c->getStartTime());
+
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\KernelInterface')->getMock();
+ $kernel->expects($this->once())->method('getStartTime')->will($this->returnValue(123456));
+
+ $c = new TimeDataCollector($kernel);
+ $request = new Request();
+ $request->server->set('REQUEST_TIME', 1);
+
+ $c->collect($request, new Response());
+ $this->assertEquals(123456000, $c->getStartTime());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DataCollector/Util/ValueExporterTest.php b/vendor/symfony/http-kernel/Tests/DataCollector/Util/ValueExporterTest.php
new file mode 100644
index 0000000000..5fe92d60e0
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DataCollector/Util/ValueExporterTest.php
@@ -0,0 +1,51 @@
+<?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\DataCollector\Util;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter;
+
+/**
+ * @group legacy
+ */
+class ValueExporterTest extends TestCase
+{
+ /**
+ * @var ValueExporter
+ */
+ private $valueExporter;
+
+ protected function setUp()
+ {
+ $this->valueExporter = new ValueExporter();
+ }
+
+ public function testDateTime()
+ {
+ $dateTime = new \DateTime('2014-06-10 07:35:40', new \DateTimeZone('UTC'));
+ $this->assertSame('Object(DateTime) - 2014-06-10T07:35:40+00:00', $this->valueExporter->exportValue($dateTime));
+ }
+
+ public function testDateTimeImmutable()
+ {
+ $dateTime = new \DateTimeImmutable('2014-06-10 07:35:40', new \DateTimeZone('UTC'));
+ $this->assertSame('Object(DateTimeImmutable) - 2014-06-10T07:35:40+00:00', $this->valueExporter->exportValue($dateTime));
+ }
+
+ public function testIncompleteClass()
+ {
+ $foo = new \__PHP_Incomplete_Class();
+ $array = new \ArrayObject($foo);
+ $array['__PHP_Incomplete_Class_Name'] = 'AppBundle/Foo';
+ $this->assertSame('__PHP_Incomplete_Class(AppBundle/Foo)', $this->valueExporter->exportValue($foo));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Debug/FileLinkFormatterTest.php b/vendor/symfony/http-kernel/Tests/Debug/FileLinkFormatterTest.php
new file mode 100644
index 0000000000..d616098a54
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Debug/FileLinkFormatterTest.php
@@ -0,0 +1,67 @@
+<?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\Debug;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
+
+class FileLinkFormatterTest extends TestCase
+{
+ public function testWhenNoFileLinkFormatAndNoRequest()
+ {
+ $sut = new FileLinkFormatter();
+
+ $this->assertFalse($sut->format('/kernel/root/src/my/very/best/file.php', 3));
+ }
+
+ public function testWhenFileLinkFormatAndNoRequest()
+ {
+ $file = __DIR__.DIRECTORY_SEPARATOR.'file.php';
+
+ $sut = new FileLinkFormatter('debug://open?url=file://%f&line=%l', new RequestStack());
+
+ $this->assertSame("debug://open?url=file://$file&line=3", $sut->format($file, 3));
+ }
+
+ public function testWhenFileLinkFormatAndRequest()
+ {
+ $file = __DIR__.DIRECTORY_SEPARATOR.'file.php';
+ $baseDir = __DIR__;
+ $requestStack = new RequestStack();
+ $request = new Request();
+ $requestStack->push($request);
+
+ $sut = new FileLinkFormatter('debug://open?url=file://%f&line=%l', $requestStack, __DIR__, '/_profiler/open?file=%f&line=%l#line%l');
+
+ $this->assertSame("debug://open?url=file://$file&line=3", $sut->format($file, 3));
+ }
+
+ public function testWhenNoFileLinkFormatAndRequest()
+ {
+ $file = __DIR__.DIRECTORY_SEPARATOR.'file.php';
+ $requestStack = new RequestStack();
+ $request = new Request();
+ $requestStack->push($request);
+
+ $request->server->set('SERVER_NAME', 'www.example.org');
+ $request->server->set('SERVER_PORT', 80);
+ $request->server->set('SCRIPT_NAME', '/app.php');
+ $request->server->set('SCRIPT_FILENAME', '/web/app.php');
+ $request->server->set('REQUEST_URI', '/app.php/example');
+
+ $sut = new FileLinkFormatter(null, $requestStack, __DIR__, '/_profiler/open?file=%f&line=%l#line%l');
+
+ $this->assertSame('http://www.example.org/app.php/_profiler/open?file=file.php&line=3#line3', $sut->format($file, 3));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Debug/TraceableEventDispatcherTest.php b/vendor/symfony/http-kernel/Tests/Debug/TraceableEventDispatcherTest.php
new file mode 100644
index 0000000000..aaa82d524c
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Debug/TraceableEventDispatcherTest.php
@@ -0,0 +1,121 @@
+<?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\Debug;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Stopwatch\Stopwatch;
+
+class TraceableEventDispatcherTest extends TestCase
+{
+ public function testStopwatchSections()
+ {
+ $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch = new Stopwatch());
+ $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
+ $request = Request::create('/');
+ $response = $kernel->handle($request);
+ $kernel->terminate($request, $response);
+
+ $events = $stopwatch->getSectionEvents($response->headers->get('X-Debug-Token'));
+ $this->assertEquals(array(
+ '__section__',
+ 'kernel.request',
+ 'kernel.controller',
+ 'kernel.controller_arguments',
+ 'controller',
+ 'kernel.response',
+ 'kernel.terminate',
+ ), array_keys($events));
+ }
+
+ public function testStopwatchCheckControllerOnRequestEvent()
+ {
+ $stopwatch = $this->getMockBuilder('Symfony\Component\Stopwatch\Stopwatch')
+ ->setMethods(array('isStarted'))
+ ->getMock();
+ $stopwatch->expects($this->once())
+ ->method('isStarted')
+ ->will($this->returnValue(false));
+
+ $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
+ $request = Request::create('/');
+ $kernel->handle($request);
+ }
+
+ public function testStopwatchStopControllerOnRequestEvent()
+ {
+ $stopwatch = $this->getMockBuilder('Symfony\Component\Stopwatch\Stopwatch')
+ ->setMethods(array('isStarted', 'stop', 'stopSection'))
+ ->getMock();
+ $stopwatch->expects($this->once())
+ ->method('isStarted')
+ ->will($this->returnValue(true));
+ $stopwatch->expects($this->once())
+ ->method('stop');
+ $stopwatch->expects($this->once())
+ ->method('stopSection');
+
+ $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
+ $request = Request::create('/');
+ $kernel->handle($request);
+ }
+
+ public function testAddListenerNested()
+ {
+ $called1 = false;
+ $called2 = false;
+ $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
+ $dispatcher->addListener('my-event', function () use ($dispatcher, &$called1, &$called2) {
+ $called1 = true;
+ $dispatcher->addListener('my-event', function () use (&$called2) {
+ $called2 = true;
+ });
+ });
+ $dispatcher->dispatch('my-event');
+ $this->assertTrue($called1);
+ $this->assertFalse($called2);
+ $dispatcher->dispatch('my-event');
+ $this->assertTrue($called2);
+ }
+
+ public function testListenerCanRemoveItselfWhenExecuted()
+ {
+ $eventDispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
+ $listener1 = function () use ($eventDispatcher, &$listener1) {
+ $eventDispatcher->removeListener('foo', $listener1);
+ };
+ $eventDispatcher->addListener('foo', $listener1);
+ $eventDispatcher->addListener('foo', function () {});
+ $eventDispatcher->dispatch('foo');
+
+ $this->assertCount(1, $eventDispatcher->getListeners('foo'), 'expected listener1 to be removed');
+ }
+
+ protected function getHttpKernel($dispatcher, $controller)
+ {
+ $controllerResolver = $this->getMockBuilder('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface')->getMock();
+ $controllerResolver->expects($this->once())->method('getController')->will($this->returnValue($controller));
+ $argumentResolver = $this->getMockBuilder('Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface')->getMock();
+ $argumentResolver->expects($this->once())->method('getArguments')->will($this->returnValue(array()));
+
+ return new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/AddAnnotatedClassesToCachePassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/AddAnnotatedClassesToCachePassTest.php
new file mode 100644
index 0000000000..a2fb6afca4
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/AddAnnotatedClassesToCachePassTest.php
@@ -0,0 +1,99 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DependencyInjection\AddAnnotatedClassesToCachePass;
+
+class AddAnnotatedClassesToCachePassTest extends TestCase
+{
+ public function testExpandClasses()
+ {
+ $r = new \ReflectionClass(AddAnnotatedClassesToCachePass::class);
+ $pass = $r->newInstanceWithoutConstructor();
+ $r = new \ReflectionMethod(AddAnnotatedClassesToCachePass::class, 'expandClasses');
+ $r->setAccessible(true);
+ $expand = $r->getClosure($pass);
+
+ $this->assertSame('Foo', $expand(array('Foo'), array())[0]);
+ $this->assertSame('Foo', $expand(array('\\Foo'), array())[0]);
+ $this->assertSame('Foo', $expand(array('Foo'), array('\\Foo'))[0]);
+ $this->assertSame('Foo', $expand(array('Foo'), array('Foo'))[0]);
+ $this->assertSame('Foo', $expand(array('\\Foo'), array('\\Foo\\Bar'))[0]);
+ $this->assertSame('Foo', $expand(array('Foo'), array('\\Foo\\Bar'))[0]);
+ $this->assertSame('Foo', $expand(array('\\Foo'), array('\\Foo\\Bar\\Acme'))[0]);
+
+ $this->assertSame('Foo\\Bar', $expand(array('Foo\\'), array('\\Foo\\Bar'))[0]);
+ $this->assertSame('Foo\\Bar\\Acme', $expand(array('Foo\\'), array('\\Foo\\Bar\\Acme'))[0]);
+ $this->assertEmpty($expand(array('Foo\\'), array('\\Foo')));
+
+ $this->assertSame('Acme\\Foo\\Bar', $expand(array('**\\Foo\\'), array('\\Acme\\Foo\\Bar'))[0]);
+ $this->assertEmpty($expand(array('**\\Foo\\'), array('\\Foo\\Bar')));
+ $this->assertEmpty($expand(array('**\\Foo\\'), array('\\Acme\\Foo')));
+ $this->assertEmpty($expand(array('**\\Foo\\'), array('\\Foo')));
+
+ $this->assertSame('Acme\\Foo', $expand(array('**\\Foo'), array('\\Acme\\Foo'))[0]);
+ $this->assertEmpty($expand(array('**\\Foo'), array('\\Acme\\Foo\\AcmeBundle')));
+ $this->assertEmpty($expand(array('**\\Foo'), array('\\Acme\\FooBar\\AcmeBundle')));
+
+ $this->assertSame('Foo\\Acme\\Bar', $expand(array('Foo\\*\\Bar'), array('\\Foo\\Acme\\Bar'))[0]);
+ $this->assertEmpty($expand(array('Foo\\*\\Bar'), array('\\Foo\\Acme\\Bundle\\Bar')));
+
+ $this->assertSame('Foo\\Acme\\Bar', $expand(array('Foo\\**\\Bar'), array('\\Foo\\Acme\\Bar'))[0]);
+ $this->assertSame('Foo\\Acme\\Bundle\\Bar', $expand(array('Foo\\**\\Bar'), array('\\Foo\\Acme\\Bundle\\Bar'))[0]);
+
+ $this->assertSame('Acme\\Bar', $expand(array('*\\Bar'), array('\\Acme\\Bar'))[0]);
+ $this->assertEmpty($expand(array('*\\Bar'), array('\\Bar')));
+ $this->assertEmpty($expand(array('*\\Bar'), array('\\Foo\\Acme\\Bar')));
+
+ $this->assertSame('Foo\\Acme\\Bar', $expand(array('**\\Bar'), array('\\Foo\\Acme\\Bar'))[0]);
+ $this->assertSame('Foo\\Acme\\Bundle\\Bar', $expand(array('**\\Bar'), array('\\Foo\\Acme\\Bundle\\Bar'))[0]);
+ $this->assertEmpty($expand(array('**\\Bar'), array('\\Bar')));
+
+ $this->assertSame('Foo\\Bar', $expand(array('Foo\\*'), array('\\Foo\\Bar'))[0]);
+ $this->assertEmpty($expand(array('Foo\\*'), array('\\Foo\\Acme\\Bar')));
+
+ $this->assertSame('Foo\\Bar', $expand(array('Foo\\**'), array('\\Foo\\Bar'))[0]);
+ $this->assertSame('Foo\\Acme\\Bar', $expand(array('Foo\\**'), array('\\Foo\\Acme\\Bar'))[0]);
+
+ $this->assertSame(array('Foo\\Bar'), $expand(array('Foo\\*'), array('Foo\\Bar', 'Foo\\BarTest')));
+ $this->assertSame(array('Foo\\Bar', 'Foo\\BarTest'), $expand(array('Foo\\*', 'Foo\\*Test'), array('Foo\\Bar', 'Foo\\BarTest')));
+
+ $this->assertSame(
+ 'Acme\\FooBundle\\Controller\\DefaultController',
+ $expand(array('**Bundle\\Controller\\'), array('\\Acme\\FooBundle\\Controller\\DefaultController'))[0]
+ );
+
+ $this->assertSame(
+ 'FooBundle\\Controller\\DefaultController',
+ $expand(array('**Bundle\\Controller\\'), array('\\FooBundle\\Controller\\DefaultController'))[0]
+ );
+
+ $this->assertSame(
+ 'Acme\\FooBundle\\Controller\\Bar\\DefaultController',
+ $expand(array('**Bundle\\Controller\\'), array('\\Acme\\FooBundle\\Controller\\Bar\\DefaultController'))[0]
+ );
+
+ $this->assertSame(
+ 'Bundle\\Controller\\Bar\\DefaultController',
+ $expand(array('**Bundle\\Controller\\'), array('\\Bundle\\Controller\\Bar\\DefaultController'))[0]
+ );
+
+ $this->assertSame(
+ 'Acme\\Bundle\\Controller\\Bar\\DefaultController',
+ $expand(array('**Bundle\\Controller\\'), array('\\Acme\\Bundle\\Controller\\Bar\\DefaultController'))[0]
+ );
+
+ $this->assertSame('Foo\\Bar', $expand(array('Foo\\Bar'), array())[0]);
+ $this->assertSame('Foo\\Acme\\Bar', $expand(array('Foo\\**'), array('\\Foo\\Acme\\Bar'))[0]);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php
new file mode 100644
index 0000000000..df8977de0b
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/ControllerArgumentValueResolverPassTest.php
@@ -0,0 +1,67 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\DependencyInjection\ControllerArgumentValueResolverPass;
+
+class ControllerArgumentValueResolverPassTest extends TestCase
+{
+ public function testServicesAreOrderedAccordingToPriority()
+ {
+ $services = array(
+ 'n3' => array(array()),
+ 'n1' => array(array('priority' => 200)),
+ 'n2' => array(array('priority' => 100)),
+ );
+
+ $expected = array(
+ new Reference('n1'),
+ new Reference('n2'),
+ new Reference('n3'),
+ );
+
+ $definition = new Definition(ArgumentResolver::class, array(null, array()));
+ $container = new ContainerBuilder();
+ $container->setDefinition('argument_resolver', $definition);
+
+ foreach ($services as $id => list($tag)) {
+ $container->register($id)->addTag('controller.argument_value_resolver', $tag);
+ }
+
+ (new ControllerArgumentValueResolverPass())->process($container);
+ $this->assertEquals($expected, $definition->getArgument(1)->getValues());
+ }
+
+ public function testReturningEmptyArrayWhenNoService()
+ {
+ $definition = new Definition(ArgumentResolver::class, array(null, array()));
+ $container = new ContainerBuilder();
+ $container->setDefinition('argument_resolver', $definition);
+
+ (new ControllerArgumentValueResolverPass())->process($container);
+ $this->assertEquals(array(), $definition->getArgument(1)->getValues());
+ }
+
+ public function testNoArgumentResolver()
+ {
+ $container = new ContainerBuilder();
+
+ (new ControllerArgumentValueResolverPass())->process($container);
+
+ $this->assertFalse($container->hasDefinition('argument_resolver'));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php
new file mode 100644
index 0000000000..d28c6eca57
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/FragmentRendererPassTest.php
@@ -0,0 +1,105 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\DependencyInjection\FragmentRendererPass;
+use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;
+
+class FragmentRendererPassTest extends TestCase
+{
+ /**
+ * Tests that content rendering not implementing FragmentRendererInterface
+ * trigger an exception.
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testContentRendererWithoutInterface()
+ {
+ // one service, not implementing any interface
+ $services = array(
+ 'my_content_renderer' => array(array('alias' => 'foo')),
+ );
+
+ $definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
+
+ $builder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
+ $builder->expects($this->any())
+ ->method('hasDefinition')
+ ->will($this->returnValue(true));
+
+ // We don't test kernel.fragment_renderer here
+ $builder->expects($this->atLeastOnce())
+ ->method('findTaggedServiceIds')
+ ->will($this->returnValue($services));
+
+ $builder->expects($this->atLeastOnce())
+ ->method('getDefinition')
+ ->will($this->returnValue($definition));
+
+ $pass = new FragmentRendererPass();
+ $pass->process($builder);
+ }
+
+ public function testValidContentRenderer()
+ {
+ $services = array(
+ 'my_content_renderer' => array(array('alias' => 'foo')),
+ );
+
+ $renderer = new Definition('', array(null));
+
+ $definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
+ $definition->expects($this->atLeastOnce())
+ ->method('getClass')
+ ->will($this->returnValue('Symfony\Component\HttpKernel\Tests\DependencyInjection\RendererService'));
+
+ $builder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition', 'getReflectionClass'))->getMock();
+ $builder->expects($this->any())
+ ->method('hasDefinition')
+ ->will($this->returnValue(true));
+
+ // We don't test kernel.fragment_renderer here
+ $builder->expects($this->atLeastOnce())
+ ->method('findTaggedServiceIds')
+ ->will($this->returnValue($services));
+
+ $builder->expects($this->atLeastOnce())
+ ->method('getDefinition')
+ ->will($this->onConsecutiveCalls($renderer, $definition));
+
+ $builder->expects($this->atLeastOnce())
+ ->method('getReflectionClass')
+ ->with('Symfony\Component\HttpKernel\Tests\DependencyInjection\RendererService')
+ ->will($this->returnValue(new \ReflectionClass('Symfony\Component\HttpKernel\Tests\DependencyInjection\RendererService')));
+
+ $pass = new FragmentRendererPass();
+ $pass->process($builder);
+
+ $this->assertInstanceOf(Reference::class, $renderer->getArgument(0));
+ }
+}
+
+class RendererService implements FragmentRendererInterface
+{
+ public function render($uri, Request $request = null, array $options = array())
+ {
+ }
+
+ public function getName()
+ {
+ return 'test';
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php
new file mode 100644
index 0000000000..0406345d96
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php
@@ -0,0 +1,66 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DependencyInjection\LazyLoadingFragmentHandler;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class LazyLoadingFragmentHandlerTest extends TestCase
+{
+ /**
+ * @group legacy
+ * @expectedDeprecation The Symfony\Component\HttpKernel\DependencyInjection\LazyLoadingFragmentHandler::addRendererService() method is deprecated since version 3.3 and will be removed in 4.0.
+ */
+ public function testRenderWithLegacyMapping()
+ {
+ $renderer = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface')->getMock();
+ $renderer->expects($this->once())->method('getName')->will($this->returnValue('foo'));
+ $renderer->expects($this->any())->method('render')->will($this->returnValue(new Response()));
+
+ $requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock();
+ $requestStack->expects($this->any())->method('getCurrentRequest')->will($this->returnValue(Request::create('/')));
+
+ $container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerInterface')->getMock();
+ $container->expects($this->once())->method('get')->will($this->returnValue($renderer));
+
+ $handler = new LazyLoadingFragmentHandler($container, $requestStack, false);
+ $handler->addRendererService('foo', 'foo');
+
+ $handler->render('/foo', 'foo');
+
+ // second call should not lazy-load anymore (see once() above on the get() method)
+ $handler->render('/foo', 'foo');
+ }
+
+ public function testRender()
+ {
+ $renderer = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface')->getMock();
+ $renderer->expects($this->once())->method('getName')->will($this->returnValue('foo'));
+ $renderer->expects($this->any())->method('render')->will($this->returnValue(new Response()));
+
+ $requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock();
+ $requestStack->expects($this->any())->method('getCurrentRequest')->will($this->returnValue(Request::create('/')));
+
+ $container = $this->getMockBuilder('Psr\Container\ContainerInterface')->getMock();
+ $container->expects($this->once())->method('has')->with('foo')->willReturn(true);
+ $container->expects($this->once())->method('get')->will($this->returnValue($renderer));
+
+ $handler = new LazyLoadingFragmentHandler($container, $requestStack, false);
+
+ $handler->render('/foo', 'foo');
+
+ // second call should not lazy-load anymore (see once() above on the get() method)
+ $handler->render('/foo', 'foo');
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php
new file mode 100644
index 0000000000..81fc8b455d
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php
@@ -0,0 +1,55 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
+
+class MergeExtensionConfigurationPassTest extends TestCase
+{
+ public function testAutoloadMainExtension()
+ {
+ $container = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\ContainerBuilder')->setMethods(array('getExtensionConfig', 'loadFromExtension', 'getParameterBag', 'getDefinitions', 'getAliases', 'getExtensions'))->getMock();
+ $params = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag')->getMock();
+
+ $container->expects($this->at(0))
+ ->method('getExtensionConfig')
+ ->with('loaded')
+ ->will($this->returnValue(array(array())));
+ $container->expects($this->at(1))
+ ->method('getExtensionConfig')
+ ->with('notloaded')
+ ->will($this->returnValue(array()));
+ $container->expects($this->once())
+ ->method('loadFromExtension')
+ ->with('notloaded', array());
+
+ $container->expects($this->any())
+ ->method('getParameterBag')
+ ->will($this->returnValue($params));
+ $params->expects($this->any())
+ ->method('all')
+ ->will($this->returnValue(array()));
+ $container->expects($this->any())
+ ->method('getDefinitions')
+ ->will($this->returnValue(array()));
+ $container->expects($this->any())
+ ->method('getAliases')
+ ->will($this->returnValue(array()));
+ $container->expects($this->any())
+ ->method('getExtensions')
+ ->will($this->returnValue(array()));
+
+ $configPass = new MergeExtensionConfigurationPass(array('loaded', 'notloaded'));
+ $configPass->process($container);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php
new file mode 100644
index 0000000000..0542698d69
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php
@@ -0,0 +1,329 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareTrait;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\ServiceLocator;
+use Symfony\Component\DependencyInjection\TypedReference;
+use Symfony\Component\HttpKernel\DependencyInjection\RegisterControllerArgumentLocatorsPass;
+
+class RegisterControllerArgumentLocatorsPassTest extends TestCase
+{
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Class "Symfony\Component\HttpKernel\Tests\DependencyInjection\NotFound" used for service "foo" cannot be found.
+ */
+ public function testInvalidClass()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', NotFound::class)
+ ->addTag('controller.service_arguments')
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Missing "action" attribute on tag "controller.service_arguments" {"argument":"bar"} for service "foo".
+ */
+ public function testNoAction()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('argument' => 'bar'))
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Missing "argument" attribute on tag "controller.service_arguments" {"action":"fooAction"} for service "foo".
+ */
+ public function testNoArgument()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('action' => 'fooAction'))
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Missing "id" attribute on tag "controller.service_arguments" {"action":"fooAction","argument":"bar"} for service "foo".
+ */
+ public function testNoService()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('action' => 'fooAction', 'argument' => 'bar'))
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Invalid "action" attribute on tag "controller.service_arguments" for service "foo": no public "barAction()" method found on class "Symfony\Component\HttpKernel\Tests\DependencyInjection\RegisterTestController".
+ */
+ public function testInvalidMethod()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('action' => 'barAction', 'argument' => 'bar', 'id' => 'bar_service'))
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Invalid "controller.service_arguments" tag for service "foo": method "fooAction()" has no "baz" argument on class "Symfony\Component\HttpKernel\Tests\DependencyInjection\RegisterTestController".
+ */
+ public function testInvalidArgument()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('action' => 'fooAction', 'argument' => 'baz', 'id' => 'bar'))
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ public function testAllActions()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments')
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $locator = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+
+ $this->assertEquals(array('foo:fooAction'), array_keys($locator));
+ $this->assertInstanceof(ServiceClosureArgument::class, $locator['foo:fooAction']);
+
+ $locator = $container->getDefinition((string) $locator['foo:fooAction']->getValues()[0]);
+
+ $this->assertSame(ServiceLocator::class, $locator->getClass());
+ $this->assertFalse($locator->isPublic());
+
+ $expected = array('bar' => new ServiceClosureArgument(new TypedReference(ControllerDummy::class, ControllerDummy::class, RegisterTestController::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)));
+ $this->assertEquals($expected, $locator->getArgument(0));
+ }
+
+ public function testExplicitArgument()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('action' => 'fooAction', 'argument' => 'bar', 'id' => 'bar'))
+ ->addTag('controller.service_arguments', array('action' => 'fooAction', 'argument' => 'bar', 'id' => 'baz')) // should be ignored, the first wins
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $locator = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+ $locator = $container->getDefinition((string) $locator['foo:fooAction']->getValues()[0]);
+
+ $expected = array('bar' => new ServiceClosureArgument(new TypedReference('bar', ControllerDummy::class, RegisterTestController::class)));
+ $this->assertEquals($expected, $locator->getArgument(0));
+ }
+
+ public function testOptionalArgument()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', RegisterTestController::class)
+ ->addTag('controller.service_arguments', array('action' => 'fooAction', 'argument' => 'bar', 'id' => '?bar'))
+ ;
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $locator = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+ $locator = $container->getDefinition((string) $locator['foo:fooAction']->getValues()[0]);
+
+ $expected = array('bar' => new ServiceClosureArgument(new TypedReference('bar', ControllerDummy::class, RegisterTestController::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)));
+ $this->assertEquals($expected, $locator->getArgument(0));
+ }
+
+ public function testSkipSetContainer()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', ContainerAwareRegisterTestController::class)
+ ->addTag('controller.service_arguments');
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $locator = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+ $this->assertSame(array('foo:fooAction'), array_keys($locator));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Cannot determine controller argument for "Symfony\Component\HttpKernel\Tests\DependencyInjection\NonExistentClassController::fooAction()": the $nonExistent argument is type-hinted with the non-existent class or interface: "Symfony\Component\HttpKernel\Tests\DependencyInjection\NonExistentClass". Did you forget to add a use statement?
+ */
+ public function testExceptionOnNonExistentTypeHint()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', NonExistentClassController::class)
+ ->addTag('controller.service_arguments');
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Cannot determine controller argument for "Symfony\Component\HttpKernel\Tests\DependencyInjection\NonExistentClassDifferentNamespaceController::fooAction()": the $nonExistent argument is type-hinted with the non-existent class or interface: "Acme\NonExistentClass".
+ */
+ public function testExceptionOnNonExistentTypeHintDifferentNamespace()
+ {
+ $container = new ContainerBuilder();
+ $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', NonExistentClassDifferentNamespaceController::class)
+ ->addTag('controller.service_arguments');
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+ }
+
+ public function testNoExceptionOnNonExistentTypeHintOptionalArg()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', NonExistentClassOptionalController::class)
+ ->addTag('controller.service_arguments');
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $locator = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+ $this->assertSame(array('foo:barAction', 'foo:fooAction'), array_keys($locator));
+ }
+
+ public function testArgumentWithNoTypeHintIsOk()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('foo', ArgumentWithoutTypeController::class)
+ ->addTag('controller.service_arguments');
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $locator = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+ $this->assertEmpty(array_keys($locator));
+ }
+}
+
+class RegisterTestController
+{
+ public function __construct(ControllerDummy $bar)
+ {
+ }
+
+ public function fooAction(ControllerDummy $bar)
+ {
+ }
+
+ protected function barAction(ControllerDummy $bar)
+ {
+ }
+}
+
+class ContainerAwareRegisterTestController implements ContainerAwareInterface
+{
+ use ContainerAwareTrait;
+
+ public function fooAction(ControllerDummy $bar)
+ {
+ }
+}
+
+class ControllerDummy
+{
+}
+
+class NonExistentClassController
+{
+ public function fooAction(NonExistentClass $nonExistent)
+ {
+ }
+}
+
+class NonExistentClassDifferentNamespaceController
+{
+ public function fooAction(\Acme\NonExistentClass $nonExistent)
+ {
+ }
+}
+
+class NonExistentClassOptionalController
+{
+ public function fooAction(NonExistentClass $nonExistent = null)
+ {
+ }
+
+ public function barAction(NonExistentClass $nonExistent = null, $bar)
+ {
+ }
+}
+
+class ArgumentWithoutTypeController
+{
+ public function fooAction($someArg)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php b/vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php
new file mode 100644
index 0000000000..9cac968185
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPassTest.php
@@ -0,0 +1,148 @@
+<?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\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\Compiler\ResolveInvalidReferencesPass;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\DependencyInjection\RegisterControllerArgumentLocatorsPass;
+use Symfony\Component\HttpKernel\DependencyInjection\RemoveEmptyControllerArgumentLocatorsPass;
+
+class RemoveEmptyControllerArgumentLocatorsPassTest extends TestCase
+{
+ public function testProcess()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('stdClass', 'stdClass');
+ $container->register(parent::class, 'stdClass');
+ $container->register('c1', RemoveTestController1::class)->addTag('controller.service_arguments');
+ $container->register('c2', RemoveTestController2::class)->addTag('controller.service_arguments')
+ ->addMethodCall('setTestCase', array(new Reference('c1')));
+
+ $pass = new RegisterControllerArgumentLocatorsPass();
+ $pass->process($container);
+
+ $controllers = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+
+ $this->assertCount(2, $container->getDefinition((string) $controllers['c1:fooAction']->getValues()[0])->getArgument(0));
+ $this->assertCount(1, $container->getDefinition((string) $controllers['c2:setTestCase']->getValues()[0])->getArgument(0));
+ $this->assertCount(1, $container->getDefinition((string) $controllers['c2:fooAction']->getValues()[0])->getArgument(0));
+
+ (new ResolveInvalidReferencesPass())->process($container);
+
+ $this->assertCount(1, $container->getDefinition((string) $controllers['c2:setTestCase']->getValues()[0])->getArgument(0));
+ $this->assertSame(array(), $container->getDefinition((string) $controllers['c2:fooAction']->getValues()[0])->getArgument(0));
+
+ (new RemoveEmptyControllerArgumentLocatorsPass())->process($container);
+
+ $controllers = $container->getDefinition((string) $resolver->getArgument(0))->getArgument(0);
+
+ $this->assertSame(array('c1:fooAction'), array_keys($controllers));
+ $this->assertSame(array('bar'), array_keys($container->getDefinition((string) $controllers['c1:fooAction']->getValues()[0])->getArgument(0)));
+
+ $expectedLog = array(
+ 'Symfony\Component\HttpKernel\DependencyInjection\RemoveEmptyControllerArgumentLocatorsPass: Removing service-argument resolver for controller "c2:fooAction": no corresponding services exist for the referenced types.',
+ 'Symfony\Component\HttpKernel\DependencyInjection\RemoveEmptyControllerArgumentLocatorsPass: Removing method "setTestCase" of service "c2" from controller candidates: the method is called at instantiation, thus cannot be an action.',
+ );
+
+ $this->assertSame($expectedLog, $container->getCompiler()->getLog());
+ }
+
+ public function testSameIdClass()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register(RegisterTestController::class, RegisterTestController::class)
+ ->addTag('controller.service_arguments')
+ ;
+
+ (new RegisterControllerArgumentLocatorsPass())->process($container);
+ (new RemoveEmptyControllerArgumentLocatorsPass())->process($container);
+
+ $expected = array(
+ RegisterTestController::class.':fooAction',
+ RegisterTestController::class.'::fooAction',
+ );
+ $this->assertEquals($expected, array_keys($container->getDefinition((string) $resolver->getArgument(0))->getArgument(0)));
+ }
+
+ public function testInvoke()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register('invokable', InvokableRegisterTestController::class)
+ ->addTag('controller.service_arguments')
+ ;
+
+ (new RegisterControllerArgumentLocatorsPass())->process($container);
+ (new RemoveEmptyControllerArgumentLocatorsPass())->process($container);
+
+ $this->assertEquals(
+ array('invokable:__invoke', 'invokable'),
+ array_keys($container->getDefinition((string) $resolver->getArgument(0))->getArgument(0))
+ );
+ }
+
+ public function testInvokeSameIdClass()
+ {
+ $container = new ContainerBuilder();
+ $resolver = $container->register('argument_resolver.service')->addArgument(array());
+
+ $container->register(InvokableRegisterTestController::class, InvokableRegisterTestController::class)
+ ->addTag('controller.service_arguments')
+ ;
+
+ (new RegisterControllerArgumentLocatorsPass())->process($container);
+ (new RemoveEmptyControllerArgumentLocatorsPass())->process($container);
+
+ $expected = array(
+ InvokableRegisterTestController::class.':__invoke',
+ InvokableRegisterTestController::class.'::__invoke',
+ InvokableRegisterTestController::class,
+ );
+ $this->assertEquals($expected, array_keys($container->getDefinition((string) $resolver->getArgument(0))->getArgument(0)));
+ }
+}
+
+class RemoveTestController1
+{
+ public function fooAction(\stdClass $bar, ClassNotInContainer $baz)
+ {
+ }
+}
+
+class RemoveTestController2
+{
+ public function setTestCase(TestCase $test)
+ {
+ }
+
+ public function fooAction(ClassNotInContainer $bar)
+ {
+ }
+}
+
+class InvokableRegisterTestController
+{
+ public function __invoke(\stdClass $bar)
+ {
+ }
+}
+
+class ClassNotInContainer
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php b/vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php
new file mode 100644
index 0000000000..7242579301
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Event/GetResponseForExceptionEventTest.php
@@ -0,0 +1,27 @@
+<?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\Event;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\Tests\TestHttpKernel;
+
+class GetResponseForExceptionEventTest extends TestCase
+{
+ public function testAllowSuccessfulResponseIsFalseByDefault()
+ {
+ $event = new GetResponseForExceptionEvent(new TestHttpKernel(), new Request(), 1, new \Exception());
+
+ $this->assertFalse($event->isAllowingCustomResponseCode());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php
new file mode 100644
index 0000000000..f4878f626f
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/AddRequestFormatsListenerTest.php
@@ -0,0 +1,84 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\EventListener\AddRequestFormatsListener;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Test AddRequestFormatsListener class.
+ *
+ * @author Gildas Quemener <gildas.quemener@gmail.com>
+ */
+class AddRequestFormatsListenerTest extends TestCase
+{
+ /**
+ * @var AddRequestFormatsListener
+ */
+ private $listener;
+
+ protected function setUp()
+ {
+ $this->listener = new AddRequestFormatsListener(array('csv' => array('text/csv', 'text/plain')));
+ }
+
+ protected function tearDown()
+ {
+ $this->listener = null;
+ }
+
+ public function testIsAnEventSubscriber()
+ {
+ $this->assertInstanceOf('Symfony\Component\EventDispatcher\EventSubscriberInterface', $this->listener);
+ }
+
+ public function testRegisteredEvent()
+ {
+ $this->assertEquals(
+ array(KernelEvents::REQUEST => array('onKernelRequest', 1)),
+ AddRequestFormatsListener::getSubscribedEvents()
+ );
+ }
+
+ public function testSetAdditionalFormats()
+ {
+ $request = $this->getRequestMock();
+ $event = $this->getGetResponseEventMock($request);
+
+ $request->expects($this->once())
+ ->method('setFormat')
+ ->with('csv', array('text/csv', 'text/plain'));
+
+ $this->listener->onKernelRequest($event);
+ }
+
+ protected function getRequestMock()
+ {
+ return $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')->getMock();
+ }
+
+ protected function getGetResponseEventMock(Request $request)
+ {
+ $event = $this
+ ->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $event->expects($this->any())
+ ->method('getRequest')
+ ->will($this->returnValue($request));
+
+ return $event;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php
new file mode 100644
index 0000000000..d1349906bb
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/DebugHandlersListenerTest.php
@@ -0,0 +1,135 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Psr\Log\LogLevel;
+use Symfony\Component\Console\Event\ConsoleEvent;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Input\ArgvInput;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Debug\ErrorHandler;
+use Symfony\Component\Debug\ExceptionHandler;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\KernelEvent;
+use Symfony\Component\HttpKernel\EventListener\DebugHandlersListener;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * DebugHandlersListenerTest.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DebugHandlersListenerTest extends TestCase
+{
+ public function testConfigure()
+ {
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $userHandler = function () {};
+ $listener = new DebugHandlersListener($userHandler, $logger);
+ $xHandler = new ExceptionHandler();
+ $eHandler = new ErrorHandler();
+ $eHandler->setExceptionHandler(array($xHandler, 'handle'));
+
+ $exception = null;
+ set_error_handler(array($eHandler, 'handleError'));
+ set_exception_handler(array($eHandler, 'handleException'));
+ try {
+ $listener->configure();
+ } catch (\Exception $exception) {
+ }
+ restore_exception_handler();
+ restore_error_handler();
+
+ if (null !== $exception) {
+ throw $exception;
+ }
+
+ $this->assertSame($userHandler, $xHandler->setHandler('var_dump'));
+
+ $loggers = $eHandler->setLoggers(array());
+
+ $this->assertArrayHasKey(E_DEPRECATED, $loggers);
+ $this->assertSame(array($logger, LogLevel::INFO), $loggers[E_DEPRECATED]);
+ }
+
+ public function testConfigureForHttpKernelWithNoTerminateWithException()
+ {
+ $listener = new DebugHandlersListener(null);
+ $eHandler = new ErrorHandler();
+ $event = new KernelEvent(
+ $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock(),
+ Request::create('/'),
+ HttpKernelInterface::MASTER_REQUEST
+ );
+
+ $exception = null;
+ $h = set_exception_handler(array($eHandler, 'handleException'));
+ try {
+ $listener->configure($event);
+ } catch (\Exception $exception) {
+ }
+ restore_exception_handler();
+
+ if (null !== $exception) {
+ throw $exception;
+ }
+
+ $this->assertNull($h);
+ }
+
+ public function testConsoleEvent()
+ {
+ $dispatcher = new EventDispatcher();
+ $listener = new DebugHandlersListener(null);
+ $app = $this->getMockBuilder('Symfony\Component\Console\Application')->getMock();
+ $app->expects($this->once())->method('getHelperSet')->will($this->returnValue(new HelperSet()));
+ $command = new Command(__FUNCTION__);
+ $command->setApplication($app);
+ $event = new ConsoleEvent($command, new ArgvInput(), new ConsoleOutput());
+
+ $dispatcher->addSubscriber($listener);
+
+ $xListeners = array(
+ KernelEvents::REQUEST => array(array($listener, 'configure')),
+ ConsoleEvents::COMMAND => array(array($listener, 'configure')),
+ );
+ $this->assertSame($xListeners, $dispatcher->getListeners());
+
+ $exception = null;
+ $eHandler = new ErrorHandler();
+ set_error_handler(array($eHandler, 'handleError'));
+ set_exception_handler(array($eHandler, 'handleException'));
+ try {
+ $dispatcher->dispatch(ConsoleEvents::COMMAND, $event);
+ } catch (\Exception $exception) {
+ }
+ restore_exception_handler();
+ restore_error_handler();
+
+ if (null !== $exception) {
+ throw $exception;
+ }
+
+ $xHandler = $eHandler->setExceptionHandler('var_dump');
+ $this->assertInstanceOf('Closure', $xHandler);
+
+ $app->expects($this->once())
+ ->method('renderException');
+
+ $xHandler(new \Exception());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/DumpListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/DumpListenerTest.php
new file mode 100644
index 0000000000..509f443087
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/DumpListenerTest.php
@@ -0,0 +1,81 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Console\ConsoleEvents;
+use Symfony\Component\HttpKernel\EventListener\DumpListener;
+use Symfony\Component\VarDumper\Cloner\ClonerInterface;
+use Symfony\Component\VarDumper\Cloner\Data;
+use Symfony\Component\VarDumper\Dumper\DataDumperInterface;
+use Symfony\Component\VarDumper\VarDumper;
+
+/**
+ * DumpListenerTest.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DumpListenerTest extends TestCase
+{
+ public function testSubscribedEvents()
+ {
+ $this->assertSame(
+ array(ConsoleEvents::COMMAND => array('configure', 1024)),
+ DumpListener::getSubscribedEvents()
+ );
+ }
+
+ public function testConfigure()
+ {
+ $prevDumper = VarDumper::setHandler('var_dump');
+ VarDumper::setHandler($prevDumper);
+
+ $cloner = new MockCloner();
+ $dumper = new MockDumper();
+
+ ob_start();
+ $exception = null;
+ $listener = new DumpListener($cloner, $dumper);
+
+ try {
+ $listener->configure();
+
+ VarDumper::dump('foo');
+ VarDumper::dump('bar');
+
+ $this->assertSame('+foo-+bar-', ob_get_clean());
+ } catch (\Exception $exception) {
+ }
+
+ VarDumper::setHandler($prevDumper);
+
+ if (null !== $exception) {
+ throw $exception;
+ }
+ }
+}
+
+class MockCloner implements ClonerInterface
+{
+ public function cloneVar($var)
+ {
+ return new Data(array(array($var.'-')));
+ }
+}
+
+class MockDumper implements DataDumperInterface
+{
+ public function dump(Data $data)
+ {
+ echo '+'.$data->getValue();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php
new file mode 100644
index 0000000000..f5501a3f59
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/ExceptionListenerTest.php
@@ -0,0 +1,149 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\EventListener\ExceptionListener;
+use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Tests\Logger;
+
+/**
+ * ExceptionListenerTest.
+ *
+ * @author Robert Schönthal <seroscho@googlemail.com>
+ *
+ * @group time-sensitive
+ */
+class ExceptionListenerTest extends TestCase
+{
+ public function testConstruct()
+ {
+ $logger = new TestLogger();
+ $l = new ExceptionListener('foo', $logger);
+
+ $_logger = new \ReflectionProperty(get_class($l), 'logger');
+ $_logger->setAccessible(true);
+ $_controller = new \ReflectionProperty(get_class($l), 'controller');
+ $_controller->setAccessible(true);
+
+ $this->assertSame($logger, $_logger->getValue($l));
+ $this->assertSame('foo', $_controller->getValue($l));
+ }
+
+ /**
+ * @dataProvider provider
+ */
+ public function testHandleWithoutLogger($event, $event2)
+ {
+ $this->iniSet('error_log', file_exists('/dev/null') ? '/dev/null' : 'nul');
+
+ $l = new ExceptionListener('foo');
+ $l->onKernelException($event);
+
+ $this->assertEquals(new Response('foo'), $event->getResponse());
+
+ try {
+ $l->onKernelException($event2);
+ $this->fail('RuntimeException expected');
+ } catch (\RuntimeException $e) {
+ $this->assertSame('bar', $e->getMessage());
+ $this->assertSame('foo', $e->getPrevious()->getMessage());
+ }
+ }
+
+ /**
+ * @dataProvider provider
+ */
+ public function testHandleWithLogger($event, $event2)
+ {
+ $logger = new TestLogger();
+
+ $l = new ExceptionListener('foo', $logger);
+ $l->onKernelException($event);
+
+ $this->assertEquals(new Response('foo'), $event->getResponse());
+
+ try {
+ $l->onKernelException($event2);
+ $this->fail('RuntimeException expected');
+ } catch (\RuntimeException $e) {
+ $this->assertSame('bar', $e->getMessage());
+ $this->assertSame('foo', $e->getPrevious()->getMessage());
+ }
+
+ $this->assertEquals(3, $logger->countErrors());
+ $this->assertCount(3, $logger->getLogs('critical'));
+ }
+
+ public function provider()
+ {
+ if (!class_exists('Symfony\Component\HttpFoundation\Request')) {
+ return array(array(null, null));
+ }
+
+ $request = new Request();
+ $exception = new \Exception('foo');
+ $event = new GetResponseForExceptionEvent(new TestKernel(), $request, 'foo', $exception);
+ $event2 = new GetResponseForExceptionEvent(new TestKernelThatThrowsException(), $request, 'foo', $exception);
+
+ return array(
+ array($event, $event2),
+ );
+ }
+
+ public function testSubRequestFormat()
+ {
+ $listener = new ExceptionListener('foo', $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock());
+
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $kernel->expects($this->once())->method('handle')->will($this->returnCallback(function (Request $request) {
+ return new Response($request->getRequestFormat());
+ }));
+
+ $request = Request::create('/');
+ $request->setRequestFormat('xml');
+
+ $event = new GetResponseForExceptionEvent($kernel, $request, 'foo', new \Exception('foo'));
+ $listener->onKernelException($event);
+
+ $response = $event->getResponse();
+ $this->assertEquals('xml', $response->getContent());
+ }
+}
+
+class TestLogger extends Logger implements DebugLoggerInterface
+{
+ public function countErrors()
+ {
+ return count($this->logs['critical']);
+ }
+}
+
+class TestKernel implements HttpKernelInterface
+{
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
+ {
+ return new Response('foo');
+ }
+}
+
+class TestKernelThatThrowsException implements HttpKernelInterface
+{
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
+ {
+ throw new \RuntimeException('bar');
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/FragmentListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/FragmentListenerTest.php
new file mode 100644
index 0000000000..464b2ab462
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/FragmentListenerTest.php
@@ -0,0 +1,122 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\EventListener\FragmentListener;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\UriSigner;
+
+class FragmentListenerTest extends TestCase
+{
+ public function testOnlyTriggeredOnFragmentRoute()
+ {
+ $request = Request::create('http://example.com/foo?_path=foo%3Dbar%26_controller%3Dfoo');
+
+ $listener = new FragmentListener(new UriSigner('foo'));
+ $event = $this->createGetResponseEvent($request);
+
+ $expected = $request->attributes->all();
+
+ $listener->onKernelRequest($event);
+
+ $this->assertEquals($expected, $request->attributes->all());
+ $this->assertTrue($request->query->has('_path'));
+ }
+
+ public function testOnlyTriggeredIfControllerWasNotDefinedYet()
+ {
+ $request = Request::create('http://example.com/_fragment?_path=foo%3Dbar%26_controller%3Dfoo');
+ $request->attributes->set('_controller', 'bar');
+
+ $listener = new FragmentListener(new UriSigner('foo'));
+ $event = $this->createGetResponseEvent($request, HttpKernelInterface::SUB_REQUEST);
+
+ $expected = $request->attributes->all();
+
+ $listener->onKernelRequest($event);
+
+ $this->assertEquals($expected, $request->attributes->all());
+ }
+
+ /**
+ * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
+ */
+ public function testAccessDeniedWithNonSafeMethods()
+ {
+ $request = Request::create('http://example.com/_fragment', 'POST');
+
+ $listener = new FragmentListener(new UriSigner('foo'));
+ $event = $this->createGetResponseEvent($request);
+
+ $listener->onKernelRequest($event);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
+ */
+ public function testAccessDeniedWithWrongSignature()
+ {
+ $request = Request::create('http://example.com/_fragment', 'GET', array(), array(), array(), array('REMOTE_ADDR' => '10.0.0.1'));
+
+ $listener = new FragmentListener(new UriSigner('foo'));
+ $event = $this->createGetResponseEvent($request);
+
+ $listener->onKernelRequest($event);
+ }
+
+ public function testWithSignature()
+ {
+ $signer = new UriSigner('foo');
+ $request = Request::create($signer->sign('http://example.com/_fragment?_path=foo%3Dbar%26_controller%3Dfoo'), 'GET', array(), array(), array(), array('REMOTE_ADDR' => '10.0.0.1'));
+
+ $listener = new FragmentListener($signer);
+ $event = $this->createGetResponseEvent($request);
+
+ $listener->onKernelRequest($event);
+
+ $this->assertEquals(array('foo' => 'bar', '_controller' => 'foo'), $request->attributes->get('_route_params'));
+ $this->assertFalse($request->query->has('_path'));
+ }
+
+ public function testRemovesPathWithControllerDefined()
+ {
+ $request = Request::create('http://example.com/_fragment?_path=foo%3Dbar%26_controller%3Dfoo');
+
+ $listener = new FragmentListener(new UriSigner('foo'));
+ $event = $this->createGetResponseEvent($request, HttpKernelInterface::SUB_REQUEST);
+
+ $listener->onKernelRequest($event);
+
+ $this->assertFalse($request->query->has('_path'));
+ }
+
+ public function testRemovesPathWithControllerNotDefined()
+ {
+ $signer = new UriSigner('foo');
+ $request = Request::create($signer->sign('http://example.com/_fragment?_path=foo%3Dbar'), 'GET', array(), array(), array(), array('REMOTE_ADDR' => '10.0.0.1'));
+
+ $listener = new FragmentListener($signer);
+ $event = $this->createGetResponseEvent($request);
+
+ $listener->onKernelRequest($event);
+
+ $this->assertFalse($request->query->has('_path'));
+ }
+
+ private function createGetResponseEvent(Request $request, $requestType = HttpKernelInterface::MASTER_REQUEST)
+ {
+ return new GetResponseEvent($this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock(), $request, $requestType);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/LocaleListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/LocaleListenerTest.php
new file mode 100644
index 0000000000..2ce32819e1
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/LocaleListenerTest.php
@@ -0,0 +1,103 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\EventListener\LocaleListener;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+
+class LocaleListenerTest extends TestCase
+{
+ private $requestStack;
+
+ protected function setUp()
+ {
+ $this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->disableOriginalConstructor()->getMock();
+ }
+
+ public function testDefaultLocaleWithoutSession()
+ {
+ $listener = new LocaleListener($this->requestStack, 'fr');
+ $event = $this->getEvent($request = Request::create('/'));
+
+ $listener->onKernelRequest($event);
+ $this->assertEquals('fr', $request->getLocale());
+ }
+
+ public function testLocaleFromRequestAttribute()
+ {
+ $request = Request::create('/');
+ session_name('foo');
+ $request->cookies->set('foo', 'value');
+
+ $request->attributes->set('_locale', 'es');
+ $listener = new LocaleListener($this->requestStack, 'fr');
+ $event = $this->getEvent($request);
+
+ $listener->onKernelRequest($event);
+ $this->assertEquals('es', $request->getLocale());
+ }
+
+ public function testLocaleSetForRoutingContext()
+ {
+ // the request context is updated
+ $context = $this->getMockBuilder('Symfony\Component\Routing\RequestContext')->getMock();
+ $context->expects($this->once())->method('setParameter')->with('_locale', 'es');
+
+ $router = $this->getMockBuilder('Symfony\Component\Routing\Router')->setMethods(array('getContext'))->disableOriginalConstructor()->getMock();
+ $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
+
+ $request = Request::create('/');
+
+ $request->attributes->set('_locale', 'es');
+ $listener = new LocaleListener($this->requestStack, 'fr', $router);
+ $listener->onKernelRequest($this->getEvent($request));
+ }
+
+ public function testRouterResetWithParentRequestOnKernelFinishRequest()
+ {
+ // the request context is updated
+ $context = $this->getMockBuilder('Symfony\Component\Routing\RequestContext')->getMock();
+ $context->expects($this->once())->method('setParameter')->with('_locale', 'es');
+
+ $router = $this->getMockBuilder('Symfony\Component\Routing\Router')->setMethods(array('getContext'))->disableOriginalConstructor()->getMock();
+ $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
+
+ $parentRequest = Request::create('/');
+ $parentRequest->setLocale('es');
+
+ $this->requestStack->expects($this->once())->method('getParentRequest')->will($this->returnValue($parentRequest));
+
+ $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\FinishRequestEvent')->disableOriginalConstructor()->getMock();
+
+ $listener = new LocaleListener($this->requestStack, 'fr', $router);
+ $listener->onKernelFinishRequest($event);
+ }
+
+ public function testRequestLocaleIsNotOverridden()
+ {
+ $request = Request::create('/');
+ $request->setLocale('de');
+ $listener = new LocaleListener($this->requestStack, 'fr');
+ $event = $this->getEvent($request);
+
+ $listener->onKernelRequest($event);
+ $this->assertEquals('de', $request->getLocale());
+ }
+
+ private function getEvent(Request $request)
+ {
+ return new GetResponseEvent($this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock(), $request, HttpKernelInterface::MASTER_REQUEST);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/ProfilerListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/ProfilerListenerTest.php
new file mode 100644
index 0000000000..751aee8695
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/ProfilerListenerTest.php
@@ -0,0 +1,71 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\EventListener\ProfilerListener;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\Event\PostResponseEvent;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Symfony\Component\HttpKernel\Kernel;
+
+class ProfilerListenerTest extends TestCase
+{
+ /**
+ * Test a master and sub request with an exception and `onlyException` profiler option enabled.
+ */
+ public function testKernelTerminate()
+ {
+ $profile = $this->getMockBuilder('Symfony\Component\HttpKernel\Profiler\Profile')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $profiler = $this->getMockBuilder('Symfony\Component\HttpKernel\Profiler\Profiler')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $profiler->expects($this->once())
+ ->method('collect')
+ ->will($this->returnValue($profile));
+
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+
+ $masterRequest = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $subRequest = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $response = $this->getMockBuilder('Symfony\Component\HttpFoundation\Response')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $requestStack = new RequestStack();
+ $requestStack->push($masterRequest);
+
+ $onlyException = true;
+ $listener = new ProfilerListener($profiler, $requestStack, null, $onlyException);
+
+ // master request
+ $listener->onKernelResponse(new FilterResponseEvent($kernel, $masterRequest, Kernel::MASTER_REQUEST, $response));
+
+ // sub request
+ $listener->onKernelException(new GetResponseForExceptionEvent($kernel, $subRequest, Kernel::SUB_REQUEST, new HttpException(404)));
+ $listener->onKernelResponse(new FilterResponseEvent($kernel, $subRequest, Kernel::SUB_REQUEST, $response));
+
+ $listener->onKernelTerminate(new PostResponseEvent($kernel, $masterRequest, $response));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/ResponseListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/ResponseListenerTest.php
new file mode 100644
index 0000000000..12a31eb3ee
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/ResponseListenerTest.php
@@ -0,0 +1,95 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\EventListener\ResponseListener;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class ResponseListenerTest extends TestCase
+{
+ private $dispatcher;
+
+ private $kernel;
+
+ protected function setUp()
+ {
+ $this->dispatcher = new EventDispatcher();
+ $listener = new ResponseListener('UTF-8');
+ $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
+
+ $this->kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ }
+
+ protected function tearDown()
+ {
+ $this->dispatcher = null;
+ $this->kernel = null;
+ }
+
+ public function testFilterDoesNothingForSubRequests()
+ {
+ $response = new Response('foo');
+
+ $event = new FilterResponseEvent($this->kernel, new Request(), HttpKernelInterface::SUB_REQUEST, $response);
+ $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('', $event->getResponse()->headers->get('content-type'));
+ }
+
+ public function testFilterSetsNonDefaultCharsetIfNotOverridden()
+ {
+ $listener = new ResponseListener('ISO-8859-15');
+ $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'), 1);
+
+ $response = new Response('foo');
+
+ $event = new FilterResponseEvent($this->kernel, Request::create('/'), HttpKernelInterface::MASTER_REQUEST, $response);
+ $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('ISO-8859-15', $response->getCharset());
+ }
+
+ public function testFilterDoesNothingIfCharsetIsOverridden()
+ {
+ $listener = new ResponseListener('ISO-8859-15');
+ $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'), 1);
+
+ $response = new Response('foo');
+ $response->setCharset('ISO-8859-1');
+
+ $event = new FilterResponseEvent($this->kernel, Request::create('/'), HttpKernelInterface::MASTER_REQUEST, $response);
+ $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('ISO-8859-1', $response->getCharset());
+ }
+
+ public function testFiltersSetsNonDefaultCharsetIfNotOverriddenOnNonTextContentType()
+ {
+ $listener = new ResponseListener('ISO-8859-15');
+ $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'), 1);
+
+ $response = new Response('foo');
+ $request = Request::create('/');
+ $request->setRequestFormat('application/json');
+
+ $event = new FilterResponseEvent($this->kernel, $request, HttpKernelInterface::MASTER_REQUEST, $response);
+ $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('ISO-8859-15', $response->getCharset());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/RouterListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/RouterListenerTest.php
new file mode 100644
index 0000000000..a40e57998d
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/RouterListenerTest.php
@@ -0,0 +1,188 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\Controller\ControllerResolver;
+use Symfony\Component\HttpKernel\EventListener\ExceptionListener;
+use Symfony\Component\HttpKernel\EventListener\RouterListener;
+use Symfony\Component\HttpKernel\EventListener\ValidateRequestListener;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\Routing\RequestContext;
+
+class RouterListenerTest extends TestCase
+{
+ private $requestStack;
+
+ protected function setUp()
+ {
+ $this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->disableOriginalConstructor()->getMock();
+ }
+
+ /**
+ * @dataProvider getPortData
+ */
+ public function testPort($defaultHttpPort, $defaultHttpsPort, $uri, $expectedHttpPort, $expectedHttpsPort)
+ {
+ $urlMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\UrlMatcherInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $context = new RequestContext();
+ $context->setHttpPort($defaultHttpPort);
+ $context->setHttpsPort($defaultHttpsPort);
+ $urlMatcher->expects($this->any())
+ ->method('getContext')
+ ->will($this->returnValue($context));
+
+ $listener = new RouterListener($urlMatcher, $this->requestStack);
+ $event = $this->createGetResponseEventForUri($uri);
+ $listener->onKernelRequest($event);
+
+ $this->assertEquals($expectedHttpPort, $context->getHttpPort());
+ $this->assertEquals($expectedHttpsPort, $context->getHttpsPort());
+ $this->assertEquals(0 === strpos($uri, 'https') ? 'https' : 'http', $context->getScheme());
+ }
+
+ public function getPortData()
+ {
+ return array(
+ array(80, 443, 'http://localhost/', 80, 443),
+ array(80, 443, 'http://localhost:90/', 90, 443),
+ array(80, 443, 'https://localhost/', 80, 443),
+ array(80, 443, 'https://localhost:90/', 80, 90),
+ );
+ }
+
+ /**
+ * @param string $uri
+ *
+ * @return GetResponseEvent
+ */
+ private function createGetResponseEventForUri($uri)
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $request = Request::create($uri);
+ $request->attributes->set('_controller', null); // Prevents going in to routing process
+
+ return new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInvalidMatcher()
+ {
+ new RouterListener(new \stdClass(), $this->requestStack);
+ }
+
+ public function testRequestMatcher()
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $request = Request::create('http://localhost/');
+ $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+
+ $requestMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock();
+ $requestMatcher->expects($this->once())
+ ->method('matchRequest')
+ ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
+ ->will($this->returnValue(array()));
+
+ $listener = new RouterListener($requestMatcher, $this->requestStack, new RequestContext());
+ $listener->onKernelRequest($event);
+ }
+
+ public function testSubRequestWithDifferentMethod()
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $request = Request::create('http://localhost/', 'post');
+ $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+
+ $requestMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock();
+ $requestMatcher->expects($this->any())
+ ->method('matchRequest')
+ ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
+ ->will($this->returnValue(array()));
+
+ $context = new RequestContext();
+
+ $listener = new RouterListener($requestMatcher, $this->requestStack, new RequestContext());
+ $listener->onKernelRequest($event);
+
+ // sub-request with another HTTP method
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $request = Request::create('http://localhost/', 'get');
+ $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::SUB_REQUEST);
+
+ $listener->onKernelRequest($event);
+
+ $this->assertEquals('GET', $context->getMethod());
+ }
+
+ /**
+ * @dataProvider getLoggingParameterData
+ */
+ public function testLoggingParameter($parameter, $log, $parameters)
+ {
+ $requestMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock();
+ $requestMatcher->expects($this->once())
+ ->method('matchRequest')
+ ->will($this->returnValue($parameter));
+
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $logger->expects($this->once())
+ ->method('info')
+ ->with($this->equalTo($log), $this->equalTo($parameters));
+
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $request = Request::create('http://localhost/');
+
+ $listener = new RouterListener($requestMatcher, $this->requestStack, new RequestContext(), $logger);
+ $listener->onKernelRequest(new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST));
+ }
+
+ public function getLoggingParameterData()
+ {
+ return array(
+ array(array('_route' => 'foo'), 'Matched route "{route}".', array('route' => 'foo', 'route_parameters' => array('_route' => 'foo'), 'request_uri' => 'http://localhost/', 'method' => 'GET')),
+ array(array(), 'Matched route "{route}".', array('route' => 'n/a', 'route_parameters' => array(), 'request_uri' => 'http://localhost/', 'method' => 'GET')),
+ );
+ }
+
+ public function testWithBadRequest()
+ {
+ $requestStack = new RequestStack();
+
+ $requestMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock();
+ $requestMatcher->expects($this->never())->method('matchRequest');
+
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addSubscriber(new ValidateRequestListener());
+ $dispatcher->addSubscriber(new RouterListener($requestMatcher, $requestStack, new RequestContext()));
+ $dispatcher->addSubscriber(new ExceptionListener(function () {
+ return new Response('Exception handled', 400);
+ }));
+
+ $kernel = new HttpKernel($dispatcher, new ControllerResolver(), $requestStack, new ArgumentResolver());
+
+ $request = Request::create('http://localhost/');
+ $request->headers->set('host', '###');
+ $response = $kernel->handle($request);
+ $this->assertSame(400, $response->getStatusCode());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/SurrogateListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/SurrogateListenerTest.php
new file mode 100644
index 0000000000..1e79ebe052
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/SurrogateListenerTest.php
@@ -0,0 +1,67 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\HttpCache\Esi;
+use Symfony\Component\HttpKernel\EventListener\SurrogateListener;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class SurrogateListenerTest extends TestCase
+{
+ public function testFilterDoesNothingForSubRequests()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $response = new Response('foo <esi:include src="" />');
+ $listener = new SurrogateListener(new Esi());
+
+ $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
+ $event = new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::SUB_REQUEST, $response);
+ $dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('', $event->getResponse()->headers->get('Surrogate-Control'));
+ }
+
+ public function testFilterWhenThereIsSomeEsiIncludes()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $response = new Response('foo <esi:include src="" />');
+ $listener = new SurrogateListener(new Esi());
+
+ $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
+ $event = new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response);
+ $dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('content="ESI/1.0"', $event->getResponse()->headers->get('Surrogate-Control'));
+ }
+
+ public function testFilterWhenThereIsNoEsiIncludes()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $response = new Response('foo');
+ $listener = new SurrogateListener(new Esi());
+
+ $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
+ $event = new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response);
+ $dispatcher->dispatch(KernelEvents::RESPONSE, $event);
+
+ $this->assertEquals('', $event->getResponse()->headers->get('Surrogate-Control'));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php
new file mode 100644
index 0000000000..8ada8e7dd8
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php
@@ -0,0 +1,145 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\DependencyInjection\ServiceSubscriberInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\EventListener\SessionListener;
+use Symfony\Component\HttpKernel\EventListener\TestSessionListener;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+
+/**
+ * SessionListenerTest.
+ *
+ * Tests SessionListener.
+ *
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ */
+class TestSessionListenerTest extends TestCase
+{
+ /**
+ * @var TestSessionListener
+ */
+ private $listener;
+
+ /**
+ * @var SessionInterface
+ */
+ private $session;
+
+ protected function setUp()
+ {
+ $this->listener = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\EventListener\AbstractTestSessionListener');
+ $this->session = $this->getSession();
+ }
+
+ public function testShouldSaveMasterRequestSession()
+ {
+ $this->sessionHasBeenStarted();
+ $this->sessionMustBeSaved();
+
+ $this->filterResponse(new Request());
+ }
+
+ public function testShouldNotSaveSubRequestSession()
+ {
+ $this->sessionMustNotBeSaved();
+
+ $this->filterResponse(new Request(), HttpKernelInterface::SUB_REQUEST);
+ }
+
+ public function testDoesNotDeleteCookieIfUsingSessionLifetime()
+ {
+ $this->sessionHasBeenStarted();
+
+ $params = session_get_cookie_params();
+ session_set_cookie_params(0, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+
+ $response = $this->filterResponse(new Request(), HttpKernelInterface::MASTER_REQUEST);
+ $cookies = $response->headers->getCookies();
+
+ $this->assertEquals(0, reset($cookies)->getExpiresTime());
+ }
+
+ public function testUnstartedSessionIsNotSave()
+ {
+ $this->sessionHasNotBeenStarted();
+ $this->sessionMustNotBeSaved();
+
+ $this->filterResponse(new Request());
+ }
+
+ public function testDoesNotImplementServiceSubscriberInterface()
+ {
+ $this->assertTrue(interface_exists(ServiceSubscriberInterface::class));
+ $this->assertTrue(class_exists(SessionListener::class));
+ $this->assertTrue(class_exists(TestSessionListener::class));
+ $this->assertFalse(is_subclass_of(SessionListener::class, ServiceSubscriberInterface::class), 'Implementing ServiceSubscriberInterface would create a dep on the DI component, which eg Silex cannot afford');
+ $this->assertFalse(is_subclass_of(TestSessionListener::class, ServiceSubscriberInterface::class, 'Implementing ServiceSubscriberInterface would create a dep on the DI component, which eg Silex cannot afford'));
+ }
+
+ private function filterResponse(Request $request, $type = HttpKernelInterface::MASTER_REQUEST)
+ {
+ $request->setSession($this->session);
+ $response = new Response();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $event = new FilterResponseEvent($kernel, $request, $type, $response);
+
+ $this->listener->onKernelResponse($event);
+
+ $this->assertSame($response, $event->getResponse());
+
+ return $response;
+ }
+
+ private function sessionMustNotBeSaved()
+ {
+ $this->session->expects($this->never())
+ ->method('save');
+ }
+
+ private function sessionMustBeSaved()
+ {
+ $this->session->expects($this->once())
+ ->method('save');
+ }
+
+ private function sessionHasBeenStarted()
+ {
+ $this->session->expects($this->once())
+ ->method('isStarted')
+ ->will($this->returnValue(true));
+ }
+
+ private function sessionHasNotBeenStarted()
+ {
+ $this->session->expects($this->once())
+ ->method('isStarted')
+ ->will($this->returnValue(false));
+ }
+
+ private function getSession()
+ {
+ $mock = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ // set return value for getName()
+ $mock->expects($this->any())->method('getName')->will($this->returnValue('MOCKSESSID'));
+
+ return $mock;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php
new file mode 100644
index 0000000000..23b833177a
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php
@@ -0,0 +1,118 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\EventListener\TranslatorListener;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+class TranslatorListenerTest extends TestCase
+{
+ private $listener;
+ private $translator;
+ private $requestStack;
+
+ protected function setUp()
+ {
+ $this->translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock();
+ $this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock();
+ $this->listener = new TranslatorListener($this->translator, $this->requestStack);
+ }
+
+ public function testLocaleIsSetInOnKernelRequest()
+ {
+ $this->translator
+ ->expects($this->once())
+ ->method('setLocale')
+ ->with($this->equalTo('fr'));
+
+ $event = new GetResponseEvent($this->createHttpKernel(), $this->createRequest('fr'), HttpKernelInterface::MASTER_REQUEST);
+ $this->listener->onKernelRequest($event);
+ }
+
+ public function testDefaultLocaleIsUsedOnExceptionsInOnKernelRequest()
+ {
+ $this->translator
+ ->expects($this->at(0))
+ ->method('setLocale')
+ ->will($this->throwException(new \InvalidArgumentException()));
+ $this->translator
+ ->expects($this->at(1))
+ ->method('setLocale')
+ ->with($this->equalTo('en'));
+
+ $event = new GetResponseEvent($this->createHttpKernel(), $this->createRequest('fr'), HttpKernelInterface::MASTER_REQUEST);
+ $this->listener->onKernelRequest($event);
+ }
+
+ public function testLocaleIsSetInOnKernelFinishRequestWhenParentRequestExists()
+ {
+ $this->translator
+ ->expects($this->once())
+ ->method('setLocale')
+ ->with($this->equalTo('fr'));
+
+ $this->setMasterRequest($this->createRequest('fr'));
+ $event = new FinishRequestEvent($this->createHttpKernel(), $this->createRequest('de'), HttpKernelInterface::SUB_REQUEST);
+ $this->listener->onKernelFinishRequest($event);
+ }
+
+ public function testLocaleIsNotSetInOnKernelFinishRequestWhenParentRequestDoesNotExist()
+ {
+ $this->translator
+ ->expects($this->never())
+ ->method('setLocale');
+
+ $event = new FinishRequestEvent($this->createHttpKernel(), $this->createRequest('de'), HttpKernelInterface::SUB_REQUEST);
+ $this->listener->onKernelFinishRequest($event);
+ }
+
+ public function testDefaultLocaleIsUsedOnExceptionsInOnKernelFinishRequest()
+ {
+ $this->translator
+ ->expects($this->at(0))
+ ->method('setLocale')
+ ->will($this->throwException(new \InvalidArgumentException()));
+ $this->translator
+ ->expects($this->at(1))
+ ->method('setLocale')
+ ->with($this->equalTo('en'));
+
+ $this->setMasterRequest($this->createRequest('fr'));
+ $event = new FinishRequestEvent($this->createHttpKernel(), $this->createRequest('de'), HttpKernelInterface::SUB_REQUEST);
+ $this->listener->onKernelFinishRequest($event);
+ }
+
+ private function createHttpKernel()
+ {
+ return $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ }
+
+ private function createRequest($locale)
+ {
+ $request = new Request();
+ $request->setLocale($locale);
+
+ return $request;
+ }
+
+ private function setMasterRequest($request)
+ {
+ $this->requestStack
+ ->expects($this->any())
+ ->method('getParentRequest')
+ ->will($this->returnValue($request));
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/EventListener/ValidateRequestListenerTest.php b/vendor/symfony/http-kernel/Tests/EventListener/ValidateRequestListenerTest.php
new file mode 100644
index 0000000000..d060943255
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/EventListener/ValidateRequestListenerTest.php
@@ -0,0 +1,43 @@
+<?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\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\EventListener\ValidateRequestListener;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+class ValidateRequestListenerTest extends TestCase
+{
+ /**
+ * @expectedException \Symfony\Component\HttpFoundation\Exception\ConflictingHeadersException
+ */
+ public function testListenerThrowsWhenMasterRequestHasInconsistentClientIps()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+
+ $request = new Request();
+ $request->setTrustedProxies(array('1.1.1.1'), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_FORWARDED);
+ $request->server->set('REMOTE_ADDR', '1.1.1.1');
+ $request->headers->set('FORWARDED', 'for=2.2.2.2');
+ $request->headers->set('X_FORWARDED_FOR', '3.3.3.3');
+
+ $dispatcher->addListener(KernelEvents::REQUEST, array(new ValidateRequestListener(), 'onKernelRequest'));
+ $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
+
+ $dispatcher->dispatch(KernelEvents::REQUEST, $event);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/AccessDeniedHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/AccessDeniedHttpExceptionTest.php
new file mode 100644
index 0000000000..2bfcb2bf80
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/AccessDeniedHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+
+class AccessDeniedHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new AccessDeniedHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/BadRequestHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/BadRequestHttpExceptionTest.php
new file mode 100644
index 0000000000..5fd54ccf44
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/BadRequestHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+
+class BadRequestHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new BadRequestHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/ConflictHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/ConflictHttpExceptionTest.php
new file mode 100644
index 0000000000..63cb49e6e0
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/ConflictHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
+
+class ConflictHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new ConflictHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/GoneHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/GoneHttpExceptionTest.php
new file mode 100644
index 0000000000..ec5339d2af
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/GoneHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\GoneHttpException;
+
+class GoneHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new GoneHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/HttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/HttpExceptionTest.php
new file mode 100644
index 0000000000..b64773551e
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/HttpExceptionTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+
+class HttpExceptionTest extends TestCase
+{
+ public function headerDataProvider()
+ {
+ return array(
+ array(array('X-Test' => 'Test')),
+ array(array('X-Test' => 1)),
+ array(
+ array(
+ array('X-Test' => 'Test'),
+ array('X-Test-2' => 'Test-2'),
+ ),
+ ),
+ );
+ }
+
+ public function testHeadersDefault()
+ {
+ $exception = $this->createException();
+ $this->assertSame(array(), $exception->getHeaders());
+ }
+
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersConstructor($headers)
+ {
+ $exception = new HttpException(200, null, null, $headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = $this->createException();
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+
+ protected function createException()
+ {
+ return new HttpException(200);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/LengthRequiredHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/LengthRequiredHttpExceptionTest.php
new file mode 100644
index 0000000000..462d3ca4fc
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/LengthRequiredHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\LengthRequiredHttpException;
+
+class LengthRequiredHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new LengthRequiredHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/MethodNotAllowedHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/MethodNotAllowedHttpExceptionTest.php
new file mode 100644
index 0000000000..b5def13ce3
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/MethodNotAllowedHttpExceptionTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
+
+class MethodNotAllowedHttpExceptionTest extends HttpExceptionTest
+{
+ public function testHeadersDefault()
+ {
+ $exception = new MethodNotAllowedHttpException(array('GET', 'PUT'));
+ $this->assertSame(array('Allow' => 'GET, PUT'), $exception->getHeaders());
+ }
+
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = new MethodNotAllowedHttpException(array('GET'));
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/NotAcceptableHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/NotAcceptableHttpExceptionTest.php
new file mode 100644
index 0000000000..4c0db7a3cb
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/NotAcceptableHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException;
+
+class NotAcceptableHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new NotAcceptableHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/NotFoundHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/NotFoundHttpExceptionTest.php
new file mode 100644
index 0000000000..62ede5b4b8
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/NotFoundHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+class NotFoundHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new NotFoundHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/PreconditionFailedHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/PreconditionFailedHttpExceptionTest.php
new file mode 100644
index 0000000000..809252b757
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/PreconditionFailedHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException;
+
+class PreconditionFailedHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new PreconditionFailedHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/PreconditionRequiredHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/PreconditionRequiredHttpExceptionTest.php
new file mode 100644
index 0000000000..69d362e3f6
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/PreconditionRequiredHttpExceptionTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\PreconditionRequiredHttpException;
+
+class PreconditionRequiredHttpExceptionTest extends HttpExceptionTest
+{
+ protected function createException()
+ {
+ return new PreconditionRequiredHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/ServiceUnavailableHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/ServiceUnavailableHttpExceptionTest.php
new file mode 100644
index 0000000000..e41a23d4e7
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/ServiceUnavailableHttpExceptionTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
+
+class ServiceUnavailableHttpExceptionTest extends HttpExceptionTest
+{
+ public function testHeadersDefaultRetryAfter()
+ {
+ $exception = new ServiceUnavailableHttpException(10);
+ $this->assertSame(array('Retry-After' => 10), $exception->getHeaders());
+ }
+
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = new ServiceUnavailableHttpException(10);
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+
+ protected function createException()
+ {
+ return new ServiceUnavailableHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/TooManyRequestsHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/TooManyRequestsHttpExceptionTest.php
new file mode 100644
index 0000000000..2079bb3380
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/TooManyRequestsHttpExceptionTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
+
+class TooManyRequestsHttpExceptionTest extends HttpExceptionTest
+{
+ public function testHeadersDefaultRertyAfter()
+ {
+ $exception = new TooManyRequestsHttpException(10);
+ $this->assertSame(array('Retry-After' => 10), $exception->getHeaders());
+ }
+
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = new TooManyRequestsHttpException(10);
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+
+ protected function createException()
+ {
+ return new TooManyRequestsHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/UnauthorizedHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/UnauthorizedHttpExceptionTest.php
new file mode 100644
index 0000000000..37a0028dc8
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/UnauthorizedHttpExceptionTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
+
+class UnauthorizedHttpExceptionTest extends HttpExceptionTest
+{
+ public function testHeadersDefault()
+ {
+ $exception = new UnauthorizedHttpException('Challenge');
+ $this->assertSame(array('WWW-Authenticate' => 'Challenge'), $exception->getHeaders());
+ }
+
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = new UnauthorizedHttpException('Challenge');
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/UnprocessableEntityHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/UnprocessableEntityHttpExceptionTest.php
new file mode 100644
index 0000000000..760366c694
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/UnprocessableEntityHttpExceptionTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
+
+class UnprocessableEntityHttpExceptionTest extends HttpExceptionTest
+{
+ /**
+ * Test that setting the headers using the setter function
+ * is working as expected.
+ *
+ * @param array $headers The headers to set
+ *
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = new UnprocessableEntityHttpException(10);
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+
+ protected function createException()
+ {
+ return new UnprocessableEntityHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Exception/UnsupportedMediaTypeHttpExceptionTest.php b/vendor/symfony/http-kernel/Tests/Exception/UnsupportedMediaTypeHttpExceptionTest.php
new file mode 100644
index 0000000000..d47287a1fb
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Exception/UnsupportedMediaTypeHttpExceptionTest.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Exception;
+
+use Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException;
+
+class UnsupportedMediaTypeHttpExceptionTest extends HttpExceptionTest
+{
+ /**
+ * @dataProvider headerDataProvider
+ */
+ public function testHeadersSetter($headers)
+ {
+ $exception = new UnsupportedMediaTypeHttpException(10);
+ $exception->setHeaders($headers);
+ $this->assertSame($headers, $exception->getHeaders());
+ }
+
+ protected function createException($headers = array())
+ {
+ return new UnsupportedMediaTypeHttpException();
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php b/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php
new file mode 100644
index 0000000000..b6cf1cba20
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/123/Kernel123.php
@@ -0,0 +1,37 @@
+<?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\Fixtures\_123;
+
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\Config\Loader\LoaderInterface;
+
+class Kernel123 extends Kernel
+{
+ public function registerBundles()
+ {
+ return array();
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ }
+
+ public function getCacheDir()
+ {
+ return sys_get_temp_dir().'/'.Kernel::VERSION.'/kernel123/cache/'.$this->environment;
+ }
+
+ public function getLogDir()
+ {
+ return sys_get_temp_dir().'/'.Kernel::VERSION.'/kernel123/logs';
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/hide.txt b/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/hide.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/BaseBundle/Resources/hide.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/bar.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/bar.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/bar.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle1Bundle/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Bundle2Bundle/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt b/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ChildBundle/Resources/hide.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php
new file mode 100644
index 0000000000..e8e0b60346
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/BasicTypesController.php
@@ -0,0 +1,19 @@
+<?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\Fixtures\Controller;
+
+class BasicTypesController
+{
+ public function action(string $foo, int $bar, float $baz)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php
new file mode 100644
index 0000000000..9b4754b46f
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingRequest.php
@@ -0,0 +1,18 @@
+<?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\Fixtures\Controller;
+
+use Symfony\Component\HttpFoundation\Request;
+
+class ExtendingRequest extends Request
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php
new file mode 100644
index 0000000000..9fa54ee8bb
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/ExtendingSession.php
@@ -0,0 +1,18 @@
+<?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\Fixtures\Controller;
+
+use Symfony\Component\HttpFoundation\Session\Session;
+
+class ExtendingSession extends Session
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Controller/NullableController.php b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/NullableController.php
new file mode 100644
index 0000000000..9db4df7b4c
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/NullableController.php
@@ -0,0 +1,19 @@
+<?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\Fixtures\Controller;
+
+class NullableController
+{
+ public function action(?string $foo, ?\stdClass $bar, ?string $baz = 'value', $mandatory)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Controller/VariadicController.php b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/VariadicController.php
new file mode 100644
index 0000000000..c39812453b
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Controller/VariadicController.php
@@ -0,0 +1,19 @@
+<?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\Fixtures\Controller;
+
+class VariadicController
+{
+ public function action($foo, ...$bar)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/DataCollector/CloneVarDataCollector.php b/vendor/symfony/http-kernel/Tests/Fixtures/DataCollector/CloneVarDataCollector.php
new file mode 100644
index 0000000000..867ccdce57
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/DataCollector/CloneVarDataCollector.php
@@ -0,0 +1,41 @@
+<?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\Fixtures\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\DataCollector\DataCollector;
+
+class CloneVarDataCollector extends DataCollector
+{
+ private $varToClone;
+
+ public function __construct($varToClone)
+ {
+ $this->varToClone = $varToClone;
+ }
+
+ public function collect(Request $request, Response $response, \Exception $exception = null)
+ {
+ $this->data = $this->cloneVar($this->varToClone);
+ }
+
+ public function getData()
+ {
+ return $this->data;
+ }
+
+ public function getName()
+ {
+ return 'clone_var';
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php
new file mode 100644
index 0000000000..c8bfd36e66
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php
@@ -0,0 +1,18 @@
+<?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\Fixtures\ExtensionAbsentBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class ExtensionAbsentBundle extends Bundle
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php
new file mode 100644
index 0000000000..b43bc665a8
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php
@@ -0,0 +1,22 @@
+<?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\Fixtures\ExtensionLoadedBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\Extension;
+
+class ExtensionLoadedExtension extends Extension
+{
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php
new file mode 100644
index 0000000000..3af81cb073
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php
@@ -0,0 +1,18 @@
+<?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\Fixtures\ExtensionLoadedBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class ExtensionLoadedBundle extends Bundle
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php
new file mode 100644
index 0000000000..0fd64316fb
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php
@@ -0,0 +1,20 @@
+<?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\Fixtures\ExtensionNotValidBundle\DependencyInjection;
+
+class ExtensionNotValidExtension
+{
+ public function getAlias()
+ {
+ return 'extension_not_valid';
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php
new file mode 100644
index 0000000000..34e2920392
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php
@@ -0,0 +1,18 @@
+<?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\Fixtures\ExtensionNotValidBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class ExtensionNotValidBundle extends Bundle
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php
new file mode 100644
index 0000000000..977976b75f
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+
+/**
+ * This command has a required parameter on the constructor and will be ignored by the default Bundle implementation.
+ *
+ * @see Bundle::registerCommands()
+ */
+class BarCommand extends Command
+{
+ public function __construct($example, $name = 'bar')
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php
new file mode 100644
index 0000000000..c6570aa046
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.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\Fixtures\ExtensionPresentBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+
+class FooCommand extends Command
+{
+ protected function configure()
+ {
+ $this->setName('foo');
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php
new file mode 100644
index 0000000000..108571718d
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php
@@ -0,0 +1,22 @@
+<?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\Fixtures\ExtensionPresentBundle\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\Extension;
+
+class ExtensionPresentExtension extends Extension
+{
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php
new file mode 100644
index 0000000000..36a7ad404a
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php
@@ -0,0 +1,18 @@
+<?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\Fixtures\ExtensionPresentBundle;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class ExtensionPresentBundle extends Bundle
+{
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php b/vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php
new file mode 100644
index 0000000000..a1102ab784
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/KernelForOverrideName.php
@@ -0,0 +1,28 @@
+<?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\Fixtures;
+
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\Config\Loader\LoaderInterface;
+
+class KernelForOverrideName extends Kernel
+{
+ protected $name = 'overridden';
+
+ public function registerBundles()
+ {
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php b/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php
new file mode 100644
index 0000000000..5fd61bbc7e
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/KernelForTest.php
@@ -0,0 +1,37 @@
+<?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\Fixtures;
+
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\Config\Loader\LoaderInterface;
+
+class KernelForTest extends Kernel
+{
+ public function getBundleMap()
+ {
+ return $this->bundleMap;
+ }
+
+ public function registerBundles()
+ {
+ return array();
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ }
+
+ public function isBooted()
+ {
+ return $this->booted;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php b/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php
new file mode 100644
index 0000000000..cee1b09fb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/KernelWithoutBundles.php
@@ -0,0 +1,33 @@
+<?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\Fixtures;
+
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Kernel;
+
+class KernelWithoutBundles extends Kernel
+{
+ public function registerBundles()
+ {
+ return array();
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ }
+
+ protected function build(ContainerBuilder $container)
+ {
+ $container->setParameter('test_executed', true);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/BaseBundle/hide.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/ChildBundle/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/Resources/FooBundle/foo.txt b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/FooBundle/foo.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/Resources/FooBundle/foo.txt
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/TestClient.php b/vendor/symfony/http-kernel/Tests/Fixtures/TestClient.php
new file mode 100644
index 0000000000..e7d60cff3d
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/TestClient.php
@@ -0,0 +1,31 @@
+<?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\Fixtures;
+
+use Symfony\Component\HttpKernel\Client;
+
+class TestClient extends Client
+{
+ protected function getScript($request)
+ {
+ $script = parent::getScript($request);
+
+ $autoload = file_exists(__DIR__.'/../../vendor/autoload.php')
+ ? __DIR__.'/../../vendor/autoload.php'
+ : __DIR__.'/../../../../../../vendor/autoload.php'
+ ;
+
+ $script = preg_replace('/(\->register\(\);)/', "$0\nrequire_once '$autoload';\n", $script);
+
+ return $script;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fixtures/TestEventDispatcher.php b/vendor/symfony/http-kernel/Tests/Fixtures/TestEventDispatcher.php
new file mode 100644
index 0000000000..da7ef5bd60
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fixtures/TestEventDispatcher.php
@@ -0,0 +1,28 @@
+<?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\Fixtures;
+
+use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class TestEventDispatcher extends EventDispatcher implements TraceableEventDispatcherInterface
+{
+ public function getCalledListeners()
+ {
+ return array('foo');
+ }
+
+ public function getNotCalledListeners()
+ {
+ return array('bar');
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fragment/EsiFragmentRendererTest.php b/vendor/symfony/http-kernel/Tests/Fragment/EsiFragmentRendererTest.php
new file mode 100644
index 0000000000..bfe922e22c
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fragment/EsiFragmentRendererTest.php
@@ -0,0 +1,110 @@
+<?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\Fragment;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\Fragment\EsiFragmentRenderer;
+use Symfony\Component\HttpKernel\HttpCache\Esi;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\UriSigner;
+
+class EsiFragmentRendererTest extends TestCase
+{
+ public function testRenderFallbackToInlineStrategyIfEsiNotSupported()
+ {
+ $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true));
+ $strategy->render('/', Request::create('/'));
+ }
+
+ /**
+ * @group legacy
+ * @expectedDeprecation Passing non-scalar values as part of URI attributes to the ESI and SSI rendering strategies is deprecated %s.
+ */
+ public function testRenderFallbackWithObjectAttributesIsDeprecated()
+ {
+ $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true), new UriSigner('foo'));
+ $request = Request::create('/');
+ $reference = new ControllerReference('main_controller', array('foo' => array('a' => array(), 'b' => new \stdClass())), array());
+ $strategy->render($reference, $request);
+ }
+
+ public function testRender()
+ {
+ $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy());
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'ESI/1.0');
+
+ $this->assertEquals('<esi:include src="/" />', $strategy->render('/', $request)->getContent());
+ $this->assertEquals("<esi:comment text=\"This is a comment\" />\n<esi:include src=\"/\" />", $strategy->render('/', $request, array('comment' => 'This is a comment'))->getContent());
+ $this->assertEquals('<esi:include src="/" alt="foo" />', $strategy->render('/', $request, array('alt' => 'foo'))->getContent());
+ }
+
+ public function testRenderControllerReference()
+ {
+ $signer = new UriSigner('foo');
+ $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(), $signer);
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'ESI/1.0');
+
+ $reference = new ControllerReference('main_controller', array(), array());
+ $altReference = new ControllerReference('alt_controller', array(), array());
+
+ $this->assertEquals(
+ '<esi:include src="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller&_hash=Jz1P8NErmhKTeI6onI1EdAXTB85359MY3RIk5mSJ60w%3D" alt="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dalt_controller&_hash=iPJEdRoUpGrM1ztqByiorpfMPtiW%2FOWwdH1DBUXHhEc%3D" />',
+ $strategy->render($reference, $request, array('alt' => $altReference))->getContent()
+ );
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRenderControllerReferenceWithoutSignerThrowsException()
+ {
+ $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy());
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'ESI/1.0');
+
+ $strategy->render(new ControllerReference('main_controller'), $request);
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRenderAltControllerReferenceWithoutSignerThrowsException()
+ {
+ $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy());
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'ESI/1.0');
+
+ $strategy->render('/', $request, array('alt' => new ControllerReference('alt_controller')));
+ }
+
+ private function getInlineStrategy($called = false)
+ {
+ $inline = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer')->disableOriginalConstructor()->getMock();
+
+ if ($called) {
+ $inline->expects($this->once())->method('render');
+ }
+
+ return $inline;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php b/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php
new file mode 100644
index 0000000000..9c906b50a0
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fragment/FragmentHandlerTest.php
@@ -0,0 +1,99 @@
+<?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\Fragment;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * @group time-sensitive
+ */
+class FragmentHandlerTest extends TestCase
+{
+ private $requestStack;
+
+ protected function setUp()
+ {
+ $this->requestStack = $this->getMockBuilder('Symfony\\Component\\HttpFoundation\\RequestStack')
+ ->disableOriginalConstructor()
+ ->getMock()
+ ;
+ $this->requestStack
+ ->expects($this->any())
+ ->method('getCurrentRequest')
+ ->will($this->returnValue(Request::create('/')))
+ ;
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testRenderWhenRendererDoesNotExist()
+ {
+ $handler = new FragmentHandler($this->requestStack);
+ $handler->render('/', 'foo');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testRenderWithUnknownRenderer()
+ {
+ $handler = $this->getHandler($this->returnValue(new Response('foo')));
+
+ $handler->render('/', 'bar');
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ * @expectedExceptionMessage Error when rendering "http://localhost/" (Status code is 404).
+ */
+ public function testDeliverWithUnsuccessfulResponse()
+ {
+ $handler = $this->getHandler($this->returnValue(new Response('foo', 404)));
+
+ $handler->render('/', 'foo');
+ }
+
+ public function testRender()
+ {
+ $handler = $this->getHandler($this->returnValue(new Response('foo')), array('/', Request::create('/'), array('foo' => 'foo', 'ignore_errors' => true)));
+
+ $this->assertEquals('foo', $handler->render('/', 'foo', array('foo' => 'foo')));
+ }
+
+ protected function getHandler($returnValue, $arguments = array())
+ {
+ $renderer = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface')->getMock();
+ $renderer
+ ->expects($this->any())
+ ->method('getName')
+ ->will($this->returnValue('foo'))
+ ;
+ $e = $renderer
+ ->expects($this->any())
+ ->method('render')
+ ->will($returnValue)
+ ;
+
+ if ($arguments) {
+ call_user_func_array(array($e, 'with'), $arguments);
+ }
+
+ $handler = new FragmentHandler($this->requestStack);
+ $handler->addRenderer($renderer);
+
+ return $handler;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fragment/HIncludeFragmentRendererTest.php b/vendor/symfony/http-kernel/Tests/Fragment/HIncludeFragmentRendererTest.php
new file mode 100644
index 0000000000..1be052e5e6
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fragment/HIncludeFragmentRendererTest.php
@@ -0,0 +1,89 @@
+<?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\Fragment;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\Fragment\HIncludeFragmentRenderer;
+use Symfony\Component\HttpKernel\UriSigner;
+use Symfony\Component\HttpFoundation\Request;
+
+class HIncludeFragmentRendererTest extends TestCase
+{
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRenderExceptionWhenControllerAndNoSigner()
+ {
+ $strategy = new HIncludeFragmentRenderer();
+ $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'));
+ }
+
+ public function testRenderWithControllerAndSigner()
+ {
+ $strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));
+
+ $this->assertEquals('<hx:include src="/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller&amp;_hash=BP%2BOzCD5MRUI%2BHJpgPDOmoju00FnzLhP3TGcSHbbBLs%3D"></hx:include>', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
+ }
+
+ public function testRenderWithUri()
+ {
+ $strategy = new HIncludeFragmentRenderer();
+ $this->assertEquals('<hx:include src="/foo"></hx:include>', $strategy->render('/foo', Request::create('/'))->getContent());
+
+ $strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));
+ $this->assertEquals('<hx:include src="/foo"></hx:include>', $strategy->render('/foo', Request::create('/'))->getContent());
+ }
+
+ public function testRenderWithDefault()
+ {
+ // only default
+ $strategy = new HIncludeFragmentRenderer();
+ $this->assertEquals('<hx:include src="/foo">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default'))->getContent());
+
+ // only global default
+ $strategy = new HIncludeFragmentRenderer(null, null, 'global_default');
+ $this->assertEquals('<hx:include src="/foo">global_default</hx:include>', $strategy->render('/foo', Request::create('/'), array())->getContent());
+
+ // global default and default
+ $strategy = new HIncludeFragmentRenderer(null, null, 'global_default');
+ $this->assertEquals('<hx:include src="/foo">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default'))->getContent());
+ }
+
+ public function testRenderWithAttributesOptions()
+ {
+ // with id
+ $strategy = new HIncludeFragmentRenderer();
+ $this->assertEquals('<hx:include src="/foo" id="bar">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default', 'id' => 'bar'))->getContent());
+
+ // with attributes
+ $strategy = new HIncludeFragmentRenderer();
+ $this->assertEquals('<hx:include src="/foo" p1="v1" p2="v2">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default', 'attributes' => array('p1' => 'v1', 'p2' => 'v2')))->getContent());
+
+ // with id & attributes
+ $strategy = new HIncludeFragmentRenderer();
+ $this->assertEquals('<hx:include src="/foo" p1="v1" p2="v2" id="bar">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default', 'id' => 'bar', 'attributes' => array('p1' => 'v1', 'p2' => 'v2')))->getContent());
+ }
+
+ public function testRenderWithDefaultText()
+ {
+ $engine = $this->getMockBuilder('Symfony\\Component\\Templating\\EngineInterface')->getMock();
+ $engine->expects($this->once())
+ ->method('exists')
+ ->with('default')
+ ->will($this->throwException(new \InvalidArgumentException()));
+
+ // only default
+ $strategy = new HIncludeFragmentRenderer($engine);
+ $this->assertEquals('<hx:include src="/foo">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default'))->getContent());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fragment/InlineFragmentRendererTest.php b/vendor/symfony/http-kernel/Tests/Fragment/InlineFragmentRendererTest.php
new file mode 100644
index 0000000000..18e55a5be0
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fragment/InlineFragmentRendererTest.php
@@ -0,0 +1,250 @@
+<?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\Fragment;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class InlineFragmentRendererTest extends TestCase
+{
+ public function testRender()
+ {
+ $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
+
+ $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
+ }
+
+ public function testRenderWithControllerReference()
+ {
+ $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));
+
+ $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
+ }
+
+ public function testRenderWithObjectsAsAttributes()
+ {
+ $object = new \stdClass();
+
+ $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
+ $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
+ $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
+ $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
+
+ $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));
+
+ $this->assertSame('foo', $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'))->getContent());
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheControllerLegacy()
+ {
+ $resolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver')->setMethods(array('getController'))->getMock();
+ $resolver
+ ->expects($this->once())
+ ->method('getController')
+ ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
+ return new Response($object1->getBar());
+ }))
+ ;
+
+ $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack());
+ $renderer = new InlineFragmentRenderer($kernel);
+
+ $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
+ $this->assertEquals('bar', $response->getContent());
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
+ {
+ $resolver = $this->getMockBuilder(ControllerResolverInterface::class)->getMock();
+ $resolver
+ ->expects($this->once())
+ ->method('getController')
+ ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
+ return new Response($object1->getBar());
+ }))
+ ;
+
+ $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver());
+ $renderer = new InlineFragmentRenderer($kernel);
+
+ $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
+ $this->assertEquals('bar', $response->getContent());
+ }
+
+ public function testRenderWithTrustedHeaderDisabled()
+ {
+ Request::setTrustedProxies(array(), 0);
+
+ $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
+ $this->assertSame('foo', $strategy->render('/', Request::create('/'))->getContent());
+
+ Request::setTrustedProxies(array(), -1);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testRenderExceptionNoIgnoreErrors()
+ {
+ $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
+ $dispatcher->expects($this->never())->method('dispatch');
+
+ $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
+
+ $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
+ }
+
+ public function testRenderExceptionIgnoreErrors()
+ {
+ $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
+ $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);
+
+ $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);
+
+ $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
+ }
+
+ public function testRenderExceptionIgnoreErrorsWithAlt()
+ {
+ $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
+ $this->throwException(new \RuntimeException('foo')),
+ $this->returnValue(new Response('bar'))
+ )));
+
+ $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
+ }
+
+ private function getKernel($returnValue)
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $kernel
+ ->expects($this->any())
+ ->method('handle')
+ ->will($returnValue)
+ ;
+
+ return $kernel;
+ }
+
+ public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
+ {
+ $controllerResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface')->getMock();
+ $controllerResolver
+ ->expects($this->once())
+ ->method('getController')
+ ->will($this->returnValue(function () {
+ ob_start();
+ echo 'bar';
+ throw new \RuntimeException();
+ }))
+ ;
+
+ $argumentResolver = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface')->getMock();
+ $argumentResolver
+ ->expects($this->once())
+ ->method('getArguments')
+ ->will($this->returnValue(array()))
+ ;
+
+ $kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
+ $renderer = new InlineFragmentRenderer($kernel);
+
+ // simulate a main request with output buffering
+ ob_start();
+ echo 'Foo';
+
+ // simulate a sub-request with output buffering and an exception
+ $renderer->render('/', Request::create('/'), array('ignore_errors' => true));
+
+ $this->assertEquals('Foo', ob_get_clean());
+ }
+
+ public function testESIHeaderIsKeptInSubrequest()
+ {
+ $expectedSubRequest = Request::create('/');
+ $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
+
+ if (Request::HEADER_X_FORWARDED_FOR & Request::getTrustedHeaderSet()) {
+ $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
+ $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
+ }
+
+ $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
+
+ $request = Request::create('/');
+ $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
+ $strategy->render('/', $request);
+ }
+
+ public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
+ {
+ Request::setTrustedProxies(array(), 0);
+
+ $this->testESIHeaderIsKeptInSubrequest();
+
+ Request::setTrustedProxies(array(), -1);
+ }
+
+ public function testHeadersPossiblyResultingIn304AreNotAssignedToSubrequest()
+ {
+ $expectedSubRequest = Request::create('/');
+ if (Request::HEADER_X_FORWARDED_FOR & Request::getTrustedHeaderSet()) {
+ $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
+ $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
+ }
+
+ $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));
+ $request = Request::create('/', 'GET', array(), array(), array(), array('HTTP_IF_MODIFIED_SINCE' => 'Fri, 01 Jan 2016 00:00:00 GMT', 'HTTP_IF_NONE_MATCH' => '*'));
+ $strategy->render('/', $request);
+ }
+
+ /**
+ * Creates a Kernel expecting a request equals to $request
+ * Allows delta in comparison in case REQUEST_TIME changed by 1 second.
+ */
+ private function getKernelExpectingRequest(Request $request, $strict = false)
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $kernel
+ ->expects($this->once())
+ ->method('handle')
+ ->with($this->equalTo($request, 1))
+ ->willReturn(new Response('foo'));
+
+ return $kernel;
+ }
+}
+
+class Bar
+{
+ public $bar = 'bar';
+
+ public function getBar()
+ {
+ return $this->bar;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fragment/RoutableFragmentRendererTest.php b/vendor/symfony/http-kernel/Tests/Fragment/RoutableFragmentRendererTest.php
new file mode 100644
index 0000000000..3a040dedd6
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fragment/RoutableFragmentRendererTest.php
@@ -0,0 +1,94 @@
+<?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\Fragment;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+
+class RoutableFragmentRendererTest extends TestCase
+{
+ /**
+ * @dataProvider getGenerateFragmentUriData
+ */
+ public function testGenerateFragmentUri($uri, $controller)
+ {
+ $this->assertEquals($uri, $this->callGenerateFragmentUriMethod($controller, Request::create('/')));
+ }
+
+ /**
+ * @dataProvider getGenerateFragmentUriData
+ */
+ public function testGenerateAbsoluteFragmentUri($uri, $controller)
+ {
+ $this->assertEquals('http://localhost'.$uri, $this->callGenerateFragmentUriMethod($controller, Request::create('/'), true));
+ }
+
+ public function getGenerateFragmentUriData()
+ {
+ return array(
+ array('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array())),
+ array('/_fragment?_path=_format%3Dxml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('_format' => 'xml'), array())),
+ array('/_fragment?_path=foo%3Dfoo%26_format%3Djson%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo', '_format' => 'json'), array())),
+ array('/_fragment?bar=bar&_path=foo%3Dfoo%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo'), array('bar' => 'bar'))),
+ array('/_fragment?foo=foo&_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array('foo' => 'foo'))),
+ array('/_fragment?_path=foo%255B0%255D%3Dfoo%26foo%255B1%255D%3Dbar%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => array('foo', 'bar')), array())),
+ );
+ }
+
+ public function testGenerateFragmentUriWithARequest()
+ {
+ $request = Request::create('/');
+ $request->attributes->set('_format', 'json');
+ $request->setLocale('fr');
+ $controller = new ControllerReference('controller', array(), array());
+
+ $this->assertEquals('/_fragment?_path=_format%3Djson%26_locale%3Dfr%26_controller%3Dcontroller', $this->callGenerateFragmentUriMethod($controller, $request));
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @dataProvider getGenerateFragmentUriDataWithNonScalar
+ */
+ public function testGenerateFragmentUriWithNonScalar($controller)
+ {
+ $this->callGenerateFragmentUriMethod($controller, Request::create('/'));
+ }
+
+ public function getGenerateFragmentUriDataWithNonScalar()
+ {
+ return array(
+ array(new ControllerReference('controller', array('foo' => new Foo(), 'bar' => 'bar'), array())),
+ array(new ControllerReference('controller', array('foo' => array('foo' => 'foo'), 'bar' => array('bar' => new Foo())), array())),
+ );
+ }
+
+ private function callGenerateFragmentUriMethod(ControllerReference $reference, Request $request, $absolute = false)
+ {
+ $renderer = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\Fragment\RoutableFragmentRenderer');
+ $r = new \ReflectionObject($renderer);
+ $m = $r->getMethod('generateFragmentUri');
+ $m->setAccessible(true);
+
+ return $m->invoke($renderer, $reference, $request, $absolute);
+ }
+}
+
+class Foo
+{
+ public $foo;
+
+ public function getFoo()
+ {
+ return $this->foo;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Fragment/SsiFragmentRendererTest.php b/vendor/symfony/http-kernel/Tests/Fragment/SsiFragmentRendererTest.php
new file mode 100644
index 0000000000..b537625f24
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Fragment/SsiFragmentRendererTest.php
@@ -0,0 +1,97 @@
+<?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\Fragment;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Controller\ControllerReference;
+use Symfony\Component\HttpKernel\Fragment\SsiFragmentRenderer;
+use Symfony\Component\HttpKernel\HttpCache\Ssi;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\UriSigner;
+
+class SsiFragmentRendererTest extends TestCase
+{
+ public function testRenderFallbackToInlineStrategyIfSsiNotSupported()
+ {
+ $strategy = new SsiFragmentRenderer(new Ssi(), $this->getInlineStrategy(true));
+ $strategy->render('/', Request::create('/'));
+ }
+
+ public function testRender()
+ {
+ $strategy = new SsiFragmentRenderer(new Ssi(), $this->getInlineStrategy());
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'SSI/1.0');
+
+ $this->assertEquals('<!--#include virtual="/" -->', $strategy->render('/', $request)->getContent());
+ $this->assertEquals('<!--#include virtual="/" -->', $strategy->render('/', $request, array('comment' => 'This is a comment'))->getContent(), 'Strategy options should not impact the ssi include tag');
+ }
+
+ public function testRenderControllerReference()
+ {
+ $signer = new UriSigner('foo');
+ $strategy = new SsiFragmentRenderer(new Ssi(), $this->getInlineStrategy(), $signer);
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'SSI/1.0');
+
+ $reference = new ControllerReference('main_controller', array(), array());
+ $altReference = new ControllerReference('alt_controller', array(), array());
+
+ $this->assertEquals(
+ '<!--#include virtual="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller&_hash=Jz1P8NErmhKTeI6onI1EdAXTB85359MY3RIk5mSJ60w%3D" -->',
+ $strategy->render($reference, $request, array('alt' => $altReference))->getContent()
+ );
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRenderControllerReferenceWithoutSignerThrowsException()
+ {
+ $strategy = new SsiFragmentRenderer(new Ssi(), $this->getInlineStrategy());
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'SSI/1.0');
+
+ $strategy->render(new ControllerReference('main_controller'), $request);
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRenderAltControllerReferenceWithoutSignerThrowsException()
+ {
+ $strategy = new SsiFragmentRenderer(new Ssi(), $this->getInlineStrategy());
+
+ $request = Request::create('/');
+ $request->setLocale('fr');
+ $request->headers->set('Surrogate-Capability', 'SSI/1.0');
+
+ $strategy->render('/', $request, array('alt' => new ControllerReference('alt_controller')));
+ }
+
+ private function getInlineStrategy($called = false)
+ {
+ $inline = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer')->disableOriginalConstructor()->getMock();
+
+ if ($called) {
+ $inline->expects($this->once())->method('render');
+ }
+
+ return $inline;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php
new file mode 100644
index 0000000000..a8662b2a2b
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/EsiTest.php
@@ -0,0 +1,248 @@
+<?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\HttpKernel\HttpCache\Esi;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class EsiTest extends TestCase
+{
+ public function testHasSurrogateEsiCapability()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
+ $this->assertTrue($esi->hasSurrogateCapability($request));
+
+ $request = Request::create('/');
+ $request->headers->set('Surrogate-Capability', 'foobar');
+ $this->assertFalse($esi->hasSurrogateCapability($request));
+
+ $request = Request::create('/');
+ $this->assertFalse($esi->hasSurrogateCapability($request));
+ }
+
+ public function testAddSurrogateEsiCapability()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $esi->addSurrogateCapability($request);
+ $this->assertEquals('symfony="ESI/1.0"', $request->headers->get('Surrogate-Capability'));
+
+ $esi->addSurrogateCapability($request);
+ $this->assertEquals('symfony="ESI/1.0", symfony="ESI/1.0"', $request->headers->get('Surrogate-Capability'));
+ }
+
+ public function testAddSurrogateControl()
+ {
+ $esi = new Esi();
+
+ $response = new Response('foo <esi:include src="" />');
+ $esi->addSurrogateControl($response);
+ $this->assertEquals('content="ESI/1.0"', $response->headers->get('Surrogate-Control'));
+
+ $response = new Response('foo');
+ $esi->addSurrogateControl($response);
+ $this->assertEquals('', $response->headers->get('Surrogate-Control'));
+ }
+
+ public function testNeedsEsiParsing()
+ {
+ $esi = new Esi();
+
+ $response = new Response();
+ $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
+ $this->assertTrue($esi->needsParsing($response));
+
+ $response = new Response();
+ $this->assertFalse($esi->needsParsing($response));
+ }
+
+ public function testRenderIncludeTag()
+ {
+ $esi = new Esi();
+
+ $this->assertEquals('<esi:include src="/" onerror="continue" alt="/alt" />', $esi->renderIncludeTag('/', '/alt', true));
+ $this->assertEquals('<esi:include src="/" alt="/alt" />', $esi->renderIncludeTag('/', '/alt', false));
+ $this->assertEquals('<esi:include src="/" onerror="continue" />', $esi->renderIncludeTag('/'));
+ $this->assertEquals('<esi:comment text="some comment" />'."\n".'<esi:include src="/" onerror="continue" alt="/alt" />', $esi->renderIncludeTag('/', '/alt', true, 'some comment'));
+ }
+
+ public function testProcessDoesNothingIfContentTypeIsNotHtml()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response();
+ $response->headers->set('Content-Type', 'text/plain');
+ $esi->process($request, $response);
+
+ $this->assertFalse($response->headers->has('x-body-eval'));
+ }
+
+ public function testMultilineEsiRemoveTagsAreRemoved()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response('<esi:remove> <a href="http://www.example.com">www.example.com</a> </esi:remove> Keep this'."<esi:remove>\n <a>www.example.com</a> </esi:remove> And this");
+ $esi->process($request, $response);
+
+ $this->assertEquals(' Keep this And this', $response->getContent());
+ }
+
+ public function testCommentTagsAreRemoved()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response('<esi:comment text="some comment &gt;" /> Keep this');
+ $esi->process($request, $response);
+
+ $this->assertEquals(' Keep this', $response->getContent());
+ }
+
+ public function testProcess()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response('foo <esi:comment text="some comment" /><esi:include src="..." alt="alt" onerror="continue" />');
+ $esi->process($request, $response);
+
+ $this->assertEquals('foo <?php echo $this->surrogate->handle($this, \'...\', \'alt\', true) ?>'."\n", $response->getContent());
+ $this->assertEquals('ESI', $response->headers->get('x-body-eval'));
+
+ $response = new Response('foo <esi:comment text="some comment" /><esi:include src="foo\'" alt="bar\'" onerror="continue" />');
+ $esi->process($request, $response);
+
+ $this->assertEquals('foo <?php echo $this->surrogate->handle($this, \'foo\\\'\', \'bar\\\'\', true) ?>'."\n", $response->getContent());
+
+ $response = new Response('foo <esi:include src="..." />');
+ $esi->process($request, $response);
+
+ $this->assertEquals('foo <?php echo $this->surrogate->handle($this, \'...\', \'\', false) ?>'."\n", $response->getContent());
+
+ $response = new Response('foo <esi:include src="..."></esi:include>');
+ $esi->process($request, $response);
+
+ $this->assertEquals('foo <?php echo $this->surrogate->handle($this, \'...\', \'\', false) ?>'."\n", $response->getContent());
+ }
+
+ public function testProcessEscapesPhpTags()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response('<?php <? <% <script language=php>');
+ $esi->process($request, $response);
+
+ $this->assertEquals('<?php echo "<?"; ?>php <?php echo "<?"; ?> <?php echo "<%"; ?> <?php echo "<s"; ?>cript language=php>', $response->getContent());
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testProcessWhenNoSrcInAnEsi()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response('foo <esi:include />');
+ $esi->process($request, $response);
+ }
+
+ public function testProcessRemoveSurrogateControlHeader()
+ {
+ $esi = new Esi();
+
+ $request = Request::create('/');
+ $response = new Response('foo <esi:include src="..." />');
+ $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
+ $esi->process($request, $response);
+ $this->assertEquals('ESI', $response->headers->get('x-body-eval'));
+
+ $response->headers->set('Surrogate-Control', 'no-store, content="ESI/1.0"');
+ $esi->process($request, $response);
+ $this->assertEquals('ESI', $response->headers->get('x-body-eval'));
+ $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
+
+ $response->headers->set('Surrogate-Control', 'content="ESI/1.0", no-store');
+ $esi->process($request, $response);
+ $this->assertEquals('ESI', $response->headers->get('x-body-eval'));
+ $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
+ }
+
+ public function testHandle()
+ {
+ $esi = new Esi();
+ $cache = $this->getCache(Request::create('/'), new Response('foo'));
+ $this->assertEquals('foo', $esi->handle($cache, '/', '/alt', true));
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testHandleWhenResponseIsNot200()
+ {
+ $esi = new Esi();
+ $response = new Response('foo');
+ $response->setStatusCode(404);
+ $cache = $this->getCache(Request::create('/'), $response);
+ $esi->handle($cache, '/', '/alt', false);
+ }
+
+ public function testHandleWhenResponseIsNot200AndErrorsAreIgnored()
+ {
+ $esi = new Esi();
+ $response = new Response('foo');
+ $response->setStatusCode(404);
+ $cache = $this->getCache(Request::create('/'), $response);
+ $this->assertEquals('', $esi->handle($cache, '/', '/alt', true));
+ }
+
+ public function testHandleWhenResponseIsNot200AndAltIsPresent()
+ {
+ $esi = new Esi();
+ $response1 = new Response('foo');
+ $response1->setStatusCode(404);
+ $response2 = new Response('bar');
+ $cache = $this->getCache(Request::create('/'), array($response1, $response2));
+ $this->assertEquals('bar', $esi->handle($cache, '/', '/alt', false));
+ }
+
+ protected function getCache($request, $response)
+ {
+ $cache = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpCache\HttpCache')->setMethods(array('getRequest', 'handle'))->disableOriginalConstructor()->getMock();
+ $cache->expects($this->any())
+ ->method('getRequest')
+ ->will($this->returnValue($request))
+ ;
+ if (is_array($response)) {
+ $cache->expects($this->any())
+ ->method('handle')
+ ->will(call_user_func_array(array($this, 'onConsecutiveCalls'), $response))
+ ;
+ } else {
+ $cache->expects($this->any())
+ ->method('handle')
+ ->will($this->returnValue($response))
+ ;
+ }
+
+ return $cache;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTest.php
new file mode 100644
index 0000000000..a24380c406
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTest.php
@@ -0,0 +1,1367 @@
+<?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 Symfony\Component\HttpKernel\HttpCache\HttpCache;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * @group time-sensitive
+ */
+class HttpCacheTest extends HttpCacheTestCase
+{
+ public function testTerminateDelegatesTerminationOnlyForTerminableInterface()
+ {
+ $storeMock = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ // does not implement TerminableInterface
+ $kernel = new TestKernel();
+ $httpCache = new HttpCache($kernel, $storeMock);
+ $httpCache->terminate(Request::create('/'), new Response());
+
+ $this->assertFalse($kernel->terminateCalled, 'terminate() is never called if the kernel class does not implement TerminableInterface');
+
+ // implements TerminableInterface
+ $kernelMock = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Kernel')
+ ->disableOriginalConstructor()
+ ->setMethods(array('terminate', 'registerBundles', 'registerContainerConfiguration'))
+ ->getMock();
+
+ $kernelMock->expects($this->once())
+ ->method('terminate');
+
+ $kernel = new HttpCache($kernelMock, $storeMock);
+ $kernel->terminate(Request::create('/'), new Response());
+ }
+
+ public function testPassesOnNonGetHeadRequests()
+ {
+ $this->setNextResponse(200);
+ $this->request('POST', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertResponseOk();
+ $this->assertTraceContains('pass');
+ $this->assertFalse($this->response->headers->has('Age'));
+ }
+
+ public function testInvalidatesOnPostPutDeleteRequests()
+ {
+ foreach (array('post', 'put', 'delete') as $method) {
+ $this->setNextResponse(200);
+ $this->request($method, '/');
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertResponseOk();
+ $this->assertTraceContains('invalidate');
+ $this->assertTraceContains('pass');
+ }
+ }
+
+ public function testDoesNotCacheWithAuthorizationRequestHeaderAndNonPublicResponse()
+ {
+ $this->setNextResponse(200, array('ETag' => '"Foo"'));
+ $this->request('GET', '/', array('HTTP_AUTHORIZATION' => 'basic foobarbaz'));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertResponseOk();
+ $this->assertEquals('private', $this->response->headers->get('Cache-Control'));
+
+ $this->assertTraceContains('miss');
+ $this->assertTraceNotContains('store');
+ $this->assertFalse($this->response->headers->has('Age'));
+ }
+
+ public function testDoesCacheWithAuthorizationRequestHeaderAndPublicResponse()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'ETag' => '"Foo"'));
+ $this->request('GET', '/', array('HTTP_AUTHORIZATION' => 'basic foobarbaz'));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertResponseOk();
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertTrue($this->response->headers->has('Age'));
+ $this->assertEquals('public', $this->response->headers->get('Cache-Control'));
+ }
+
+ public function testDoesNotCacheWithCookieHeaderAndNonPublicResponse()
+ {
+ $this->setNextResponse(200, array('ETag' => '"Foo"'));
+ $this->request('GET', '/', array(), array('foo' => 'bar'));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertResponseOk();
+ $this->assertEquals('private', $this->response->headers->get('Cache-Control'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceNotContains('store');
+ $this->assertFalse($this->response->headers->has('Age'));
+ }
+
+ public function testDoesNotCacheRequestsWithACookieHeader()
+ {
+ $this->setNextResponse(200);
+ $this->request('GET', '/', array(), array('foo' => 'bar'));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertResponseOk();
+ $this->assertEquals('private', $this->response->headers->get('Cache-Control'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceNotContains('store');
+ $this->assertFalse($this->response->headers->has('Age'));
+ }
+
+ public function testRespondsWith304WhenIfModifiedSinceMatchesLastModified()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Last-Modified' => $time->format(DATE_RFC2822), 'Content-Type' => 'text/plain'), 'Hello World');
+ $this->request('GET', '/', array('HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(304, $this->response->getStatusCode());
+ $this->assertEquals('', $this->response->headers->get('Content-Type'));
+ $this->assertEmpty($this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ }
+
+ public function testRespondsWith304WhenIfNoneMatchMatchesETag()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'ETag' => '12345', 'Content-Type' => 'text/plain'), 'Hello World');
+ $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '12345'));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(304, $this->response->getStatusCode());
+ $this->assertEquals('', $this->response->headers->get('Content-Type'));
+ $this->assertTrue($this->response->headers->has('ETag'));
+ $this->assertEmpty($this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ }
+
+ public function testRespondsWith304OnlyIfIfNoneMatchAndIfModifiedSinceBothMatch()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+
+ $this->setNextResponse(200, array(), '', function ($request, $response) use ($time) {
+ $response->setStatusCode(200);
+ $response->headers->set('ETag', '12345');
+ $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
+ $response->headers->set('Content-Type', 'text/plain');
+ $response->setContent('Hello World');
+ });
+
+ // only ETag matches
+ $t = \DateTime::createFromFormat('U', time() - 3600);
+ $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $t->format(DATE_RFC2822)));
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+
+ // only Last-Modified matches
+ $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '1234', 'HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+
+ // Both matches
+ $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(304, $this->response->getStatusCode());
+ }
+
+ public function testIncrementsMaxAgeWhenNoDateIsSpecifiedEventWhenUsingETag()
+ {
+ $this->setNextResponse(
+ 200,
+ array(
+ 'ETag' => '1234',
+ 'Cache-Control' => 'public, s-maxage=60',
+ )
+ );
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ sleep(2);
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('fresh');
+ $this->assertEquals(2, $this->response->headers->get('Age'));
+ }
+
+ public function testValidatesPrivateResponsesCachedOnTheClient()
+ {
+ $this->setNextResponse(200, array(), '', function ($request, $response) {
+ $etags = preg_split('/\s*,\s*/', $request->headers->get('IF_NONE_MATCH'));
+ if ($request->cookies->has('authenticated')) {
+ $response->headers->set('Cache-Control', 'private, no-store');
+ $response->setETag('"private tag"');
+ if (in_array('"private tag"', $etags)) {
+ $response->setStatusCode(304);
+ } else {
+ $response->setStatusCode(200);
+ $response->headers->set('Content-Type', 'text/plain');
+ $response->setContent('private data');
+ }
+ } else {
+ $response->headers->set('Cache-Control', 'public');
+ $response->setETag('"public tag"');
+ if (in_array('"public tag"', $etags)) {
+ $response->setStatusCode(304);
+ } else {
+ $response->setStatusCode(200);
+ $response->headers->set('Content-Type', 'text/plain');
+ $response->setContent('public data');
+ }
+ }
+ });
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('"public tag"', $this->response->headers->get('ETag'));
+ $this->assertEquals('public data', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ $this->request('GET', '/', array(), array('authenticated' => ''));
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('"private tag"', $this->response->headers->get('ETag'));
+ $this->assertEquals('private data', $this->response->getContent());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('invalid');
+ $this->assertTraceNotContains('store');
+ }
+
+ public function testStoresResponsesWhenNoCacheRequestDirectivePresent()
+ {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
+
+ $this->assertHttpKernelIsCalled();
+ $this->assertTraceContains('store');
+ $this->assertTrue($this->response->headers->has('Age'));
+ }
+
+ public function testReloadsResponsesWhenCacheHitsButNoCacheRequestDirectivePresentWhenAllowReloadIsSetTrue()
+ {
+ $count = 0;
+
+ $this->setNextResponse(200, array('Cache-Control' => 'public, max-age=10000'), '', function ($request, $response) use (&$count) {
+ ++$count;
+ $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
+ });
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('store');
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+
+ $this->cacheConfig['allow_reload'] = true;
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Goodbye World', $this->response->getContent());
+ $this->assertTraceContains('reload');
+ $this->assertTraceContains('store');
+ }
+
+ public function testDoesNotReloadResponsesWhenAllowReloadIsSetFalseDefault()
+ {
+ $count = 0;
+
+ $this->setNextResponse(200, array('Cache-Control' => 'public, max-age=10000'), '', function ($request, $response) use (&$count) {
+ ++$count;
+ $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
+ });
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('store');
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+
+ $this->cacheConfig['allow_reload'] = false;
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceNotContains('reload');
+
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceNotContains('reload');
+ }
+
+ public function testRevalidatesFreshCacheEntryWhenMaxAgeRequestDirectiveIsExceededWhenAllowRevalidateOptionIsSetTrue()
+ {
+ $count = 0;
+
+ $this->setNextResponse(200, array(), '', function ($request, $response) use (&$count) {
+ ++$count;
+ $response->headers->set('Cache-Control', 'public, max-age=10000');
+ $response->setETag($count);
+ $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
+ });
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('store');
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+
+ $this->cacheConfig['allow_revalidate'] = true;
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'max-age=0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Goodbye World', $this->response->getContent());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('invalid');
+ $this->assertTraceContains('store');
+ }
+
+ public function testDoesNotRevalidateFreshCacheEntryWhenEnableRevalidateOptionIsSetFalseDefault()
+ {
+ $count = 0;
+
+ $this->setNextResponse(200, array(), '', function ($request, $response) use (&$count) {
+ ++$count;
+ $response->headers->set('Cache-Control', 'public, max-age=10000');
+ $response->setETag($count);
+ $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
+ });
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('store');
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+
+ $this->cacheConfig['allow_revalidate'] = false;
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'max-age=0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceNotContains('stale');
+ $this->assertTraceNotContains('invalid');
+ $this->assertTraceContains('fresh');
+
+ $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'max-age=0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceNotContains('stale');
+ $this->assertTraceNotContains('invalid');
+ $this->assertTraceContains('fresh');
+ }
+
+ public function testFetchesResponseFromBackendWhenCacheMisses()
+ {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('miss');
+ $this->assertTrue($this->response->headers->has('Age'));
+ }
+
+ public function testDoesNotCacheSomeStatusCodeResponses()
+ {
+ foreach (array_merge(range(201, 202), range(204, 206), range(303, 305), range(400, 403), range(405, 409), range(411, 417), range(500, 505)) as $code) {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse($code, array('Expires' => $time->format(DATE_RFC2822)));
+
+ $this->request('GET', '/');
+ $this->assertEquals($code, $this->response->getStatusCode());
+ $this->assertTraceNotContains('store');
+ $this->assertFalse($this->response->headers->has('Age'));
+ }
+ }
+
+ public function testDoesNotCacheResponsesWithExplicitNoStoreDirective()
+ {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse(200, array('Expires' => $time->format(DATE_RFC2822), 'Cache-Control' => 'no-store'));
+
+ $this->request('GET', '/');
+ $this->assertTraceNotContains('store');
+ $this->assertFalse($this->response->headers->has('Age'));
+ }
+
+ public function testDoesNotCacheResponsesWithoutFreshnessInformationOrAValidator()
+ {
+ $this->setNextResponse();
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceNotContains('store');
+ }
+
+ public function testCachesResponsesWithExplicitNoCacheDirective()
+ {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse(200, array('Expires' => $time->format(DATE_RFC2822), 'Cache-Control' => 'public, no-cache'));
+
+ $this->request('GET', '/');
+ $this->assertTraceContains('store');
+ $this->assertTrue($this->response->headers->has('Age'));
+ }
+
+ public function testCachesResponsesWithAnExpirationHeader()
+ {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ $values = $this->getMetaStorageValues();
+ $this->assertCount(1, $values);
+ }
+
+ public function testCachesResponsesWithAMaxAgeDirective()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 'public, max-age=5'));
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ $values = $this->getMetaStorageValues();
+ $this->assertCount(1, $values);
+ }
+
+ public function testCachesResponsesWithASMaxAgeDirective()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 's-maxage=5'));
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ $values = $this->getMetaStorageValues();
+ $this->assertCount(1, $values);
+ }
+
+ public function testCachesResponsesWithALastModifiedValidatorButNoFreshnessInformation()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Last-Modified' => $time->format(DATE_RFC2822)));
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ }
+
+ public function testCachesResponsesWithAnETagValidatorButNoFreshnessInformation()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'ETag' => '"123456"'));
+
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ }
+
+ public function testHitsCachedResponsesWithExpiresHeader()
+ {
+ $time1 = \DateTime::createFromFormat('U', time() - 5);
+ $time2 = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Date' => $time1->format(DATE_RFC2822), 'Expires' => $time2->format(DATE_RFC2822)));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTrue(strtotime($this->responses[0]->headers->get('Date')) - strtotime($this->response->headers->get('Date')) < 2);
+ $this->assertTrue($this->response->headers->get('Age') > 0);
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ }
+
+ public function testHitsCachedResponseWithMaxAgeDirective()
+ {
+ $time = \DateTime::createFromFormat('U', time() - 5);
+ $this->setNextResponse(200, array('Date' => $time->format(DATE_RFC2822), 'Cache-Control' => 'public, max-age=10'));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTrue(strtotime($this->responses[0]->headers->get('Date')) - strtotime($this->response->headers->get('Date')) < 2);
+ $this->assertTrue($this->response->headers->get('Age') > 0);
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ }
+
+ public function testDegradationWhenCacheLocked()
+ {
+ if ('\\' === DIRECTORY_SEPARATOR) {
+ $this->markTestSkipped('Skips on windows to avoid permissions issues.');
+ }
+
+ $this->cacheConfig['stale_while_revalidate'] = 10;
+
+ // The prescence of Last-Modified makes this cacheable (because Response::isValidateable() then).
+ $this->setNextResponse(200, array('Cache-Control' => 'public, s-maxage=5', 'Last-Modified' => 'some while ago'), 'Old response');
+ $this->request('GET', '/'); // warm the cache
+
+ // Now, lock the cache
+ $concurrentRequest = Request::create('/', 'GET');
+ $this->store->lock($concurrentRequest);
+
+ /*
+ * After 10s, the cached response has become stale. Yet, we're still within the "stale_while_revalidate"
+ * timeout so we may serve the stale response.
+ */
+ sleep(10);
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('stale-while-revalidate');
+ $this->assertEquals('Old response', $this->response->getContent());
+
+ /*
+ * Another 10s later, stale_while_revalidate is over. Resort to serving the old response, but
+ * do so with a "server unavailable" message.
+ */
+ sleep(10);
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(503, $this->response->getStatusCode());
+ $this->assertEquals('Old response', $this->response->getContent());
+ }
+
+ public function testHitsCachedResponseWithSMaxAgeDirective()
+ {
+ $time = \DateTime::createFromFormat('U', time() - 5);
+ $this->setNextResponse(200, array('Date' => $time->format(DATE_RFC2822), 'Cache-Control' => 's-maxage=10, max-age=0'));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTrue(strtotime($this->responses[0]->headers->get('Date')) - strtotime($this->response->headers->get('Date')) < 2);
+ $this->assertTrue($this->response->headers->get('Age') > 0);
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ }
+
+ public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformation()
+ {
+ $this->setNextResponse();
+
+ $this->cacheConfig['default_ttl'] = 10;
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=10/', $this->response->headers->get('Cache-Control'));
+
+ $this->cacheConfig['default_ttl'] = 10;
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=10/', $this->response->headers->get('Cache-Control'));
+ }
+
+ public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAfterTtlWasExpired()
+ {
+ $this->setNextResponse();
+
+ $this->cacheConfig['default_ttl'] = 2;
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+
+ // expires the cache
+ $values = $this->getMetaStorageValues();
+ $this->assertCount(1, $values);
+ $tmp = unserialize($values[0]);
+ $time = \DateTime::createFromFormat('U', time() - 5);
+ $tmp[0][1]['date'] = $time->format(DATE_RFC2822);
+ $r = new \ReflectionObject($this->store);
+ $m = $r->getMethod('save');
+ $m->setAccessible(true);
+ $m->invoke($this->store, 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('invalid');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+
+ $this->setNextResponse();
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+ }
+
+ public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformationAndAfterTtlWasExpiredWithStatus304()
+ {
+ $this->setNextResponse();
+
+ $this->cacheConfig['default_ttl'] = 2;
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ // expires the cache
+ $values = $this->getMetaStorageValues();
+ $this->assertCount(1, $values);
+ $tmp = unserialize($values[0]);
+ $time = \DateTime::createFromFormat('U', time() - 5);
+ $tmp[0][1]['date'] = $time->format(DATE_RFC2822);
+ $r = new \ReflectionObject($this->store);
+ $m = $r->getMethod('save');
+ $m->setAccessible(true);
+ $m->invoke($this->store, 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('valid');
+ $this->assertTraceContains('store');
+ $this->assertTraceNotContains('miss');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertRegExp('/s-maxage=2/', $this->response->headers->get('Cache-Control'));
+ }
+
+ public function testDoesNotAssignDefaultTtlWhenResponseHasMustRevalidateDirective()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 'must-revalidate'));
+
+ $this->cacheConfig['default_ttl'] = 10;
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('miss');
+ $this->assertTraceNotContains('store');
+ $this->assertNotRegExp('/s-maxage/', $this->response->headers->get('Cache-Control'));
+ $this->assertEquals('Hello World', $this->response->getContent());
+ }
+
+ public function testFetchesFullResponseWhenCacheStaleAndNoValidatorsPresent()
+ {
+ $time = \DateTime::createFromFormat('U', time() + 5);
+ $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));
+
+ // build initial request
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('Date'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertNotNull($this->response->headers->get('Age'));
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ // go in and play around with the cached metadata directly ...
+ $values = $this->getMetaStorageValues();
+ $this->assertCount(1, $values);
+ $tmp = unserialize($values[0]);
+ $time = \DateTime::createFromFormat('U', time());
+ $tmp[0][1]['expires'] = $time->format(DATE_RFC2822);
+ $r = new \ReflectionObject($this->store);
+ $m = $r->getMethod('save');
+ $m->setAccessible(true);
+ $m->invoke($this->store, 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));
+
+ // build subsequent request; should be found but miss due to freshness
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTrue($this->response->headers->get('Age') <= 1);
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTraceContains('stale');
+ $this->assertTraceNotContains('fresh');
+ $this->assertTraceNotContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Hello World', $this->response->getContent());
+ }
+
+ public function testValidatesCachedResponsesWithLastModifiedAndNoFreshnessInformation()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($time) {
+ $response->headers->set('Cache-Control', 'public');
+ $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
+ if ($time->format(DATE_RFC2822) == $request->headers->get('IF_MODIFIED_SINCE')) {
+ $response->setStatusCode(304);
+ $response->setContent('');
+ }
+ });
+
+ // build initial request
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('Last-Modified'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertTraceNotContains('stale');
+
+ // build subsequent request; should be found but miss due to freshness
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('Last-Modified'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTrue($this->response->headers->get('Age') <= 1);
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('valid');
+ $this->assertTraceContains('store');
+ $this->assertTraceNotContains('miss');
+ }
+
+ public function testValidatesCachedResponsesUseSameHttpMethod()
+ {
+ $test = $this;
+
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($test) {
+ $test->assertSame('OPTIONS', $request->getMethod());
+ });
+
+ // build initial request
+ $this->request('OPTIONS', '/');
+
+ // build subsequent request
+ $this->request('OPTIONS', '/');
+ }
+
+ public function testValidatesCachedResponsesWithETagAndNoFreshnessInformation()
+ {
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) {
+ $response->headers->set('Cache-Control', 'public');
+ $response->headers->set('ETag', '"12345"');
+ if ($response->getETag() == $request->headers->get('IF_NONE_MATCH')) {
+ $response->setStatusCode(304);
+ $response->setContent('');
+ }
+ });
+
+ // build initial request
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('ETag'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ // build subsequent request; should be found but miss due to freshness
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertNotNull($this->response->headers->get('ETag'));
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ $this->assertTrue($this->response->headers->get('Age') <= 1);
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('valid');
+ $this->assertTraceContains('store');
+ $this->assertTraceNotContains('miss');
+ }
+
+ public function testServesResponseWhileFreshAndRevalidatesWithLastModifiedInformation()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+
+ $this->setNextResponse(200, array(), 'Hello World', function (Request $request, Response $response) use ($time) {
+ $response->setSharedMaxAge(10);
+ $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
+ });
+
+ // prime the cache
+ $this->request('GET', '/');
+
+ // next request before s-maxage has expired: Serve from cache
+ // without hitting the backend
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+
+ sleep(15); // expire the cache
+
+ $this->setNextResponse(304, array(), '', function (Request $request, Response $response) use ($time) {
+ $this->assertEquals($time->format(DATE_RFC2822), $request->headers->get('IF_MODIFIED_SINCE'));
+ });
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('valid');
+ }
+
+ public function testReplacesCachedResponsesWhenValidationResultsInNon304Response()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+ $count = 0;
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($time, &$count) {
+ $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
+ $response->headers->set('Cache-Control', 'public');
+ switch (++$count) {
+ case 1:
+ $response->setContent('first response');
+ break;
+ case 2:
+ $response->setContent('second response');
+ break;
+ case 3:
+ $response->setContent('');
+ $response->setStatusCode(304);
+ break;
+ }
+ });
+
+ // first request should fetch from backend and store in cache
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('first response', $this->response->getContent());
+
+ // second request is validated, is invalid, and replaces cached entry
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('second response', $this->response->getContent());
+
+ // third response is validated, valid, and returns cached entry
+ $this->request('GET', '/');
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('second response', $this->response->getContent());
+
+ $this->assertEquals(3, $count);
+ }
+
+ public function testPassesHeadRequestsThroughDirectlyOnPass()
+ {
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) {
+ $response->setContent('');
+ $response->setStatusCode(200);
+ $this->assertEquals('HEAD', $request->getMethod());
+ });
+
+ $this->request('HEAD', '/', array('HTTP_EXPECT' => 'something ...'));
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals('', $this->response->getContent());
+ }
+
+ public function testUsesCacheToRespondToHeadRequestsWhenFresh()
+ {
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) {
+ $response->headers->set('Cache-Control', 'public, max-age=10');
+ $response->setContent('Hello World');
+ $response->setStatusCode(200);
+ $this->assertNotEquals('HEAD', $request->getMethod());
+ });
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ $this->request('HEAD', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('', $this->response->getContent());
+ $this->assertEquals(strlen('Hello World'), $this->response->headers->get('Content-Length'));
+ }
+
+ public function testSendsNoContentWhenFresh()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($time) {
+ $response->headers->set('Cache-Control', 'public, max-age=10');
+ $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
+ });
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals('Hello World', $this->response->getContent());
+
+ $this->request('GET', '/', array('HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(304, $this->response->getStatusCode());
+ $this->assertEquals('', $this->response->getContent());
+ }
+
+ public function testInvalidatesCachedResponsesOnPost()
+ {
+ $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) {
+ if ('GET' == $request->getMethod()) {
+ $response->setStatusCode(200);
+ $response->headers->set('Cache-Control', 'public, max-age=500');
+ $response->setContent('Hello World');
+ } elseif ('POST' == $request->getMethod()) {
+ $response->setStatusCode(303);
+ $response->headers->set('Location', '/');
+ $response->headers->remove('Cache-Control');
+ $response->setContent('');
+ }
+ });
+
+ // build initial request to enter into the cache
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ // make sure it is valid
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+
+ // now POST to same URL
+ $this->request('POST', '/helloworld');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals('/', $this->response->headers->get('Location'));
+ $this->assertTraceContains('invalidate');
+ $this->assertTraceContains('pass');
+ $this->assertEquals('', $this->response->getContent());
+
+ // now make sure it was actually invalidated
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Hello World', $this->response->getContent());
+ $this->assertTraceContains('stale');
+ $this->assertTraceContains('invalid');
+ $this->assertTraceContains('store');
+ }
+
+ public function testServesFromCacheWhenHeadersMatch()
+ {
+ $count = 0;
+ $this->setNextResponse(200, array('Cache-Control' => 'max-age=10000'), '', function ($request, $response) use (&$count) {
+ $response->headers->set('Vary', 'Accept User-Agent Foo');
+ $response->headers->set('Cache-Control', 'public, max-age=10');
+ $response->headers->set('X-Response-Count', ++$count);
+ $response->setContent($request->headers->get('USER_AGENT'));
+ });
+
+ $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Bob/1.0', $this->response->getContent());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+
+ $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Bob/1.0', $this->response->getContent());
+ $this->assertTraceContains('fresh');
+ $this->assertTraceNotContains('store');
+ $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
+ }
+
+ public function testStoresMultipleResponsesWhenHeadersDiffer()
+ {
+ $count = 0;
+ $this->setNextResponse(200, array('Cache-Control' => 'max-age=10000'), '', function ($request, $response) use (&$count) {
+ $response->headers->set('Vary', 'Accept User-Agent Foo');
+ $response->headers->set('Cache-Control', 'public, max-age=10');
+ $response->headers->set('X-Response-Count', ++$count);
+ $response->setContent($request->headers->get('USER_AGENT'));
+ });
+
+ $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertEquals('Bob/1.0', $this->response->getContent());
+ $this->assertEquals(1, $this->response->headers->get('X-Response-Count'));
+
+ $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/2.0'));
+ $this->assertEquals(200, $this->response->getStatusCode());
+ $this->assertTraceContains('miss');
+ $this->assertTraceContains('store');
+ $this->assertEquals('Bob/2.0', $this->response->getContent());
+ $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));
+
+ $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
+ $this->assertTraceContains('fresh');
+ $this->assertEquals('Bob/1.0', $this->response->getContent());
+ $this->assertEquals(1, $this->response->headers->get('X-Response-Count'));
+
+ $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/2.0'));
+ $this->assertTraceContains('fresh');
+ $this->assertEquals('Bob/2.0', $this->response->getContent());
+ $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));
+
+ $this->request('GET', '/', array('HTTP_USER_AGENT' => 'Bob/2.0'));
+ $this->assertTraceContains('miss');
+ $this->assertEquals('Bob/2.0', $this->response->getContent());
+ $this->assertEquals(3, $this->response->headers->get('X-Response-Count'));
+ }
+
+ public function testShouldCatchExceptions()
+ {
+ $this->catchExceptions();
+
+ $this->setNextResponse();
+ $this->request('GET', '/');
+
+ $this->assertExceptionsAreCaught();
+ }
+
+ public function testShouldCatchExceptionsWhenReloadingAndNoCacheRequest()
+ {
+ $this->catchExceptions();
+
+ $this->setNextResponse();
+ $this->cacheConfig['allow_reload'] = true;
+ $this->request('GET', '/', array(), array(), false, array('Pragma' => 'no-cache'));
+
+ $this->assertExceptionsAreCaught();
+ }
+
+ public function testShouldNotCatchExceptions()
+ {
+ $this->catchExceptions(false);
+
+ $this->setNextResponse();
+ $this->request('GET', '/');
+
+ $this->assertExceptionsAreNotCaught();
+ }
+
+ public function testEsiCacheSendsTheLowestTtl()
+ {
+ $responses = array(
+ array(
+ 'status' => 200,
+ 'body' => '<esi:include src="/foo" /> <esi:include src="/bar" />',
+ 'headers' => array(
+ 'Cache-Control' => 's-maxage=300',
+ 'Surrogate-Control' => 'content="ESI/1.0"',
+ ),
+ ),
+ array(
+ 'status' => 200,
+ 'body' => 'Hello World!',
+ 'headers' => array('Cache-Control' => 's-maxage=300'),
+ ),
+ array(
+ 'status' => 200,
+ 'body' => 'My name is Bobby.',
+ 'headers' => array('Cache-Control' => 's-maxage=100'),
+ ),
+ );
+
+ $this->setNextResponses($responses);
+
+ $this->request('GET', '/', array(), array(), true);
+ $this->assertEquals('Hello World! My name is Bobby.', $this->response->getContent());
+
+ // check for 100 or 99 as the test can be executed after a second change
+ $this->assertTrue(in_array($this->response->getTtl(), array(99, 100)));
+ }
+
+ public function testEsiCacheForceValidation()
+ {
+ $responses = array(
+ array(
+ 'status' => 200,
+ 'body' => '<esi:include src="/foo" /> <esi:include src="/bar" />',
+ 'headers' => array(
+ 'Cache-Control' => 's-maxage=300',
+ 'Surrogate-Control' => 'content="ESI/1.0"',
+ ),
+ ),
+ array(
+ 'status' => 200,
+ 'body' => 'Hello World!',
+ 'headers' => array('ETag' => 'foobar'),
+ ),
+ array(
+ 'status' => 200,
+ 'body' => 'My name is Bobby.',
+ 'headers' => array('Cache-Control' => 's-maxage=100'),
+ ),
+ );
+
+ $this->setNextResponses($responses);
+
+ $this->request('GET', '/', array(), array(), true);
+ $this->assertEquals('Hello World! My name is Bobby.', $this->response->getContent());
+ $this->assertNull($this->response->getTtl());
+ $this->assertTrue($this->response->mustRevalidate());
+ $this->assertTrue($this->response->headers->hasCacheControlDirective('private'));
+ $this->assertTrue($this->response->headers->hasCacheControlDirective('no-cache'));
+ }
+
+ public function testEsiRecalculateContentLengthHeader()
+ {
+ $responses = array(
+ array(
+ 'status' => 200,
+ 'body' => '<esi:include src="/foo" />',
+ 'headers' => array(
+ 'Content-Length' => 26,
+ 'Cache-Control' => 's-maxage=300',
+ 'Surrogate-Control' => 'content="ESI/1.0"',
+ ),
+ ),
+ array(
+ 'status' => 200,
+ 'body' => 'Hello World!',
+ 'headers' => array(),
+ ),
+ );
+
+ $this->setNextResponses($responses);
+
+ $this->request('GET', '/', array(), array(), true);
+ $this->assertEquals('Hello World!', $this->response->getContent());
+ $this->assertEquals(12, $this->response->headers->get('Content-Length'));
+ }
+
+ public function testClientIpIsAlwaysLocalhostForForwardedRequests()
+ {
+ $this->setNextResponse();
+ $this->request('GET', '/', array('REMOTE_ADDR' => '10.0.0.1'));
+
+ $this->assertEquals('127.0.0.1', $this->kernel->getBackendRequest()->server->get('REMOTE_ADDR'));
+ }
+
+ /**
+ * @dataProvider getTrustedProxyData
+ */
+ public function testHttpCacheIsSetAsATrustedProxy(array $existing, array $expected)
+ {
+ Request::setTrustedProxies($existing, Request::HEADER_X_FORWARDED_ALL);
+
+ $this->setNextResponse();
+ $this->request('GET', '/', array('REMOTE_ADDR' => '10.0.0.1'));
+
+ $this->assertEquals($expected, Request::getTrustedProxies());
+ }
+
+ public function getTrustedProxyData()
+ {
+ return array(
+ array(array(), array('127.0.0.1')),
+ array(array('10.0.0.2'), array('10.0.0.2', '127.0.0.1')),
+ array(array('10.0.0.2', '127.0.0.1'), array('10.0.0.2', '127.0.0.1')),
+ );
+ }
+
+ /**
+ * @dataProvider getXForwardedForData
+ */
+ public function testXForwarderForHeaderForForwardedRequests($xForwardedFor, $expected)
+ {
+ $this->setNextResponse();
+ $server = array('REMOTE_ADDR' => '10.0.0.1');
+ if (false !== $xForwardedFor) {
+ $server['HTTP_X_FORWARDED_FOR'] = $xForwardedFor;
+ }
+ $this->request('GET', '/', $server);
+
+ $this->assertEquals($expected, $this->kernel->getBackendRequest()->headers->get('X-Forwarded-For'));
+ }
+
+ public function getXForwardedForData()
+ {
+ return array(
+ array(false, '10.0.0.1'),
+ array('10.0.0.2', '10.0.0.2, 10.0.0.1'),
+ array('10.0.0.2, 10.0.0.3', '10.0.0.2, 10.0.0.3, 10.0.0.1'),
+ );
+ }
+
+ public function testXForwarderForHeaderForPassRequests()
+ {
+ $this->setNextResponse();
+ $server = array('REMOTE_ADDR' => '10.0.0.1');
+ $this->request('POST', '/', $server);
+
+ $this->assertEquals('10.0.0.1', $this->kernel->getBackendRequest()->headers->get('X-Forwarded-For'));
+ }
+
+ public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
+ {
+ $time = \DateTime::createFromFormat('U', time());
+
+ $responses = array(
+ array(
+ 'status' => 200,
+ 'body' => '<esi:include src="/hey" />',
+ 'headers' => array(
+ 'Surrogate-Control' => 'content="ESI/1.0"',
+ 'ETag' => 'hey',
+ 'Last-Modified' => $time->format(DATE_RFC2822),
+ ),
+ ),
+ array(
+ 'status' => 200,
+ 'body' => 'Hey!',
+ 'headers' => array(),
+ ),
+ );
+
+ $this->setNextResponses($responses);
+
+ $this->request('GET', '/', array(), array(), true);
+ $this->assertNull($this->response->getETag());
+ $this->assertNull($this->response->getLastModified());
+ }
+
+ public function testDoesNotCacheOptionsRequest()
+ {
+ $this->setNextResponse(200, array('Cache-Control' => 'public, s-maxage=60'), 'get');
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsCalled();
+
+ $this->setNextResponse(200, array('Cache-Control' => 'public, s-maxage=60'), 'options');
+ $this->request('OPTIONS', '/');
+ $this->assertHttpKernelIsCalled();
+
+ $this->request('GET', '/');
+ $this->assertHttpKernelIsNotCalled();
+ $this->assertSame('get', $this->response->getContent());
+ }
+}
+
+class TestKernel implements HttpKernelInterface
+{
+ public $terminateCalled = false;
+
+ public function terminate(Request $request, Response $response)
+ {
+ $this->terminateCalled = true;
+ }
+
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
+ {
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTestCase.php b/vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTestCase.php
new file mode 100644
index 0000000000..ed5c690d60
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/HttpCacheTestCase.php
@@ -0,0 +1,185 @@
+<?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);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/ResponseCacheStrategyTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/ResponseCacheStrategyTest.php
new file mode 100644
index 0000000000..5e4c322223
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/ResponseCacheStrategyTest.php
@@ -0,0 +1,222 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This code is partially based on the Rack-Cache library by Ryan Tomayko,
+ * which is released under the MIT license.
+ * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
+ *
+ * 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\Response;
+use Symfony\Component\HttpKernel\HttpCache\ResponseCacheStrategy;
+
+class ResponseCacheStrategyTest extends TestCase
+{
+ public function testMinimumSharedMaxAgeWins()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $response1 = new Response();
+ $response1->setSharedMaxAge(60);
+ $cacheStrategy->add($response1);
+
+ $response2 = new Response();
+ $response2->setSharedMaxAge(3600);
+ $cacheStrategy->add($response2);
+
+ $response = new Response();
+ $response->setSharedMaxAge(86400);
+ $cacheStrategy->update($response);
+
+ $this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage'));
+ }
+
+ public function testSharedMaxAgeNotSetIfNotSetInAnyEmbeddedRequest()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $response1 = new Response();
+ $response1->setSharedMaxAge(60);
+ $cacheStrategy->add($response1);
+
+ $response2 = new Response();
+ $cacheStrategy->add($response2);
+
+ $response = new Response();
+ $response->setSharedMaxAge(86400);
+ $cacheStrategy->update($response);
+
+ $this->assertFalse($response->headers->hasCacheControlDirective('s-maxage'));
+ }
+
+ public function testSharedMaxAgeNotSetIfNotSetInMasterRequest()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $response1 = new Response();
+ $response1->setSharedMaxAge(60);
+ $cacheStrategy->add($response1);
+
+ $response2 = new Response();
+ $response2->setSharedMaxAge(3600);
+ $cacheStrategy->add($response2);
+
+ $response = new Response();
+ $cacheStrategy->update($response);
+
+ $this->assertFalse($response->headers->hasCacheControlDirective('s-maxage'));
+ }
+
+ public function testMasterResponseNotCacheableWhenEmbeddedResponseRequiresValidation()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $embeddedResponse = new Response();
+ $embeddedResponse->setLastModified(new \DateTime());
+ $cacheStrategy->add($embeddedResponse);
+
+ $masterResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600);
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('no-cache'));
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('must-revalidate'));
+ $this->assertFalse($masterResponse->isFresh());
+ }
+
+ public function testValidationOnMasterResponseIsNotPossibleWhenItContainsEmbeddedResponses()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ // This master response uses the "validation" model
+ $masterResponse = new Response();
+ $masterResponse->setLastModified(new \DateTime());
+ $masterResponse->setEtag('foo');
+
+ // Embedded response uses "expiry" model
+ $embeddedResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600);
+ $cacheStrategy->add($embeddedResponse);
+
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertFalse($masterResponse->isValidateable());
+ $this->assertFalse($masterResponse->headers->has('Last-Modified'));
+ $this->assertFalse($masterResponse->headers->has('ETag'));
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('no-cache'));
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('must-revalidate'));
+ }
+
+ public function testMasterResponseWithValidationIsUnchangedWhenThereIsNoEmbeddedResponse()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $masterResponse = new Response();
+ $masterResponse->setLastModified(new \DateTime());
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertTrue($masterResponse->isValidateable());
+ }
+
+ public function testMasterResponseWithExpirationIsUnchangedWhenThereIsNoEmbeddedResponse()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $masterResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600);
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertTrue($masterResponse->isFresh());
+ }
+
+ public function testMasterResponseIsNotCacheableWhenEmbeddedResponseIsNotCacheable()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $masterResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600); // Public, cacheable
+
+ /* This response has no validation or expiration information.
+ That makes it uncacheable, it is always stale.
+ (It does *not* make this private, though.) */
+ $embeddedResponse = new Response();
+ $this->assertFalse($embeddedResponse->isFresh()); // not fresh, as no lifetime is provided
+
+ $cacheStrategy->add($embeddedResponse);
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('no-cache'));
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('must-revalidate'));
+ $this->assertFalse($masterResponse->isFresh());
+ }
+
+ public function testEmbeddingPrivateResponseMakesMainResponsePrivate()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $masterResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600); // public, cacheable
+
+ // The embedded response might for example contain per-user data that remains valid for 60 seconds
+ $embeddedResponse = new Response();
+ $embeddedResponse->setPrivate();
+ $embeddedResponse->setMaxAge(60); // this would implicitly set "private" as well, but let's be explicit
+
+ $cacheStrategy->add($embeddedResponse);
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertTrue($masterResponse->headers->hasCacheControlDirective('private'));
+ // Not sure if we should pass "max-age: 60" in this case, as long as the response is private and
+ // that's the more conservative of both the master and embedded response...?
+ }
+
+ public function testResponseIsExiprableWhenEmbeddedResponseCombinesExpiryAndValidation()
+ {
+ /* When "expiration wins over validation" (https://symfony.com/doc/current/http_cache/validation.html)
+ * and both the main and embedded response provide s-maxage, then the more restricting value of both
+ * should be fine, regardless of whether the embedded response can be validated later on or must be
+ * completely regenerated.
+ */
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $masterResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600);
+
+ $embeddedResponse = new Response();
+ $embeddedResponse->setSharedMaxAge(60);
+ $embeddedResponse->setEtag('foo');
+
+ $cacheStrategy->add($embeddedResponse);
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertSame('60', $masterResponse->headers->getCacheControlDirective('s-maxage'));
+ }
+
+ public function testResponseIsExpirableButNotValidateableWhenMasterResponseCombinesExpirationAndValidation()
+ {
+ $cacheStrategy = new ResponseCacheStrategy();
+
+ $masterResponse = new Response();
+ $masterResponse->setSharedMaxAge(3600);
+ $masterResponse->setEtag('foo');
+ $masterResponse->setLastModified(new \DateTime());
+
+ $embeddedResponse = new Response();
+ $embeddedResponse->setSharedMaxAge(60);
+
+ $cacheStrategy->add($embeddedResponse);
+ $cacheStrategy->update($masterResponse);
+
+ $this->assertSame('60', $masterResponse->headers->getCacheControlDirective('s-maxage'));
+ $this->assertFalse($masterResponse->isValidateable());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php
new file mode 100644
index 0000000000..1079d37a27
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/SsiTest.php
@@ -0,0 +1,215 @@
+<?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\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpCache\Ssi;
+
+class SsiTest extends TestCase
+{
+ public function testHasSurrogateSsiCapability()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $request->headers->set('Surrogate-Capability', 'abc="SSI/1.0"');
+ $this->assertTrue($ssi->hasSurrogateCapability($request));
+
+ $request = Request::create('/');
+ $request->headers->set('Surrogate-Capability', 'foobar');
+ $this->assertFalse($ssi->hasSurrogateCapability($request));
+
+ $request = Request::create('/');
+ $this->assertFalse($ssi->hasSurrogateCapability($request));
+ }
+
+ public function testAddSurrogateSsiCapability()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $ssi->addSurrogateCapability($request);
+ $this->assertEquals('symfony="SSI/1.0"', $request->headers->get('Surrogate-Capability'));
+
+ $ssi->addSurrogateCapability($request);
+ $this->assertEquals('symfony="SSI/1.0", symfony="SSI/1.0"', $request->headers->get('Surrogate-Capability'));
+ }
+
+ public function testAddSurrogateControl()
+ {
+ $ssi = new Ssi();
+
+ $response = new Response('foo <!--#include virtual="" -->');
+ $ssi->addSurrogateControl($response);
+ $this->assertEquals('content="SSI/1.0"', $response->headers->get('Surrogate-Control'));
+
+ $response = new Response('foo');
+ $ssi->addSurrogateControl($response);
+ $this->assertEquals('', $response->headers->get('Surrogate-Control'));
+ }
+
+ public function testNeedsSsiParsing()
+ {
+ $ssi = new Ssi();
+
+ $response = new Response();
+ $response->headers->set('Surrogate-Control', 'content="SSI/1.0"');
+ $this->assertTrue($ssi->needsParsing($response));
+
+ $response = new Response();
+ $this->assertFalse($ssi->needsParsing($response));
+ }
+
+ public function testRenderIncludeTag()
+ {
+ $ssi = new Ssi();
+
+ $this->assertEquals('<!--#include virtual="/" -->', $ssi->renderIncludeTag('/', '/alt', true));
+ $this->assertEquals('<!--#include virtual="/" -->', $ssi->renderIncludeTag('/', '/alt', false));
+ $this->assertEquals('<!--#include virtual="/" -->', $ssi->renderIncludeTag('/'));
+ }
+
+ public function testProcessDoesNothingIfContentTypeIsNotHtml()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $response = new Response();
+ $response->headers->set('Content-Type', 'text/plain');
+ $ssi->process($request, $response);
+
+ $this->assertFalse($response->headers->has('x-body-eval'));
+ }
+
+ public function testProcess()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $response = new Response('foo <!--#include virtual="..." -->');
+ $ssi->process($request, $response);
+
+ $this->assertEquals('foo <?php echo $this->surrogate->handle($this, \'...\', \'\', false) ?>'."\n", $response->getContent());
+ $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
+
+ $response = new Response('foo <!--#include virtual="foo\'" -->');
+ $ssi->process($request, $response);
+
+ $this->assertEquals("foo <?php echo \$this->surrogate->handle(\$this, 'foo\\'', '', false) ?>"."\n", $response->getContent());
+ }
+
+ public function testProcessEscapesPhpTags()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $response = new Response('<?php <? <% <script language=php>');
+ $ssi->process($request, $response);
+
+ $this->assertEquals('<?php echo "<?"; ?>php <?php echo "<?"; ?> <?php echo "<%"; ?> <?php echo "<s"; ?>cript language=php>', $response->getContent());
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testProcessWhenNoSrcInAnSsi()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $response = new Response('foo <!--#include -->');
+ $ssi->process($request, $response);
+ }
+
+ public function testProcessRemoveSurrogateControlHeader()
+ {
+ $ssi = new Ssi();
+
+ $request = Request::create('/');
+ $response = new Response('foo <!--#include virtual="..." -->');
+ $response->headers->set('Surrogate-Control', 'content="SSI/1.0"');
+ $ssi->process($request, $response);
+ $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
+
+ $response->headers->set('Surrogate-Control', 'no-store, content="SSI/1.0"');
+ $ssi->process($request, $response);
+ $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
+ $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
+
+ $response->headers->set('Surrogate-Control', 'content="SSI/1.0", no-store');
+ $ssi->process($request, $response);
+ $this->assertEquals('SSI', $response->headers->get('x-body-eval'));
+ $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
+ }
+
+ public function testHandle()
+ {
+ $ssi = new Ssi();
+ $cache = $this->getCache(Request::create('/'), new Response('foo'));
+ $this->assertEquals('foo', $ssi->handle($cache, '/', '/alt', true));
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testHandleWhenResponseIsNot200()
+ {
+ $ssi = new Ssi();
+ $response = new Response('foo');
+ $response->setStatusCode(404);
+ $cache = $this->getCache(Request::create('/'), $response);
+ $ssi->handle($cache, '/', '/alt', false);
+ }
+
+ public function testHandleWhenResponseIsNot200AndErrorsAreIgnored()
+ {
+ $ssi = new Ssi();
+ $response = new Response('foo');
+ $response->setStatusCode(404);
+ $cache = $this->getCache(Request::create('/'), $response);
+ $this->assertEquals('', $ssi->handle($cache, '/', '/alt', true));
+ }
+
+ public function testHandleWhenResponseIsNot200AndAltIsPresent()
+ {
+ $ssi = new Ssi();
+ $response1 = new Response('foo');
+ $response1->setStatusCode(404);
+ $response2 = new Response('bar');
+ $cache = $this->getCache(Request::create('/'), array($response1, $response2));
+ $this->assertEquals('bar', $ssi->handle($cache, '/', '/alt', false));
+ }
+
+ protected function getCache($request, $response)
+ {
+ $cache = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpCache\HttpCache')->setMethods(array('getRequest', 'handle'))->disableOriginalConstructor()->getMock();
+ $cache->expects($this->any())
+ ->method('getRequest')
+ ->will($this->returnValue($request))
+ ;
+ if (is_array($response)) {
+ $cache->expects($this->any())
+ ->method('handle')
+ ->will(call_user_func_array(array($this, 'onConsecutiveCalls'), $response))
+ ;
+ } else {
+ $cache->expects($this->any())
+ ->method('handle')
+ ->will($this->returnValue($response))
+ ;
+ }
+
+ return $cache;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/StoreTest.php b/vendor/symfony/http-kernel/Tests/HttpCache/StoreTest.php
new file mode 100644
index 0000000000..cef019167a
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/StoreTest.php
@@ -0,0 +1,301 @@
+<?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\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpCache\Store;
+
+class StoreTest extends 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('Symfony\Component\HttpFoundation\Response', $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('Symfony\Component\HttpFoundation\Response', $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));
+ }
+
+ public function testPurgeHttps()
+ {
+ $request = Request::create('https://example.com/foo');
+ $this->store->write($request, new Response('foo'));
+
+ $this->assertNotEmpty($this->getStoreMetadata($request));
+
+ $this->assertTrue($this->store->purge('https://example.com/foo'));
+ $this->assertEmpty($this->getStoreMetadata($request));
+ }
+
+ public function testPurgeHttpAndHttps()
+ {
+ $requestHttp = Request::create('https://example.com/foo');
+ $this->store->write($requestHttp, new Response('foo'));
+
+ $requestHttps = Request::create('http://example.com/foo');
+ $this->store->write($requestHttps, new Response('foo'));
+
+ $this->assertNotEmpty($this->getStoreMetadata($requestHttp));
+ $this->assertNotEmpty($this->getStoreMetadata($requestHttps));
+
+ $this->assertTrue($this->store->purge('http://example.com/foo'));
+ $this->assertEmpty($this->getStoreMetadata($requestHttp));
+ $this->assertEmpty($this->getStoreMetadata($requestHttps));
+ }
+
+ 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);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php b/vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php
new file mode 100644
index 0000000000..946c7a31cb
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/TestHttpKernel.php
@@ -0,0 +1,92 @@
+<?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 Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class TestHttpKernel extends HttpKernel implements ControllerResolverInterface, ArgumentResolverInterface
+{
+ protected $body;
+ protected $status;
+ protected $headers;
+ protected $called = false;
+ protected $customizer;
+ protected $catch = false;
+ protected $backendRequest;
+
+ public function __construct($body, $status, $headers, \Closure $customizer = null)
+ {
+ $this->body = $body;
+ $this->status = $status;
+ $this->headers = $headers;
+ $this->customizer = $customizer;
+
+ parent::__construct(new EventDispatcher(), $this, null, $this);
+ }
+
+ public function getBackendRequest()
+ {
+ return $this->backendRequest;
+ }
+
+ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = false)
+ {
+ $this->catch = $catch;
+ $this->backendRequest = $request;
+
+ return parent::handle($request, $type, $catch);
+ }
+
+ public function isCatchingExceptions()
+ {
+ return $this->catch;
+ }
+
+ public function getController(Request $request)
+ {
+ return array($this, 'callController');
+ }
+
+ public function getArguments(Request $request, $controller)
+ {
+ return array($request);
+ }
+
+ public function callController(Request $request)
+ {
+ $this->called = true;
+
+ $response = new Response($this->body, $this->status, $this->headers);
+
+ if (null !== $customizer = $this->customizer) {
+ $customizer($request, $response);
+ }
+
+ return $response;
+ }
+
+ public function hasBeenCalled()
+ {
+ return $this->called;
+ }
+
+ public function reset()
+ {
+ $this->called = false;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php b/vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php
new file mode 100644
index 0000000000..926d8daf53
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpCache/TestMultipleHttpKernel.php
@@ -0,0 +1,81 @@
+<?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 Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class TestMultipleHttpKernel extends HttpKernel implements ControllerResolverInterface, ArgumentResolverInterface
+{
+ protected $bodies = array();
+ protected $statuses = array();
+ protected $headers = array();
+ protected $called = false;
+ protected $backendRequest;
+
+ public function __construct($responses)
+ {
+ foreach ($responses as $response) {
+ $this->bodies[] = $response['body'];
+ $this->statuses[] = $response['status'];
+ $this->headers[] = $response['headers'];
+ }
+
+ parent::__construct(new EventDispatcher(), $this, null, $this);
+ }
+
+ public function getBackendRequest()
+ {
+ return $this->backendRequest;
+ }
+
+ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = false)
+ {
+ $this->backendRequest = $request;
+
+ return parent::handle($request, $type, $catch);
+ }
+
+ public function getController(Request $request)
+ {
+ return array($this, 'callController');
+ }
+
+ public function getArguments(Request $request, $controller)
+ {
+ return array($request);
+ }
+
+ public function callController(Request $request)
+ {
+ $this->called = true;
+
+ $response = new Response(array_shift($this->bodies), array_shift($this->statuses), array_shift($this->headers));
+
+ return $response;
+ }
+
+ public function hasBeenCalled()
+ {
+ return $this->called;
+ }
+
+ public function reset()
+ {
+ $this->called = false;
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/HttpKernelTest.php b/vendor/symfony/http-kernel/Tests/HttpKernelTest.php
new file mode 100644
index 0000000000..7aed26aa59
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/HttpKernelTest.php
@@ -0,0 +1,403 @@
+<?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;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
+use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class HttpKernelTest extends TestCase
+{
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testHandleWhenControllerThrowsAnExceptionAndCatchIsTrue()
+ {
+ $kernel = $this->getHttpKernel(new EventDispatcher(), function () { throw new \RuntimeException(); });
+
+ $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testHandleWhenControllerThrowsAnExceptionAndCatchIsFalseAndNoListenerIsRegistered()
+ {
+ $kernel = $this->getHttpKernel(new EventDispatcher(), function () { throw new \RuntimeException(); });
+
+ $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, false);
+ }
+
+ public function testHandleWhenControllerThrowsAnExceptionAndCatchIsTrueWithAHandlingListener()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
+ $event->setResponse(new Response($event->getException()->getMessage()));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { throw new \RuntimeException('foo'); });
+ $response = $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
+
+ $this->assertEquals('500', $response->getStatusCode());
+ $this->assertEquals('foo', $response->getContent());
+ }
+
+ public function testHandleWhenControllerThrowsAnExceptionAndCatchIsTrueWithANonHandlingListener()
+ {
+ $exception = new \RuntimeException();
+
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
+ // should set a response, but does not
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () use ($exception) { throw $exception; });
+
+ try {
+ $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
+ $this->fail('LogicException expected');
+ } catch (\RuntimeException $e) {
+ $this->assertSame($exception, $e);
+ }
+ }
+
+ public function testHandleExceptionWithARedirectionResponse()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
+ $event->setResponse(new RedirectResponse('/login', 301));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { throw new AccessDeniedHttpException(); });
+ $response = $kernel->handle(new Request());
+
+ $this->assertEquals('301', $response->getStatusCode());
+ $this->assertEquals('/login', $response->headers->get('Location'));
+ }
+
+ public function testHandleHttpException()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
+ $event->setResponse(new Response($event->getException()->getMessage()));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { throw new MethodNotAllowedHttpException(array('POST')); });
+ $response = $kernel->handle(new Request());
+
+ $this->assertEquals('405', $response->getStatusCode());
+ $this->assertEquals('POST', $response->headers->get('Allow'));
+ }
+
+ /**
+ * @group legacy
+ * @dataProvider getStatusCodes
+ */
+ public function testLegacyHandleWhenAnExceptionIsHandledWithASpecificStatusCode($responseStatusCode, $expectedStatusCode)
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) use ($responseStatusCode, $expectedStatusCode) {
+ $event->setResponse(new Response('', $responseStatusCode, array('X-Status-Code' => $expectedStatusCode)));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { throw new \RuntimeException(); });
+ $response = $kernel->handle(new Request());
+
+ $this->assertEquals($expectedStatusCode, $response->getStatusCode());
+ $this->assertFalse($response->headers->has('X-Status-Code'));
+ }
+
+ public function getStatusCodes()
+ {
+ return array(
+ array(200, 404),
+ array(404, 200),
+ array(301, 200),
+ array(500, 200),
+ );
+ }
+
+ /**
+ * @dataProvider getSpecificStatusCodes
+ */
+ public function testHandleWhenAnExceptionIsHandledWithASpecificStatusCode($expectedStatusCode)
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::EXCEPTION, function (GetResponseForExceptionEvent $event) use ($expectedStatusCode) {
+ $event->allowCustomResponseCode();
+ $event->setResponse(new Response('', $expectedStatusCode));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { throw new \RuntimeException(); });
+ $response = $kernel->handle(new Request());
+
+ $this->assertEquals($expectedStatusCode, $response->getStatusCode());
+ }
+
+ public function getSpecificStatusCodes()
+ {
+ return array(
+ array(200),
+ array(302),
+ array(403),
+ );
+ }
+
+ public function testHandleWhenAListenerReturnsAResponse()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::REQUEST, function ($event) {
+ $event->setResponse(new Response('hello'));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher);
+
+ $this->assertEquals('hello', $kernel->handle(new Request())->getContent());
+ }
+
+ /**
+ * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+ */
+ public function testHandleWhenNoControllerIsFound()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, false);
+
+ $kernel->handle(new Request());
+ }
+
+ public function testHandleWhenTheControllerIsAClosure()
+ {
+ $response = new Response('foo');
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, function () use ($response) { return $response; });
+
+ $this->assertSame($response, $kernel->handle(new Request()));
+ }
+
+ public function testHandleWhenTheControllerIsAnObjectWithInvoke()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, new Controller());
+
+ $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
+ }
+
+ public function testHandleWhenTheControllerIsAFunction()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, 'Symfony\Component\HttpKernel\Tests\controller_func');
+
+ $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
+ }
+
+ public function testHandleWhenTheControllerIsAnArray()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, array(new Controller(), 'controller'));
+
+ $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
+ }
+
+ public function testHandleWhenTheControllerIsAStaticArray()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, array('Symfony\Component\HttpKernel\Tests\Controller', 'staticcontroller'));
+
+ $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testHandleWhenTheControllerDoesNotReturnAResponse()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, function () { return 'foo'; });
+
+ $kernel->handle(new Request());
+ }
+
+ public function testHandleWhenTheControllerDoesNotReturnAResponseButAViewIsRegistered()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::VIEW, function ($event) {
+ $event->setResponse(new Response($event->getControllerResult()));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function () { return 'foo'; });
+
+ $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
+ }
+
+ public function testHandleWithAResponseListener()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::RESPONSE, function ($event) {
+ $event->setResponse(new Response('foo'));
+ });
+ $kernel = $this->getHttpKernel($dispatcher);
+
+ $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
+ }
+
+ public function testHandleAllowChangingControllerArguments()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::CONTROLLER_ARGUMENTS, function (FilterControllerArgumentsEvent $event) {
+ $event->setArguments(array('foo'));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function ($content) { return new Response($content); });
+
+ $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
+ }
+
+ public function testHandleAllowChangingControllerAndArguments()
+ {
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::CONTROLLER_ARGUMENTS, function (FilterControllerArgumentsEvent $event) {
+ $oldController = $event->getController();
+ $oldArguments = $event->getArguments();
+
+ $newController = function ($id) use ($oldController, $oldArguments) {
+ $response = call_user_func_array($oldController, $oldArguments);
+
+ $response->headers->set('X-Id', $id);
+
+ return $response;
+ };
+
+ $event->setController($newController);
+ $event->setArguments(array('bar'));
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher, function ($content) { return new Response($content); }, null, array('foo'));
+
+ $this->assertResponseEquals(new Response('foo', 200, array('X-Id' => 'bar')), $kernel->handle(new Request()));
+ }
+
+ public function testTerminate()
+ {
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher);
+ $dispatcher->addListener(KernelEvents::TERMINATE, function ($event) use (&$called, &$capturedKernel, &$capturedRequest, &$capturedResponse) {
+ $called = true;
+ $capturedKernel = $event->getKernel();
+ $capturedRequest = $event->getRequest();
+ $capturedResponse = $event->getResponse();
+ });
+
+ $kernel->terminate($request = Request::create('/'), $response = new Response());
+ $this->assertTrue($called);
+ $this->assertEquals($kernel, $capturedKernel);
+ $this->assertEquals($request, $capturedRequest);
+ $this->assertEquals($response, $capturedResponse);
+ }
+
+ public function testVerifyRequestStackPushPopDuringHandle()
+ {
+ $request = new Request();
+
+ $stack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->setMethods(array('push', 'pop'))->getMock();
+ $stack->expects($this->at(0))->method('push')->with($this->equalTo($request));
+ $stack->expects($this->at(1))->method('pop');
+
+ $dispatcher = new EventDispatcher();
+ $kernel = $this->getHttpKernel($dispatcher, null, $stack);
+
+ $kernel->handle($request, HttpKernelInterface::MASTER_REQUEST);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
+ */
+ public function testInconsistentClientIpsOnMasterRequests()
+ {
+ $request = new Request();
+ $request->setTrustedProxies(array('1.1.1.1'), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_FORWARDED);
+ $request->server->set('REMOTE_ADDR', '1.1.1.1');
+ $request->headers->set('FORWARDED', 'for=2.2.2.2');
+ $request->headers->set('X_FORWARDED_FOR', '3.3.3.3');
+
+ $dispatcher = new EventDispatcher();
+ $dispatcher->addListener(KernelEvents::REQUEST, function ($event) {
+ $event->getRequest()->getClientIp();
+ });
+
+ $kernel = $this->getHttpKernel($dispatcher);
+ $kernel->handle($request, $kernel::MASTER_REQUEST, false);
+ }
+
+ private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $controller = null, RequestStack $requestStack = null, array $arguments = array())
+ {
+ if (null === $controller) {
+ $controller = function () { return new Response('Hello'); };
+ }
+
+ $controllerResolver = $this->getMockBuilder(ControllerResolverInterface::class)->getMock();
+ $controllerResolver
+ ->expects($this->any())
+ ->method('getController')
+ ->will($this->returnValue($controller));
+
+ $argumentResolver = $this->getMockBuilder(ArgumentResolverInterface::class)->getMock();
+ $argumentResolver
+ ->expects($this->any())
+ ->method('getArguments')
+ ->will($this->returnValue($arguments));
+
+ return new HttpKernel($eventDispatcher, $controllerResolver, $requestStack, $argumentResolver);
+ }
+
+ private function assertResponseEquals(Response $expected, Response $actual)
+ {
+ $expected->setDate($actual->getDate());
+ $this->assertEquals($expected, $actual);
+ }
+}
+
+class Controller
+{
+ public function __invoke()
+ {
+ return new Response('foo');
+ }
+
+ public function controller()
+ {
+ return new Response('foo');
+ }
+
+ public static function staticController()
+ {
+ return new Response('foo');
+ }
+}
+
+function controller_func()
+{
+ return new Response('foo');
+}
diff --git a/vendor/symfony/http-kernel/Tests/KernelTest.php b/vendor/symfony/http-kernel/Tests/KernelTest.php
new file mode 100644
index 0000000000..d2a27d03aa
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/KernelTest.php
@@ -0,0 +1,900 @@
+<?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;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\Config\EnvParametersResource;
+use Symfony\Component\HttpKernel\Kernel;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest;
+use Symfony\Component\HttpKernel\Tests\Fixtures\KernelForOverrideName;
+use Symfony\Component\HttpKernel\Tests\Fixtures\KernelWithoutBundles;
+
+class KernelTest extends TestCase
+{
+ public function testConstructor()
+ {
+ $env = 'test_env';
+ $debug = true;
+ $kernel = new KernelForTest($env, $debug);
+
+ $this->assertEquals($env, $kernel->getEnvironment());
+ $this->assertEquals($debug, $kernel->isDebug());
+ $this->assertFalse($kernel->isBooted());
+ $this->assertLessThanOrEqual(microtime(true), $kernel->getStartTime());
+ $this->assertNull($kernel->getContainer());
+ }
+
+ public function testClone()
+ {
+ $env = 'test_env';
+ $debug = true;
+ $kernel = new KernelForTest($env, $debug);
+
+ $clone = clone $kernel;
+
+ $this->assertEquals($env, $clone->getEnvironment());
+ $this->assertEquals($debug, $clone->isDebug());
+ $this->assertFalse($clone->isBooted());
+ $this->assertLessThanOrEqual(microtime(true), $clone->getStartTime());
+ $this->assertNull($clone->getContainer());
+ }
+
+ public function testBootInitializesBundlesAndContainer()
+ {
+ $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer'));
+ $kernel->expects($this->once())
+ ->method('initializeBundles');
+ $kernel->expects($this->once())
+ ->method('initializeContainer');
+
+ $kernel->boot();
+ }
+
+ public function testBootSetsTheContainerToTheBundles()
+ {
+ $bundle = $this->getMockBuilder('Symfony\Component\HttpKernel\Bundle\Bundle')->getMock();
+ $bundle->expects($this->once())
+ ->method('setContainer');
+
+ $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'getBundles'));
+ $kernel->expects($this->once())
+ ->method('getBundles')
+ ->will($this->returnValue(array($bundle)));
+
+ $kernel->boot();
+ }
+
+ public function testBootSetsTheBootedFlagToTrue()
+ {
+ // use test kernel to access isBooted()
+ $kernel = $this->getKernelForTest(array('initializeBundles', 'initializeContainer'));
+ $kernel->boot();
+
+ $this->assertTrue($kernel->isBooted());
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testClassCacheIsLoaded()
+ {
+ $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache'));
+ $kernel->loadClassCache('name', '.extension');
+ $kernel->expects($this->once())
+ ->method('doLoadClassCache')
+ ->with('name', '.extension');
+
+ $kernel->boot();
+ }
+
+ public function testClassCacheIsNotLoadedByDefault()
+ {
+ $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache'));
+ $kernel->expects($this->never())
+ ->method('doLoadClassCache');
+
+ $kernel->boot();
+ }
+
+ /**
+ * @group legacy
+ */
+ public function testClassCacheIsNotLoadedWhenKernelIsNotBooted()
+ {
+ $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache'));
+ $kernel->loadClassCache();
+ $kernel->expects($this->never())
+ ->method('doLoadClassCache');
+ }
+
+ public function testEnvParametersResourceIsAdded()
+ {
+ $container = new ContainerBuilder();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest')
+ ->disableOriginalConstructor()
+ ->setMethods(array('getContainerBuilder', 'prepareContainer', 'getCacheDir', 'getLogDir'))
+ ->getMock();
+ $kernel->expects($this->any())
+ ->method('getContainerBuilder')
+ ->will($this->returnValue($container));
+ $kernel->expects($this->any())
+ ->method('prepareContainer')
+ ->will($this->returnValue(null));
+ $kernel->expects($this->any())
+ ->method('getCacheDir')
+ ->will($this->returnValue(sys_get_temp_dir()));
+ $kernel->expects($this->any())
+ ->method('getLogDir')
+ ->will($this->returnValue(sys_get_temp_dir()));
+
+ $reflection = new \ReflectionClass(get_class($kernel));
+ $method = $reflection->getMethod('buildContainer');
+ $method->setAccessible(true);
+ $method->invoke($kernel);
+
+ $found = false;
+ foreach ($container->getResources() as $resource) {
+ if ($resource instanceof EnvParametersResource) {
+ $found = true;
+ break;
+ }
+ }
+
+ $this->assertTrue($found);
+ }
+
+ public function testBootKernelSeveralTimesOnlyInitializesBundlesOnce()
+ {
+ $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer'));
+ $kernel->expects($this->once())
+ ->method('initializeBundles');
+
+ $kernel->boot();
+ $kernel->boot();
+ }
+
+ public function testShutdownCallsShutdownOnAllBundles()
+ {
+ $bundle = $this->getMockBuilder('Symfony\Component\HttpKernel\Bundle\Bundle')->getMock();
+ $bundle->expects($this->once())
+ ->method('shutdown');
+
+ $kernel = $this->getKernel(array(), array($bundle));
+
+ $kernel->boot();
+ $kernel->shutdown();
+ }
+
+ public function testShutdownGivesNullContainerToAllBundles()
+ {
+ $bundle = $this->getMockBuilder('Symfony\Component\HttpKernel\Bundle\Bundle')->getMock();
+ $bundle->expects($this->at(3))
+ ->method('setContainer')
+ ->with(null);
+
+ $kernel = $this->getKernel(array('getBundles'));
+ $kernel->expects($this->any())
+ ->method('getBundles')
+ ->will($this->returnValue(array($bundle)));
+
+ $kernel->boot();
+ $kernel->shutdown();
+ }
+
+ public function testHandleCallsHandleOnHttpKernel()
+ {
+ $type = HttpKernelInterface::MASTER_REQUEST;
+ $catch = true;
+ $request = new Request();
+
+ $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernel')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $httpKernelMock
+ ->expects($this->once())
+ ->method('handle')
+ ->with($request, $type, $catch);
+
+ $kernel = $this->getKernel(array('getHttpKernel'));
+ $kernel->expects($this->once())
+ ->method('getHttpKernel')
+ ->will($this->returnValue($httpKernelMock));
+
+ $kernel->handle($request, $type, $catch);
+ }
+
+ public function testHandleBootsTheKernel()
+ {
+ $type = HttpKernelInterface::MASTER_REQUEST;
+ $catch = true;
+ $request = new Request();
+
+ $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernel')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $kernel = $this->getKernel(array('getHttpKernel', 'boot'));
+ $kernel->expects($this->once())
+ ->method('getHttpKernel')
+ ->will($this->returnValue($httpKernelMock));
+
+ $kernel->expects($this->once())
+ ->method('boot');
+
+ $kernel->handle($request, $type, $catch);
+ }
+
+ public function testStripComments()
+ {
+ $source = <<<'EOF'
+<?php
+
+$string = 'string should not be modified';
+
+$string = 'string should not be
+
+modified';
+
+
+$heredoc = <<<HD
+
+
+Heredoc should not be modified {$a[1+$b]}
+
+
+HD;
+
+$nowdoc = <<<'ND'
+
+
+Nowdoc should not be modified
+
+
+ND;
+
+/**
+ * some class comments to strip
+ */
+class TestClass
+{
+ /**
+ * some method comments to strip
+ */
+ public function doStuff()
+ {
+ // inline comment
+ }
+}
+EOF;
+ $expected = <<<'EOF'
+<?php
+$string = 'string should not be modified';
+$string = 'string should not be
+
+modified';
+$heredoc = <<<HD
+
+
+Heredoc should not be modified {$a[1+$b]}
+
+
+HD;
+$nowdoc = <<<'ND'
+
+
+Nowdoc should not be modified
+
+
+ND;
+class TestClass
+{
+ public function doStuff()
+ {
+ }
+}
+EOF;
+
+ $output = Kernel::stripComments($source);
+
+ // Heredocs are preserved, making the output mixing Unix and Windows line
+ // endings, switching to "\n" everywhere on Windows to avoid failure.
+ if ('\\' === DIRECTORY_SEPARATOR) {
+ $expected = str_replace("\r\n", "\n", $expected);
+ $output = str_replace("\r\n", "\n", $output);
+ }
+
+ $this->assertEquals($expected, $output);
+ }
+
+ public function testGetRootDir()
+ {
+ $kernel = new KernelForTest('test', true);
+
+ $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures', realpath($kernel->getRootDir()));
+ }
+
+ public function testGetName()
+ {
+ $kernel = new KernelForTest('test', true);
+
+ $this->assertEquals('Fixtures', $kernel->getName());
+ }
+
+ public function testOverrideGetName()
+ {
+ $kernel = new KernelForOverrideName('test', true);
+
+ $this->assertEquals('overridden', $kernel->getName());
+ }
+
+ public function testSerialize()
+ {
+ $env = 'test_env';
+ $debug = true;
+ $kernel = new KernelForTest($env, $debug);
+
+ $expected = serialize(array($env, $debug));
+ $this->assertEquals($expected, $kernel->serialize());
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testLocateResourceThrowsExceptionWhenNameIsNotValid()
+ {
+ $this->getKernel()->locateResource('Foo');
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testLocateResourceThrowsExceptionWhenNameIsUnsafe()
+ {
+ $this->getKernel()->locateResource('@FooBundle/../bar');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testLocateResourceThrowsExceptionWhenBundleDoesNotExist()
+ {
+ $this->getKernel()->locateResource('@FooBundle/config/routing.xml');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testLocateResourceThrowsExceptionWhenResourceDoesNotExist()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'))))
+ ;
+
+ $kernel->locateResource('@Bundle1Bundle/config/routing.xml');
+ }
+
+ public function testLocateResourceReturnsTheFirstThatMatches()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'))))
+ ;
+
+ $this->assertEquals(__DIR__.'/Fixtures/Bundle1Bundle/foo.txt', $kernel->locateResource('@Bundle1Bundle/foo.txt'));
+ }
+
+ public function testLocateResourceReturnsTheFirstThatMatchesWithParent()
+ {
+ $parent = $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle');
+ $child = $this->getBundle(__DIR__.'/Fixtures/Bundle2Bundle');
+
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->exactly(2))
+ ->method('getBundle')
+ ->will($this->returnValue(array($child, $parent)))
+ ;
+
+ $this->assertEquals(__DIR__.'/Fixtures/Bundle2Bundle/foo.txt', $kernel->locateResource('@ParentAABundle/foo.txt'));
+ $this->assertEquals(__DIR__.'/Fixtures/Bundle1Bundle/bar.txt', $kernel->locateResource('@ParentAABundle/bar.txt'));
+ }
+
+ public function testLocateResourceReturnsAllMatches()
+ {
+ $parent = $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle');
+ $child = $this->getBundle(__DIR__.'/Fixtures/Bundle2Bundle');
+
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array($child, $parent)))
+ ;
+
+ $this->assertEquals(array(
+ __DIR__.'/Fixtures/Bundle2Bundle/foo.txt',
+ __DIR__.'/Fixtures/Bundle1Bundle/foo.txt', ),
+ $kernel->locateResource('@Bundle1Bundle/foo.txt', null, false));
+ }
+
+ public function testLocateResourceReturnsAllMatchesBis()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array(
+ $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'),
+ $this->getBundle(__DIR__.'/Foobar'),
+ )))
+ ;
+
+ $this->assertEquals(
+ array(__DIR__.'/Fixtures/Bundle1Bundle/foo.txt'),
+ $kernel->locateResource('@Bundle1Bundle/foo.txt', null, false)
+ );
+ }
+
+ public function testLocateResourceIgnoresDirOnNonResource()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'))))
+ ;
+
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Bundle1Bundle/foo.txt',
+ $kernel->locateResource('@Bundle1Bundle/foo.txt', __DIR__.'/Fixtures')
+ );
+ }
+
+ public function testLocateResourceReturnsTheDirOneForResources()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/FooBundle', null, null, 'FooBundle'))))
+ ;
+
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Resources/FooBundle/foo.txt',
+ $kernel->locateResource('@FooBundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources')
+ );
+ }
+
+ public function testLocateResourceReturnsTheDirOneForResourcesAndBundleOnes()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->once())
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle', null, null, 'Bundle1Bundle'))))
+ ;
+
+ $this->assertEquals(array(
+ __DIR__.'/Fixtures/Resources/Bundle1Bundle/foo.txt',
+ __DIR__.'/Fixtures/Bundle1Bundle/Resources/foo.txt', ),
+ $kernel->locateResource('@Bundle1Bundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources', false)
+ );
+ }
+
+ public function testLocateResourceOverrideBundleAndResourcesFolders()
+ {
+ $parent = $this->getBundle(__DIR__.'/Fixtures/BaseBundle', null, 'BaseBundle', 'BaseBundle');
+ $child = $this->getBundle(__DIR__.'/Fixtures/ChildBundle', 'ParentBundle', 'ChildBundle', 'ChildBundle');
+
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->exactly(4))
+ ->method('getBundle')
+ ->will($this->returnValue(array($child, $parent)))
+ ;
+
+ $this->assertEquals(array(
+ __DIR__.'/Fixtures/Resources/ChildBundle/foo.txt',
+ __DIR__.'/Fixtures/ChildBundle/Resources/foo.txt',
+ __DIR__.'/Fixtures/BaseBundle/Resources/foo.txt',
+ ),
+ $kernel->locateResource('@BaseBundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources', false)
+ );
+
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Resources/ChildBundle/foo.txt',
+ $kernel->locateResource('@BaseBundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources')
+ );
+
+ try {
+ $kernel->locateResource('@BaseBundle/Resources/hide.txt', __DIR__.'/Fixtures/Resources', false);
+ $this->fail('Hidden resources should raise an exception when returning an array of matching paths');
+ } catch (\RuntimeException $e) {
+ }
+
+ try {
+ $kernel->locateResource('@BaseBundle/Resources/hide.txt', __DIR__.'/Fixtures/Resources', true);
+ $this->fail('Hidden resources should raise an exception when returning the first matching path');
+ } catch (\RuntimeException $e) {
+ }
+ }
+
+ public function testLocateResourceOnDirectories()
+ {
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->exactly(2))
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/FooBundle', null, null, 'FooBundle'))))
+ ;
+
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Resources/FooBundle/',
+ $kernel->locateResource('@FooBundle/Resources/', __DIR__.'/Fixtures/Resources')
+ );
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Resources/FooBundle',
+ $kernel->locateResource('@FooBundle/Resources', __DIR__.'/Fixtures/Resources')
+ );
+
+ $kernel = $this->getKernel(array('getBundle'));
+ $kernel
+ ->expects($this->exactly(2))
+ ->method('getBundle')
+ ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle', null, null, 'Bundle1Bundle'))))
+ ;
+
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Bundle1Bundle/Resources/',
+ $kernel->locateResource('@Bundle1Bundle/Resources/')
+ );
+ $this->assertEquals(
+ __DIR__.'/Fixtures/Bundle1Bundle/Resources',
+ $kernel->locateResource('@Bundle1Bundle/Resources')
+ );
+ }
+
+ public function testInitializeBundles()
+ {
+ $parent = $this->getBundle(null, null, 'ParentABundle');
+ $child = $this->getBundle(null, 'ParentABundle', 'ChildABundle');
+
+ // use test kernel so we can access getBundleMap()
+ $kernel = $this->getKernelForTest(array('registerBundles'));
+ $kernel
+ ->expects($this->once())
+ ->method('registerBundles')
+ ->will($this->returnValue(array($parent, $child)))
+ ;
+ $kernel->boot();
+
+ $map = $kernel->getBundleMap();
+ $this->assertEquals(array($child, $parent), $map['ParentABundle']);
+ }
+
+ public function testInitializeBundlesSupportInheritanceCascade()
+ {
+ $grandparent = $this->getBundle(null, null, 'GrandParentBBundle');
+ $parent = $this->getBundle(null, 'GrandParentBBundle', 'ParentBBundle');
+ $child = $this->getBundle(null, 'ParentBBundle', 'ChildBBundle');
+
+ // use test kernel so we can access getBundleMap()
+ $kernel = $this->getKernelForTest(array('registerBundles'));
+ $kernel
+ ->expects($this->once())
+ ->method('registerBundles')
+ ->will($this->returnValue(array($grandparent, $parent, $child)))
+ ;
+ $kernel->boot();
+
+ $map = $kernel->getBundleMap();
+ $this->assertEquals(array($child, $parent, $grandparent), $map['GrandParentBBundle']);
+ $this->assertEquals(array($child, $parent), $map['ParentBBundle']);
+ $this->assertEquals(array($child), $map['ChildBBundle']);
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage Bundle "ChildCBundle" extends bundle "FooBar", which is not registered.
+ */
+ public function testInitializeBundlesThrowsExceptionWhenAParentDoesNotExists()
+ {
+ $child = $this->getBundle(null, 'FooBar', 'ChildCBundle');
+ $kernel = $this->getKernel(array(), array($child));
+ $kernel->boot();
+ }
+
+ public function testInitializeBundlesSupportsArbitraryBundleRegistrationOrder()
+ {
+ $grandparent = $this->getBundle(null, null, 'GrandParentCBundle');
+ $parent = $this->getBundle(null, 'GrandParentCBundle', 'ParentCBundle');
+ $child = $this->getBundle(null, 'ParentCBundle', 'ChildCBundle');
+
+ // use test kernel so we can access getBundleMap()
+ $kernel = $this->getKernelForTest(array('registerBundles'));
+ $kernel
+ ->expects($this->once())
+ ->method('registerBundles')
+ ->will($this->returnValue(array($parent, $grandparent, $child)))
+ ;
+ $kernel->boot();
+
+ $map = $kernel->getBundleMap();
+ $this->assertEquals(array($child, $parent, $grandparent), $map['GrandParentCBundle']);
+ $this->assertEquals(array($child, $parent), $map['ParentCBundle']);
+ $this->assertEquals(array($child), $map['ChildCBundle']);
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage Bundle "ParentCBundle" is directly extended by two bundles "ChildC2Bundle" and "ChildC1Bundle".
+ */
+ public function testInitializeBundlesThrowsExceptionWhenABundleIsDirectlyExtendedByTwoBundles()
+ {
+ $parent = $this->getBundle(null, null, 'ParentCBundle');
+ $child1 = $this->getBundle(null, 'ParentCBundle', 'ChildC1Bundle');
+ $child2 = $this->getBundle(null, 'ParentCBundle', 'ChildC2Bundle');
+
+ $kernel = $this->getKernel(array(), array($parent, $child1, $child2));
+ $kernel->boot();
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage Trying to register two bundles with the same name "DuplicateName"
+ */
+ public function testInitializeBundleThrowsExceptionWhenRegisteringTwoBundlesWithTheSameName()
+ {
+ $fooBundle = $this->getBundle(null, null, 'FooBundle', 'DuplicateName');
+ $barBundle = $this->getBundle(null, null, 'BarBundle', 'DuplicateName');
+
+ $kernel = $this->getKernel(array(), array($fooBundle, $barBundle));
+ $kernel->boot();
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage Bundle "CircularRefBundle" can not extend itself.
+ */
+ public function testInitializeBundleThrowsExceptionWhenABundleExtendsItself()
+ {
+ $circularRef = $this->getBundle(null, 'CircularRefBundle', 'CircularRefBundle');
+
+ $kernel = $this->getKernel(array(), array($circularRef));
+ $kernel->boot();
+ }
+
+ public function testTerminateReturnsSilentlyIfKernelIsNotBooted()
+ {
+ $kernel = $this->getKernel(array('getHttpKernel'));
+ $kernel->expects($this->never())
+ ->method('getHttpKernel');
+
+ $kernel->terminate(Request::create('/'), new Response());
+ }
+
+ public function testTerminateDelegatesTerminationOnlyForTerminableInterface()
+ {
+ // does not implement TerminableInterface
+ $httpKernel = new TestKernel();
+
+ $kernel = $this->getKernel(array('getHttpKernel'));
+ $kernel->expects($this->once())
+ ->method('getHttpKernel')
+ ->willReturn($httpKernel);
+
+ $kernel->boot();
+ $kernel->terminate(Request::create('/'), new Response());
+
+ $this->assertFalse($httpKernel->terminateCalled, 'terminate() is never called if the kernel class does not implement TerminableInterface');
+
+ // implements TerminableInterface
+ $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernel')
+ ->disableOriginalConstructor()
+ ->setMethods(array('terminate'))
+ ->getMock();
+
+ $httpKernelMock
+ ->expects($this->once())
+ ->method('terminate');
+
+ $kernel = $this->getKernel(array('getHttpKernel'));
+ $kernel->expects($this->exactly(2))
+ ->method('getHttpKernel')
+ ->will($this->returnValue($httpKernelMock));
+
+ $kernel->boot();
+ $kernel->terminate(Request::create('/'), new Response());
+ }
+
+ public function testKernelWithoutBundles()
+ {
+ $kernel = new KernelWithoutBundles('test', true);
+ $kernel->boot();
+
+ $this->assertTrue($kernel->getContainer()->getParameter('test_executed'));
+ }
+
+ public function testKernelRootDirNameStartingWithANumber()
+ {
+ $dir = __DIR__.'/Fixtures/123';
+ require_once $dir.'/Kernel123.php';
+ $kernel = new \Symfony\Component\HttpKernel\Tests\Fixtures\_123\Kernel123('dev', true);
+ $this->assertEquals('_123', $kernel->getName());
+ }
+
+ /**
+ * @group legacy
+ * @expectedDeprecation The Symfony\Component\HttpKernel\Kernel::getEnvParameters() method is deprecated as of 3.3 and will be removed in 4.0. Use the %cenv()%c syntax to get the value of any environment variable from configuration files instead.
+ * @expectedDeprecation The support of special environment variables that start with SYMFONY__ (such as "SYMFONY__FOO__BAR") is deprecated as of 3.3 and will be removed in 4.0. Use the %cenv()%c syntax instead to get the value of environment variables in configuration files.
+ */
+ public function testSymfonyEnvironmentVariables()
+ {
+ $_SERVER['SYMFONY__FOO__BAR'] = 'baz';
+
+ $kernel = $this->getKernel();
+ $method = new \ReflectionMethod($kernel, 'getEnvParameters');
+ $method->setAccessible(true);
+
+ $envParameters = $method->invoke($kernel);
+ $this->assertSame('baz', $envParameters['foo.bar']);
+
+ unset($_SERVER['SYMFONY__FOO__BAR']);
+ }
+
+ public function testProjectDirExtension()
+ {
+ $kernel = new CustomProjectDirKernel('test', true);
+ $kernel->boot();
+
+ $this->assertSame('foo', $kernel->getProjectDir());
+ $this->assertSame('foo', $kernel->getContainer()->getParameter('kernel.project_dir'));
+ }
+
+ /**
+ * Returns a mock for the BundleInterface.
+ *
+ * @return BundleInterface
+ */
+ protected function getBundle($dir = null, $parent = null, $className = null, $bundleName = null)
+ {
+ $bundle = $this
+ ->getMockBuilder('Symfony\Component\HttpKernel\Bundle\BundleInterface')
+ ->setMethods(array('getPath', 'getParent', 'getName'))
+ ->disableOriginalConstructor()
+ ;
+
+ if ($className) {
+ $bundle->setMockClassName($className);
+ }
+
+ $bundle = $bundle->getMockForAbstractClass();
+
+ $bundle
+ ->expects($this->any())
+ ->method('getName')
+ ->will($this->returnValue(null === $bundleName ? get_class($bundle) : $bundleName))
+ ;
+
+ $bundle
+ ->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue($dir))
+ ;
+
+ $bundle
+ ->expects($this->any())
+ ->method('getParent')
+ ->will($this->returnValue($parent))
+ ;
+
+ return $bundle;
+ }
+
+ /**
+ * Returns a mock for the abstract kernel.
+ *
+ * @param array $methods Additional methods to mock (besides the abstract ones)
+ * @param array $bundles Bundles to register
+ *
+ * @return Kernel
+ */
+ protected function getKernel(array $methods = array(), array $bundles = array())
+ {
+ $methods[] = 'registerBundles';
+
+ $kernel = $this
+ ->getMockBuilder('Symfony\Component\HttpKernel\Kernel')
+ ->setMethods($methods)
+ ->setConstructorArgs(array('test', false))
+ ->getMockForAbstractClass()
+ ;
+ $kernel->expects($this->any())
+ ->method('registerBundles')
+ ->will($this->returnValue($bundles))
+ ;
+ $p = new \ReflectionProperty($kernel, 'rootDir');
+ $p->setAccessible(true);
+ $p->setValue($kernel, __DIR__.'/Fixtures');
+
+ return $kernel;
+ }
+
+ protected function getKernelForTest(array $methods = array())
+ {
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest')
+ ->setConstructorArgs(array('test', false))
+ ->setMethods($methods)
+ ->getMock();
+ $p = new \ReflectionProperty($kernel, 'rootDir');
+ $p->setAccessible(true);
+ $p->setValue($kernel, __DIR__.'/Fixtures');
+
+ return $kernel;
+ }
+}
+
+class TestKernel implements HttpKernelInterface
+{
+ public $terminateCalled = false;
+
+ public function terminate()
+ {
+ $this->terminateCalled = true;
+ }
+
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
+ {
+ }
+}
+
+class CustomProjectDirKernel extends Kernel
+{
+ private $baseDir;
+
+ public function __construct()
+ {
+ parent::__construct('test', false);
+
+ $this->baseDir = 'foo';
+ }
+
+ public function registerBundles()
+ {
+ return array();
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ }
+
+ public function getProjectDir()
+ {
+ return $this->baseDir;
+ }
+
+ public function getRootDir()
+ {
+ return __DIR__.'/Fixtures';
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Logger.php b/vendor/symfony/http-kernel/Tests/Logger.php
new file mode 100644
index 0000000000..63c70bf67a
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Logger.php
@@ -0,0 +1,88 @@
+<?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;
+
+use Psr\Log\LoggerInterface;
+
+class Logger implements LoggerInterface
+{
+ protected $logs;
+
+ public function __construct()
+ {
+ $this->clear();
+ }
+
+ public function getLogs($level = false)
+ {
+ return false === $level ? $this->logs : $this->logs[$level];
+ }
+
+ public function clear()
+ {
+ $this->logs = array(
+ 'emergency' => array(),
+ 'alert' => array(),
+ 'critical' => array(),
+ 'error' => array(),
+ 'warning' => array(),
+ 'notice' => array(),
+ 'info' => array(),
+ 'debug' => array(),
+ );
+ }
+
+ public function log($level, $message, array $context = array())
+ {
+ $this->logs[$level][] = $message;
+ }
+
+ public function emergency($message, array $context = array())
+ {
+ $this->log('emergency', $message, $context);
+ }
+
+ public function alert($message, array $context = array())
+ {
+ $this->log('alert', $message, $context);
+ }
+
+ public function critical($message, array $context = array())
+ {
+ $this->log('critical', $message, $context);
+ }
+
+ public function error($message, array $context = array())
+ {
+ $this->log('error', $message, $context);
+ }
+
+ public function warning($message, array $context = array())
+ {
+ $this->log('warning', $message, $context);
+ }
+
+ public function notice($message, array $context = array())
+ {
+ $this->log('notice', $message, $context);
+ }
+
+ public function info($message, array $context = array())
+ {
+ $this->log('info', $message, $context);
+ }
+
+ public function debug($message, array $context = array())
+ {
+ $this->log('debug', $message, $context);
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php b/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php
new file mode 100644
index 0000000000..99ff207567
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Profiler/FileProfilerStorageTest.php
@@ -0,0 +1,350 @@
+<?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\Profiler;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\Profiler\FileProfilerStorage;
+use Symfony\Component\HttpKernel\Profiler\Profile;
+
+class FileProfilerStorageTest extends TestCase
+{
+ private $tmpDir;
+ private $storage;
+
+ protected function setUp()
+ {
+ $this->tmpDir = sys_get_temp_dir().'/sf2_profiler_file_storage';
+ if (is_dir($this->tmpDir)) {
+ self::cleanDir();
+ }
+ $this->storage = new FileProfilerStorage('file:'.$this->tmpDir);
+ $this->storage->purge();
+ }
+
+ protected function tearDown()
+ {
+ self::cleanDir();
+ }
+
+ public function testStore()
+ {
+ for ($i = 0; $i < 10; ++$i) {
+ $profile = new Profile('token_'.$i);
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+ }
+ $this->assertCount(10, $this->storage->find('127.0.0.1', 'http://foo.bar', 20, 'GET'), '->write() stores data in the storage');
+ }
+
+ public function testChildren()
+ {
+ $parentProfile = new Profile('token_parent');
+ $parentProfile->setIp('127.0.0.1');
+ $parentProfile->setUrl('http://foo.bar/parent');
+
+ $childProfile = new Profile('token_child');
+ $childProfile->setIp('127.0.0.1');
+ $childProfile->setUrl('http://foo.bar/child');
+
+ $parentProfile->addChild($childProfile);
+
+ $this->storage->write($parentProfile);
+ $this->storage->write($childProfile);
+
+ // Load them from storage
+ $parentProfile = $this->storage->read('token_parent');
+ $childProfile = $this->storage->read('token_child');
+
+ // Check child has link to parent
+ $this->assertNotNull($childProfile->getParent());
+ $this->assertEquals($parentProfile->getToken(), $childProfile->getParentToken());
+
+ // Check parent has child
+ $children = $parentProfile->getChildren();
+ $this->assertCount(1, $children);
+ $this->assertEquals($childProfile->getToken(), $children[0]->getToken());
+ }
+
+ public function testStoreSpecialCharsInUrl()
+ {
+ // The storage accepts special characters in URLs (Even though URLs are not
+ // supposed to contain them)
+ $profile = new Profile('simple_quote');
+ $profile->setUrl('http://foo.bar/\'');
+ $this->storage->write($profile);
+ $this->assertTrue(false !== $this->storage->read('simple_quote'), '->write() accepts single quotes in URL');
+
+ $profile = new Profile('double_quote');
+ $profile->setUrl('http://foo.bar/"');
+ $this->storage->write($profile);
+ $this->assertTrue(false !== $this->storage->read('double_quote'), '->write() accepts double quotes in URL');
+
+ $profile = new Profile('backslash');
+ $profile->setUrl('http://foo.bar/\\');
+ $this->storage->write($profile);
+ $this->assertTrue(false !== $this->storage->read('backslash'), '->write() accepts backslash in URL');
+
+ $profile = new Profile('comma');
+ $profile->setUrl('http://foo.bar/,');
+ $this->storage->write($profile);
+ $this->assertTrue(false !== $this->storage->read('comma'), '->write() accepts comma in URL');
+ }
+
+ public function testStoreDuplicateToken()
+ {
+ $profile = new Profile('token');
+ $profile->setUrl('http://example.com/');
+
+ $this->assertTrue($this->storage->write($profile), '->write() returns true when the token is unique');
+
+ $profile->setUrl('http://example.net/');
+
+ $this->assertTrue($this->storage->write($profile), '->write() returns true when the token is already present in the storage');
+ $this->assertEquals('http://example.net/', $this->storage->read('token')->getUrl(), '->write() overwrites the current profile data');
+
+ $this->assertCount(1, $this->storage->find('', '', 1000, ''), '->find() does not return the same profile twice');
+ }
+
+ public function testRetrieveByIp()
+ {
+ $profile = new Profile('token');
+ $profile->setIp('127.0.0.1');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $this->assertCount(1, $this->storage->find('127.0.0.1', '', 10, 'GET'), '->find() retrieve a record by IP');
+ $this->assertCount(0, $this->storage->find('127.0.%.1', '', 10, 'GET'), '->find() does not interpret a "%" as a wildcard in the IP');
+ $this->assertCount(0, $this->storage->find('127.0._.1', '', 10, 'GET'), '->find() does not interpret a "_" as a wildcard in the IP');
+ }
+
+ public function testRetrieveByStatusCode()
+ {
+ $profile200 = new Profile('statuscode200');
+ $profile200->setStatusCode(200);
+ $this->storage->write($profile200);
+
+ $profile404 = new Profile('statuscode404');
+ $profile404->setStatusCode(404);
+ $this->storage->write($profile404);
+
+ $this->assertCount(1, $this->storage->find(null, null, 10, null, null, null, '200'), '->find() retrieve a record by Status code 200');
+ $this->assertCount(1, $this->storage->find(null, null, 10, null, null, null, '404'), '->find() retrieve a record by Status code 404');
+ }
+
+ public function testRetrieveByUrl()
+ {
+ $profile = new Profile('simple_quote');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar/\'');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $profile = new Profile('double_quote');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar/"');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $profile = new Profile('backslash');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo\\bar/');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $profile = new Profile('percent');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar/%');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $profile = new Profile('underscore');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar/_');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $profile = new Profile('semicolon');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar/;');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/\'', 10, 'GET'), '->find() accepts single quotes in URLs');
+ $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/"', 10, 'GET'), '->find() accepts double quotes in URLs');
+ $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo\\bar/', 10, 'GET'), '->find() accepts backslash in URLs');
+ $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/;', 10, 'GET'), '->find() accepts semicolon in URLs');
+ $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/%', 10, 'GET'), '->find() does not interpret a "%" as a wildcard in the URL');
+ $this->assertCount(1, $this->storage->find('127.0.0.1', 'http://foo.bar/_', 10, 'GET'), '->find() does not interpret a "_" as a wildcard in the URL');
+ }
+
+ public function testStoreTime()
+ {
+ $dt = new \DateTime('now');
+ $start = $dt->getTimestamp();
+
+ for ($i = 0; $i < 3; ++$i) {
+ $dt->modify('+1 minute');
+ $profile = new Profile('time_'.$i);
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://foo.bar');
+ $profile->setTime($dt->getTimestamp());
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+ }
+
+ $records = $this->storage->find('', '', 3, 'GET', $start, time() + 3 * 60);
+ $this->assertCount(3, $records, '->find() returns all previously added records');
+ $this->assertEquals($records[0]['token'], 'time_2', '->find() returns records ordered by time in descendant order');
+ $this->assertEquals($records[1]['token'], 'time_1', '->find() returns records ordered by time in descendant order');
+ $this->assertEquals($records[2]['token'], 'time_0', '->find() returns records ordered by time in descendant order');
+
+ $records = $this->storage->find('', '', 3, 'GET', $start, time() + 2 * 60);
+ $this->assertCount(2, $records, '->find() should return only first two of the previously added records');
+ }
+
+ public function testRetrieveByEmptyUrlAndIp()
+ {
+ for ($i = 0; $i < 5; ++$i) {
+ $profile = new Profile('token_'.$i);
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+ }
+ $this->assertCount(5, $this->storage->find('', '', 10, 'GET'), '->find() returns all previously added records');
+ $this->storage->purge();
+ }
+
+ public function testRetrieveByMethodAndLimit()
+ {
+ foreach (array('POST', 'GET') as $method) {
+ for ($i = 0; $i < 5; ++$i) {
+ $profile = new Profile('token_'.$i.$method);
+ $profile->setMethod($method);
+ $this->storage->write($profile);
+ }
+ }
+
+ $this->assertCount(5, $this->storage->find('', '', 5, 'POST'));
+
+ $this->storage->purge();
+ }
+
+ public function testPurge()
+ {
+ $profile = new Profile('token1');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://example.com/');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $this->assertTrue(false !== $this->storage->read('token1'));
+ $this->assertCount(1, $this->storage->find('127.0.0.1', '', 10, 'GET'));
+
+ $profile = new Profile('token2');
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://example.net/');
+ $profile->setMethod('GET');
+ $this->storage->write($profile);
+
+ $this->assertTrue(false !== $this->storage->read('token2'));
+ $this->assertCount(2, $this->storage->find('127.0.0.1', '', 10, 'GET'));
+
+ $this->storage->purge();
+
+ $this->assertEmpty($this->storage->read('token'), '->purge() removes all data stored by profiler');
+ $this->assertCount(0, $this->storage->find('127.0.0.1', '', 10, 'GET'), '->purge() removes all items from index');
+ }
+
+ public function testDuplicates()
+ {
+ for ($i = 1; $i <= 5; ++$i) {
+ $profile = new Profile('foo'.$i);
+ $profile->setIp('127.0.0.1');
+ $profile->setUrl('http://example.net/');
+ $profile->setMethod('GET');
+
+ ///three duplicates
+ $this->storage->write($profile);
+ $this->storage->write($profile);
+ $this->storage->write($profile);
+ }
+ $this->assertCount(3, $this->storage->find('127.0.0.1', 'http://example.net/', 3, 'GET'), '->find() method returns incorrect number of entries');
+ }
+
+ public function testStatusCode()
+ {
+ $profile = new Profile('token1');
+ $profile->setStatusCode(200);
+ $this->storage->write($profile);
+
+ $profile = new Profile('token2');
+ $profile->setStatusCode(404);
+ $this->storage->write($profile);
+
+ $tokens = $this->storage->find('', '', 10, '');
+ $this->assertCount(2, $tokens);
+ $this->assertContains($tokens[0]['status_code'], array(200, 404));
+ $this->assertContains($tokens[1]['status_code'], array(200, 404));
+ }
+
+ public function testMultiRowIndexFile()
+ {
+ $iteration = 3;
+ for ($i = 0; $i < $iteration; ++$i) {
+ $profile = new Profile('token'.$i);
+ $profile->setIp('127.0.0.'.$i);
+ $profile->setUrl('http://foo.bar/'.$i);
+
+ $this->storage->write($profile);
+ $this->storage->write($profile);
+ $this->storage->write($profile);
+ }
+
+ $handle = fopen($this->tmpDir.'/index.csv', 'r');
+ for ($i = 0; $i < $iteration; ++$i) {
+ $row = fgetcsv($handle);
+ $this->assertEquals('token'.$i, $row[0]);
+ $this->assertEquals('127.0.0.'.$i, $row[1]);
+ $this->assertEquals('http://foo.bar/'.$i, $row[3]);
+ }
+ $this->assertFalse(fgetcsv($handle));
+ }
+
+ public function testReadLineFromFile()
+ {
+ $r = new \ReflectionMethod($this->storage, 'readLineFromFile');
+
+ $r->setAccessible(true);
+
+ $h = tmpfile();
+
+ fwrite($h, "line1\n\n\nline2\n");
+ fseek($h, 0, SEEK_END);
+
+ $this->assertEquals('line2', $r->invoke($this->storage, $h));
+ $this->assertEquals('line1', $r->invoke($this->storage, $h));
+ }
+
+ protected function cleanDir()
+ {
+ $flags = \FilesystemIterator::SKIP_DOTS;
+ $iterator = new \RecursiveDirectoryIterator($this->tmpDir, $flags);
+ $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
+
+ foreach ($iterator as $file) {
+ if (is_file($file)) {
+ unlink($file);
+ }
+ }
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php b/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php
new file mode 100644
index 0000000000..1a6f54636a
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/Profiler/ProfilerTest.php
@@ -0,0 +1,91 @@
+<?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\Profiler;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;
+use Symfony\Component\HttpKernel\Profiler\FileProfilerStorage;
+use Symfony\Component\HttpKernel\Profiler\Profiler;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class ProfilerTest extends TestCase
+{
+ private $tmp;
+ private $storage;
+
+ public function testCollect()
+ {
+ $request = new Request();
+ $request->query->set('foo', 'bar');
+ $response = new Response('', 204);
+ $collector = new RequestDataCollector();
+
+ $profiler = new Profiler($this->storage);
+ $profiler->add($collector);
+ $profile = $profiler->collect($request, $response);
+ $profiler->saveProfile($profile);
+
+ $this->assertSame(204, $profile->getStatusCode());
+ $this->assertSame('GET', $profile->getMethod());
+ $this->assertSame('bar', $profile->getCollector('request')->getRequestQuery()->all()['foo']->getValue());
+ }
+
+ public function testFindWorksWithDates()
+ {
+ $profiler = new Profiler($this->storage);
+
+ $this->assertCount(0, $profiler->find(null, null, null, null, '7th April 2014', '9th April 2014'));
+ }
+
+ public function testFindWorksWithTimestamps()
+ {
+ $profiler = new Profiler($this->storage);
+
+ $this->assertCount(0, $profiler->find(null, null, null, null, '1396828800', '1397001600'));
+ }
+
+ public function testFindWorksWithInvalidDates()
+ {
+ $profiler = new Profiler($this->storage);
+
+ $this->assertCount(0, $profiler->find(null, null, null, null, 'some string', ''));
+ }
+
+ public function testFindWorksWithStatusCode()
+ {
+ $profiler = new Profiler($this->storage);
+
+ $this->assertCount(0, $profiler->find(null, null, null, null, null, null, '204'));
+ }
+
+ protected function setUp()
+ {
+ $this->tmp = tempnam(sys_get_temp_dir(), 'sf2_profiler');
+ if (file_exists($this->tmp)) {
+ @unlink($this->tmp);
+ }
+
+ $this->storage = new FileProfilerStorage('file:'.$this->tmp);
+ $this->storage->purge();
+ }
+
+ protected function tearDown()
+ {
+ if (null !== $this->storage) {
+ $this->storage->purge();
+ $this->storage = null;
+
+ @unlink($this->tmp);
+ }
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/TestHttpKernel.php b/vendor/symfony/http-kernel/Tests/TestHttpKernel.php
new file mode 100644
index 0000000000..3ec5927254
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/TestHttpKernel.php
@@ -0,0 +1,42 @@
+<?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;
+
+use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
+use Symfony\Component\HttpKernel\HttpKernel;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+
+class TestHttpKernel extends HttpKernel implements ControllerResolverInterface, ArgumentResolverInterface
+{
+ public function __construct()
+ {
+ parent::__construct(new EventDispatcher(), $this, null, $this);
+ }
+
+ public function getController(Request $request)
+ {
+ return array($this, 'callController');
+ }
+
+ public function getArguments(Request $request, $controller)
+ {
+ return array($request);
+ }
+
+ public function callController(Request $request)
+ {
+ return new Response('Request: '.$request->getRequestUri());
+ }
+}
diff --git a/vendor/symfony/http-kernel/Tests/UriSignerTest.php b/vendor/symfony/http-kernel/Tests/UriSignerTest.php
new file mode 100644
index 0000000000..253a4c91bd
--- /dev/null
+++ b/vendor/symfony/http-kernel/Tests/UriSignerTest.php
@@ -0,0 +1,64 @@
+<?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;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpKernel\UriSigner;
+
+class UriSignerTest extends TestCase
+{
+ public function testSign()
+ {
+ $signer = new UriSigner('foobar');
+
+ $this->assertContains('?_hash=', $signer->sign('http://example.com/foo'));
+ $this->assertContains('&_hash=', $signer->sign('http://example.com/foo?foo=bar'));
+ }
+
+ public function testCheck()
+ {
+ $signer = new UriSigner('foobar');
+
+ $this->assertFalse($signer->check('http://example.com/foo?_hash=foo'));
+ $this->assertFalse($signer->check('http://example.com/foo?foo=bar&_hash=foo'));
+ $this->assertFalse($signer->check('http://example.com/foo?foo=bar&_hash=foo&bar=foo'));
+
+ $this->assertTrue($signer->check($signer->sign('http://example.com/foo')));
+ $this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar')));
+ $this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar&0=integer')));
+
+ $this->assertTrue($signer->sign('http://example.com/foo?foo=bar&bar=foo') === $signer->sign('http://example.com/foo?bar=foo&foo=bar'));
+ }
+
+ public function testCheckWithDifferentArgSeparator()
+ {
+ $this->iniSet('arg_separator.output', '&amp;');
+ $signer = new UriSigner('foobar');
+
+ $this->assertSame(
+ 'http://example.com/foo?baz=bay&foo=bar&_hash=rIOcC%2FF3DoEGo%2FvnESjSp7uU9zA9S%2F%2BOLhxgMexoPUM%3D',
+ $signer->sign('http://example.com/foo?foo=bar&baz=bay')
+ );
+ $this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar&baz=bay')));
+ }
+
+ public function testCheckWithDifferentParameter()
+ {
+ $signer = new UriSigner('foobar', 'qux');
+
+ $this->assertSame(
+ 'http://example.com/foo?baz=bay&foo=bar&qux=rIOcC%2FF3DoEGo%2FvnESjSp7uU9zA9S%2F%2BOLhxgMexoPUM%3D',
+ $signer->sign('http://example.com/foo?foo=bar&baz=bay')
+ );
+ $this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar&baz=bay')));
+ }
+}