diff --git a/core/modules/update/src/ProjectCoreCompatibility.php b/core/modules/update/src/ProjectCoreCompatibility.php index 66c37d03bda..16356093b58 100644 --- a/core/modules/update/src/ProjectCoreCompatibility.php +++ b/core/modules/update/src/ProjectCoreCompatibility.php @@ -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; + } } /** diff --git a/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php b/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php index 15b407c6092..c98380f5f87 100644 --- a/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php +++ b/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php @@ -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; + } + }