| # Copyright 2023 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """This module tests the logic to find ChromeOS image version for a board.""" |
| |
| from chromite.lib import chrome_lkgm |
| from chromite.lib import cros_test_lib |
| from chromite.lib import gs |
| from chromite.lib import gs_unittest |
| from chromite.lib import partial_mock |
| |
| |
| class ChromeOSVersionFinderTest( |
| gs_unittest.AbstractGSContextTest, |
| cros_test_lib.MockTempDirTestCase, |
| cros_test_lib.LoggingTestCase, |
| ): |
| """Tests the determination of which SDK version to use.""" |
| |
| VERSION = "3543.0.0" |
| FULL_VERSION = "R55-%s" % VERSION |
| RECENT_VERSION_MISSING = "3542.0.0" |
| RECENT_VERSION_FOUND = "3541.0.0" |
| FULL_VERSION_RECENT = "R55-%s" % RECENT_VERSION_FOUND |
| BRANCH_VERSION = "3541.68.0" |
| FILL_VERSION_BRANCH = "R55-%s" % BRANCH_VERSION |
| MINI_BRANCH_VERSION = "3543.2.1" |
| FULL_VERSION_MINI_BRANCH = "R55-%s" % MINI_BRANCH_VERSION |
| BOARD = "eve" |
| |
| VERSION_BASE = "gs://chromeos-image-archive/%s-release/LATEST-%s" % ( |
| BOARD, |
| VERSION, |
| ) |
| |
| CAT_ERROR = "CommandException: No URLs matched %s" % VERSION_BASE |
| |
| def setUp(self) -> None: |
| self.finder = chrome_lkgm.ChromeOSVersionFinder( |
| self.tempdir, self.BOARD, 10 |
| ) |
| |
| def testConfigName(self) -> None: |
| """Test config_name contains the given board name.""" |
| self.assertTrue(self.BOARD in self.finder.config_name) |
| |
| def testFullVersionFromPlatformVersion(self) -> None: |
| """Test full version calculation from the platform version.""" |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-%s" % self.VERSION), |
| stdout=self.FULL_VERSION, |
| ) |
| self.assertEqual( |
| self.FULL_VERSION, |
| self.finder.GetFullVersionFromLatest(self.VERSION), |
| ) |
| |
| def _SetupMissingVersions(self) -> None: |
| """Version & Version-1 are missing, but Version-2 exists.""" |
| |
| def _RaiseGSNoSuchKey(*_args, **_kwargs) -> None: |
| raise gs.GSNoSuchKey("file does not exist") |
| |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-%s" % self.VERSION), |
| side_effect=_RaiseGSNoSuchKey, |
| ) |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex( |
| "cat .*/LATEST-%s" % self.RECENT_VERSION_MISSING |
| ), |
| side_effect=_RaiseGSNoSuchKey, |
| ) |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex( |
| "cat .*/LATEST-%s" % self.RECENT_VERSION_FOUND |
| ), |
| stdout=self.FULL_VERSION_RECENT, |
| ) |
| |
| def testNoFallbackVersion(self) -> None: |
| """Test that all versions are checked before returning None.""" |
| |
| def _RaiseGSNoSuchKey(*_args, **_kwargs) -> None: |
| raise gs.GSNoSuchKey("file does not exist") |
| |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-*"), |
| side_effect=_RaiseGSNoSuchKey, |
| ) |
| self.finder.fallback_versions = 2000000 |
| with cros_test_lib.LoggingCapturer() as logs: |
| self.assertEqual( |
| None, self.finder.GetFullVersionFromLatest(self.VERSION) |
| ) |
| self.AssertLogsContain(logs, "LATEST-1.0.0") |
| self.AssertLogsContain(logs, "LATEST--1.0.0", inverted=True) |
| |
| def testFallbackVersions(self) -> None: |
| """Test full version calculation with various fallback versions.""" |
| self._SetupMissingVersions() |
| for version in range(6): |
| self.finder.fallback_versions = version |
| # _SetupMissingVersions mocks the result of 3 files. |
| # The file ending with LATEST-3.0.0 is the only one that would pass. |
| self.assertEqual( |
| self.FULL_VERSION_RECENT if version >= 3 else None, |
| self.finder.GetFullVersionFromLatest(self.VERSION), |
| ) |
| |
| def testBranchFallbackVersions(self) -> None: |
| """Test full version calculation for a branch version with fallbacks.""" |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-%s" % "12345.89.0"), |
| side_effect=gs.GSNoSuchKey, |
| ) |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-%s" % "12345.88.0"), |
| side_effect=gs.GSNoSuchKey, |
| ) |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-%s" % "12345.87.0"), |
| stdout="R123-12345.87.0", |
| ) |
| self.assertEqual( |
| self.finder.GetFullVersionFromLatest("12345.89.0"), |
| "R123-12345.87.0", |
| ) |
| |
| def testBranchNoFallbackVersions(self) -> None: |
| """Test version calculation for a branch version with no fallbacks.""" |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex("cat .*/LATEST-*"), |
| side_effect=gs.GSNoSuchKey, |
| ) |
| self.assertEqual( |
| self.finder.GetFullVersionFromLatest("12345.89.0"), None |
| ) |
| |
| def testMiniBranchFullVersion(self) -> None: |
| """Test full version calculation for a mini branch version.""" |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex( |
| "cat .*/LATEST-%s" % self.MINI_BRANCH_VERSION |
| ), |
| stdout=self.FULL_VERSION_MINI_BRANCH, |
| ) |
| self.assertEqual( |
| self.FULL_VERSION_MINI_BRANCH, |
| self.finder.GetFullVersionFromLatest(self.MINI_BRANCH_VERSION), |
| ) |
| |
| def testMiniBranchNoLatestVersion(self) -> None: |
| """There is no matching latest mini branch.""" |
| self.gs_mock.AddCmdResult( |
| partial_mock.ListRegex( |
| "cat .*/LATEST-%s" % self.MINI_BRANCH_VERSION |
| ), |
| stdout="", |
| stderr=self.CAT_ERROR, |
| returncode=1, |
| ) |
| # Set any other query to return a valid version, but we don't expect |
| # that to occur for non canary versions. |
| self.gs_mock.SetDefaultCmdResult(stdout=self.FULL_VERSION_MINI_BRANCH) |
| self.assertEqual( |
| None, self.finder.GetFullVersionFromLatest(self.MINI_BRANCH_VERSION) |
| ) |