From 991088ee6c55447ec1f27515325b9e87979ef1ef Mon Sep 17 00:00:00 2001
From: tedbow <tedbow@240860.no-reply.drupal.org>
Date: Thu, 1 Sep 2022 16:14:03 +0000
Subject: [PATCH] Issue #3303902 by tedbow, phenaproxima, dww, TravisCarden:
 Move ProjectInfo class into package_manager

---
 .../src/ExtensionUpdater.php                  |   2 +-
 .../src/Form/UpdateReady.php                  |   2 +-
 .../src/Validator/UpdateReleaseValidator.php  |   4 +-
 .../Validator/UpdateReleaseValidatorTest.php  |   4 +-
 package_manager/package_manager.info.yml      |   2 +
 .../src}/LegacyVersionUtility.php             |   2 +-
 {src => package_manager/src}/ProjectInfo.php  |   2 +-
 .../aaa_automatic_updates_test.9.8.2.xml      |   0
 .../release-history/drupal.9.8.1-security.xml |  65 ++++++++
 .../drupal.9.8.2-older-sec-release.xml        | 127 +++++++++++++++
 .../drupal.9.8.2-unsupported_unpublished.xml  | 147 ++++++++++++++++++
 .../fixtures/release-history/drupal.9.8.2.xml | 146 +++++++++++++++++
 .../drupal.9.8.2_unknown_status.xml           |   0
 .../Kernel/PackageManagerKernelTestBase.php   |  76 +++++++++
 .../Kernel/PendingUpdatesValidatorTest.php    |   6 +-
 .../tests}/src/Kernel/ProjectInfoTest.php     |   9 +-
 .../tests/src/Kernel/StageOwnershipTest.php   |   3 +-
 src/CronUpdater.php                           |   1 +
 src/Form/UpdaterForm.php                      |   2 +-
 src/ReleaseChooser.php                        |   3 +-
 src/Validator/VersionPolicyValidator.php      |   4 +-
 .../automatic_updates_test_cron.module        |   2 +-
 .../Kernel/AutomaticUpdatesKernelTestBase.php |  75 ---------
 tests/src/Unit/LegacyVersionUtilityTest.php   |   4 +-
 24 files changed, 587 insertions(+), 101 deletions(-)
 rename {src => package_manager/src}/LegacyVersionUtility.php (98%)
 rename {src => package_manager/src}/ProjectInfo.php (99%)
 rename {tests => package_manager/tests}/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml (100%)
 create mode 100644 package_manager/tests/fixtures/release-history/drupal.9.8.1-security.xml
 create mode 100644 package_manager/tests/fixtures/release-history/drupal.9.8.2-older-sec-release.xml
 create mode 100644 package_manager/tests/fixtures/release-history/drupal.9.8.2-unsupported_unpublished.xml
 create mode 100644 package_manager/tests/fixtures/release-history/drupal.9.8.2.xml
 rename {tests => package_manager/tests}/fixtures/release-history/drupal.9.8.2_unknown_status.xml (100%)
 rename {tests => package_manager/tests}/src/Kernel/ProjectInfoTest.php (94%)

diff --git a/automatic_updates_extensions/src/ExtensionUpdater.php b/automatic_updates_extensions/src/ExtensionUpdater.php
index 4948ff6133..6314ea7d00 100644
--- a/automatic_updates_extensions/src/ExtensionUpdater.php
+++ b/automatic_updates_extensions/src/ExtensionUpdater.php
@@ -3,7 +3,7 @@
 namespace Drupal\automatic_updates_extensions;
 
 use Drupal\automatic_updates\Exception\UpdateException;
-use Drupal\automatic_updates\LegacyVersionUtility;
+use Drupal\package_manager\LegacyVersionUtility;
 use Drupal\package_manager\Event\StageEvent;
 use Drupal\package_manager\Exception\StageValidationException;
 use Drupal\package_manager\Stage;
diff --git a/automatic_updates_extensions/src/Form/UpdateReady.php b/automatic_updates_extensions/src/Form/UpdateReady.php
index 270f8c2a8b..d398b4f718 100644
--- a/automatic_updates_extensions/src/Form/UpdateReady.php
+++ b/automatic_updates_extensions/src/Form/UpdateReady.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\automatic_updates_extensions\Form;
 
-use Drupal\automatic_updates\ProjectInfo;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\automatic_updates\Validator\StagedDatabaseUpdateValidator;
 use Drupal\automatic_updates_extensions\BatchProcessor;
 use Drupal\automatic_updates\BatchProcessor as AutoUpdatesBatchProcessor;
