| # Copyright 2012 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unittests for lkgm_manager""" |
| |
| import contextlib |
| import os |
| import tempfile |
| from unittest import mock |
| from xml.dom import minidom |
| |
| from chromite.cbuildbot import cbuildbot_alerts |
| from chromite.cbuildbot import lkgm_manager |
| from chromite.cbuildbot import manifest_version |
| from chromite.cbuildbot import repository |
| from chromite.lib import config_lib |
| from chromite.lib import constants |
| from chromite.lib import cros_build_lib |
| from chromite.lib import cros_test_lib |
| from chromite.lib import git |
| from chromite.lib import osutils |
| from chromite.lib.buildstore import FakeBuildStore |
| |
| |
| FAKE_VERSION_STRING = "1.2.4-rc3" |
| FAKE_VERSION_STRING_NEXT = "1.2.4-rc4" |
| CHROME_BRANCH = "13" |
| |
| FAKE_VERSION = """ |
| CHROMEOS_BUILD=1 |
| CHROMEOS_BRANCH=2 |
| CHROMEOS_PATCH=4 |
| CHROME_BRANCH=13 |
| """ |
| |
| |
| # pylint: disable=protected-access |
| |
| |
| class LKGMCandidateInfoTest(cros_test_lib.TestCase): |
| """Test methods testing methods in _LKGMCandidateInfo class.""" |
| |
| def testLoadFromString(self): |
| """Tests whether we can load from a string.""" |
| info = lkgm_manager._LKGMCandidateInfo( |
| version_string=FAKE_VERSION_STRING, chrome_branch=CHROME_BRANCH |
| ) |
| self.assertEqual(info.VersionString(), FAKE_VERSION_STRING) |
| |
| def testIncrementVersionPatch(self): |
| """Tests whether we can increment a lkgm info.""" |
| info = lkgm_manager._LKGMCandidateInfo( |
| version_string=FAKE_VERSION_STRING, chrome_branch=CHROME_BRANCH |
| ) |
| info.IncrementVersion() |
| self.assertEqual(info.VersionString(), FAKE_VERSION_STRING_NEXT) |
| |
| def testVersionCompare(self): |
| """Tests whether our comparision method works.""" |
| info0 = lkgm_manager._LKGMCandidateInfo("5.2.3-rc100") |
| info1 = lkgm_manager._LKGMCandidateInfo("1.2.3-rc1") |
| info2 = lkgm_manager._LKGMCandidateInfo("1.2.3-rc2") |
| info3 = lkgm_manager._LKGMCandidateInfo("1.2.200-rc1") |
| info4 = lkgm_manager._LKGMCandidateInfo("1.4.3-rc1") |
| |
| self.assertGreater(info0, info1) |
| self.assertGreater(info0, info2) |
| self.assertGreater(info0, info3) |
| self.assertGreater(info0, info4) |
| self.assertGreater(info2, info1) |
| self.assertGreater(info3, info1) |
| self.assertGreater(info3, info2) |
| self.assertGreater(info4, info1) |
| self.assertGreater(info4, info2) |
| self.assertGreater(info4, info3) |
| self.assertEqual(info0, info0) |
| self.assertEqual(info1, info1) |
| self.assertEqual(info2, info2) |
| self.assertEqual(info3, info3) |
| self.assertEqual(info4, info4) |
| self.assertNotEqual(info0, info1) |
| self.assertNotEqual(info0, info2) |
| self.assertNotEqual(info0, info3) |
| self.assertNotEqual(info0, info4) |
| self.assertNotEqual(info1, info0) |
| self.assertNotEqual(info1, info2) |
| self.assertNotEqual(info1, info3) |
| self.assertNotEqual(info1, info4) |
| self.assertNotEqual(info2, info0) |
| self.assertNotEqual(info2, info1) |
| self.assertNotEqual(info2, info3) |
| self.assertNotEqual(info2, info4) |
| self.assertNotEqual(info3, info0) |
| self.assertNotEqual(info3, info1) |
| self.assertNotEqual(info3, info2) |
| self.assertNotEqual(info3, info4) |
| self.assertNotEqual(info4, info0) |
| self.assertNotEqual(info4, info1) |
| self.assertNotEqual(info4, info1) |
| self.assertNotEqual(info4, info3) |
| |
| |
| @contextlib.contextmanager |
| def TemporaryManifest(): |
| with tempfile.NamedTemporaryFile(mode="w") as f: |
| # Create fake but empty manifest file. |
| new_doc = minidom.getDOMImplementation().createDocument( |
| None, "manifest", None |
| ) |
| print(new_doc.toxml()) |
| new_doc.writexml(f) |
| f.flush() |
| yield f |
| |
| |
| class LKGMManagerTest(cros_test_lib.MockTempDirTestCase): |
| """Tests for the BuildSpecs manager.""" |
| |
| def setUp(self): |
| self.manager = None |
| self.push_mock = self.PatchObject(git, "CreatePushBranch") |
| |
| self.source_repo = "ssh://source/repo" |
| self.manifest_repo = "ssh://manifest/repo" |
| self.version_file = "version-file.sh" |
| self.branch = "master" |
| self.build_name = "amd64-generic" |
| self.incr_type = "branch" |
| self.buildstore = FakeBuildStore() |
| |
| # Create tmp subdirs based on the one provided TempDirMixin. |
| self.tmpdir = os.path.join(self.tempdir, "base") |
| osutils.SafeMakedirs(self.tmpdir) |
| self.tmpmandir = os.path.join(self.tempdir, "man") |
| osutils.SafeMakedirs(self.tmpmandir) |
| |
| def _LKGMManager(self, build_type=constants.PFQ_TYPE, config=None): |
| repo = repository.RepoRepository( |
| self.source_repo, self.tmpdir, self.branch, depth=1 |
| ) |
| manager = lkgm_manager.LKGMManager( |
| repo, |
| self.manifest_repo, |
| self.build_name, |
| build_type, |
| "branch", |
| force=False, |
| branch=self.branch, |
| config=config, |
| buildstore=self.buildstore, |
| dry_run=True, |
| ) |
| manager.manifest_dir = self.tmpmandir |
| manager.lkgm_path = os.path.join( |
| self.tmpmandir, constants.LKGM_MANIFEST |
| ) |
| |
| manager.all_specs_dir = "/LKGM/path" |
| manifest_dir = manager.manifest_dir |
| manager.specs_for_builder = os.path.join( |
| manifest_dir, manager.rel_working_dir, "build-name", "%(builder)s" |
| ) |
| manager.SLEEP_TIMEOUT = 0 |
| return manager |
| |
| def _GetPathToManifest(self, info): |
| return os.path.join( |
| self.manager.all_specs_dir, "%s.xml" % info.VersionString() |
| ) |
| |
| def testCreateFromManifest(self): |
| """Tests that we can create a new candidate from another manifest.""" |
| self.manager = self._LKGMManager() |
| # Let's stub out other LKGMManager calls cause they're already |
| # unit tested. |
| |
| version = "2010.0.0-rc7" |
| my_info = lkgm_manager._LKGMCandidateInfo("2010.0.0") |
| new_candidate = lkgm_manager._LKGMCandidateInfo(version) |
| manifest = ( |
| "/tmp/manifest-versions-internal/paladin/buildspecs/" |
| "20/%s.xml" % version |
| ) |
| new_manifest = "/path/to/tmp/file.xml" |
| |
| build_id = 20162 |
| |
| site_params = config_lib.GetSiteParams() |
| # Patch out our RepoRepository to make sure we don't corrupt real repo. |
| self.PatchObject(self.manager, "cros_source") |
| filter_mock = self.PatchObject( |
| manifest_version, "FilterManifest", return_value=new_manifest |
| ) |
| |
| # Do manifest refresh work. |
| self.PatchObject( |
| lkgm_manager.LKGMManager, |
| "GetCurrentVersionInfo", |
| return_value=my_info, |
| ) |
| self.PatchObject(lkgm_manager.LKGMManager, "RefreshManifestCheckout") |
| init_mock = self.PatchObject( |
| lkgm_manager.LKGMManager, "InitializeManifestVariables" |
| ) |
| |
| # Publish new candidate. |
| publish_mock = self.PatchObject( |
| lkgm_manager.LKGMManager, "PublishManifest" |
| ) |
| |
| candidate_path = self.manager.CreateFromManifest( |
| manifest, build_id=build_id |
| ) |
| self.assertEqual(candidate_path, self._GetPathToManifest(new_candidate)) |
| self.assertEqual(self.manager.current_version, version) |
| |
| filter_mock.assert_called_once_with( |
| manifest, whitelisted_remotes=site_params.EXTERNAL_REMOTES |
| ) |
| publish_mock.assert_called_once_with( |
| new_manifest, version, build_id=build_id |
| ) |
| init_mock.assert_called_once_with(my_info) |
| self.push_mock.assert_called_once_with(mock.ANY, mock.ANY, sync=False) |
| |
| def testCreateNewCandidateReturnNoneIfNoWorkToDo(self): |
| """Tests that we return nothing if there is nothing to create.""" |
| self.manager = self._LKGMManager() |
| new_manifest = "some_manifest" |
| my_info = lkgm_manager._LKGMCandidateInfo("1.2.3") |
| |
| # Patch out our RepoRepository to make sure we don't corrupt real repo. |
| cros_source_mock = self.PatchObject(self.manager, "cros_source") |
| cros_source_mock.branch = "master" |
| cros_source_mock.directory = "/foo/repo" |
| |
| self.PatchObject(lkgm_manager.LKGMManager, "CheckoutSourceCode") |
| self.PatchObject( |
| lkgm_manager.LKGMManager, |
| "CreateManifest", |
| return_value=new_manifest, |
| ) |
| self.PatchObject(lkgm_manager.LKGMManager, "RefreshManifestCheckout") |
| self.PatchObject( |
| lkgm_manager.LKGMManager, |
| "GetCurrentVersionInfo", |
| return_value=my_info, |
| ) |
| init_mock = self.PatchObject( |
| lkgm_manager.LKGMManager, "InitializeManifestVariables" |
| ) |
| self.PatchObject( |
| lkgm_manager.LKGMManager, "HasCheckoutBeenBuilt", return_value=True |
| ) |
| |
| candidate = self.manager.CreateNewCandidate() |
| self.assertEqual(candidate, None) |
| init_mock.assert_called_once_with(my_info) |
| |
| def _CreateManifest(self): |
| """Returns a created test manifest in tmpdir with its dir_pfx.""" |
| self.manager.current_version = "1.2.4-rc21" |
| dir_pfx = CHROME_BRANCH |
| manifest = os.path.join( |
| self.manager.manifest_dir, |
| self.manager.rel_working_dir, |
| "buildspecs", |
| dir_pfx, |
| "1.2.4-rc21.xml", |
| ) |
| osutils.Touch(manifest) |
| return manifest, dir_pfx |
| |
| def _MockParseGitLog(self, fake_git_log, project): |
| exists_mock = self.PatchObject(os.path, "exists", return_value=True) |
| link_mock = self.PatchObject(cbuildbot_alerts, "PrintBuildbotLink") |
| fake_project_handler = mock.Mock(spec=git.Manifest) |
| fake_project_handler.checkouts_by_path = {project["path"]: project} |
| self.PatchObject(git, "Manifest", return_value=fake_project_handler) |
| |
| fake_result = cros_build_lib.CompletedProcess(stdout=fake_git_log) |
| self.PatchObject(git, "RunGit", return_value=fake_result) |
| |
| return exists_mock, link_mock |
| |
| def testAddChromeVersionToManifest(self): |
| """Tests whether we can write the chrome version to the manifest file.""" |
| self.manager = self._LKGMManager() |
| with TemporaryManifest() as f: |
| chrome_version = "35.0.1863.0" |
| # Write the chrome element to manifest. |
| self.manager._AddChromeVersionToManifest(f.name, chrome_version) |
| |
| # Read the manifest file. |
| new_doc = minidom.parse(f.name) |
| elements = new_doc.getElementsByTagName(lkgm_manager.CHROME_ELEMENT) |
| self.assertEqual(len(elements), 1) |
| self.assertEqual( |
| elements[0].getAttribute(lkgm_manager.CHROME_VERSION_ATTR), |
| chrome_version, |
| ) |