You are here

public function DrupalKernelTest::testCompileDIC in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php \Drupal\KernelTests\Core\DrupalKernel\DrupalKernelTest::testCompileDIC()

Tests DIC compilation.

File

core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php, line 78

Class

DrupalKernelTest
Tests DIC compilation to disk.

Namespace

Drupal\KernelTests\Core\DrupalKernel

Code

public function testCompileDIC() {

  // @todo: write a memory based storage backend for testing.
  $modules_enabled = [
    'system' => 'system',
    'user' => 'user',
  ];
  $request = Request::createFromGlobals();
  $this
    ->getTestKernel($request, $modules_enabled);

  // Instantiate it a second time and we should get the compiled Container
  // class.
  $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);

  // Verify that the list of modules is the same for the initial and the
  // compiled container.
  $module_list = array_keys($container
    ->get('module_handler')
    ->getModuleList());
  $this
    ->assertEquals(array_values($modules_enabled), $module_list);

  // Get the container another time, simulating a "production" environment.
  $container = $this
    ->getTestKernel($request, NULL)
    ->getContainer();
  $refClass = new \ReflectionClass($container);
  $is_compiled_container = !$refClass
    ->isSubclassOf('Symfony\\Component\\DependencyInjection\\ContainerBuilder');
  $this
    ->assertTrue($is_compiled_container);

  // Verify that the list of modules is the same for the initial and the
  // compiled container.
  $module_list = array_keys($container
    ->get('module_handler')
    ->getModuleList());
  $this
    ->assertEquals(array_values($modules_enabled), $module_list);

  // Test that our synthetic services are there.
  $class_loader = $container
    ->get('class_loader');
  $refClass = new \ReflectionClass($class_loader);
  $this
    ->assertTrue($refClass
    ->hasMethod('loadClass'), 'Container has a class loader');

  // We make this assertion here purely to show that the new container below
  // is functioning correctly, i.e. we get a brand new ContainerBuilder
  // which has the required new services, after changing the list of enabled
  // modules.
  $this
    ->assertFalse($container
    ->has('service_provider_test_class'));

  // Add another module so that we can test that the new module's bundle is
  // registered to the new container.
  $modules_enabled['service_provider_test'] = 'service_provider_test';
  $this
    ->getTestKernel($request, $modules_enabled);

  // Instantiate it a second time and we should not get a ContainerBuilder
  // class because we are loading the container definition from cache.
  $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');

  // Assert that the new module's bundle was registered to the new container.
  $this
    ->assertTrue($container
    ->has('service_provider_test_class'), 'Container has test service');

  // Test that our synthetic services are there.
  $class_loader = $container
    ->get('class_loader');
  $refClass = new \ReflectionClass($class_loader);
  $this
    ->assertTrue($refClass
    ->hasMethod('loadClass'), 'Container has a class loader');

  // Check that the location of the new module is registered.
  $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']);

  // Check that the container itself is not among the persist IDs because it
  // does not make sense to persist the container itself.
  $persist_ids = $container
    ->getParameter('persist_ids');
  $this
    ->assertNotContains('service_container', $persist_ids);
}