diff --git a/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php b/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php
index 115479d19d..945d89b5a7 100644
--- a/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php
+++ b/automatic_updates_extensions/src/Validator/UpdateReleaseValidator.php
@@ -2,9 +2,9 @@
 
 namespace Drupal\automatic_updates_extensions\Validator;
 
-use Drupal\automatic_updates\ProjectInfo;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\automatic_updates_extensions\ExtensionUpdater;
-use Drupal\automatic_updates\LegacyVersionUtility;
+use Drupal\package_manager\LegacyVersionUtility;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
diff --git a/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php b/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php
index 3d79f87987..3ad5cdda8b 100644
--- a/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php
+++ b/automatic_updates_extensions/tests/src/Kernel/Validator/UpdateReleaseValidatorTest.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\Tests\automatic_updates_extensions\Kernel\Validator;
 
-use Drupal\automatic_updates\LegacyVersionUtility;
+use Drupal\package_manager\LegacyVersionUtility;
 use Drupal\package_manager\Event\PreApplyEvent;
 use Drupal\package_manager\Event\PreCreateEvent;
 use Drupal\package_manager\ValidationResult;
@@ -129,7 +129,7 @@ class UpdateReleaseValidatorTest extends AutomaticUpdatesExtensionsKernelTestBas
     $this->assertFileIsReadable($active_installed);
     $this->assertFileIsReadable($staged_installed);
     $this->setReleaseMetadata([
-      'aaa_automatic_updates_test' => __DIR__ . "/../../../../../tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml",
+      '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__ . '/../../../../../tests/fixtures/release-history/drupal.9.8.2.xml',
     ]);
diff --git a/package_manager/package_manager.info.yml b/package_manager/package_manager.info.yml
index 0b9c3b2e40..cf0acc27fb 100644
--- a/package_manager/package_manager.info.yml
+++ b/package_manager/package_manager.info.yml
@@ -3,3 +3,5 @@ type: module
 description: 'API module providing functionality for staging package installs and updates with Composer.'
 core_version_requirement: ^9.3
 php: 7.4
+dependencies:
+  - drupal:update
diff --git a/src/LegacyVersionUtility.php b/package_manager/src/LegacyVersionUtility.php
similarity index 98%
rename from src/LegacyVersionUtility.php
rename to package_manager/src/LegacyVersionUtility.php
index 6536f5db55..9de7210945 100644
--- a/src/LegacyVersionUtility.php
+++ b/package_manager/src/LegacyVersionUtility.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\automatic_updates;
+namespace Drupal\package_manager;
 
 use Drupal\Core\Extension\ExtensionVersion;
 
diff --git a/src/ProjectInfo.php b/package_manager/src/ProjectInfo.php
similarity index 99%
rename from src/ProjectInfo.php
rename to package_manager/src/ProjectInfo.php
index 1ec4061072..c28b0927f2 100644
--- a/src/ProjectInfo.php
+++ b/package_manager/src/ProjectInfo.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\automatic_updates;
+namespace Drupal\package_manager;
 
 use Composer\Semver\Comparator;
 use Drupal\update\ProjectRelease;
