Issue #3451701 by dww, Mingsong, MegaphoneJon: The update module should not crash with releases that contain invalid values for core_version_requirement

merge-requests/6220/merge
catch 2024-06-03 14:23:31 +01:00
parent 5c1a0edb59
commit d3b2a6a56e
2 changed files with 53 additions and 1 deletions

View File

@ -169,7 +169,12 @@ final class ProjectCoreCompatibility {
* version of Drupal core, otherwise FALSE.
*/
protected function isCoreCompatible($core_compatibility_constraint) {
return Semver::satisfies($this->existingCoreVersion, $core_compatibility_constraint);
try {
return Semver::satisfies($this->existingCoreVersion, $core_compatibility_constraint);
}
catch (\Exception $e) {
return FALSE;
}
}
/**

View File

@ -156,4 +156,51 @@ class ProjectCoreCompatibilityTest extends UnitTestCase {
return $test_cases;
}
/**
* @covers ::isCoreCompatible
* @dataProvider providerIsCoreCompatible
*
* @param string $constraint
* The core_version_constraint to test.
* @param string $installed_core
* The installed version of core to compare against.
* @param bool $expected
* The expected result.
*/
public function testIsCoreCompatible(string $constraint, string $installed_core, bool $expected): void {
$core_data['existing_version'] = $installed_core;
$project_compatibility = new ProjectCoreCompatibility($core_data, [], []);
$reflection = new \ReflectionClass(ProjectCoreCompatibility::class);
$reflection_method = $reflection->getMethod('isCoreCompatible');
$result = $reflection_method->invokeArgs($project_compatibility, [$constraint]);
$this->assertSame($expected, $result);
}
/**
* Data provider for testIsCoreCompatible().
*/
public static function providerIsCoreCompatible(): array {
$test_cases['compatible exact'] = [
'10.3.0',
'10.3.0',
TRUE,
];
$test_cases['compatible with OR'] = [
'^9 || ^10',
'10.3.0',
TRUE,
];
$test_cases['incompatible'] = [
'^10',
'11.0.0',
FALSE,
];
$test_cases['broken'] = [
'^^11',
'11.0.0',
FALSE,
];
return $test_cases;
}
}