diff --git a/libraries/classes/VersionInformation.php b/libraries/classes/VersionInformation.php index e6f42dbfad..b8b8afedaf 100644 --- a/libraries/classes/VersionInformation.php +++ b/libraries/classes/VersionInformation.php @@ -141,6 +141,8 @@ class VersionInformation */ public function getLatestCompatibleVersion(array $releases) { + // Maintains the latest compatible version + $latestRelease = null; foreach ($releases as $release) { $phpVersions = $release->php_versions; $phpConditions = explode(",", $phpVersions); @@ -150,7 +152,7 @@ class VersionInformation } } - // We evalute MySQL version constraint if there are only + // We evaluate MySQL version constraint if there are only // one server configured. if (count($GLOBALS['cfg']['Servers']) === 1) { $mysqlVersions = $release->mysql_versions; @@ -161,15 +163,17 @@ class VersionInformation } } } - - return [ - 'version' => $release->version, - 'date' => $release->date, - ]; + // To compare the current release with the previous latest release or no release is set + if ($latestRelease === null || version_compare($latestRelease['version'], $release->version, '<')) { + $latestRelease = [ + 'version' => $release->version, + 'date' => $release->date + ]; + } } // no compatible version - return null; + return $latestRelease; } /** diff --git a/test/classes/VersionInformationTest.php b/test/classes/VersionInformationTest.php index 69497d0079..6020059e62 100644 --- a/test/classes/VersionInformationTest.php +++ b/test/classes/VersionInformationTest.php @@ -221,7 +221,7 @@ class VersionInformationTest extends PmaTestCase * * @return void */ - public function testGetLaestCompatibleVersionWithMultipleServers() + public function testGetLatestCompatibleVersionWithMultipleServers() { $GLOBALS['cfg']['Servers'] = [ [], @@ -252,7 +252,7 @@ class VersionInformationTest extends PmaTestCase * * @return void */ - public function testGetLaestCompatibleVersionWithOldPHPVersion() + public function testGetLatestCompatibleVersionWithOldPHPVersion() { $GLOBALS['cfg']['Servers'] = [ [], @@ -288,6 +288,281 @@ class VersionInformationTest extends PmaTestCase $this->assertEquals('4.0.10.10', $compatible['version']); } + + /** + * Tests getLatestCompatibleVersion() with an new PHP version + * + * @dataProvider dataProviderVersionConditions + * @param array[] $versions The versions to use + * @param array[] $conditions The conditions that will be executed + * @param string|null $matchedLastVersion The version that will be matched + * @return void + */ + public function testGetLatestCompatibleVersionWithNewPHPVersion(array $versions, array $conditions, ?string $matchedLastVersion): void + { + $GLOBALS['cfg']['Servers'] = []; + + $mockVersionInfo = $this->getMockBuilder(VersionInformation::class) + ->setMethods(['evaluateVersionCondition']) + ->getMock(); + + $i = 0; + foreach ($conditions as $conditionArray) { + [ + $condition, + $returnValue, + ] = $conditionArray; + $mockVersionInfo->expects($this->at($i)) + ->method('evaluateVersionCondition') + ->with('PHP', $condition) + ->will($this->returnValue($returnValue)); + $i++; + } + /** @var VersionInformation $mockVersionInfo */ + $compatible = $mockVersionInfo->getLatestCompatibleVersion($versions); + $this->assertEquals($matchedLastVersion, $compatible['version'] ?? null); + } + + /** + * Provider for testGetLatestCompatibleVersionWithNewPHPVersion + * Returns the conditions to be used for mocks + * @return array[] + */ + public function dataProviderVersionConditions(): array + { + return [ + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<8.0', + 'version' => '4.9.3', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '5.0.0', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=5.5', + true, + ], + [ + '<8.0', + true, + ], + [ + '>=7.1', + true, + ], + [ + '<8.0', + false, + ], + ], + '4.9.3', + ], + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<7.0', + 'version' => '6.0.0', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '5.0.0', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=5.5', + true, + ], + [ + '<7.0', + true, + ], + [ + '>=7.1', + false, + ], + ], + '6.0.0', + ], + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<7.0', + 'version' => '6.0.0-rc1', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '6.0.0-rc2', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=5.5', + true, + ], + [ + '<7.0', + true, + ], + [ + '>=7.1', + false, + ], + ], + '6.0.0-rc1', + ], + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<7.0', + 'version' => '6.0.0', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '5.0.0', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=5.5', + false, + ], + [ + '>=7.1', + true, + ], + [ + '<8.0', + false, + ], + ], + null, + ], + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<7.0', + 'version' => '6.0.0', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '5.0.0', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=5.5', + false, + ], + [ + '>=7.1', + true, + ], + [ + '<8.0', + true, + ], + ], + '5.0.0', + ], + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<8.0', + 'version' => '4.9.3', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '5.0.0', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=5.5', + true, + ], + [ + '<8.0', + true, + ], + [ + '>=7.1', + true, + ], + [ + '<8.0', + true, + ], + ], + '5.0.0', + ], + [ + [ + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=7.1,<8.0', + 'version' => '5.0.0', + 'mysql_versions' => '>=5.5', + ], + (object) [ + 'date' => '2019-12-26', + 'php_versions' => '>=5.5,<8.0', + 'version' => '4.9.3', + 'mysql_versions' => '>=5.5', + ], + ], + [ + [ + '>=7.1', + true, + ], + [ + '<8.0', + true, + ], + [ + '>=5.5', + true, + ], + [ + '<8.0', + true, + ], + ], + '5.0.0', + ], + ]; + } + /** * Tests evaluateVersionCondition() method *