diff --git a/tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml b/package_manager/tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml
similarity index 100%
rename from tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml
rename to package_manager/tests/fixtures/release-history/aaa_automatic_updates_test.9.8.2.xml
diff --git a/package_manager/tests/fixtures/release-history/drupal.9.8.1-security.xml b/package_manager/tests/fixtures/release-history/drupal.9.8.1-security.xml
new file mode 100644
index 0000000000..5466a623be
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/drupal.9.8.1-security.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>9.8.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>Drupal 9.8.1</name>
+  <version>9.8.1</version>
+  <status>published</status>
+  <release_link>http://example.com/drupal-9-8-1-release</release_link>
+  <download_link>http://example.com/drupal-9-8-1.tar.gz</download_link>
+  <date>1250425521</date>
+  <terms>
+    <term><name>Release type</name><value>New features</value></term>
+    <term><name>Release type</name><value>Bug fixes</value></term>
+    <term><name>Release type</name><value>Security update</value></term>
+  </terms>
+ </release>
+ <release>
+   <name>Drupal 9.8.0</name>
+   <version>9.8.0</version>
+   <status>published</status>
+   <release_link>http://example.com/drupal-9-8-0-release</release_link>
+   <download_link>http://example.com/drupal-9-8-0.tar.gz</download_link>
+   <date>1250424521</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+     <term><name>Release type</name><value>Insecure</value></term>
+   </terms>
+ </release>
+    <release>
+        <name>Drupal 9.8.0-alpha1</name>
+        <version>9.8.0-alpha1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-8-0-alpha1-release</release_link>
+        <download_link>http://example.com/drupal-9-8-0-alpha1-.tar.gz</download_link>
+        <date>1250424521</date>
+        <terms>
+            <term><name>Release type</name><value>New features</value></term>
+            <term><name>Release type</name><value>Bug fixes</value></term>
+            <term><name>Release type</name><value>Insecure</value></term>
+        </terms>
+    </release>
+    <release>
+        <name>Drupal 9.8.x-dev</name>
+        <version>9.8.x-dev</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-8-x-dex-release</release_link>
+        <download_link>http://example.com/drupal-9-8-x-dex.tar.gz</download_link>
+        <date>1250424521</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/drupal.9.8.2-older-sec-release.xml b/package_manager/tests/fixtures/release-history/drupal.9.8.2-older-sec-release.xml
new file mode 100644
index 0000000000..1bc31480c7
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/drupal.9.8.2-older-sec-release.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>9.7.,9.8.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>Drupal 9.8.2</name>
+    <version>9.8.2</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-9-8-2-release</release_link>
+    <download_link>http://example.com/drupal-9-8-2.tar.gz</download_link>
+    <date>1250425521</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>Drupal 9.8.1</name>
+  <version>9.8.1</version>
+  <status>published</status>
+  <release_link>http://example.com/drupal-9-8-1-release</release_link>
+  <download_link>http://example.com/drupal-9-8-1.tar.gz</download_link>
+  <date>1250425521</date>
+  <terms>
+    <term><name>Release type</name><value>New features</value></term>
+    <term><name>Release type</name><value>Bug fixes</value></term>
+    <term><name>Release type</name><value>Security update</value></term>
+  </terms>
+ </release>
+    <release>
+        <name>Drupal 9.8.1-beta1</name>
+        <version>9.8.1-beta1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-8-1-beta1-release</release_link>
+        <download_link>http://example.com/drupal-9-8-1-beta1.tar.gz</download_link>
+        <date>1250424521</date>
+        <terms>
+            <term><name>Release type</name><value>New features</value></term>
+            <term><name>Release type</name><value>Bug fixes</value></term>
+            <term><name>Release type</name><value>Security release</value></term>
+        </terms>
+    </release>
+ <release>
+   <name>Drupal 9.8.0</name>
+   <version>9.8.0</version>
+   <status>published</status>
+   <release_link>http://example.com/drupal-9-8-0-release</release_link>
+   <download_link>http://example.com/drupal-9-8-0.tar.gz</download_link>
+   <date>1250424521</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+     <term><name>Release type</name><value>Insecure</value></term>
+   </terms>
+ </release>
+  <release>
+    <name>Drupal 9.8.0-alpha1</name>
+    <version>9.8.0-alpha1</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-9-8-0-alpha1-release</release_link>
+    <download_link>http://example.com/drupal-9-8-0-alpha1.tar.gz</download_link>
+    <date>1250424521</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>Drupal 9.7.1</name>
+        <version>9.7.1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-1-release</release_link>
+        <download_link>http://example.com/drupal-9-7-1.tar.gz</download_link>
+        <date>1250425521</date>
+        <terms>
+            <term><name>Release type</name><value>New features</value></term>
+            <term><name>Release type</name><value>Bug fixes</value></term>
+            <term><name>Release type</name><value>Security update</value></term>
+        </terms>
+    </release>
+    <release>
+        <name>Drupal 9.7.0</name>
+        <version>9.7.0</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-0-release</release_link>
+        <download_link>http://example.com/drupal-9-7-0.tar.gz</download_link>
+        <date>1250424521</date>
+        <terms>
+            <term><name>Release type</name><value>New features</value></term>
+            <term><name>Release type</name><value>Bug fixes</value></term>
+            <term><name>Release type</name><value>Insecure</value></term>
+        </terms>
+    </release>
+    <release>
+        <name>Drupal 9.7.0-alpha1</name>
+        <version>9.7.0-alpha1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-0-alpha1-release</release_link>
+        <download_link>http://example.com/drupal-9-7-0-alpha1.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.8.x-dev</name>
+        <version>9.8.x-dev</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-8-x-dex-release</release_link>
+        <download_link>http://example.com/drupal-9-8-x-dex.tar.gz</download_link>
+        <date>1250424521</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/drupal.9.8.2-unsupported_unpublished.xml b/package_manager/tests/fixtures/release-history/drupal.9.8.2-unsupported_unpublished.xml
new file mode 100644
index 0000000000..ecf62618b0
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/drupal.9.8.2-unsupported_unpublished.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>9.7.,9.8.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>Drupal 9.8.2</name>
+    <version>9.8.2</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-9-8-2-release</release_link>
+    <download_link>http://example.com/drupal-9-8-2.tar.gz</download_link>
+    <date>1250425521</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>Drupal 9.8.1</name>
+  <version>9.8.1</version>
+  <status>published</status>
+  <release_link>http://example.com/drupal-9-8-1-release</release_link>
+  <download_link>http://example.com/drupal-9-8-1.tar.gz</download_link>
+  <date>1250425521</date>
+  <terms>
+    <term><name>Release type</name><value>New features</value></term>
+    <term><name>Release type</name><value>Bug fixes</value></term>
+    <term><name>Release type</name><value>Unsupported</value></term>
+  </terms>
+ </release>
+ <release>
+   <name>Drupal 9.8.0</name>
+   <version>9.8.0</version>
+   <status>unpublished</status>
+   <release_link>http://example.com/drupal-9-8-0-release</release_link>
+   <download_link>http://example.com/drupal-9-8-0.tar.gz</download_link>
+   <date>1250424521</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>Drupal 9.8.0-alpha1</name>
+    <version>9.8.0-alpha1</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-9-8-0-alpha1-release</release_link>
+    <download_link>http://example.com/drupal-9-8-0-alpha1.tar.gz</download_link>
+    <date>1250424521</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>Drupal 9.7.1</name>
+        <version>9.7.1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-1-release</release_link>
+        <download_link>http://example.com/drupal-9-7-1.tar.gz</download_link>
+        <date>1250425521</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>Drupal 9.7.0</name>
+        <version>9.7.0</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-0-release</release_link>
+        <download_link>http://example.com/drupal-9-7-0.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.7.0-alpha1</name>
+        <version>9.7.0-alpha1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-0-alpha1-release</release_link>
+        <download_link>http://example.com/drupal-9-7-0-alpha1.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.6.1</name>
+        <version>9.6.1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-6-1-release</release_link>
+        <download_link>http://example.com/drupal-9-6-1.tar.gz</download_link>
+        <date>1250425521</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>Drupal 9.6.0</name>
+        <version>9.6.0</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-6-0-release</release_link>
+        <download_link>http://example.com/drupal-9-6-0.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.6.0-alpha1</name>
+        <version>9.6.0-alpha1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-6-0-alpha1-release</release_link>
+        <download_link>http://example.com/drupal-9-6-0-alpha1.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.8.x-dev</name>
+        <version>9.8.x-dev</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-8-x-dex-release</release_link>
+        <download_link>http://example.com/drupal-9-8-x-dex.tar.gz</download_link>
+        <date>1250424521</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/drupal.9.8.2.xml b/package_manager/tests/fixtures/release-history/drupal.9.8.2.xml
new file mode 100644
index 0000000000..a830e4d023
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/drupal.9.8.2.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>9.7.,9.8.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+  <release>
+    <name>Drupal 9.8.2</name>
+    <version>9.8.2</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-9-8-2-release</release_link>
+    <download_link>http://example.com/drupal-9-8-2.tar.gz</download_link>
+    <date>1250425521</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>Drupal 9.8.1</name>
+  <version>9.8.1</version>
+  <status>published</status>
+  <release_link>http://example.com/drupal-9-8-1-release</release_link>
+  <download_link>http://example.com/drupal-9-8-1.tar.gz</download_link>
+  <date>1250425521</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>Drupal 9.8.0</name>
+   <version>9.8.0</version>
+   <status>published</status>
+   <release_link>http://example.com/drupal-9-8-0-release</release_link>
+   <download_link>http://example.com/drupal-9-8-0.tar.gz</download_link>
+   <date>1250424521</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>Drupal 9.8.0-alpha1</name>
+    <version>9.8.0-alpha1</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-9-8-0-alpha1-release</release_link>
+    <download_link>http://example.com/drupal-9-8-0-alpha1.tar.gz</download_link>
+    <date>1250424521</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>Drupal 9.7.1</name>
+        <version>9.7.1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-1-release</release_link>
+        <download_link>http://example.com/drupal-9-7-1.tar.gz</download_link>
+        <date>1250425521</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>Drupal 9.7.0</name>
+        <version>9.7.0</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-0-release</release_link>
+        <download_link>http://example.com/drupal-9-7-0.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.7.0-alpha1</name>
+        <version>9.7.0-alpha1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-7-0-alpha1-release</release_link>
+        <download_link>http://example.com/drupal-9-7-0-alpha1.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.6.1</name>
+        <version>9.6.1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-6-1-release</release_link>
+        <download_link>http://example.com/drupal-9-6-1.tar.gz</download_link>
+        <date>1250425521</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>Drupal 9.6.0</name>
+        <version>9.6.0</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-6-0-release</release_link>
+        <download_link>http://example.com/drupal-9-6-0.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.6.0-alpha1</name>
+        <version>9.6.0-alpha1</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-6-0-alpha1-release</release_link>
+        <download_link>http://example.com/drupal-9-6-0-alpha1.tar.gz</download_link>
+        <date>1250424521</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>Drupal 9.8.x-dev</name>
+        <version>9.8.x-dev</version>
+        <status>published</status>
+        <release_link>http://example.com/drupal-9-8-x-dex-release</release_link>
+        <download_link>http://example.com/drupal-9-8-x-dex.tar.gz</download_link>
+        <date>1250424521</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/tests/fixtures/release-history/drupal.9.8.2_unknown_status.xml b/package_manager/tests/fixtures/release-history/drupal.9.8.2_unknown_status.xml
similarity index 100%
rename from tests/fixtures/release-history/drupal.9.8.2_unknown_status.xml
rename to package_manager/tests/fixtures/release-history/drupal.9.8.2_unknown_status.xml
diff --git a/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php b/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php
index 61e54d7658..81ea6eba08 100644
--- a/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php
+++ b/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php
@@ -11,6 +11,11 @@ use Drupal\package_manager\Exception\StageValidationException;
 use Drupal\package_manager\Stage;
 use Drupal\package_manager_bypass\Beginner;
 use Drupal\Tests\package_manager\Traits\ValidationTestTrait;
