/**
  * {@inheritdoc}
  */
 public function installOptionalConfig(StorageInterface $storage = NULL, $dependency = [])
 {
     $profile = $this->drupalGetProfile();
     $optional_profile_config = [];
     if (!$storage) {
         // Search the install profile's optional configuration too.
         $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION, TRUE);
         // The extension install storage ensures that overrides are used.
         $profile_storage = NULL;
     } elseif (isset($profile)) {
         // Creates a profile storage to search for overrides.
         $profile_install_path = $this->drupalGetPath('module', $profile) . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY;
         $profile_storage = new FileStorage($profile_install_path, StorageInterface::DEFAULT_COLLECTION);
         $optional_profile_config = $profile_storage->listAll();
     } else {
         // Profile has not been set yet. For example during the first steps of the
         // installer or during unit tests.
         $profile_storage = NULL;
     }
     $enabled_extensions = $this->getEnabledExtensions();
     $existing_config = $this->getActiveStorages()->listAll();
     $list = array_unique(array_merge($storage->listAll(), $optional_profile_config));
     $list = array_filter($list, function ($config_name) use($existing_config) {
         // Only list configuration that:
         // - does not already exist
         // - is a configuration entity (this also excludes config that has an
         //   implicit dependency on modules that are not yet installed)
         return !in_array($config_name, $existing_config) && $this->configManager->getEntityTypeIdByName($config_name);
     });
     $all_config = array_merge($existing_config, $list);
     $all_config = array_combine($all_config, $all_config);
     $config_to_create = $storage->readMultiple($list);
     // Check to see if the corresponding override storage has any overrides or
     // new configuration that can be installed.
     if ($profile_storage) {
         $config_to_create = $profile_storage->readMultiple($list) + $config_to_create;
     }
     // Sort $config_to_create in the order of the least dependent first.
     $dependency_manager = new ConfigDependencyManager();
     $dependency_manager->setData($config_to_create);
     $config_to_create = array_merge(array_flip($dependency_manager->sortAll()), $config_to_create);
     foreach ($config_to_create as $config_name => $data) {
         // Remove configuration where its dependencies cannot be met.
         $remove = !$this->validateDependencies($config_name, $data, $enabled_extensions, $all_config);
         // If $dependency is defined, remove configuration that does not have a
         // matching dependency.
         if (!$remove && !empty($dependency)) {
             // Create a light weight dependency object to check dependencies.
             $config_entity = new ConfigEntityDependency($config_name, $data);
             $remove = !$config_entity->hasDependency(key($dependency), reset($dependency));
         }
         if ($remove) {
             // Remove from the list of configuration to create.
             unset($config_to_create[$config_name]);
             // Remove from the list of all configuration. This ensures that any
             // configuration that depends on this configuration is also removed.
             unset($all_config[$config_name]);
         }
     }
     if (!empty($config_to_create)) {
         $this->createConfiguration(StorageInterface::DEFAULT_COLLECTION, $config_to_create, TRUE);
     }
 }
 /**
  * @dataProvider providerTestSortAll
  */
 public function testSortAll(array $data, array $expected_order)
 {
     $dependency_manager = new ConfigDependencyManager();
     $dependency_manager->setData($data);
     $this->assertEquals($expected_order, $dependency_manager->sortAll());
 }