resourceloader: Speed up dependency checks in structure/ResourcesTest
Stats from wmf-quibble-core-vendor-mysql-php72-docker builds. Before: * testIllegalDependencies (+21ms) * testMissingDependencies (+254ms) After: * testValidDependencies (+17ms) Bug: T225730 Change-Id: Idf760a27c7ad16d4838ae82e7895b659934fbf93
This commit is contained in:
parent
83207676b8
commit
a5a672b1a5
1 changed files with 27 additions and 37 deletions
|
|
@ -45,54 +45,44 @@ class ResourcesTest extends MediaWikiTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify that nothing depends on "startup".
|
* Verify that all modules specified as dependencies of other modules actually
|
||||||
|
* exist and are not illegal.
|
||||||
*
|
*
|
||||||
* Depending on it is unsupported as it cannot be loaded by the client.
|
* @todo Modules can dynamically choose dependencies based on context. This method
|
||||||
*
|
* does not find all such variations. The same applies to testUnsatisfiableDependencies().
|
||||||
* @todo Modules can dynamically choose dependencies based on context. This method does not
|
|
||||||
* test such dependencies. The same goes for testMissingDependencies() and
|
|
||||||
* testUnsatisfiableDependencies().
|
|
||||||
*/
|
*/
|
||||||
public function testIllegalDependencies() {
|
public function testValidDependencies() {
|
||||||
$data = self::getAllModules();
|
$data = self::getAllModules();
|
||||||
|
$knownDeps = array_keys( $data['modules'] );
|
||||||
|
$illegalDeps = [ 'startup' ];
|
||||||
|
|
||||||
$illegalDeps = [];
|
// Avoid an assert for each module to keep the test fast.
|
||||||
foreach ( $data['modules'] as $moduleName => $module ) {
|
// Instead, perform a single assertion against everything at once.
|
||||||
if ( $module instanceof ResourceLoaderStartUpModule ) {
|
// When all is good, actual/expected are both empty arrays.
|
||||||
$illegalDeps[] = $moduleName;
|
// When we find issues, add the violations to 'actual' and add an empty
|
||||||
}
|
// key to 'expected'. These keys in expected are because the PHPUnit diff
|
||||||
}
|
// (as of 6.5) only goes one level deep.
|
||||||
|
$actualUnknown = [];
|
||||||
/** @var ResourceLoaderModule $module */
|
$expectedUnknown = [];
|
||||||
foreach ( $data['modules'] as $moduleName => $module ) {
|
$actualIllegal = [];
|
||||||
foreach ( $illegalDeps as $illegalDep ) {
|
$expectedIllegal = [];
|
||||||
$this->assertNotContains(
|
|
||||||
$illegalDep,
|
|
||||||
$module->getDependencies( $data['context'] ),
|
|
||||||
"Module '$moduleName' must not depend on '$illegalDep'"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Verify that all modules specified as dependencies of other modules actually exist.
|
|
||||||
*/
|
|
||||||
public function testMissingDependencies() {
|
|
||||||
$data = self::getAllModules();
|
|
||||||
$validDeps = array_keys( $data['modules'] );
|
|
||||||
|
|
||||||
/** @var ResourceLoaderModule $module */
|
/** @var ResourceLoaderModule $module */
|
||||||
foreach ( $data['modules'] as $moduleName => $module ) {
|
foreach ( $data['modules'] as $moduleName => $module ) {
|
||||||
foreach ( $module->getDependencies( $data['context'] ) as $dep ) {
|
foreach ( $module->getDependencies( $data['context'] ) as $dep ) {
|
||||||
$this->assertContains(
|
if ( !in_array( $dep, $knownDeps, true ) ) {
|
||||||
$dep,
|
$actualUnknown[$moduleName][] = $dep;
|
||||||
$validDeps,
|
$expectedUnknown[$moduleName] = [];
|
||||||
"The module '$dep' required by '$moduleName' must exist"
|
}
|
||||||
);
|
if ( in_array( $dep, $illegalDeps, true ) ) {
|
||||||
|
$actualIllegal[$moduleName][] = $dep;
|
||||||
|
$expectedIllegal[$moduleName] = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$this->assertEquals( $expectedUnknown, $actualUnknown, 'Dependencies that do not exist' );
|
||||||
|
$this->assertEquals( $expectedIllegal, $actualIllegal, 'Dependencies that are not legal' );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify that all specified messages actually exist.
|
* Verify that all specified messages actually exist.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue