doTestSecurityUpdateAvailability($case['site_patch_version'], $case['expected_security_releases'], $case['expected_update_message_type'], $case['fixture']); } } /** * Tests the Update Status module when a security update is available. * * @param string $site_patch_version * The patch version to set the site to for testing. * @param string[] $expected_security_releases * The security releases, if any, that the status report should recommend. * @param string $expected_update_message_type * The type of update message expected. * @param string $fixture * The test fixture that contains the test XML. */ protected function doTestSecurityUpdateAvailability($site_patch_version, array $expected_security_releases, $expected_update_message_type, $fixture): void { $this->setProjectInstalledVersion("8.$site_patch_version"); $this->refreshUpdateStatus([$this->updateProject => $fixture]); $this->assertSecurityUpdates("{$this->updateProject}-8", $expected_security_releases, $expected_update_message_type, $this->updateTableLocator); } /** * Data provider method for testSecurityUpdateAvailability(). * * These test cases rely on the following fixtures containing the following * releases: * - [::$updateProject].sec.8.0.1_0.2.xml * - 8.0.2 Security update * - 8.0.1 Security update, Insecure * - 8.0.0 Insecure * - [::$updateProject].sec.8.0.2.xml * - 8.0.2 Security update * - 8.0.1 Insecure * - 8.0.0 Insecure * - [::$updateProject].sec.8.2.0-rc2.xml * - 8.2.0-rc2 Security update * - 8.2.0-rc1 Insecure * - 8.2.0-beta2 Insecure * - 8.2.0-beta1 Insecure * - 8.2.0-alpha2 Insecure * - 8.2.0-alpha1 Insecure * - 8.1.2 Security update * - 8.1.1 Insecure * - 8.1.0 Insecure * - 8.0.2 Security update * - 8.0.1 Insecure * - 8.0.0 Insecure * - [::$updateProject].sec.8.1.2.xml * - 8.1.2 Security update * - 8.1.1 Insecure * - 8.1.0 Insecure * - 8.0.2 * - 8.0.1 * - 8.0.0 * - [::$updateProject].sec.8.1.2_insecure.xml * - 8.1.2 Security update * - 8.1.1 Insecure * - 8.1.0 Insecure * - 8.0.2 Insecure * - 8.0.1 Insecure * - 8.0.0 Insecure * - [::$updateProject].sec.8.1.2_insecure-unsupported * This file has the exact releases as * [::$updateProject].sec.8.1.2_insecure.xml. It has a different value for * 'supported_branches' that does not contain '8.0.'. It is used to ensure * that the "Security update required!" is displayed even if the currently * installed version is in an unsupported branch. * - [::$updateProject].sec.2.0-rc2-b.xml * - 8.2.0-rc2 * - 8.2.0-rc1 * - 8.2.0-beta2 * - 8.2.0-beta1 * - 8.2.0-alpha2 * - 8.2.0-alpha1 * - 8.1.2 Security update * - 8.1.1 Insecure * - 8.1.0 Insecure * - 8.0.2 Security update * - 8.0.1 Insecure * - 8.0.0 Insecure */ public static function securityUpdateAvailabilityProvider() { $test_cases = [ // Security release available for site minor release 0. // No releases for next minor. '0.0, 0.2' => [ 'site_patch_version' => '0.0', 'expected_security_releases' => ['0.2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.0.2', ], // Site on latest security release available for site minor release 0. // Minor release 1 also has a security release, and the current release // is marked as insecure. '0.2, 0.2' => [ 'site_patch_version' => '0.2', 'expected_security_releases' => ['1.2', '2.0-rc2'], 'expected_update_message_type' => static::UPDATE_AVAILABLE, 'fixture' => 'sec.8.2.0-rc2', ], // Two security releases available for site minor release 0. // 0.1 security release marked as insecure. // No releases for next minor. '0.0, 0.1, 0.2' => [ 'site_patch_version' => '0.0', 'expected_security_releases' => ['0.2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.0.1_8.0.2', ], // Security release available for site minor release 1. // No releases for next minor. '1.0, 1.2' => [ 'site_patch_version' => '1.0', 'expected_security_releases' => ['1.2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.1.2', ], // Security release available for site minor release 0. // Security release also available for next minor. '0.0, 0.2 1.2' => [ 'site_patch_version' => '0.0', 'expected_security_releases' => ['0.2', '1.2', '2.0-rc2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.2.0-rc2', ], // No newer security release for site minor 1. // Previous minor has security release. '1.2, 0.2 1.2' => [ 'site_patch_version' => '1.2', 'expected_security_releases' => [], 'expected_update_message_type' => static::UPDATE_NONE, 'fixture' => 'sec.8.2.0-rc2', ], // No security release available for site minor release 0. // Security release available for next minor. '0.0, 1.2, insecure' => [ 'site_patch_version' => '0.0', 'expected_security_releases' => ['1.2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.1.2_insecure', ], // No security release available for site minor release 0. // Site minor is not a supported branch. // Security release available for next minor. '0.0, 1.2, insecure-unsupported' => [ 'site_patch_version' => '0.0', 'expected_security_releases' => ['1.2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.1.2_insecure-unsupported', ], // All releases for minor 0 are secure. // Security release available for next minor. '0.0, 1.2, secure' => [ 'site_patch_version' => '0.0', 'expected_security_releases' => ['1.2'], 'expected_update_message_type' => static::UPDATE_AVAILABLE, 'fixture' => 'sec.8.1.2', ], '0.2, 1.2, secure' => [ 'site_patch_version' => '0.2', 'expected_security_releases' => ['1.2'], 'expected_update_message_type' => static::UPDATE_AVAILABLE, 'fixture' => 'sec.8.1.2', ], // Site on 2.0-rc2 which is a security release. '2.0-rc2, 0.2 1.2' => [ 'site_patch_version' => '2.0-rc2', 'expected_security_releases' => [], 'expected_update_message_type' => static::UPDATE_NONE, 'fixture' => 'sec.8.2.0-rc2', ], // Ensure that 8.0.2 security release is not shown because it is earlier // version than 1.0. '1.0, 0.2 1.2' => [ 'site_patch_version' => '1.0', 'expected_security_releases' => ['1.2', '2.0-rc2'], 'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.2.0-rc2', ], ]; $pre_releases = [ '2.0-alpha1', '2.0-alpha2', '2.0-beta1', '2.0-beta2', '2.0-rc1', '2.0-rc2', ]; foreach ($pre_releases as $pre_release) { // If the site is on an alpha/beta/RC of an upcoming minor and none of the // alpha/beta/RC versions are marked insecure, no security update should // be required. $test_cases["Pre-release:$pre_release, no security update"] = [ 'site_patch_version' => $pre_release, 'expected_security_releases' => [], 'expected_update_message_type' => $pre_release === '2.0-rc2' ? static::UPDATE_NONE : static::UPDATE_AVAILABLE, 'fixture' => 'sec.8.2.0-rc2-b', ]; // If the site is on an alpha/beta/RC of an upcoming minor and there is // an RC version with a security update, it should be recommended. $test_cases["Pre-release:$pre_release, security update"] = [ 'site_patch_version' => $pre_release, 'expected_security_releases' => $pre_release === '2.0-rc2' ? [] : ['2.0-rc2'], 'expected_update_message_type' => $pre_release === '2.0-rc2' ? static::UPDATE_NONE : static::SECURITY_UPDATE_REQUIRED, 'fixture' => 'sec.8.2.0-rc2', ]; } return $test_cases; } }