+use GuzzleHttp\Client;
+use GuzzleHttp\Handler\MockHandler;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Psr7\Response;
+use GuzzleHttp\Psr7\Utils;
 use org\bovigo\vfs\vfsStream;
 use org\bovigo\vfs\vfsStreamDirectory;
 use org\bovigo\vfs\vfsStreamFile;
@@ -18,6 +23,7 @@ use org\bovigo\vfs\visitor\vfsStreamAbstractVisitor;
 use PhpTuf\ComposerStager\Domain\Value\Path\PathInterface;
 use PhpTuf\ComposerStager\Infrastructure\Factory\Path\PathFactoryInterface;
 use PhpTuf\ComposerStager\Infrastructure\Value\Path\AbstractPath;
+use Psr\Http\Message\RequestInterface;
 use Symfony\Component\DependencyInjection\Definition;
 
 /**
@@ -27,12 +33,28 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase {
 
   use ValidationTestTrait;
 
+  /**
+   * The mocked HTTP client that returns metadata about available updates.
+   *
+   * We need to preserve this as a class property so that we can re-inject it
+   * into the container when a rebuild is triggered by module installation.
+   *
+   * @var \GuzzleHttp\Client
+   *
+   * @see ::register()
+   */
+  private $client;
+
+
   /**
    * {@inheritdoc}
    */
   protected static $modules = [
     'package_manager',
     'package_manager_bypass',
+    'system',
+    'update',
+    'update_test',
   ];
 
   /**
@@ -50,6 +72,14 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase {
     $this->installConfig('package_manager');
 
     $this->createVirtualProject();
+
+    // The Update module's default configuration must be installed for our
+    // fake release metadata to be fetched.
+    $this->installConfig('update');
+
+    // Make the update system think that all of System's post-update functions
+    // have run.
+    $this->registerPostUpdateFunctions();
   }
 
   /**
@@ -58,6 +88,12 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase {
   public function register(ContainerBuilder $container) {
     parent::register($container);
 
+    // If we previously set up a mock HTTP client in ::setReleaseMetadata(),
+    // re-inject it into the container.
+    if ($this->client) {
+      $container->set('http_client', $this->client);
+    }
+
     // Ensure that Composer Stager uses the test path factory, which is aware
     // of the virtual file system.
     $definition = new Definition(TestPathFactory::class);
@@ -228,6 +264,46 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase {
     $this->container->set('package_manager.validator.disk_space', $validator);
   }
 
+  /**
+   * Sets the current (running) version of core, as known to the Update module.
+   *
+   * @param string $version
+   *   The current version of core.
+   */
+  protected function setCoreVersion(string $version): void {
+    $this->config('update_test.settings')
+      ->set('system_info.#all.version', $version)
+      ->save();
+  }
+
+  /**
+   * Sets the release metadata file to use when fetching available updates.
+   *
+   * @param string[] $files
+   *   The paths of the XML metadata files to use, keyed by project name.
+   */
+  protected function setReleaseMetadata(array $files): void {
+    $responses = [];
+
+    foreach ($files as $project => $file) {
+      $metadata = Utils::tryFopen($file, 'r');
+      $responses["/release-history/$project/current"] = new Response(200, [], Utils::streamFor($metadata));
+    }
+    $callable = function (RequestInterface $request) use ($responses): Response {
+      return $responses[$request->getUri()->getPath()] ?? new Response(404);
+    };
+
+    // The mock handler's queue consist of same callable as many times as the
+    // number of requests we expect to be made for update XML because it will
+    // retrieve one item off the queue for each request.
+    // @see \GuzzleHttp\Handler\MockHandler::__invoke()
+    $handler = new MockHandler(array_fill(0, 100, $callable));
+    $this->client = new Client([
+      'handler' => HandlerStack::create($handler),
+    ]);
+    $this->container->set('http_client', $this->client);
+  }
+
 }
 
 /**
diff --git a/package_manager/tests/src/Kernel/PendingUpdatesValidatorTest.php b/package_manager/tests/src/Kernel/PendingUpdatesValidatorTest.php
index 35605045ea..50e4c0e669 100644
--- a/package_manager/tests/src/Kernel/PendingUpdatesValidatorTest.php
+++ b/package_manager/tests/src/Kernel/PendingUpdatesValidatorTest.php
@@ -21,7 +21,6 @@ class PendingUpdatesValidatorTest extends PackageManagerKernelTestBase {
    * Tests that no error is raised if there are no pending updates.
    */
   public function testNoPendingUpdates(): void {
-    $this->registerPostUpdateFunctions();
     $this->assertResults([], PreCreateEvent::class);
   }
 
