View source
<?php
namespace Drupal\KernelTests\Core\DrupalKernel;
use Composer\Autoload\ClassLoader;
use Drupal\Core\DrupalKernel;
use Drupal\Core\DrupalKernelInterface;
use Drupal\KernelTests\KernelTestBase;
use org\bovigo\vfs\vfsStream;
use Prophecy\Argument;
use Symfony\Component\HttpFoundation\Request;
class DrupalKernelTest extends KernelTestBase {
protected function setUp() : void {
$this->root = static::getDrupalRoot();
$this
->bootEnvironment();
}
protected function getTestKernel(Request $request, array $modules_enabled = NULL) {
$class_loader = (require $this->root . '/autoload.php');
$kernel = DrupalKernel::createFromRequest($request, $class_loader, 'testing');
$this
->setSetting('container_yamls', []);
$this
->setSetting('hash_salt', $this->databasePrefix);
if (isset($modules_enabled)) {
$kernel
->updateModules($modules_enabled);
}
$kernel
->boot();
return $kernel;
}
public function testCompileDIC() {
$modules_enabled = [
'system' => 'system',
'user' => 'user',
];
$request = Request::createFromGlobals();
$this
->getTestKernel($request, $modules_enabled);
$kernel = $this
->getTestKernel($request);
$container = $kernel
->getContainer();
$refClass = new \ReflectionClass($container);
$is_compiled_container = !$refClass
->isSubclassOf('Symfony\\Component\\DependencyInjection\\ContainerBuilder');
$this
->assertTrue($is_compiled_container);
$module_list = array_keys($container
->get('module_handler')
->getModuleList());
$this
->assertEquals(array_values($modules_enabled), $module_list);
$container = $this
->getTestKernel($request, NULL)
->getContainer();
$refClass = new \ReflectionClass($container);
$is_compiled_container = !$refClass
->isSubclassOf('Symfony\\Component\\DependencyInjection\\ContainerBuilder');
$this
->assertTrue($is_compiled_container);
$module_list = array_keys($container
->get('module_handler')
->getModuleList());
$this
->assertEquals(array_values($modules_enabled), $module_list);
$class_loader = $container
->get('class_loader');
$refClass = new \ReflectionClass($class_loader);
$this
->assertTrue($refClass
->hasMethod('loadClass'), 'Container has a class loader');
$this
->assertFalse($container
->has('service_provider_test_class'));
$modules_enabled['service_provider_test'] = 'service_provider_test';
$this
->getTestKernel($request, $modules_enabled);
$kernel = $this
->getTestKernel($request, $modules_enabled);
$container = $kernel
->getContainer();
$refClass = new \ReflectionClass($container);
$is_container_builder = $refClass
->isSubclassOf('Symfony\\Component\\DependencyInjection\\ContainerBuilder');
$this
->assertFalse($is_container_builder, 'Container is not a builder');
$this
->assertTrue($container
->has('service_provider_test_class'), 'Container has test service');
$class_loader = $container
->get('class_loader');
$refClass = new \ReflectionClass($class_loader);
$this
->assertTrue($refClass
->hasMethod('loadClass'), 'Container has a class loader');
$modules = $container
->getParameter('container.modules');
$module_extension_list = $container
->get('extension.list.module');
$this
->assertEquals([
'type' => 'module',
'pathname' => $module_extension_list
->getPathname('service_provider_test'),
'filename' => NULL,
], $modules['service_provider_test']);
$persist_ids = $container
->getParameter('persist_ids');
$this
->assertNotContains('service_container', $persist_ids);
}
public function testRepeatedBootWithDifferentEnvironment() {
$request = Request::createFromGlobals();
$class_loader = (require $this->root . '/autoload.php');
$environments = [
'testing1',
'testing1',
'testing2',
'testing2',
];
foreach ($environments as $environment) {
$kernel = DrupalKernel::createFromRequest($request, $class_loader, $environment);
$this
->setSetting('container_yamls', []);
$this
->setSetting('hash_salt', $this->databasePrefix);
$this
->assertInstanceOf(DrupalKernelInterface::class, $kernel
->boot(), "Environment {$environment} should boot.");
}
}
public function testPreventChangeOfSitePath() {
$modules_enabled = [
'system' => 'system',
'user' => 'user',
];
$request = Request::createFromGlobals();
$kernel = $this
->getTestKernel($request, $modules_enabled);
$pass = FALSE;
try {
$kernel
->setSitePath('/dev/null');
} catch (\LogicException $e) {
$pass = TRUE;
}
$this
->assertTrue($pass, 'Throws LogicException if DrupalKernel::setSitePath() is called after boot');
$path = $kernel
->getSitePath();
$kernel
->setSitePath($path);
}
public function providerClassLoaderAutoDetect() {
return [
'TRUE' => [
TRUE,
],
'FALSE' => [
FALSE,
],
];
}
public function testClassLoaderAutoDetect($value) {
vfsStream::setup('root', NULL, [
'sites' => [
'default' => [],
],
'core' => [
'lib' => [
'Drupal' => [
'Core' => [],
'Component' => [],
],
],
],
]);
$this
->setSetting('class_loader_auto_detect', $value);
$classloader = $this
->prophesize(ClassLoader::class);
if ($value) {
$classloader
->setApcuPrefix(Argument::type('string'))
->shouldBeCalled();
}
else {
$classloader
->setApcuPrefix(Argument::type('string'))
->shouldNotBeCalled();
}
$kernel = new DrupalKernel('test', $classloader
->reveal(), FALSE, vfsStream::url('root'));
$kernel
->setSitePath(vfsStream::url('root/sites/default'));
$kernel
->boot();
}
}