diff --git a/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php b/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php index e6a832537889e05be7c8b9c4641074ee9c3258dc..ac778868ba49fdd8f4503c048896b934cc379936 100644 --- a/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php +++ b/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php @@ -6,7 +6,6 @@ use Drupal\package_manager\ProjectInfo; use Drupal\automatic_updates_extensions\ExtensionUpdater; use Drupal\package_manager\LegacyVersionUtility; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\package_manager\Event\PreApplyEvent; use Drupal\package_manager\Event\PreCreateEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -63,43 +62,6 @@ final class UpdateReleaseValidator implements EventSubscriberInterface { return FALSE; } - /** - * Checks that the packages are secure and supported. - * - * @param \Drupal\package_manager\Event\PreApplyEvent $event - * The event object. - */ - public function checkStagedReleases(PreApplyEvent $event): void { - $messages = []; - - // Get packages that were installed and also updated in the staging area. - $active = $event->getStage()->getActiveComposer(); - $staged = $event->getStage()->getStageComposer(); - $updated_packages = $staged->getPackagesWithDifferentVersionsIn($active); - foreach ($updated_packages as $staged_package) { - if (!in_array($staged_package->getType(), - ['drupal-module', 'drupal-theme'], TRUE)) { - continue; - } - $project_name = $staged->getProjectForPackage($staged_package->getName()); - $semantic_version = $staged_package->getPrettyVersion(); - if (!$this->isSupportedRelease($project_name, $semantic_version)) { - $messages[] = $this->t('Project @project_name to version @version', [ - '@project_name' => $project_name, - '@version' => $semantic_version, - ]); - } - } - if ($messages) { - $summary = $this->formatPlural( - count($messages), - 'Cannot update because the following project version is not in the list of installable releases.', - 'Cannot update because the following project versions are not in the list of installable releases.' - ); - $event->addError($messages, $summary); - } - } - /** * Checks that the update projects are secure and supported. * @@ -144,7 +106,6 @@ final class UpdateReleaseValidator implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ PreCreateEvent::class => 'checkRelease', - PreApplyEvent::class => 'checkStagedReleases', ]; } diff --git a/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php b/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php index c610ed11239b6874e35bf2bae1a53d15590912d8..14c5cddb47259ea4e402818e9496e4cf67f76cb3 100644 --- a/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php +++ b/automatic_updates_extensions/tests/src/Kernel/AutomaticUpdatesExtensionsKernelTestBase.php @@ -19,7 +19,7 @@ abstract class AutomaticUpdatesExtensionsKernelTestBase extends AutomaticUpdates */ protected static $modules = [ 'automatic_updates_extensions', - 'automatic_updates_test_release_history', + 'package_manager_test_release_history', ]; /** diff --git a/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php b/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php index a7fc66d7b7357e989e18f00cdbcea36d762ca348..42c3068a9f4e8187bb7d253f7610c661e0141f03 100644 --- a/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php +++ b/automatic_updates_extensions/tests/src/Kernel/Validator/PackagesInstalledWithComposerValidatorTest.php @@ -22,6 +22,7 @@ class PackagesInstalledWithComposerValidatorTest extends AutomaticUpdatesExtensi // In this test, we don't care whether the updated projects are secure and // supported. $this->disableValidators[] = 'automatic_updates_extensions.validator.target_release'; + $this->disableValidators[] = 'package_manager.validator.supported_releases'; // @todo The validator being tested covers the same cases as the following // validator. PackagesInstalledWithComposerValidatorTest will be removed // in https://drupal.org/i/3303900. diff --git a/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php b/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php index 0c6918e2d8cc49c1fc8382fa8a6241a9abe400f7..b83fc5b7d9616390f7db02a91da2e48ee2fe9625 100644 --- a/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php +++ b/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php @@ -3,7 +3,6 @@ namespace Drupal\Tests\automatic_updates_extensions\Kernel\Validator; use Drupal\package_manager\LegacyVersionUtility; -use Drupal\package_manager\Event\PreApplyEvent; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\ValidationResult; use Drupal\Tests\automatic_updates_extensions\Kernel\AutomaticUpdatesExtensionsKernelTestBase; @@ -80,80 +79,4 @@ class UpdateReleaseValidatorTest extends AutomaticUpdatesExtensionsKernelTestBas $this->assertUpdateResults([$project => $target_version], $expected_results, PreCreateEvent::class); } - /** - * Data provider for testPreApplyException(). - * - * @return mixed[][] - * The test cases. - */ - public function providerTestPreApplyException(): array { - $fixtures_folder = __DIR__ . '/../../../fixtures/update_release_validator'; - return [ - 'semver, supported update' => ['semver_test', '8.1.0', '8.1.1', "$fixtures_folder/semver_supported_update_stage", FALSE], - 'semver, update to unsupported branch' => ['semver_test', '8.1.0', '8.2.0', "$fixtures_folder/semver_unsupported_update_stage", TRUE], - 'legacy, supported update' => ['aaa_update_test', '8.x-2.0', '8.x-2.1', "$fixtures_folder/legacy_supported_update_stage", FALSE], - 'legacy, update to unsupported branch' => ['aaa_update_test', '8.x-2.0', '8.x-3.0', "$fixtures_folder/legacy_unsupported_update_stage", TRUE], - ]; - } - - /** - * Tests updating to a release during pre-apply. - * - * @param string $project - * The project to update. - * @param string $installed_version - * The installed version of the project. - * @param string $target_version - * The target version. - * @param string $stage_dir - * Path of fixture stage directory. It will be used as the virtual project's - * stage directory. - * @param bool $error_expected - * Whether an error is expected in the update. - * - * @dataProvider providerTestPreApplyException - */ - public function testPreApplyException(string $project, string $installed_version, string $target_version, string $stage_dir, bool $error_expected): void { - $this->enableModules(['aaa_automatic_updates_test', $project]); - - $module_info = ['version' => $installed_version, 'project' => $project]; - $aaa_automatic_updates_test_info = ['version' => '7.0.0', 'project' => 'aaa_automatic_updates_test']; - $this->config('update_test.settings') - ->set("system_info.$project", $module_info) - ->set("system_info.aaa_automatic_updates_test", $aaa_automatic_updates_test_info) - ->save(); - - // Path of `active.installed.json` file. It will be used as the virtual - // project's active `vendor/composer/installed.json` file. - $this->setReleaseMetadata([ - 'aaa_automatic_updates_test' => __DIR__ . "/../../../../../package_manager/tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml", - $project => __DIR__ . "/../../../fixtures/release-history/$project.1.1.xml", - 'drupal' => __DIR__ . '/../../../../../package_manager/tests/fixtures/release-history/drupal.9.8.2.xml', - ]); - $active_dir = __DIR__ . '/../../../fixtures/update_release_validator/active'; - $this->copyFixtureFolderToActiveDirectory($active_dir); - $this->copyFixtureFolderToStageDirectoryOnApply($stage_dir); - if ($error_expected) { - $expected_results = [ - ValidationResult::createError( - ["Project $project to version " . LegacyVersionUtility::convertToSemanticVersion($target_version)], - t('Cannot update because the following project version is not in the list of installable releases.') - ), - ]; - } - else { - $expected_results = []; - } - - // Always updating aaa_automatic_updates_test to 7.0.1(valid release) along - // with the project provided for test. - $this->assertUpdateResults( - [ - 'aaa_automatic_updates_test' => '7.0.1', - ], - $expected_results, - PreApplyEvent::class - ); - } - } diff --git a/package_manager/package_manager.services.yml b/package_manager/package_manager.services.yml index 50edf6afdb8f80cde92251aec69d2543a5c15d24..cb63a5f1b1a540da2192652eaafbbb63834b4b59 100644 --- a/package_manager/package_manager.services.yml +++ b/package_manager/package_manager.services.yml @@ -179,6 +179,10 @@ services: class: Drupal\package_manager\Validator\ComposerPatchesValidator tags: - { name: event_subscriber } + package_manager.validator.supported_releases: + class: Drupal\package_manager\Validator\SupportedReleaseValidator + tags: + - { name: event_subscriber } package_manager.update_processor: class: Drupal\package_manager\PackageManagerUpdateProcessor arguments: [ '@config.factory', '@queue', '@update.fetcher', '@state', '@private_key', '@keyvalue', '@keyvalue.expirable' ] diff --git a/package_manager/src/Validator/SupportedReleaseValidator.php b/package_manager/src/Validator/SupportedReleaseValidator.php new file mode 100644 index 0000000000000000000000000000000000000000..780cda00ceb8983717a85099502badb9ad82d8af --- /dev/null +++ b/package_manager/src/Validator/SupportedReleaseValidator.php @@ -0,0 +1,126 @@ +<?php + +namespace Drupal\package_manager\Validator; + +use Drupal\Component\Render\FormattableMarkup; +use Drupal\package_manager\ProjectInfo; +use Drupal\package_manager\LegacyVersionUtility; +use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\package_manager\Event\PreApplyEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * Validates that updated projects are secure and supported. + * + * @internal + * This class is an internal part of the module's update handling and + * should not be used by external code. + */ +final class SupportedReleaseValidator implements EventSubscriberInterface { + + use StringTranslationTrait; + + /** + * Checks if the given version of a project is supported. + * + * Checks if the given version of the given project is in the core update + * system's list of known, secure, installable releases of that project. + * considered a supported release by verifying if the project is found in the + * core update system's list of known, secure, and installable releases. + * + * @param string $name + * The name of the project. + * @param string $semantic_version + * A semantic version number for the project. + * + * @return bool + * TRUE if the given version of the project is supported, otherwise FALSE. + * given version is not supported will return FALSE. + */ + protected function isSupportedRelease(string $name, string $semantic_version): bool { + $supported_releases = (new ProjectInfo($name))->getInstallableReleases(); + if (!$supported_releases) { + return FALSE; + } + + // If this version is found in the list of installable releases, it is + // secured and supported. + if (array_key_exists($semantic_version, $supported_releases)) { + return TRUE; + } + // If the semantic version number wasn't in the list of + // installable releases, convert it to a legacy version number and see + // if the version number is in the list. + $legacy_version = LegacyVersionUtility::convertToLegacyVersion($semantic_version); + if ($legacy_version && array_key_exists($legacy_version, $supported_releases)) { + return TRUE; + } + // Neither the semantic version nor the legacy version are in the list + // of installable releases, so the release isn't supported. + return FALSE; + } + + /** + * Checks that the packages are secure and supported. + * + * @param \Drupal\package_manager\Event\PreApplyEvent $event + * The event object. + */ + public function checkStagedReleases(PreApplyEvent $event): void { + $active = $event->getStage()->getActiveComposer(); + $staged = $event->getStage()->getStageComposer(); + $updated_packages = array_merge( + $staged->getPackagesNotIn($active), + $staged->getPackagesWithDifferentVersionsIn($active) + ); + $unknown_packages = []; + $unsupported_packages = []; + foreach ($updated_packages as $package_name => $staged_package) { + // Only packages of the types 'drupal-module' or 'drupal-theme' that + // start with 'drupal/' will have update XML from drupal.org. + if (!in_array($staged_package->getType(), ['drupal-module', 'drupal-theme'], TRUE) + || !str_starts_with($package_name, 'drupal/')) { + continue; + } + $project_name = $staged->getProjectForPackage($package_name); + if (empty($project_name)) { + $unknown_packages[] = $package_name; + continue; + } + $semantic_version = $staged_package->getPrettyVersion(); + if (!$this->isSupportedRelease($project_name, $semantic_version)) { + $unsupported_packages[] = new FormattableMarkup('@project_name (@package_name) @version', [ + '@project_name' => $project_name, + '@package_name' => $package_name, + '@version' => $semantic_version, + ]); + } + } + if ($unsupported_packages) { + $summary = $this->formatPlural( + count($unsupported_packages), + 'Cannot update because the following project version is not in the list of installable releases.', + 'Cannot update because the following project versions are not in the list of installable releases.' + ); + $event->addError($unsupported_packages, $summary); + } + if ($unknown_packages) { + $summary = $this->formatPlural( + count($unknown_packages), + 'Cannot update because the following new or updated Drupal package does not have project information.', + 'Cannot update because the following new or updated Drupal packages do not have project information.', + ); + $event->addError($unknown_packages, $summary); + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + return [ + PreApplyEvent::class => 'checkStagedReleases', + ]; + } + +} diff --git a/package_manager/tests/fixtures/release-history/aaa_update_test.1.1.xml b/package_manager/tests/fixtures/release-history/aaa_update_test.1.1.xml new file mode 100644 index 0000000000000000000000000000000000000000..2451a4bd4f0390ef183974f615d162bb0382152d --- /dev/null +++ b/package_manager/tests/fixtures/release-history/aaa_update_test.1.1.xml @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Test legacy versions --> +<project xmlns:dc="http://purl.org/dc/elements/1.1/"> +<title>AAA Update test</title> +<short_name>aaa_update_test</short_name> +<dc:creator>Drupal</dc:creator> +<supported_branches>8.x-2.,8.x-1.</supported_branches> +<project_status>published</project_status> +<link>http://example.com/project/aaa_update_test</link> + <terms> + <term><name>Projects</name><value>AAA Update test project</value></term> + </terms> +<releases> + <release> + <name>AAA Update test 8.x-3.0</name> + <version>8.x-3.0</version> + <tag>8.x-3.0</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-3-0-release</release_link> + <download_link>http://example.com/aaa_update_test-8-3-0.tar.gz</download_link> + <date>1584195300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-2.1</name> + <version>8.x-2.1</version> + <tag>8.x-2.1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-2-1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-2-1.tar.gz</download_link> + <date>1581603300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-2.1-beta1</name> + <version>8.x-2.1-beta1</version> + <tag>8.x-2.1-beta1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-2-1-beta1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-2-1-beta1.tar.gz</download_link> + <date>1579011300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-2.1-alpha1</name> + <version>8.x-2.1-alpha1</version> + <tag>8.x-2.1-alpha1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-2-1-alpha1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-2-1-alpha1.tar.gz</download_link> + <date>1576419300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-2.0</name> + <version>8.x-2.0</version> + <tag>8.x-2.0</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-2-0-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-2-0.tar.gz</download_link> + <date>1573827300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-2.0-beta1</name> + <version>8.x-2.0-beta1</version> + <tag>8.x-2.0-beta1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-2-0-beta1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-2-0-beta1.tar.gz</download_link> + <date>1571235300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-2.0-alpha1</name> + <version>8.x-2.0-alpha1</version> + <tag>8.x-2.0-alpha1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-2-0-alpha1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-2-0-alpha1.tar.gz</download_link> + <date>1568643300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-1.1</name> + <version>8.x-1.1</version> + <tag>8.x-1.1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-1-1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-1-1.tar.gz</download_link> + <date>1566051300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-1.1-beta1</name> + <version>8.x-1.1-beta1</version> + <tag>8.x-1.1-beta1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-1-1-beta1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-1-1-beta1.tar.gz</download_link> + <date>1563459300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-1.1-alpha1</name> + <version>8.x-1.1-alpha1</version> + <tag>8.x-1.1-alpha1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-1-1-alpha1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-1-1-alpha1.tar.gz</download_link> + <date>1560867300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-1.0</name> + <version>8.x-1.0</version> + <tag>8.x-1.0</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-1-0-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-1-0.tar.gz</download_link> + <date>1558275300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-1.0-beta1</name> + <version>8.x-1.0-beta1</version> + <tag>8.x-1.0-beta1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-1-0-beta1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-1-0-beta1.tar.gz</download_link> + <date>1555683300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>AAA Update test 8.x-1.0-alpha1</name> + <version>8.x-1.0-alpha1</version> + <tag>8.x-1.0-alpha1</tag> + <status>published</status> + <release_link>http://example.com/aaa_update_test-8-x-1-0-alpha1-release</release_link> + <download_link>http://example.com/aaa_update_test-8-x-1-0-alpha1.tar.gz</download_link> + <date>1553091300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> +</releases> +</project> diff --git a/package_manager/tests/fixtures/release-history/alpha.1.1.0.xml b/package_manager/tests/fixtures/release-history/alpha.1.1.0.xml new file mode 100644 index 0000000000000000000000000000000000000000..1bcdbbad801481b4431aad8eb2a5c8288ddfad52 --- /dev/null +++ b/package_manager/tests/fixtures/release-history/alpha.1.1.0.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<project xmlns:dc="http://purl.org/dc/elements/1.1/"> +<title>Alpha</title> +<short_name>alpha</short_name> +<dc:creator>Drupal</dc:creator> +<supported_branches>1.1.,1.0.</supported_branches> +<project_status>published</project_status> +<link>http://example.com/project/alpha</link> + <terms> + <term><name>Projects</name><value>Alpha project</value></term> + </terms> +<releases> + <release> + <name>Alpha 1.1.0</name> + <version>1.1.0</version> + <tag>1.1.0</tag> + <status>published</status> + <release_link>http://example.com/alpha-1-1-0-release</release_link> + <download_link>http://example.com/alpha-1-1-0.tar.gz</download_link> + <date>1584195300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Alpha 1.0.0</name> + <version>1.0.0</version> + <tag>1.0.0</tag> + <status>published</status> + <release_link>http://example.com/alpha-1-0-0-release</release_link> + <download_link>http://example.com/alpha-1-0-0.tar.gz</download_link> + <date>1581603300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> +</releases> +</project> diff --git a/package_manager/tests/fixtures/release-history/semver_test.1.1.xml b/package_manager/tests/fixtures/release-history/semver_test.1.1.xml new file mode 100644 index 0000000000000000000000000000000000000000..addca0b25be665a50c2a4cc62e027c6b274b0e08 --- /dev/null +++ b/package_manager/tests/fixtures/release-history/semver_test.1.1.xml @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="utf-8"?> +<project xmlns:dc="http://purl.org/dc/elements/1.1/"> +<title>Semver Test</title> +<short_name>semver_test</short_name> +<dc:creator>Drupal</dc:creator> +<supported_branches>8.0.,8.1.</supported_branches> +<project_status>published</project_status> +<link>http://example.com/project/semver_test</link> + <terms> + <term><name>Projects</name><value>Semver Test project</value></term> + </terms> +<releases> + <release> + <name>Semver Test 8.2.0</name> + <version>8.2.0</version> + <tag>8.2.0</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-2-0-release</release_link> + <download_link>http://example.com/semver_test-8-2-0.tar.gz</download_link> + <date>1584195300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.1.1</name> + <version>8.1.1</version> + <tag>8.1.1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-1-1-release</release_link> + <download_link>http://example.com/semver_test-8-1-1.tar.gz</download_link> + <date>1581603300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.1.1-beta1</name> + <version>8.1.1-beta1</version> + <tag>8.1.1-beta1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-1-1-beta1-release</release_link> + <download_link>http://example.com/semver_test-8-1-1-beta1.tar.gz</download_link> + <date>1579011300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.1.1-alpha1</name> + <version>8.1.1-alpha1</version> + <tag>8.1.1-alpha1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-1-1-alpha1-release</release_link> + <download_link>http://example.com/semver_test-8-1-1-alpha1.tar.gz</download_link> + <date>1576419300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.1.0</name> + <version>8.1.0</version> + <tag>8.1.0</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-1-0-release</release_link> + <download_link>http://example.com/semver_test-8-1-0.tar.gz</download_link> + <date>1573827300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.1.0-beta1</name> + <version>8.1.0-beta1</version> + <tag>8.1.0-beta1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-1-0-beta1-release</release_link> + <download_link>http://example.com/semver_test-8-1-0-beta1.tar.gz</download_link> + <date>1571235300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.1.0-alpha1</name> + <version>8.1.0-alpha1</version> + <tag>8.1.0-alpha1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-1-0-alpha1-release</release_link> + <download_link>http://example.com/semver_test-8-1-0-alpha1.tar.gz</download_link> + <date>1568643300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.0.1</name> + <version>8.0.1</version> + <tag>8.0.1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-0-1-release</release_link> + <download_link>http://example.com/semver_test-8-0-1.tar.gz</download_link> + <date>1566051300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.0.1-beta1</name> + <version>8.0.1-beta1</version> + <tag>8.0.1-beta1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-0-1-beta1-release</release_link> + <download_link>http://example.com/semver_test-8-0-1-beta1.tar.gz</download_link> + <date>1563459300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.0.1-alpha1</name> + <version>8.0.1-alpha1</version> + <tag>8.0.1-alpha1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-0-1-alpha1-release</release_link> + <download_link>http://example.com/semver_test-8-0-1-alpha1.tar.gz</download_link> + <date>1560867300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.0.0</name> + <version>8.0.0</version> + <tag>8.0.0</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-0-0-release</release_link> + <download_link>http://example.com/semver_test-8-0-0.tar.gz</download_link> + <date>1558275300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.0.0-beta1</name> + <version>8.0.0-beta1</version> + <tag>8.0.0-beta1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-0-0-beta1-release</release_link> + <download_link>http://example.com/semver_test-8-0-0-beta1.tar.gz</download_link> + <date>1555683300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Semver Test 8.0.0-alpha1</name> + <version>8.0.0-alpha1</version> + <tag>8.0.0-alpha1</tag> + <status>published</status> + <release_link>http://example.com/semver_test-8-0-0-alpha1-release</release_link> + <download_link>http://example.com/semver_test-8-0-0-alpha1.tar.gz</download_link> + <date>1553091300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> +</releases> +</project> diff --git a/package_manager/tests/fixtures/release-history/updated_module.1.1.0.xml b/package_manager/tests/fixtures/release-history/updated_module.1.1.0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b8aaf22c6e50e65bbce4b2d9bb22177172f4f330 --- /dev/null +++ b/package_manager/tests/fixtures/release-history/updated_module.1.1.0.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<project xmlns:dc="http://purl.org/dc/elements/1.1/"> +<title>Updated Module</title> +<short_name>updated_module</short_name> +<dc:creator>Drupal</dc:creator> +<supported_branches>1.1.,1.0.</supported_branches> +<project_status>published</project_status> +<link>http://example.com/project/alpha</link> + <terms> + <term><name>Projects</name><value>Updated Module project</value></term> + </terms> +<releases> + <release> + <name>Updated Module 1.1.0</name> + <version>1.1.0</version> + <tag>1.1.0</tag> + <status>published</status> + <release_link>http://example.com/updated_module-1-1-0-release</release_link> + <download_link>http://example.com/updated_module-1-1-0.tar.gz</download_link> + <date>1584195300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> + <release> + <name>Updated Module 1.0.0</name> + <version>1.0.0</version> + <tag>1.0.0</tag> + <status>published</status> + <release_link>http://example.com/updated_module-1-0-0-release</release_link> + <download_link>http://example.com/updated_module-1-0-0.tar.gz</download_link> + <date>1581603300</date> + <terms> + <term><name>Release type</name><value>New features</value></term> + <term><name>Release type</name><value>Bug fixes</value></term> + </terms> + </release> +</releases> +</project> diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..8215de0b462a258714e2ebb3b9624da096742794 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide @@ -0,0 +1 @@ +project: aaa_automatic_updates_test diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.json new file mode 100644 index 0000000000000000000000000000000000000000..e2e49f1fc08a7951d2e53a0c5420aa9c972a43d3 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.json @@ -0,0 +1,25 @@ +{ + "packages": [ + { + "name": "drupal/core-recommended", + "version": "9.8.0", + "require": { + "drupal/core": "9.8.0" + } + }, + { + "name": "drupal/core", + "version": "9.8.0" + }, + { + "name": "drupal/dependency", + "version": "9.8.1", + "type": "drupal-library" + }, + { + "name": "drupal/aaa_automatic_updates_test", + "version": "7.0.1", + "type": "drupal-module" + } + ] +} diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..3615e159a244713222feaaccf897438f6487cf34 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_supported_update_stage/vendor/composer/installed.php @@ -0,0 +1,16 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/aaa_automatic_updates_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/aaa_automatic_updates_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..8215de0b462a258714e2ebb3b9624da096742794 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/modules/aaa_automatic_updates_test/aaa_automatic_updates_test.info.yml.hide @@ -0,0 +1 @@ +project: aaa_automatic_updates_test diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.json new file mode 100644 index 0000000000000000000000000000000000000000..67af3dbbccc1b9fd56e24b8c5741649500f770d0 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.json @@ -0,0 +1,25 @@ +{ + "packages": [ + { + "name": "drupal/core-recommended", + "version": "9.8.0", + "require": { + "drupal/core": "9.8.0" + } + }, + { + "name": "drupal/core", + "version": "9.8.0" + }, + { + "name": "drupal/dependency", + "version": "9.8.1", + "type": "drupal-library" + }, + { + "name": "drupal/aaa_automatic_updates_test", + "version": "7.0.1-dev", + "type": "drupal-module" + } + ] +} diff --git a/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..3615e159a244713222feaaccf897438f6487cf34 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/aaa_automatic_updates_test_unsupported_update_stage/vendor/composer/installed.php @@ -0,0 +1,16 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/aaa_automatic_updates_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/aaa_automatic_updates_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/supported_release_validator/active/modules/aaa_update_test/aaa_update_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/active/modules/aaa_update_test/aaa_update_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..b2d1f884d4a007ebd07dc00b3e46a8c5d098918d --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/active/modules/aaa_update_test/aaa_update_test.info.yml.hide @@ -0,0 +1 @@ +project: aaa_update_test diff --git a/package_manager/tests/fixtures/supported_release_validator/active/modules/semver_test/semver_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/active/modules/semver_test/semver_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..6175b81a041a98520a59f20ff0e1bce7b659cacd --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/active/modules/semver_test/semver_test.info.yml.hide @@ -0,0 +1 @@ +project: semver_test diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/active/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.json similarity index 82% rename from automatic_updates_extensions/tests/fixtures/update_release_validator/active/vendor/composer/installed.json rename to package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.json index 4e077b457077d987dbbfdc465ca7ba5cf56f9454..f243b4a216a8f47b2802e3ae34c0bd2bbc7e85d4 100644 --- a/automatic_updates_extensions/tests/fixtures/update_release_validator/active/vendor/composer/installed.json +++ b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.json @@ -16,11 +16,6 @@ "version": "9.8.0", "type": "drupal-library" }, - { - "name": "drupal/aaa_automatic_updates_test", - "version": "7.0.0", - "type": "drupal-module" - }, { "name": "drupal/aaa_update_test", "version": "2.0.0", diff --git a/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..4b9371be01a0fd1a5cdb7c6c9a05fea544e586b3 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/active/vendor/composer/installed.php @@ -0,0 +1,20 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/semver_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/semver_test', + ], + 'drupal/aaa_update_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/aaa_update_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..b2d1f884d4a007ebd07dc00b3e46a8c5d098918d --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide @@ -0,0 +1 @@ +project: aaa_update_test diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_supported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.json similarity index 100% rename from automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_supported_update_stage/vendor/composer/installed.json rename to package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.json diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..badfa21a19596c4e48162dd0afa57537f78fd4f5 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/legacy_supported_update_stage/vendor/composer/installed.php @@ -0,0 +1,16 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/aaa_update_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/aaa_update_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..b2d1f884d4a007ebd07dc00b3e46a8c5d098918d --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/modules/aaa_update_test/aaa_update_test.info.yml.hide @@ -0,0 +1 @@ +project: aaa_update_test diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json similarity index 100% rename from automatic_updates_extensions/tests/fixtures/update_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json rename to package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.json diff --git a/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..badfa21a19596c4e48162dd0afa57537f78fd4f5 --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/legacy_unsupported_update_stage/vendor/composer/installed.php @@ -0,0 +1,16 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/aaa_update_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/aaa_update_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/modules/semver_test/semver_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/modules/semver_test/semver_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..6175b81a041a98520a59f20ff0e1bce7b659cacd --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/modules/semver_test/semver_test.info.yml.hide @@ -0,0 +1 @@ +project: semver_test diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/semver_supported_update_stage/composer/vendor/installed.json b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.json similarity index 100% rename from automatic_updates_extensions/tests/fixtures/update_release_validator/semver_supported_update_stage/composer/vendor/installed.json rename to package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.json diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..ed3212d4688ae6d507442567b6792864b2ce033c --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/semver_supported_update_stage/vendor/composer/installed.php @@ -0,0 +1,16 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/semver_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/semver_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/modules/semver_test/semver_test.info.yml.hide b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/modules/semver_test/semver_test.info.yml.hide new file mode 100644 index 0000000000000000000000000000000000000000..6175b81a041a98520a59f20ff0e1bce7b659cacd --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/modules/semver_test/semver_test.info.yml.hide @@ -0,0 +1 @@ +project: semver_test diff --git a/automatic_updates_extensions/tests/fixtures/update_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json similarity index 100% rename from automatic_updates_extensions/tests/fixtures/update_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json rename to package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.json diff --git a/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.php b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.php new file mode 100644 index 0000000000000000000000000000000000000000..ed3212d4688ae6d507442567b6792864b2ce033c --- /dev/null +++ b/package_manager/tests/fixtures/supported_release_validator/semver_unsupported_update_stage/vendor/composer/installed.php @@ -0,0 +1,16 @@ +<?php + +/** + * @file + * Lists packages installed by Composer. + */ + +$projects_dir = __DIR__ . '/../../modules'; +return [ + 'versions' => [ + 'drupal/semver_test' => [ + 'type' => 'drupal-module', + 'install_path' => $projects_dir . '/semver_test', + ], + ], +]; diff --git a/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml b/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml.hide similarity index 86% rename from package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml rename to package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml.hide index ebf1452ec9c88c23a25d6451946844b21b7a4228..5d31bbdb5a80a68434488753a0dc6902949446f6 100644 --- a/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml +++ b/package_manager/tests/fixtures/updated_module/1.0.0/updated_module.info.yml.hide @@ -2,3 +2,4 @@ name: 'Updated module' description: 'A module which will change during an update, to ensure that the changes are picked up.' type: module package: Testing +project: updated_module diff --git a/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml b/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml.hide similarity index 86% rename from package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml rename to package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml.hide index ebf1452ec9c88c23a25d6451946844b21b7a4228..5d31bbdb5a80a68434488753a0dc6902949446f6 100644 --- a/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml +++ b/package_manager/tests/fixtures/updated_module/1.1.0/updated_module.info.yml.hide @@ -2,3 +2,4 @@ name: 'Updated module' description: 'A module which will change during an update, to ensure that the changes are picked up.' type: module package: Testing +project: updated_module diff --git a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.info.yml b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.info.yml similarity index 78% rename from tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.info.yml rename to package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.info.yml index a66c6682cc213647015759d225ae708a87cff496..ecf8c8e6122e9648240eaf05ea07c18886336bda 100644 --- a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.info.yml +++ b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.info.yml @@ -1,4 +1,4 @@ -name: 'Automatic Updates Test - Release history' +name: 'Package Manager Test Release history' type: module description: 'Provides a mechanism for serving fake release history metadata in functional tests.' package: Testing diff --git a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.routing.yml b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.routing.yml similarity index 55% rename from tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.routing.yml rename to package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.routing.yml index 2adff0876e3a259893a47df3fe6ac9d323bf94ab..df0b40c617810dcf79a62e863901c2c24e79855d 100644 --- a/tests/modules/automatic_updates_test_release_history/automatic_updates_test_release_history.routing.yml +++ b/package_manager/tests/modules/package_manager_test_release_history/package_manager_test_release_history.routing.yml @@ -1,8 +1,8 @@ -automatic_updates_test_release_history.metadata: +package_manager_test_release_history.metadata: path: '/test-release-history/{project_name}/{version}' defaults: _title: 'Update test' - _controller: '\Drupal\automatic_updates_test_release_history\TestController::metadata' + _controller: '\Drupal\package_manager_test_release_history\TestController::metadata' requirements: _access: 'TRUE' options: diff --git a/tests/modules/automatic_updates_test_release_history/src/TestController.php b/package_manager/tests/modules/package_manager_test_release_history/src/TestController.php similarity index 96% rename from tests/modules/automatic_updates_test_release_history/src/TestController.php rename to package_manager/tests/modules/package_manager_test_release_history/src/TestController.php index 5cdd3a1729d965e3f66f16b1e0e3f415f0e2340b..b56375abde8ad6e9a65c4b969d9569ecaaa28b1b 100644 --- a/tests/modules/automatic_updates_test_release_history/src/TestController.php +++ b/package_manager/tests/modules/package_manager_test_release_history/src/TestController.php @@ -1,6 +1,6 @@ <?php -namespace Drupal\automatic_updates_test_release_history; +namespace Drupal\package_manager_test_release_history; use Drupal\Core\Controller\ControllerBase; use Symfony\Component\HttpFoundation\BinaryFileResponse; diff --git a/package_manager/tests/src/Build/PackageInstallTest.php b/package_manager/tests/src/Build/PackageInstallTest.php index 831e62375955f8205c83a1f10b25b6f99eb3b841..46b2c6289289a3d63ac0a8b3d918f12271674c26 100644 --- a/package_manager/tests/src/Build/PackageInstallTest.php +++ b/package_manager/tests/src/Build/PackageInstallTest.php @@ -15,11 +15,10 @@ class PackageInstallTest extends TemplateProjectTestBase { public function testPackageInstall(): void { $this->createTestProject('RecommendedProject'); - $this->addRepository('alpha', __DIR__ . '/../../fixtures/alpha/1.0.0'); - - $this->installQuickStart('minimal'); - $this->formLogin($this->adminUsername, $this->adminPassword); - $this->installModules(['package_manager_test_api']); + $this->setReleaseMetadata([ + 'alpha' => __DIR__ . '/../../fixtures/release-history/alpha.1.1.0.xml', + ]); + $this->addRepository('alpha', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/alpha/1.0.0')); // Use the API endpoint to create a stage and install alpha 1.0.0. We ask // the API to return the contents of composer.json file of installed module, diff --git a/package_manager/tests/src/Build/PackageUpdateTest.php b/package_manager/tests/src/Build/PackageUpdateTest.php index 120f59b6a1466139fea373cfdecda48f0f2c890b..336f51e8b1a732d8211257f6fc9184da630a11c8 100644 --- a/package_manager/tests/src/Build/PackageUpdateTest.php +++ b/package_manager/tests/src/Build/PackageUpdateTest.php @@ -15,19 +15,20 @@ class PackageUpdateTest extends TemplateProjectTestBase { public function testPackageUpdate(): void { $this->createTestProject('RecommendedProject'); - $this->addRepository('alpha', __DIR__ . '/../../fixtures/alpha/1.0.0'); - $this->addRepository('updated_module', __DIR__ . '/../../fixtures/updated_module/1.0.0'); + $this->addRepository('alpha', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/alpha/1.0.0')); + $this->addRepository('updated_module', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/updated_module/1.0.0')); + $this->setReleaseMetadata([ + 'updated_module' => __DIR__ . '/../../fixtures/release-history/updated_module.1.1.0.xml', + ]); $this->runComposer('COMPOSER_MIRROR_PATH_REPOS=1 composer require drupal/alpha drupal/updated_module --update-with-all-dependencies', 'project'); - $this->installQuickStart('minimal'); - $this->formLogin($this->adminUsername, $this->adminPassword); // The updated_module provides actual Drupal-facing functionality that we're // testing as well, so we need to install it. - $this->installModules(['package_manager_test_api', 'updated_module']); + $this->installModules(['updated_module']); // Change both modules' upstream version. - $this->addRepository('alpha', __DIR__ . '/../../fixtures/alpha/1.1.0'); - $this->addRepository('updated_module', __DIR__ . '/../../fixtures/updated_module/1.1.0'); + $this->addRepository('alpha', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/alpha/1.1.0')); + $this->addRepository('updated_module', $this->copyFixtureToTempDirectory(__DIR__ . '/../../fixtures/updated_module/1.1.0')); // Use the API endpoint to create a stage and update updated_module to // 1.1.0. Even though both modules have version 1.1.0 available, only diff --git a/package_manager/tests/src/Build/TemplateProjectTestBase.php b/package_manager/tests/src/Build/TemplateProjectTestBase.php index ed711eabffcb5d45d8230f598cfb6a301452c15b..c4de1dc5d65e9326abf4c10ebe913d72006386c6 100644 --- a/package_manager/tests/src/Build/TemplateProjectTestBase.php +++ b/package_manager/tests/src/Build/TemplateProjectTestBase.php @@ -4,6 +4,8 @@ namespace Drupal\Tests\package_manager\Build; use Drupal\BuildTests\QuickStart\QuickStartTestBase; use Drupal\Composer\Composer; +use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait; +use Drupal\Tests\RandomGeneratorTrait; /** * Base class for tests which create a test site from a core project template. @@ -15,6 +17,9 @@ use Drupal\Composer\Composer; */ abstract class TemplateProjectTestBase extends QuickStartTestBase { + use FixtureUtilityTrait; + use RandomGeneratorTrait; + /** * The web root of the test site, relative to the workspace directory. * @@ -22,6 +27,23 @@ abstract class TemplateProjectTestBase extends QuickStartTestBase { */ private $webRoot; + /** + * A secondary server instance, to serve XML metadata about available updates. + * + * @var \Symfony\Component\Process\Process + */ + private $metadataServer; + + /** + * {@inheritdoc} + */ + protected function tearDown(): void { + if ($this->metadataServer) { + $this->metadataServer->stop(); + } + parent::tearDown(); + } + /** * Data provider for tests which use all of the core project templates. * @@ -136,6 +158,19 @@ END; $this->runComposer("composer config repo.$name '$repository'", $working_directory); } + /** + * Prepares the test site to serve an XML feed of available release metadata. + * + * @param array $xml_map + * The update XML map, as used by update_test.settings. + * + * @see \Drupal\automatic_updates_test\TestController::metadata() + */ + protected function setReleaseMetadata(array $xml_map): void { + $xml_map = var_export($xml_map, TRUE); + $this->writeSettings("\$config['update_test.settings']['xml_map'] = $xml_map;"); + } + /** * Creates a test project from a given template and installs Drupal. * @@ -225,6 +260,28 @@ END; $this->assertStringNotContainsString('Symlinking', $output); } // END: DELETE FROM CORE MERGE REQUEST + + // Install Drupal. + $this->installQuickStart('minimal'); + $this->formLogin($this->adminUsername, $this->adminPassword); + + // When checking for updates, we need to be able to make sub-requests, but + // the built-in PHP server is single-threaded. Therefore, open a second + // server instance on another port, which will serve the metadata about + // available updates. + $port = $this->findAvailablePort(); + $this->metadataServer = $this->instantiateServer($port); + $code = <<<END +\$config['automatic_updates.settings']['cron_port'] = $port; +\$config['update.settings']['fetch']['url'] = 'http://localhost:$port/test-release-history'; +END; + $this->writeSettings($code); + + // Install helpful modules. + $this->installModules([ + 'package_manager_test_api', + 'package_manager_test_release_history', + ]); } /** @@ -366,6 +423,21 @@ END; } } + /** + * Copies a fixture directory to a temporary directory and returns its path. + * + * @param string $fixture_directory + * The fixture directory. + * + * @return string + * The temporary directory. + */ + protected function copyFixtureToTempDirectory(string $fixture_directory): string { + $temp_directory = $this->getWorkspaceDirectory() . '/fixtures_temp_' . $this->randomMachineName(20); + static::copyFixtureFilesTo($fixture_directory, $temp_directory); + return $temp_directory; + } + // BEGIN: DELETE FROM CORE MERGE REQUEST /** diff --git a/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php b/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php index a757fc9e048ef57a7fc58de1e220e61a7cee036e..7eae32bb717f9e49e8e19e1ae59f3510b8f00286 100644 --- a/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php +++ b/package_manager/tests/src/Kernel/OverwriteExistingPackagesValidatorTest.php @@ -12,6 +12,16 @@ use Drupal\package_manager\ValidationResult; */ class OverwriteExistingPackagesValidatorTest extends PackageManagerKernelTestBase { + /** + * {@inheritdoc} + */ + protected function setUp(): void { + // In this test, we don't care whether the updated projects are secure and + // supported. + $this->disableValidators[] = 'package_manager.validator.supported_releases'; + parent::setUp(); + } + /** * Tests that new installed packages overwrite existing directories. * diff --git a/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php b/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6ba83e7360d5c2e4f8fbac71bd315e4d9415ce75 --- /dev/null +++ b/package_manager/tests/src/Kernel/SupportedReleaseValidatorTest.php @@ -0,0 +1,98 @@ +<?php + +namespace Drupal\Tests\package_manager\Kernel; + +use Drupal\package_manager\Event\PreApplyEvent; +use Drupal\package_manager\ValidationResult; + +/** + * @coversDefaultClass \Drupal\package_manager\Validator\SupportedReleaseValidator + * + * @group package_manager + */ +class SupportedReleaseValidatorTest extends PackageManagerKernelTestBase { + + /** + * Data provider for testException(). + * + * @return mixed[][] + * The test cases. + */ + public function providerException(): array { + $fixtures_folder = __DIR__ . '/../../fixtures/supported_release_validator'; + $release_fixture_folder = __DIR__ . '/../../fixtures/release-history'; + $summary = t('Cannot update because the following project version is not in the list of installable releases.'); + return [ + 'semver, supported update' => [ + 'semver_test', + "$release_fixture_folder/semver_test.1.1.xml", + "$fixtures_folder/semver_supported_update_stage", + [], + ], + 'semver, update to unsupported branch' => [ + 'semver_test', + "$release_fixture_folder/semver_test.1.1.xml", + "$fixtures_folder/semver_unsupported_update_stage", + [ + ValidationResult::createError(['semver_test (drupal/semver_test) 8.2.0'], $summary), + ], + ], + 'legacy, supported update' => [ + 'aaa_update_test', + "$release_fixture_folder/aaa_update_test.1.1.xml", + "$fixtures_folder/legacy_supported_update_stage", + [], + ], + 'legacy, update to unsupported branch' => [ + 'aaa_update_test', + "$release_fixture_folder/aaa_update_test.1.1.xml", + "$fixtures_folder/legacy_unsupported_update_stage", + [ + ValidationResult::createError(['aaa_update_test (drupal/aaa_update_test) 3.0.0'], $summary), + ], + ], + 'aaa_automatic_updates_test(not in active), update to unsupported branch' => [ + 'aaa_automatic_updates_test', + "$release_fixture_folder/aaa_automatic_updates_test.9.8.2.xml", + "$fixtures_folder/aaa_automatic_updates_test_unsupported_update_stage", + [ + ValidationResult::createError(['aaa_automatic_updates_test (drupal/aaa_automatic_updates_test) 7.0.1-dev'], $summary), + ], + ], + 'aaa_automatic_updates_test(not in active), update to supported branch' => [ + 'aaa_automatic_updates_test', + "$release_fixture_folder/aaa_automatic_updates_test.9.8.2.xml", + "$fixtures_folder/aaa_automatic_updates_test_supported_update_stage", + [], + ], + ]; + } + + /** + * Tests exceptions when updating to unsupported or insecure releases. + * + * @param string $project + * The project to update. + * @param string $release_xml + * Path of release xml for project. + * @param string $stage_dir + * Path of fixture stage directory. It will be used as the virtual project's + * stage directory. + * @param array $expected_results + * The expected validation results. + * + * @dataProvider providerException + */ + public function testException(string $project, string $release_xml, string $stage_dir, array $expected_results): void { + $this->setReleaseMetadata([ + $project => $release_xml, + 'drupal' => __DIR__ . '/../../fixtures/release-history/drupal.9.8.2.xml', + ]); + $active_dir = __DIR__ . '/../../fixtures/supported_release_validator/active'; + $this->copyFixtureFolderToActiveDirectory($active_dir); + $this->copyFixtureFolderToStageDirectoryOnApply($stage_dir); + + $this->assertResults($expected_results, PreApplyEvent::class); + } + +} diff --git a/tests/src/Build/UpdateTestBase.php b/tests/src/Build/UpdateTestBase.php index c88d11f40a049b99175c6d6dc50c0efa3585640e..effacbb73f885abf6ec3c2fa2211a382796a317e 100644 --- a/tests/src/Build/UpdateTestBase.php +++ b/tests/src/Build/UpdateTestBase.php @@ -4,75 +4,24 @@ namespace Drupal\Tests\automatic_updates\Build; use Drupal\Component\Utility\Html; use Drupal\Tests\package_manager\Build\TemplateProjectTestBase; -use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait; -use Drupal\Tests\RandomGeneratorTrait; /** * Base class for tests that perform in-place updates. */ abstract class UpdateTestBase extends TemplateProjectTestBase { - use FixtureUtilityTrait; - use RandomGeneratorTrait; - - /** - * A secondary server instance, to serve XML metadata about available updates. - * - * @var \Symfony\Component\Process\Process - */ - private $metadataServer; - - /** - * {@inheritdoc} - */ - protected function tearDown(): void { - if ($this->metadataServer) { - $this->metadataServer->stop(); - } - parent::tearDown(); - } - /** * {@inheritdoc} */ protected function createTestProject(string $template): void { parent::createTestProject($template); - // Install Drupal, Automatic Updates, and other modules needed for testing. - $this->installQuickStart('minimal'); - $this->formLogin($this->adminUsername, $this->adminPassword); + // Install Automatic Updates, and other modules needed for testing. $this->installModules([ 'automatic_updates', 'automatic_updates_test', 'automatic_updates_test_cron', - 'automatic_updates_test_release_history', ]); - - // When checking for updates, we need to be able to make sub-requests, but - // the built-in PHP server is single-threaded. Therefore, open a second - // server instance on another port, which will serve the metadata about - // available updates. - $port = $this->findAvailablePort(); - $this->metadataServer = $this->instantiateServer($port); - - $code = <<<END -\$config['automatic_updates.settings']['cron_port'] = $port; -\$config['update.settings']['fetch']['url'] = 'http://localhost:$port/test-release-history'; -END; - $this->writeSettings($code); - } - - /** - * Prepares the test site to serve an XML feed of available release metadata. - * - * @param array $xml_map - * The update XML map, as used by update_test.settings. - * - * @see \Drupal\automatic_updates_test\TestController::metadata() - */ - protected function setReleaseMetadata(array $xml_map): void { - $xml_map = var_export($xml_map, TRUE); - $this->writeSettings("\$config['update_test.settings']['xml_map'] = $xml_map;"); } /** @@ -106,19 +55,4 @@ END; } } - /** - * Copies a fixture directory to a temporary directory and returns its path. - * - * @param string $fixture_directory - * The fixture directory. - * - * @return string - * The temporary directory. - */ - protected function copyFixtureToTempDirectory(string $fixture_directory): string { - $temp_directory = $this->getWorkspaceDirectory() . '/fixtures_temp_' . $this->randomMachineName(20); - static::copyFixtureFilesTo($fixture_directory, $temp_directory); - return $temp_directory; - } - } diff --git a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php index 9a043e65df161c6a2c7499f41d4d4ae332c04ddb..aca41c16559560a33679eca0a3f0bd762cdb2cb4 100644 --- a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php +++ b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php @@ -55,7 +55,7 @@ abstract class AutomaticUpdatesFunctionalTestBase extends BrowserTestBase { */ protected function installModulesFromClassProperty(ContainerInterface $container): void { $container->get('module_installer')->install([ - 'automatic_updates_test_release_history', + 'package_manager_test_release_history', ]); $this->container = $container->get('kernel')->getContainer(); diff --git a/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php b/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php index 864814f293fdf609c4f1c85828ef97103c29ae9c..eac85e7c2c4353372f4b3c22df4aab7e29d20ec6 100644 --- a/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php +++ b/tests/src/Kernel/ReadinessValidation/StagedProjectsValidatorTest.php @@ -19,6 +19,16 @@ class StagedProjectsValidatorTest extends AutomaticUpdatesKernelTestBase { */ protected static $modules = ['automatic_updates']; + /** + * {@inheritdoc} + */ + protected function setUp(): void { + // In this test, we don't care whether the updated projects are secure and + // supported. + $this->disableValidators[] = 'package_manager.validator.supported_releases'; + parent::setUp(); + } + /** * Asserts a set of validation results when staged changes are applied. *