@@ -31,10 +30,6 @@ class PendingUpdatesValidatorTest extends PackageManagerKernelTestBase {
    * @depends testNoPendingUpdates
    */
   public function testPendingUpdateHook(): void {
-    // Register the System module's post-update functions, so that any detected
-    // pending updates are guaranteed to be schema updates.
-    $this->registerPostUpdateFunctions();
-
     // Set the installed schema version of Package Manager to its default value
     // and import an empty update hook which is numbered much higher than will
     // ever exist in the real world.
@@ -54,6 +49,7 @@ class PendingUpdatesValidatorTest extends PackageManagerKernelTestBase {
    * Tests that an error is raised if there are pending post-updates.
    */
   public function testPendingPostUpdate(): void {
+    $this->registerPostUpdateFunctions();
     // The System module's post-update functions have not been registered, so
     // the update registry will think they're pending.
     $result = ValidationResult::createError([
diff --git a/tests/src/Kernel/ProjectInfoTest.php b/package_manager/tests/src/Kernel/ProjectInfoTest.php
similarity index 94%
rename from tests/src/Kernel/ProjectInfoTest.php
rename to package_manager/tests/src/Kernel/ProjectInfoTest.php
index 63a5b2ce13..d0e404ff77 100644
--- a/tests/src/Kernel/ProjectInfoTest.php
+++ b/package_manager/tests/src/Kernel/ProjectInfoTest.php
@@ -1,15 +1,16 @@
 <?php
 
-namespace Drupal\Tests\automatic_updates\Kernel;
+namespace Drupal\Tests\package_manger\Kernel;
 
-use Drupal\automatic_updates\ProjectInfo;
+use Drupal\package_manager\ProjectInfo;
+use Drupal\Tests\package_manager\Kernel\PackageManagerKernelTestBase;
 
 /**
- * @coversDefaultClass \Drupal\automatic_updates\ProjectInfo
+ * @coversDefaultClass \Drupal\package_manager\ProjectInfo
  *
  * @group automatic_updates
  */
-class ProjectInfoTest extends AutomaticUpdatesKernelTestBase {
+class ProjectInfoTest extends PackageManagerKernelTestBase {
 
   /**
    * @covers ::getInstallableReleases()
diff --git a/package_manager/tests/src/Kernel/StageOwnershipTest.php b/package_manager/tests/src/Kernel/StageOwnershipTest.php
index 39594018b3..cfd06a1a6f 100644
--- a/package_manager/tests/src/Kernel/StageOwnershipTest.php
+++ b/package_manager/tests/src/Kernel/StageOwnershipTest.php
@@ -16,7 +16,7 @@ use Psr\Log\Test\TestLogger;
 /**
  * Tests that ownership of the stage is enforced.
  *
- * @group package_manger
+ * @group package_manager
  */
 class StageOwnershipTest extends PackageManagerKernelTestBase {
 
@@ -39,7 +39,6 @@ class StageOwnershipTest extends PackageManagerKernelTestBase {
     $this->installSchema('system', ['sequences']);
     $this->installSchema('user', ['users_data']);
     $this->installEntitySchema('user');
-    $this->registerPostUpdateFunctions();
   }
 
   /**
diff --git a/src/CronUpdater.php b/src/CronUpdater.php
index 23f6183eef..f79d7561b2 100644
--- a/src/CronUpdater.php
+++ b/src/CronUpdater.php
@@ -8,6 +8,7 @@ use Drupal\Core\Mail\MailManagerInterface;
 use Drupal\Core\State\StateInterface;
 use Drupal\Core\Url;
 use Drupal\package_manager\Exception\StageValidationException;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\update\ProjectRelease;
 use GuzzleHttp\Psr7\Uri as GuzzleUri;
 use Symfony\Component\HttpFoundation\Response;
diff --git a/src/Form/UpdaterForm.php b/src/Form/UpdaterForm.php
index 3994b341c8..2b36689a08 100644
--- a/src/Form/UpdaterForm.php
+++ b/src/Form/UpdaterForm.php
@@ -4,7 +4,7 @@ namespace Drupal\automatic_updates\Form;
 
 use Drupal\automatic_updates\BatchProcessor;
 use Drupal\automatic_updates\Event\ReadinessCheckEvent;
-use Drupal\automatic_updates\ProjectInfo;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\automatic_updates\ReleaseChooser;
 use Drupal\automatic_updates\Updater;
 use Drupal\automatic_updates\Validation\ReadinessTrait;
diff --git a/src/ReleaseChooser.php b/src/ReleaseChooser.php
index 04050af1aa..d620f18131 100644
--- a/src/ReleaseChooser.php
+++ b/src/ReleaseChooser.php
@@ -4,6 +4,7 @@ namespace Drupal\automatic_updates;
 
 use Composer\Semver\Semver;
 use Drupal\automatic_updates\Validator\VersionPolicyValidator;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\update\ProjectRelease;
 use Drupal\Core\Extension\ExtensionVersion;
 
@@ -24,7 +25,7 @@ final class ReleaseChooser {
   /**
    * The project information fetcher.
    *
-   * @var \Drupal\automatic_updates\ProjectInfo
+   * @var \Drupal\package_manager\ProjectInfo
    */
   protected $projectInfo;
 
diff --git a/src/Validator/VersionPolicyValidator.php b/src/Validator/VersionPolicyValidator.php
index e7bed65b64..15f67b8cc4 100644
--- a/src/Validator/VersionPolicyValidator.php
+++ b/src/Validator/VersionPolicyValidator.php
@@ -4,7 +4,7 @@ namespace Drupal\automatic_updates\Validator;
 
 use Drupal\automatic_updates\CronUpdater;
 use Drupal\automatic_updates\Event\ReadinessCheckEvent;
-use Drupal\automatic_updates\ProjectInfo;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\automatic_updates\Updater;
 use Drupal\automatic_updates\Validator\VersionPolicy\ForbidDowngrade;
 use Drupal\automatic_updates\Validator\VersionPolicy\ForbidMinorUpdates;
@@ -228,7 +228,7 @@ final class VersionPolicyValidator implements EventSubscriberInterface {
    *   descending order (i.e., newest first). Will be in ascending order (i.e.,
    *   oldest first) if $updater is the cron updater.
    *
-   * @see \Drupal\automatic_updates\ProjectInfo::getInstallableReleases()
+   * @see \Drupal\package_manager\ProjectInfo::getInstallableReleases()
    */
   private function getAvailableReleases(Updater $updater): array {
     $project_info = new ProjectInfo('drupal');
diff --git a/tests/modules/automatic_updates_test_cron/automatic_updates_test_cron.module b/tests/modules/automatic_updates_test_cron/automatic_updates_test_cron.module
index 34842fcf68..af8284e440 100644
--- a/tests/modules/automatic_updates_test_cron/automatic_updates_test_cron.module
+++ b/tests/modules/automatic_updates_test_cron/automatic_updates_test_cron.module
@@ -7,7 +7,7 @@
  * @todo Move into automatic_updates when TUF integration is stable.
  */
 
-use Drupal\automatic_updates\ProjectInfo;
+use Drupal\package_manager\ProjectInfo;
 use Drupal\automatic_updates\CronUpdater;
 use Drupal\Core\Extension\ExtensionVersion;
 use Drupal\Core\Form\FormStateInterface;
diff --git a/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php b/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php
index 532ca14047..2814dc463d 100644
--- a/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php
+++ b/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php
@@ -9,12 +9,6 @@ use Drupal\Core\Url;
 use Drupal\Tests\automatic_updates\Traits\ValidationTestTrait;
 use Drupal\Tests\package_manager\Kernel\PackageManagerKernelTestBase;
 use Drupal\Tests\package_manager\Kernel\TestStageTrait;
-use GuzzleHttp\Client;
-use GuzzleHttp\Handler\MockHandler;
-use GuzzleHttp\HandlerStack;
-use GuzzleHttp\Psr7\Response;
-use GuzzleHttp\Psr7\Utils;
-use Psr\Http\Message\RequestInterface;
 
 /**
  * Base class for kernel tests of the Automatic Updates module.
@@ -28,23 +22,8 @@ abstract class AutomaticUpdatesKernelTestBase extends PackageManagerKernelTestBa
    */
   protected static $modules = [
     'automatic_updates_test_cron',
-    'system',
-    'update',
-    'update_test',
   ];
 
-  /**
-   * The mocked HTTP client that returns metadata about available updates.
-   *
-   * We need to preserve this as a class property so that we can re-inject it
-   * into the container when a rebuild is triggered by module installation.
-   *
-   * @var \GuzzleHttp\Client
-   *
-   * @see ::register()
-   */
-  private $client;
-
   /**
    * {@inheritdoc}
    */
@@ -63,14 +42,6 @@ abstract class AutomaticUpdatesKernelTestBase extends PackageManagerKernelTestBa
     $this->disableValidators[] = 'automatic_updates.validator.xdebug';
     parent::setUp();
 
-    // The Update module's default configuration must be installed for our
-    // fake release metadata to be fetched.
-    $this->installConfig('update');
-
-    // Make the update system think that all of System's post-update functions
-    // have run.
-    $this->registerPostUpdateFunctions();
-
     // By default, pretend we're running Drupal core 9.8.0 and a non-security
     // update to 9.8.1 is available.
     $this->setCoreVersion('9.8.0');
@@ -85,30 +56,12 @@ abstract class AutomaticUpdatesKernelTestBase extends PackageManagerKernelTestBa
     $this->container->get('automatic_updates_test_cron.enabler')->enableCron();
   }
 
-  /**
-   * Sets the current (running) version of core, as known to the Update module.
-   *
-   * @param string $version
-   *   The current version of core.
-   */
-  protected function setCoreVersion(string $version): void {
-    $this->config('update_test.settings')
-      ->set('system_info.#all.version', $version)
-      ->save();
-  }
-
   /**
    * {@inheritdoc}
    */
   public function register(ContainerBuilder $container) {
     parent::register($container);
 
-    // If we previously set up a mock HTTP client in ::setReleaseMetadata(),
-    // re-inject it into the container.
-    if ($this->client) {
-      $container->set('http_client', $this->client);
-    }
-
     // Use the test-only implementations of the regular and cron updaters.
     $overrides = [
       'automatic_updates.updater' => TestUpdater::class,
@@ -121,34 +74,6 @@ abstract class AutomaticUpdatesKernelTestBase extends PackageManagerKernelTestBa
     }
   }
 
-  /**
-   * Sets the release metadata file to use when fetching available updates.
-   *
-   * @param string[] $files
-   *   The paths of the XML metadata files to use, keyed by project name.
-   */
-  protected function setReleaseMetadata(array $files): void {
-    $responses = [];
-
-    foreach ($files as $project => $file) {
-      $metadata = Utils::tryFopen($file, 'r');
-      $responses["/release-history/$project/current"] = new Response(200, [], Utils::streamFor($metadata));
-    }
-    $callable = function (RequestInterface $request) use ($responses): Response {
-      return $responses[$request->getUri()->getPath()] ?? new Response(404);
-    };
-
-    // The mock handler's queue consist of same callable as many times as the
-    // number of requests we expect to be made for update XML because it will
-    // retrieve one item off the queue for each request.
-    // @see \GuzzleHttp\Handler\MockHandler::__invoke()
-    $handler = new MockHandler(array_fill(0, count($responses), $callable));
-    $this->client = new Client([
-      'handler' => HandlerStack::create($handler),
-    ]);
-    $this->container->set('http_client', $this->client);
-  }
-
 }
 
 /**
diff --git a/tests/src/Unit/LegacyVersionUtilityTest.php b/tests/src/Unit/LegacyVersionUtilityTest.php
index 8043d9eff6..95d0edec25 100644
--- a/tests/src/Unit/LegacyVersionUtilityTest.php
+++ b/tests/src/Unit/LegacyVersionUtilityTest.php
@@ -2,11 +2,11 @@
 
 namespace Drupal\Tests\automatic_updates\Unit;
 
-use Drupal\automatic_updates\LegacyVersionUtility;
+use Drupal\package_manager\LegacyVersionUtility;
 use Drupal\Tests\UnitTestCase;
 
 /**
- * @coversDefaultClass \Drupal\automatic_updates\LegacyVersionUtility
+ * @coversDefaultClass \Drupal\package_manager\LegacyVersionUtility
  *
  * @group automatic_updates
  */
-- 
GitLab