123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?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\Bundle\FrameworkBundle\Test;
- use PHPUnit\Framework\TestCase;
- use Symfony\Component\DependencyInjection\ResettableContainerInterface;
- use Symfony\Component\Finder\Finder;
- use Symfony\Component\HttpKernel\KernelInterface;
- /**
- * KernelTestCase is the base class for tests needing a Kernel.
- *
- * @author Fabien Potencier <fabien@symfony.com>
- */
- abstract class KernelTestCase extends TestCase
- {
- protected static $class;
- /**
- * @var KernelInterface
- */
- protected static $kernel;
- /**
- * Finds the directory where the phpunit.xml(.dist) is stored.
- *
- * If you run tests with the PHPUnit CLI tool, everything will work as expected.
- * If not, override this method in your test classes.
- *
- * @return string The directory where phpunit.xml(.dist) is stored
- *
- * @throws \RuntimeException
- */
- protected static function getPhpUnitXmlDir()
- {
- if (!isset($_SERVER['argv']) || false === strpos($_SERVER['argv'][0], 'phpunit')) {
- throw new \RuntimeException('You must override the KernelTestCase::createKernel() method.');
- }
- $dir = static::getPhpUnitCliConfigArgument();
- if (null === $dir &&
- (is_file(getcwd().\DIRECTORY_SEPARATOR.'phpunit.xml') ||
- is_file(getcwd().\DIRECTORY_SEPARATOR.'phpunit.xml.dist'))) {
- $dir = getcwd();
- }
- // Can't continue
- if (null === $dir) {
- throw new \RuntimeException('Unable to guess the Kernel directory.');
- }
- if (!is_dir($dir)) {
- $dir = \dirname($dir);
- }
- return $dir;
- }
- /**
- * Finds the value of the CLI configuration option.
- *
- * PHPUnit will use the last configuration argument on the command line, so this only returns
- * the last configuration argument.
- *
- * @return string The value of the PHPUnit CLI configuration option
- */
- private static function getPhpUnitCliConfigArgument()
- {
- $dir = null;
- $reversedArgs = array_reverse($_SERVER['argv']);
- foreach ($reversedArgs as $argIndex => $testArg) {
- if (preg_match('/^-[^ \-]*c$/', $testArg) || '--configuration' === $testArg) {
- $dir = realpath($reversedArgs[$argIndex - 1]);
- break;
- } elseif (0 === strpos($testArg, '--configuration=')) {
- $argPath = substr($testArg, \strlen('--configuration='));
- $dir = realpath($argPath);
- break;
- } elseif (0 === strpos($testArg, '-c')) {
- $argPath = substr($testArg, \strlen('-c'));
- $dir = realpath($argPath);
- break;
- }
- }
- return $dir;
- }
- /**
- * Attempts to guess the kernel location.
- *
- * When the Kernel is located, the file is required.
- *
- * @return string The Kernel class name
- *
- * @throws \RuntimeException
- */
- protected static function getKernelClass()
- {
- if (isset($_SERVER['KERNEL_DIR']) || isset($_ENV['KERNEL_DIR'])) {
- $dir = isset($_SERVER['KERNEL_DIR']) ? $_SERVER['KERNEL_DIR'] : $_ENV['KERNEL_DIR'];
- if (!is_dir($dir)) {
- $phpUnitDir = static::getPhpUnitXmlDir();
- if (is_dir("$phpUnitDir/$dir")) {
- $dir = "$phpUnitDir/$dir";
- }
- }
- } else {
- $dir = static::getPhpUnitXmlDir();
- }
- $finder = new Finder();
- $finder->name('*Kernel.php')->depth(0)->in($dir);
- $results = iterator_to_array($finder);
- if (!\count($results)) {
- throw new \RuntimeException('Either set KERNEL_DIR in your phpunit.xml according to https://symfony.com/doc/current/book/testing.html#your-first-functional-test or override the WebTestCase::createKernel() method.');
- }
- $file = current($results);
- $class = $file->getBasename('.php');
- require_once $file;
- return $class;
- }
- /**
- * Boots the Kernel for this test.
- */
- protected static function bootKernel(array $options = array())
- {
- static::ensureKernelShutdown();
- static::$kernel = static::createKernel($options);
- static::$kernel->boot();
- }
- /**
- * Creates a Kernel.
- *
- * Available options:
- *
- * * environment
- * * debug
- *
- * @return KernelInterface A KernelInterface instance
- */
- protected static function createKernel(array $options = array())
- {
- if (null === static::$class) {
- static::$class = static::getKernelClass();
- }
- return new static::$class(
- isset($options['environment']) ? $options['environment'] : 'test',
- isset($options['debug']) ? $options['debug'] : true
- );
- }
- /**
- * Shuts the kernel down if it was used in the test.
- */
- protected static function ensureKernelShutdown()
- {
- if (null !== static::$kernel) {
- $container = static::$kernel->getContainer();
- static::$kernel->shutdown();
- if ($container instanceof ResettableContainerInterface) {
- $container->reset();
- }
- }
- }
- /**
- * Clean up Kernel usage in this test.
- */
- protected function tearDown()
- {
- static::ensureKernelShutdown();
- }
- }
|