diff --git a/core/modules/update/src/ProjectCoreCompatibility.php b/core/modules/update/src/ProjectCoreCompatibility.php index 66c37d03bdafeed6c9ebbe200bc96ecc193f8b18..16356093b583cd2d631549a8b0037988c270ff38 100644 --- a/core/modules/update/src/ProjectCoreCompatibility.php +++ b/core/modules/update/src/ProjectCoreCompatibility.php @@ -169,7 +169,12 @@ public function setReleaseMessage(array &$project_data) { * 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 15b407c6092532d59012bee7faf4988d73aa4c95..c98380f5f8768943abbbb629eca5a307b211500e 100644 --- a/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php +++ b/core/modules/update/tests/src/Unit/ProjectCoreCompatibilityTest.php @@ -156,4 +156,51 @@ public static function providerSetProjectCoreCompatibilityRanges() { 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; + } + }