From b18fb8241ed64e7d7adf30993f6e954351452ec5 Mon Sep 17 00:00:00 2001 From: Thomas Steur Date: Mon, 15 May 2017 17:01:58 +1200 Subject: Make sure plugins in config.ini.php are sorted depending on dependencies (#11683) * fix #11681 make sure plugins in config.ini.php are sorted depending on dependencies * added comment * add missing tests --- .../Framework/TestingEnvironmentManipulator.php | 20 ++-- .../Application/Kernel/PluginListTest.php | 113 +++++++++++++++++++++ 2 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php (limited to 'tests/PHPUnit') diff --git a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php index 1aa1a74de8..59bac60155 100644 --- a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php +++ b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php @@ -227,16 +227,15 @@ class TestingEnvironmentManipulator implements EnvironmentManipulator private function getPluginAndRequiredPlugins($pluginName, $plugins) { - $pluginJsonPath = $this->makePathToPluginJson($pluginName); + $pluginLoader = new Plugin\MetadataLoader($pluginName); + $pluginJson = $pluginLoader->loadPluginInfoJson(); - if (file_exists($pluginJsonPath)) { - $pluginJson = json_decode(trim(file_get_contents($pluginJsonPath)), true); + if (!empty($pluginJson['require'])) { + foreach ($pluginJson['require'] as $possiblePluginName => $requiredVersion) { - if (!empty($pluginJson['require'])) { - foreach ($pluginJson['require'] as $possiblePluginName => $requiredVersion) { - if (file_exists($this->makePathToPluginJson($possiblePluginName))) { - $plugins = $this->getPluginAndRequiredPlugins($possiblePluginName, $plugins); - } + $pluginLoader2 = new Plugin\MetadataLoader($possiblePluginName); + if (file_exists($pluginLoader2->getPathToPluginJson())) { + $plugins = $this->getPluginAndRequiredPlugins($possiblePluginName, $plugins); } } } @@ -248,11 +247,6 @@ class TestingEnvironmentManipulator implements EnvironmentManipulator return $plugins; } - private function makePathToPluginJson($pluginName) - { - return Plugin\Manager::getPluginsDirectory() . $pluginName . '/' . Plugin\MetadataLoader::PLUGIN_JSON_FILENAME; - } - private function classExists($klass) { if (class_exists($klass)) { diff --git a/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php b/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php new file mode 100644 index 0000000000..00f873b2ee --- /dev/null +++ b/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php @@ -0,0 +1,113 @@ +pluginList = $this->makePluginList(); + } + + public function test_sortPlugins() + { + $pluginList = $this->makePluginList(); + $sorted = $pluginList->sortPlugins(array('UsersManager', 'CoreHome', 'MyCustomPlugin', 'ExampleCommand', 'MyCustomPlugin2', 'Abcdef')); + $this->assertSame(array( + 'CoreHome', // core plugins loaded first + 'UsersManager', + 'ExampleCommand', // a "by default disabled plugin" is loaded before custom plugins + 'Abcdef', // then we load custom plugins + 'MyCustomPlugin', + 'MyCustomPlugin2', + ), $sorted); + } + + public function test_sortPlugins_onlyCorePlugins() + { + $pluginList = $this->makePluginList(); + $sorted = $pluginList->sortPlugins(array('UsersManager', 'CoreHome')); + $this->assertSame(array('CoreHome','UsersManager'), $sorted); + } + + public function test_sortPluginsAndRespectDependencies_sortsPluginsAlphabetically() + { + $pluginList = $this->makePluginList(); + $sorted = $pluginList->sortPluginsAndRespectDependencies(array( + 'UsersManager', 'MyCustomPlugin', 'ExampleCommand', 'MyCustomPlugin2', 'CoreHome', 'Abcdef' + )); + $this->assertSame(array( + 'CoreHome', // core plugins loaded first + 'UsersManager', + 'ExampleCommand', // a "by default disabled plugin" is loaded before custom plugins + 'Abcdef', // then we load custom plugins + 'MyCustomPlugin', + 'MyCustomPlugin2', + ), $sorted); + } + + public function test_sortPluginsAndRespectDependencies_makesSureToListRequiredDependencyFirst() + { + $pluginJsonInfo = array( + 'Abcdef' => array('require' => array('MyCustomPlugin2' => '2.2.1')), + 'MyCustomPlugin2' => array('require' => array('CoreHome' => '4.2.1', 'MyCustomPlugin3' => '3.0.3')), + 'fooBar' => array('require' => array('Ast' => '1.2.1', 'MyCustomPlugin3' => '3.0.3')) + ); + + $pluginList = $this->makePluginList(); + $sorted = $pluginList->sortPluginsAndRespectDependencies(array( + 'UsersManager', 'MyCustomPlugin', + 'ExampleCommand', 'MyCustomPlugin2', 'Ast', + 'Acc', 'MyCustomPlugin3', 'CoreHome', 'Abcdef', 'fooBar', + ), $pluginJsonInfo); + $this->assertSame(array( + 'CoreHome', // core plugins loaded first + 'UsersManager', + 'ExampleCommand', // a "by default disabled plugin" is loaded before custom plugins + 'MyCustomPlugin3', + 'MyCustomPlugin2', + 'Abcdef', + 'Acc', + 'Ast', + 'fooBar', + 'MyCustomPlugin', + ), $sorted); + } + + public function test_sortPluginsAndRespectDependencies_onlyCorePlugins() + { + $pluginList = $this->makePluginList(); + $sorted = $pluginList->sortPluginsAndRespectDependencies(array('UsersManager', 'CoreHome')); + $this->assertSame(array('CoreHome','UsersManager'), $sorted); + } + + private function makePluginList() + { + $globalSettingsProvider = StaticContainer::get('Piwik\Application\Kernel\GlobalSettingsProvider'); + $section = $globalSettingsProvider->getSection('Plugins'); + // $section['Plugins'] = $pluginsToLoad; + $globalSettingsProvider->setSection('Plugins', $section); + return new PluginList($globalSettingsProvider); + } + +} -- cgit v1.2.3