While MediaWiki Core already sets requirements for PHP versions, it should be possible for extensions to tighten these requirements. This mirrors the PHP parameter of extension infoboxes as well. This change introduces a new 'platform' key (in addition to 'MediaWiki', 'skins' and 'extensions', where non-MediaWiki software requirements will be listed in the future, starting with a PHP version constraint. Further keys are supposed to be added to allow setting constraints against php extensions and other abilities of the platform. Bug: T197535 Change-Id: I6744cc0be2363b603331af9dc860eb8603a1a89a
285 lines
6.1 KiB
PHP
285 lines
6.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @covers VersionChecker
|
|
*/
|
|
class VersionCheckerTest extends PHPUnit\Framework\TestCase {
|
|
|
|
use MediaWikiCoversValidator;
|
|
use PHPUnit4And6Compat;
|
|
|
|
/**
|
|
* @dataProvider provideMediaWikiCheck
|
|
*/
|
|
public function testMediaWikiCheck( $coreVersion, $constraint, $expected ) {
|
|
$checker = new VersionChecker( $coreVersion, '7.0.0' );
|
|
$this->assertEquals( $expected, !(bool)$checker->checkArray( [
|
|
'FakeExtension' => [
|
|
'MediaWiki' => $constraint,
|
|
],
|
|
] ) );
|
|
}
|
|
|
|
public static function provideMediaWikiCheck() {
|
|
return [
|
|
// [ $wgVersion, constraint, expected ]
|
|
[ '1.25alpha', '>= 1.26', false ],
|
|
[ '1.25.0', '>= 1.26', false ],
|
|
[ '1.26alpha', '>= 1.26', true ],
|
|
[ '1.26alpha', '>= 1.26.0', true ],
|
|
[ '1.26alpha', '>= 1.26.0-stable', false ],
|
|
[ '1.26.0', '>= 1.26.0-stable', true ],
|
|
[ '1.26.1', '>= 1.26.0-stable', true ],
|
|
[ '1.27.1', '>= 1.26.0-stable', true ],
|
|
[ '1.26alpha', '>= 1.26.1', false ],
|
|
[ '1.26alpha', '>= 1.26alpha', true ],
|
|
[ '1.26alpha', '>= 1.25', true ],
|
|
[ '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ],
|
|
[ '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ],
|
|
[ '1.26.1', '>= 1.26.2, <=1.26.0', false ],
|
|
[ '1.26.1', '^1.26.2', false ],
|
|
// Accept anything for un-parsable version strings
|
|
[ '1.26mwf14', '== 1.25alpha', true ],
|
|
[ 'totallyinvalid', '== 1.0', true ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providePhpValidCheck
|
|
*/
|
|
public function testPhpValidCheck( $phpVersion, $constraint, $expected ) {
|
|
$checker = new VersionChecker( '1.0.0', $phpVersion );
|
|
$this->assertEquals( $expected, !(bool)$checker->checkArray( [
|
|
'FakeExtension' => [
|
|
'platform' => [
|
|
'php' => $constraint,
|
|
],
|
|
],
|
|
] ) );
|
|
}
|
|
|
|
public static function providePhpValidCheck() {
|
|
return [
|
|
// [ phpVersion, constraint, expected ]
|
|
[ '7.0.23', '>= 7.0.0', true ],
|
|
[ '7.0.23', '^7.1.0', false ],
|
|
[ '7.0.23', '7.0.23', true ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @expectedException UnexpectedValueException
|
|
*/
|
|
public function testPhpInvalidConstraint() {
|
|
$checker = new VersionChecker( '1.0.0', '7.0.0' );
|
|
$checker->checkArray( [
|
|
'FakeExtension' => [
|
|
'platform' => [
|
|
'php' => 'totallyinvalid',
|
|
],
|
|
],
|
|
] );
|
|
}
|
|
|
|
/**
|
|
* @dataProvider providePhpInvalidVersion
|
|
* @expectedException UnexpectedValueException
|
|
*/
|
|
public function testPhpInvalidVersion( $phpVersion ) {
|
|
$checker = new VersionChecker( '1.0.0', $phpVersion );
|
|
}
|
|
|
|
public static function providePhpInvalidVersion() {
|
|
return [
|
|
// [ phpVersion ]
|
|
[ '7.abc' ],
|
|
[ '5.a.x' ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideType
|
|
*/
|
|
public function testType( $given, $expected ) {
|
|
$checker = new VersionChecker( '1.0.0', '7.0.0' );
|
|
$checker->setLoadedExtensionsAndSkins( [
|
|
'FakeDependency' => [
|
|
'version' => '1.0.0',
|
|
],
|
|
'NoVersionGiven' => [],
|
|
] );
|
|
$this->assertEquals( $expected, $checker->checkArray( [
|
|
'FakeExtension' => $given,
|
|
] ) );
|
|
}
|
|
|
|
public static function provideType() {
|
|
return [
|
|
// valid type
|
|
[
|
|
[
|
|
'extensions' => [
|
|
'FakeDependency' => '1.0.0',
|
|
],
|
|
],
|
|
[],
|
|
],
|
|
[
|
|
[
|
|
'MediaWiki' => '1.0.0',
|
|
],
|
|
[],
|
|
],
|
|
[
|
|
[
|
|
'extensions' => [
|
|
'NoVersionGiven' => '*',
|
|
],
|
|
],
|
|
[],
|
|
],
|
|
[
|
|
[
|
|
'extensions' => [
|
|
'NoVersionGiven' => '1.0',
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'incompatible' => 'FakeExtension',
|
|
'type' => 'incompatible-extensions',
|
|
'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.',
|
|
],
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'extensions' => [
|
|
'Missing' => '*',
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'missing' => 'Missing',
|
|
'type' => 'missing-extensions',
|
|
'msg' => 'FakeExtension requires Missing to be installed.',
|
|
],
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'extensions' => [
|
|
'FakeDependency' => '2.0.0',
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'incompatible' => 'FakeExtension',
|
|
'type' => 'incompatible-extensions',
|
|
// phpcs:ignore Generic.Files.LineLength.TooLong
|
|
'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.',
|
|
],
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'skins' => [
|
|
'FakeSkin' => '*',
|
|
],
|
|
],
|
|
[
|
|
[
|
|
'missing' => 'FakeSkin',
|
|
'type' => 'missing-skins',
|
|
'msg' => 'FakeExtension requires FakeSkin to be installed.',
|
|
],
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Check, if a non-parsable version constraint does not throw an exception or
|
|
* returns any error message.
|
|
*/
|
|
public function testInvalidConstraint() {
|
|
$checker = new VersionChecker( '1.0.0', '7.0.0' );
|
|
$checker->setLoadedExtensionsAndSkins( [
|
|
'FakeDependency' => [
|
|
'version' => 'not really valid',
|
|
],
|
|
] );
|
|
$this->assertEquals( [
|
|
[
|
|
'type' => 'invalid-version',
|
|
'msg' => "FakeDependency does not have a valid version string.",
|
|
],
|
|
], $checker->checkArray( [
|
|
'FakeExtension' => [
|
|
'extensions' => [
|
|
'FakeDependency' => '1.24.3',
|
|
],
|
|
],
|
|
] ) );
|
|
|
|
$checker = new VersionChecker( '1.0.0', '7.0.0' );
|
|
$checker->setLoadedExtensionsAndSkins( [
|
|
'FakeDependency' => [
|
|
'version' => '1.24.3',
|
|
],
|
|
] );
|
|
|
|
$this->setExpectedException( UnexpectedValueException::class );
|
|
$checker->checkArray( [
|
|
'FakeExtension' => [
|
|
'FakeDependency' => 'not really valid',
|
|
],
|
|
] );
|
|
}
|
|
|
|
public function provideInvalidDependency() {
|
|
return [
|
|
[
|
|
[
|
|
'FakeExtension' => [
|
|
'platform' => [
|
|
'undefinedPlatformDependency' => '*',
|
|
],
|
|
],
|
|
],
|
|
'undefinedPlatformDependency',
|
|
],
|
|
[
|
|
[
|
|
'FakeExtension' => [
|
|
'undefinedDependencyType' => '*',
|
|
],
|
|
],
|
|
'undefinedDependencyType',
|
|
],
|
|
// T197478
|
|
[
|
|
[
|
|
'FakeExtension' => [
|
|
'skin' => [
|
|
'FakeSkin' => '*',
|
|
],
|
|
],
|
|
],
|
|
'skin',
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideInvalidDependency
|
|
*/
|
|
public function testInvalidDependency( $depencency, $type ) {
|
|
$checker = new VersionChecker( '1.0.0', '7.0.0' );
|
|
$this->setExpectedException(
|
|
UnexpectedValueException::class,
|
|
"Dependency type $type unknown in FakeExtension"
|
|
);
|
|
$checker->checkArray( $depencency );
|
|
}
|
|
}
|