Permalink
Cannot retrieve contributors at this time
<?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\ContainerInterface; | |
use Symfony\Component\HttpKernel\KernelInterface; | |
use Symfony\Contracts\Service\ResetInterface; | |
/** | |
* KernelTestCase is the base class for tests needing a Kernel. | |
* | |
* @author Fabien Potencier <fabien@symfony.com> | |
*/ | |
abstract class KernelTestCase extends TestCase | |
{ | |
use MailerAssertionsTrait; | |
protected static $class; | |
/** | |
* @var KernelInterface | |
*/ | |
protected static $kernel; | |
/** | |
* @var ContainerInterface | |
*/ | |
protected static $container; | |
protected static $booted = false; | |
private static $kernelContainer; | |
protected function tearDown(): void | |
{ | |
static::ensureKernelShutdown(); | |
static::$kernel = null; | |
static::$booted = false; | |
} | |
/** | |
* @return string The Kernel class name | |
* | |
* @throws \RuntimeException | |
* @throws \LogicException | |
*/ | |
protected static function getKernelClass() | |
{ | |
if (!isset($_SERVER['KERNEL_CLASS']) && !isset($_ENV['KERNEL_CLASS'])) { | |
throw new \LogicException(sprintf('You must set the KERNEL_CLASS environment variable to the fully-qualified class name of your Kernel in phpunit.xml / phpunit.xml.dist or override the "%1$s::createKernel()" or "%1$s::getKernelClass()" method.', static::class)); | |
} | |
if (!class_exists($class = $_ENV['KERNEL_CLASS'] ?? $_SERVER['KERNEL_CLASS'])) { | |
throw new \RuntimeException(sprintf('Class "%s" doesn\'t exist or cannot be autoloaded. Check that the KERNEL_CLASS value in phpunit.xml matches the fully-qualified class name of your Kernel or override the "%s::createKernel()" method.', $class, static::class)); | |
} | |
return $class; | |
} | |
/** | |
* Boots the Kernel for this test. | |
* | |
* @return KernelInterface A KernelInterface instance | |
*/ | |
protected static function bootKernel(array $options = []) | |
{ | |
static::ensureKernelShutdown(); | |
static::$kernel = static::createKernel($options); | |
static::$kernel->boot(); | |
static::$booted = true; | |
self::$kernelContainer = $container = static::$kernel->getContainer(); | |
static::$container = $container->has('test.service_container') ? $container->get('test.service_container') : $container; | |
return static::$kernel; | |
} | |
/** | |
* Creates a Kernel. | |
* | |
* Available options: | |
* | |
* * environment | |
* * debug | |
* | |
* @return KernelInterface A KernelInterface instance | |
*/ | |
protected static function createKernel(array $options = []) | |
{ | |
if (null === static::$class) { | |
static::$class = static::getKernelClass(); | |
} | |
if (isset($options['environment'])) { | |
$env = $options['environment']; | |
} elseif (isset($_ENV['APP_ENV'])) { | |
$env = $_ENV['APP_ENV']; | |
} elseif (isset($_SERVER['APP_ENV'])) { | |
$env = $_SERVER['APP_ENV']; | |
} else { | |
$env = 'test'; | |
} | |
if (isset($options['debug'])) { | |
$debug = $options['debug']; | |
} elseif (isset($_ENV['APP_DEBUG'])) { | |
$debug = $_ENV['APP_DEBUG']; | |
} elseif (isset($_SERVER['APP_DEBUG'])) { | |
$debug = $_SERVER['APP_DEBUG']; | |
} else { | |
$debug = true; | |
} | |
return new static::$class($env, $debug); | |
} | |
/** | |
* Shuts the kernel down if it was used in the test - called by the tearDown method by default. | |
*/ | |
protected static function ensureKernelShutdown() | |
{ | |
if (null !== static::$kernel) { | |
static::$kernel->shutdown(); | |
static::$booted = false; | |
} | |
if (self::$kernelContainer instanceof ResetInterface) { | |
self::$kernelContainer->reset(); | |
} | |
static::$container = self::$kernelContainer = null; | |
} | |
} |