From 278e58bd66c8d87f0544c33cb3c91134e37a9703 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Thu, 26 Jun 2014 19:29:31 +0200 Subject: [PATCH] ResourceLoader: Test that all module dependencies are satisfiable Whenever module A depends on module B, module B must exist. Whenever module A depends on module B, the possible targets of A must be a subset of targets of module B. Bug: 64513 Change-Id: I9de291d20d08df2813eb55be9a1f7e5efd907d6f --- tests/phpunit/structure/ResourcesTest.php | 51 ++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/tests/phpunit/structure/ResourcesTest.php b/tests/phpunit/structure/ResourcesTest.php index d7742a6976..fbf70e27cd 100644 --- a/tests/phpunit/structure/ResourcesTest.php +++ b/tests/phpunit/structure/ResourcesTest.php @@ -37,7 +37,11 @@ class ResourcesTest extends MediaWikiTestCase { ); } - public function testDependencies() { + /** + * Verify that nothing explicitly depends on the 'jquery' and 'mediawiki' modules. + * They are always loaded, depending on them is unsupported and leads to unexpected behaviour. + */ + public function testIllegalDependencies() { $data = self::getAllModules(); $illegalDeps = array( 'jquery', 'mediawiki' ); @@ -52,6 +56,51 @@ class ResourcesTest extends MediaWikiTestCase { } } + /** + * Verify that all modules specified as dependencies of other modules actually exist. + */ + public function testMissingDependencies() { + $data = self::getAllModules(); + $validDeps = array_keys( $data['modules'] ); + + foreach ( $data['modules'] as $moduleName => $module ) { + foreach ( $module->getDependencies() as $dep ) { + $this->assertContains( + $dep, + $validDeps, + "The module '$dep' required by '$moduleName' must exist" + ); + } + } + } + + /** + * Verify that all dependencies of all modules are always satisfiable with the 'targets' defined + * for the involved modules. + * + * Example: A depends on B. A has targets: mobile, desktop. B has targets: desktop. Therefore the + * dependency is sometimes unsatisfiable: it's impossible to load module A on mobile. + */ + public function testUnsatisfiableDependencies() { + $data = self::getAllModules(); + $validDeps = array_keys( $data['modules'] ); + + foreach ( $data['modules'] as $moduleName => $module ) { + $moduleTargets = $module->getTargets(); + foreach ( $module->getDependencies() as $dep ) { + $targets = $data['modules'][$dep]->getTargets(); + foreach ( $moduleTargets as $moduleTarget ) { + $this->assertContains( + $moduleTarget, + $targets, + "The module '$moduleName' must not have target '$moduleTarget' " + . "because its dependency '$dep' does not have it" + ); + } + } + } + } + /** * Get all registered modules from ResouceLoader. */ -- 2.20.1