blob: f03d28e77e479a5c10eef1cbd93d7d81c247af75 [file] [log] [blame]
Mike Frysinger6cb624a2012-05-24 18:17:38 -04001# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Sosadad0d322011-01-31 16:37:33 -08002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Unit tests for cros_mark_as_stable.py."""
6
Ningning Xia783efc02018-01-24 13:39:51 -08007import os
Mike Frysinger166fea02021-02-12 05:30:33 -05008from unittest import mock
Chris Sosadad0d322011-01-31 16:37:33 -08009
Don Garrett4fef8c32018-08-10 18:04:01 -070010from chromite.lib import constants
J. Richard Barnetted422f622011-11-17 09:39:46 -080011from chromite.lib import cros_build_lib
Brian Harringc92788f2012-09-21 18:07:15 -070012from chromite.lib import cros_test_lib
David James97d95872012-11-16 15:09:56 -080013from chromite.lib import git
David James59a0a2b2013-03-22 14:04:44 -070014from chromite.lib import osutils
Ningning Xia783efc02018-01-24 13:39:51 -080015from chromite.lib import parallel
Mike Frysingerde5ab0e2013-03-21 20:48:36 -040016from chromite.lib import parallel_unittest
17from chromite.lib import partial_mock
Ningning Xia783efc02018-01-24 13:39:51 -080018from chromite.lib import portage_util
Lann Martinb26e1292018-08-09 13:59:19 -060019from chromite.lib import repo_util
Mike Frysinger6cb624a2012-05-24 18:17:38 -040020from chromite.scripts import cros_mark_as_stable
Mike Frysinger40ffb532021-02-12 07:36:08 -050021
Chris Sosadad0d322011-01-31 16:37:33 -080022
Greg Edelstonba9e3da2020-03-13 15:07:14 -060023pytestmark = cros_test_lib.pytestmark_inside_only
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070024
Mike Frysingeref6ccb22014-11-07 14:59:48 -050025
Mike Frysingerc9785342014-12-08 00:47:08 -050026class RunGitMock(partial_mock.PartialCmdMock):
Alex Klein1699fab2022-09-08 08:46:06 -060027 """Partial mock for git.RunMock."""
Mike Frysingerc9785342014-12-08 00:47:08 -050028
Alex Klein1699fab2022-09-08 08:46:06 -060029 TARGET = "chromite.lib.git"
30 ATTRS = ("RunGit",)
31 DEFAULT_ATTR = "RunGit"
32
33 def RunGit(self, _git_repo, cmd, _retry=True, **kwargs):
34 return self._results["RunGit"].LookupResult(
35 (cmd,), hook_args=(cmd,), hook_kwargs=kwargs
36 )
Mike Frysingeref6ccb22014-11-07 14:59:48 -050037
38
Mike Frysingerc9785342014-12-08 00:47:08 -050039class NonClassTests(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060040 """Test the flow for pushing a change."""
Mike Frysingerc9785342014-12-08 00:47:08 -050041
Alex Klein1699fab2022-09-08 08:46:06 -060042 def setUp(self):
43 self._branch = "test_branch"
44 self._target_manifest_branch = "cros/master"
Chris Sosadad0d322011-01-31 16:37:33 -080045
Alex Klein1699fab2022-09-08 08:46:06 -060046 def _TestPushChange(self, bad_cls):
47 side_effect = Exception("unittest says this should not be called")
Mike Frysingerc9785342014-12-08 00:47:08 -050048
Alex Klein1699fab2022-09-08 08:46:06 -060049 git_log = "Marking test_one as stable\nMarking test_two as stable\n"
50 fake_description = "Marking set of ebuilds as stable\n\n%s" % git_log
51 self.PatchObject(git, "DoesCommitExistInRepo", return_value=True)
52 self.PatchObject(
53 cros_mark_as_stable, "_DoWeHaveLocalCommits", return_value=True
54 )
55 self.PatchObject(
56 cros_mark_as_stable.GitBranch,
57 "CreateBranch",
58 side_effect=side_effect,
59 )
60 self.PatchObject(
61 cros_mark_as_stable.GitBranch, "Exists", side_effect=side_effect
62 )
Chris Sosadad0d322011-01-31 16:37:33 -080063
Alex Klein1699fab2022-09-08 08:46:06 -060064 push_mock = self.PatchObject(git, "PushBranch")
65 self.PatchObject(
66 git,
67 "GetTrackingBranch",
68 return_value=git.RemoteRef("gerrit", "refs/remotes/gerrit/master"),
69 )
70 sync_mock = self.PatchObject(git, "SyncPushBranch")
71 create_mock = self.PatchObject(git, "CreatePushBranch")
72 git_mock = self.StartPatcher(RunGitMock())
Matt Tennantcb522052013-11-25 14:23:43 -080073
Alex Klein1699fab2022-09-08 08:46:06 -060074 git_mock.AddCmdResult(["checkout", self._branch])
Paul Hobbsf52ea8f2015-10-21 17:24:23 -070075
Alex Klein1699fab2022-09-08 08:46:06 -060076 cmd = [
77 "log",
78 "--format=short",
79 "--perl-regexp",
80 "--author",
81 "^(?!chrome-bot|chromeos-ci-prod|chromeos-ci-release)",
82 "refs/remotes/gerrit/master..%s" % self._branch,
83 ]
Matt Tennantcb522052013-11-25 14:23:43 -080084
Alex Klein1699fab2022-09-08 08:46:06 -060085 if bad_cls:
86 push_mock.side_effect = side_effect
87 create_mock.side_effect = side_effect
88 git_mock.AddCmdResult(cmd, stdout="Found bad stuff")
89 else:
90 git_mock.AddCmdResult(cmd, stdout="\n")
91 cmd = [
92 "log",
93 "--format=format:%s%n%n%b",
94 "refs/remotes/gerrit/master..%s" % self._branch,
95 ]
96 git_mock.AddCmdResult(cmd, stdout=git_log)
97 git_mock.AddCmdResult(["merge", "--squash", self._branch])
98 git_mock.AddCmdResult(["commit", "-m", fake_description])
99 git_mock.AddCmdResult(["config", "push.default", "tracking"])
Matt Tennantcb522052013-11-25 14:23:43 -0800100
Alex Klein1699fab2022-09-08 08:46:06 -0600101 cros_mark_as_stable.PushChange(
102 self._branch, self._target_manifest_branch, False, "."
103 )
104 sync_mock.assert_called_with(
105 ".", "gerrit", "refs/remotes/gerrit/master"
106 )
107 if not bad_cls:
108 push_mock.assert_called_with(
109 "merge_branch", ".", dryrun=False, staging_branch=None
110 )
111 create_mock.assert_called_with(
112 "merge_branch", ".", remote_push_branch=mock.ANY
113 )
Chris Sosadad0d322011-01-31 16:37:33 -0800114
Alex Klein1699fab2022-09-08 08:46:06 -0600115 def testPushChange(self):
116 """Verify pushing changes works."""
117 self._TestPushChange(bad_cls=False)
Matt Tennantcb522052013-11-25 14:23:43 -0800118
Alex Klein1699fab2022-09-08 08:46:06 -0600119 def testPushChangeBadCls(self):
120 """Verify we do not push bad CLs."""
121 self.assertRaises(AssertionError, self._TestPushChange, bad_cls=True)
Matt Tennantcb522052013-11-25 14:23:43 -0800122
Chris Sosadad0d322011-01-31 16:37:33 -0800123
Ningning Xia783efc02018-01-24 13:39:51 -0800124class EbuildMock(object):
Alex Klein1699fab2022-09-08 08:46:06 -0600125 """Mock portage_util.Ebuild."""
Ningning Xia783efc02018-01-24 13:39:51 -0800126
Alex Klein1699fab2022-09-08 08:46:06 -0600127 def __init__(self, path, new_package=True):
128 self.path = path
129 self.package = "%s_package" % path
130 self.cros_workon_vars = "cros_workon_vars"
131 self._new_package = new_package
Ningning Xia783efc02018-01-24 13:39:51 -0800132
Alex Klein1699fab2022-09-08 08:46:06 -0600133 # pylint: disable=unused-argument
134 def RevWorkOnEBuild(self, srcroot, manifest, reject_self_repo=True):
135 if self._new_package:
136 return (
137 "%s_new_package" % self.path,
138 "%s_new_ebuild" % self.path,
139 "%s_old_ebuild" % self.path,
140 )
Ningning Xia783efc02018-01-24 13:39:51 -0800141
142
143# pylint: disable=protected-access
Ningning Xia419e4eb2018-02-05 10:30:36 -0800144class MarkAsStableCMDTest(cros_test_lib.MockTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600145 """Test cros_mark_as_stable commands."""
Ningning Xia783efc02018-01-24 13:39:51 -0800146
Alex Klein1699fab2022-09-08 08:46:06 -0600147 def setUp(self):
148 self._manifest = "manifest"
149 self._parser = cros_mark_as_stable.GetParser()
150 self._package_list = ["pkg1"]
Ningning Xia783efc02018-01-24 13:39:51 -0800151
Alex Klein1699fab2022-09-08 08:46:06 -0600152 self._overlays = [
153 os.path.join(self.tempdir, "overlay_%s" % i) for i in range(0, 3)
154 ]
Ningning Xia419e4eb2018-02-05 10:30:36 -0800155
Alex Klein1699fab2022-09-08 08:46:06 -0600156 self._overlay_remote_ref = {
157 self._overlays[0]: git.RemoteRef("remote", "ref", "project_1"),
158 self._overlays[1]: git.RemoteRef("remote", "ref", "project_1"),
159 self._overlays[2]: git.RemoteRef("remote", "ref", "project_2"),
160 }
Ningning Xia419e4eb2018-02-05 10:30:36 -0800161
Alex Klein1699fab2022-09-08 08:46:06 -0600162 self._git_project_overlays = {}
163 self._overlay_tracking_branch = {}
164 for overlay in self._overlays:
165 self._git_project_overlays.setdefault(
166 self._overlay_remote_ref[overlay], []
167 ).append(overlay)
168 self._overlay_tracking_branch[overlay] = self._overlay_remote_ref[
169 overlay
170 ].ref
Ningning Xia783efc02018-01-24 13:39:51 -0800171
Alex Klein1699fab2022-09-08 08:46:06 -0600172 self.PatchObject(git, "GetTrackingBranchViaManifest")
173 # TODO: Remove explicit --buildroot after --srcroot remove and a normal
174 # default is set.
175 self._commit_options = self._parser.parse_args(
176 ["commit", "--buildroot", constants.SOURCE_ROOT]
177 )
178 self._push_options = self._parser.parse_args(
179 ["push", "--buildroot", constants.SOURCE_ROOT]
180 )
Ningning Xia783efc02018-01-24 13:39:51 -0800181
Alex Klein1699fab2022-09-08 08:46:06 -0600182 def testWorkOnPush(self):
183 """Test _WorkOnPush."""
184 self.PatchObject(parallel, "RunTasksInProcessPool")
Ningning Xia419e4eb2018-02-05 10:30:36 -0800185
Alex Klein1699fab2022-09-08 08:46:06 -0600186 cros_mark_as_stable._WorkOnPush(
187 self._push_options,
188 self._overlay_tracking_branch,
189 self._git_project_overlays,
190 )
Ningning Xia419e4eb2018-02-05 10:30:36 -0800191
Alex Klein1699fab2022-09-08 08:46:06 -0600192 def testPushOverlays(self):
193 """Test _PushOverlays."""
194 self.PatchObject(os.path, "isdir", return_value=True)
195 mock_push_change = self.PatchObject(cros_mark_as_stable, "PushChange")
Ningning Xia419e4eb2018-02-05 10:30:36 -0800196
Alex Klein1699fab2022-09-08 08:46:06 -0600197 cros_mark_as_stable._PushOverlays(
198 self._push_options, self._overlays, self._overlay_tracking_branch
199 )
200 self.assertEqual(mock_push_change.call_count, 3)
Ningning Xia419e4eb2018-02-05 10:30:36 -0800201
Alex Klein1699fab2022-09-08 08:46:06 -0600202 def testWorkOnCommit(self):
203 """Test _WorkOnCommit."""
204 self.PatchObject(parallel, "RunTasksInProcessPool")
205 self.PatchObject(cros_mark_as_stable, "_CommitOverlays")
206 self.PatchObject(
207 cros_mark_as_stable, "_GetOverlayToEbuildsMap", return_value={}
208 )
Ningning Xia419e4eb2018-02-05 10:30:36 -0800209
Alex Klein1699fab2022-09-08 08:46:06 -0600210 cros_mark_as_stable._WorkOnCommit(
211 self._commit_options,
212 self._overlays,
213 self._overlay_tracking_branch,
214 self._git_project_overlays,
215 self._manifest,
216 self._package_list,
217 )
Ningning Xia419e4eb2018-02-05 10:30:36 -0800218
Alex Klein1699fab2022-09-08 08:46:06 -0600219 def testGetOverlayToEbuildsMap(self):
220 """Test _GetOverlayToEbuildsMap."""
221 self.PatchObject(
222 portage_util, "GetOverlayEBuilds", return_value=["ebuild"]
223 )
Ningning Xia419e4eb2018-02-05 10:30:36 -0800224
Alex Klein1699fab2022-09-08 08:46:06 -0600225 expected_overlay_dicts = {
226 overlay: ["ebuild"] for overlay in self._overlays
227 }
228 overlay_ebuilds = cros_mark_as_stable._GetOverlayToEbuildsMap(
229 self._commit_options, self._overlays, self._package_list
230 )
231 self.assertCountEqual(expected_overlay_dicts, overlay_ebuilds)
Ningning Xia419e4eb2018-02-05 10:30:36 -0800232
Alex Klein1699fab2022-09-08 08:46:06 -0600233 def testCommitOverlays(self):
234 """Test _CommitOverlays."""
235 mock_run_process_pool = self.PatchObject(
236 parallel, "RunTasksInProcessPool"
237 )
238 self.PatchObject(os.path, "isdir", return_value=True)
239 self.PatchObject(git, "RunGit")
240 self.PatchObject(
241 cros_mark_as_stable, "_WorkOnEbuild", return_value=None
242 )
243 self.PatchObject(git, "GetGitRepoRevision")
244 self.PatchObject(cros_mark_as_stable.GitBranch, "CreateBranch")
245 self.PatchObject(
246 cros_mark_as_stable.GitBranch, "Exists", return_value=True
247 )
248 self.PatchObject(portage_util.EBuild, "CommitChange")
Ningning Xia419e4eb2018-02-05 10:30:36 -0800249
Alex Klein1699fab2022-09-08 08:46:06 -0600250 overlay_ebuilds = {
251 self._overlays[0]: ["ebuild_1_1", "ebuild_1_2"],
252 self._overlays[1]: ["ebuild_2_1"],
253 self._overlays[2]: ["ebuild_3_1", "ebuild_3_2"],
254 }
Ningning Xia419e4eb2018-02-05 10:30:36 -0800255
Alex Klein1699fab2022-09-08 08:46:06 -0600256 cros_mark_as_stable._CommitOverlays(
257 self._commit_options,
258 self._manifest,
259 self._overlays,
260 self._overlay_tracking_branch,
261 overlay_ebuilds,
262 list(),
263 list(),
264 )
265 self.assertEqual(3, mock_run_process_pool.call_count)
Ningning Xia783efc02018-01-24 13:39:51 -0800266
Alex Klein1699fab2022-09-08 08:46:06 -0600267 def testWorkOnEbuildWithNewPackage(self):
268 """Test _WorkOnEbuild with new packages."""
269 overlay = self._overlays[0]
270 ebuild = EbuildMock("ebuild")
Ningning Xia783efc02018-01-24 13:39:51 -0800271
Alex Klein1699fab2022-09-08 08:46:06 -0600272 with parallel.Manager() as manager:
273 revved_packages = manager.list()
274 new_package_atoms = manager.list()
Ningning Xia419e4eb2018-02-05 10:30:36 -0800275
Alex Klein1699fab2022-09-08 08:46:06 -0600276 messages = manager.list()
277 ebuild_paths_to_add = manager.list()
278 ebuild_paths_to_remove = manager.list()
Ningning Xia419e4eb2018-02-05 10:30:36 -0800279
Alex Klein1699fab2022-09-08 08:46:06 -0600280 cros_mark_as_stable._WorkOnEbuild(
281 overlay,
282 ebuild,
283 self._manifest,
284 self._commit_options,
285 ebuild_paths_to_add,
286 ebuild_paths_to_remove,
287 messages,
288 revved_packages,
289 new_package_atoms,
290 )
291 self.assertCountEqual(ebuild_paths_to_add, ["ebuild_new_ebuild"])
292 self.assertCountEqual(ebuild_paths_to_remove, ["ebuild_old_ebuild"])
293 self.assertCountEqual(
294 messages,
295 [cros_mark_as_stable._GIT_COMMIT_MESSAGE % "ebuild_package"],
296 )
297 self.assertCountEqual(revved_packages, ["ebuild_package"])
298 self.assertCountEqual(new_package_atoms, ["=ebuild_new_package"])
Ningning Xia783efc02018-01-24 13:39:51 -0800299
Alex Klein1699fab2022-09-08 08:46:06 -0600300 def testWorkOnEbuildWithoutNewPackage(self):
301 """Test _WorkOnEbuild without new packages."""
302 ebuild = EbuildMock("ebuild", new_package=False)
303 overlay = self._overlays[0]
Ningning Xia783efc02018-01-24 13:39:51 -0800304
Alex Klein1699fab2022-09-08 08:46:06 -0600305 with parallel.Manager() as manager:
306 revved_packages = manager.list()
307 new_package_atoms = manager.list()
Ningning Xia783efc02018-01-24 13:39:51 -0800308
Alex Klein1699fab2022-09-08 08:46:06 -0600309 messages = manager.list()
310 ebuild_paths_to_add = manager.list()
311 ebuild_paths_to_remove = manager.list()
Ningning Xia783efc02018-01-24 13:39:51 -0800312
Alex Klein1699fab2022-09-08 08:46:06 -0600313 cros_mark_as_stable._WorkOnEbuild(
314 overlay,
315 ebuild,
316 self._manifest,
317 self._commit_options,
318 ebuild_paths_to_add,
319 ebuild_paths_to_remove,
320 messages,
321 revved_packages,
322 new_package_atoms,
323 )
324 self.assertEqual(list(ebuild_paths_to_add), [])
325 self.assertEqual(list(ebuild_paths_to_remove), [])
326 self.assertEqual(list(messages), [])
327 self.assertEqual(list(revved_packages), [])
328 self.assertEqual(list(new_package_atoms), [])
Ningning Xia783efc02018-01-24 13:39:51 -0800329
330
Alex Klein1699fab2022-09-08 08:46:06 -0600331class MainTests(
332 cros_test_lib.RunCommandTestCase, cros_test_lib.MockTempDirTestCase
333):
334 """Tests for cros_mark_as_stable.main()."""
Ningning Xiadb884322018-01-26 16:27:06 -0800335
Alex Klein1699fab2022-09-08 08:46:06 -0600336 def setUp(self):
337 self.PatchObject(
338 git.ManifestCheckout, "Cached", return_value="manifest"
339 )
340 self.mock_work_on_push = self.PatchObject(
341 cros_mark_as_stable, "_WorkOnPush"
342 )
343 self.mock_work_on_commit = self.PatchObject(
344 cros_mark_as_stable, "_WorkOnCommit"
345 )
Ningning Xiadb884322018-01-26 16:27:06 -0800346
Alex Klein1699fab2022-09-08 08:46:06 -0600347 self._overlays = []
348 remote_refs = []
349 self._overlay_tracking_branch = {}
350 self._git_project_overlays = {}
351 for i in range(0, 3):
352 overlay = os.path.join(self.tempdir, "overlay_%s" % i)
353 osutils.SafeMakedirs(overlay)
354 self._overlays.append(overlay)
Ningning Xiadb884322018-01-26 16:27:06 -0800355
Alex Klein1699fab2022-09-08 08:46:06 -0600356 remote_ref = git.RemoteRef("remote", "ref", "project_%s" % i)
357 remote_refs.append(remote_ref)
Ningning Xiadb884322018-01-26 16:27:06 -0800358
Alex Klein1699fab2022-09-08 08:46:06 -0600359 self._overlay_tracking_branch[overlay] = remote_ref.ref
360 self._git_project_overlays[remote_ref.project_name] = [overlay]
Ningning Xia419e4eb2018-02-05 10:30:36 -0800361
Alex Klein1699fab2022-09-08 08:46:06 -0600362 self.PatchObject(
363 portage_util, "FindOverlays", return_value=self._overlays
364 )
365 self.PatchObject(
366 git, "GetTrackingBranchViaManifest", side_effect=remote_refs
367 )
Ningning Xia419e4eb2018-02-05 10:30:36 -0800368
Alex Klein1699fab2022-09-08 08:46:06 -0600369 def testMainWithCommit(self):
370 """Test Main with Commit options."""
371 cros_mark_as_stable.main(
372 ["commit", "--all", "--overlays", ":".join(self._overlays)]
373 )
374 self.mock_work_on_commit.assert_called_once_with(
375 mock.ANY,
376 self._overlays,
377 self._overlay_tracking_branch,
378 self._git_project_overlays,
379 "manifest",
380 None,
381 )
Ningning Xia419e4eb2018-02-05 10:30:36 -0800382
Alex Klein1699fab2022-09-08 08:46:06 -0600383 def testMainWithPush(self):
384 """Test Main with Push options."""
385 cros_mark_as_stable.main(
386 ["push", "--all", "--overlays", ":".join(self._overlays)]
387 )
388 self.mock_work_on_push.assert_called_once_with(
389 mock.ANY, self._overlay_tracking_branch, self._git_project_overlays
390 )
391 options = self.mock_work_on_push.call_args[0][0]
392 self.assertEqual(options.buildroot, constants.SOURCE_ROOT)
393 self.assertIsNone(options.srcroot)
Don Garrett4fef8c32018-08-10 18:04:01 -0700394
Alex Klein1699fab2022-09-08 08:46:06 -0600395 def testMainWithOverlayTypeCommit(self):
396 """Test Main with Commit options."""
397 cros_mark_as_stable.main(["commit", "--all", "--overlay-type", "both"])
398 self.mock_work_on_commit.assert_called_once_with(
399 mock.ANY,
400 self._overlays,
401 self._overlay_tracking_branch,
402 self._git_project_overlays,
403 "manifest",
404 None,
405 )
406 options = self.mock_work_on_commit.call_args[0][0]
407 self.assertEqual(options.buildroot, constants.SOURCE_ROOT)
408 self.assertIsNone(options.srcroot)
Don Garrett4fef8c32018-08-10 18:04:01 -0700409
Alex Klein1699fab2022-09-08 08:46:06 -0600410 def testMainWithBuildroot(self):
411 """Test Main with Commit options."""
412 self.PatchObject(
413 os.path, "isdir", side_effect=lambda p: p == "/buildroot"
414 )
Don Garrett4fef8c32018-08-10 18:04:01 -0700415
Alex Klein1699fab2022-09-08 08:46:06 -0600416 cros_mark_as_stable.main(
417 [
418 "commit",
419 "--all",
420 "--overlay-type",
421 "both",
422 "--buildroot",
423 "/buildroot",
424 ]
425 )
Don Garrett4fef8c32018-08-10 18:04:01 -0700426
Alex Klein1699fab2022-09-08 08:46:06 -0600427 options = self.mock_work_on_commit.call_args[0][0]
428 self.assertEqual(options.buildroot, "/buildroot")
429 self.assertIsNone(options.srcroot)
Don Garrett4fef8c32018-08-10 18:04:01 -0700430
Alex Klein1699fab2022-09-08 08:46:06 -0600431 def testMainWithSrcroot(self):
432 """Test Main with Commit options."""
433 self.PatchObject(
434 os.path, "isdir", side_effect=lambda p: p == "/buildroot"
435 )
Don Garrett4fef8c32018-08-10 18:04:01 -0700436
Alex Klein1699fab2022-09-08 08:46:06 -0600437 cros_mark_as_stable.main(
438 [
439 "commit",
440 "--all",
441 "--overlay-type",
442 "both",
443 "--srcroot",
444 "/buildroot/src",
445 ]
446 )
Don Garrett4fef8c32018-08-10 18:04:01 -0700447
Alex Klein1699fab2022-09-08 08:46:06 -0600448 options = self.mock_work_on_commit.call_args[0][0]
449 self.assertEqual(options.buildroot, "/buildroot")
450 self.assertIsNone(options.srcroot)
Ningning Xiadb884322018-01-26 16:27:06 -0800451
452
Benjamin Gordon121a2aa2018-05-04 16:24:45 -0600453class CleanStalePackagesTest(cros_test_lib.RunCommandTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600454 """Tests for cros_mark_as_stable.CleanStalePackages."""
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400455
Alex Klein1699fab2022-09-08 08:46:06 -0600456 def setUp(self):
457 self.PatchObject(osutils, "FindMissingBinaries", return_value=[])
David James59a0a2b2013-03-22 14:04:44 -0700458
Alex Klein1699fab2022-09-08 08:46:06 -0600459 def testNormalClean(self):
460 """Clean up boards/packages with normal success"""
461 cros_mark_as_stable.CleanStalePackages(
462 ".", ("board1", "board2"), ["cow", "car"]
463 )
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400464
Alex Klein1699fab2022-09-08 08:46:06 -0600465 def testNothingToUnmerge(self):
466 """Clean up packages that don't exist (portage will exit 1)"""
467 self.rc.AddCmdResult(partial_mock.In("emerge"), returncode=1)
468 cros_mark_as_stable.CleanStalePackages(".", (), ["no/pkg"])
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400469
Alex Klein1699fab2022-09-08 08:46:06 -0600470 def testUnmergeError(self):
471 """Make sure random exit errors are not ignored"""
472 self.rc.AddCmdResult(partial_mock.In("emerge"), returncode=123)
473 with parallel_unittest.ParallelMock():
474 with self.assertRaises(cros_build_lib.RunCommandError):
475 cros_mark_as_stable.CleanStalePackages(".", (), ["no/pkg"])
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400476
477
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500478class GitBranchTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600479 """Tests for cros_mark_as_stable.GitBranch."""
Chris Sosadad0d322011-01-31 16:37:33 -0800480
Alex Klein1699fab2022-09-08 08:46:06 -0600481 def setUp(self):
482 # Always stub RunCommmand out as we use it in every method.
483 self.git_mock = self.PatchObject(git, "RunGit")
484 self.start_mock = self.PatchObject(repo_util.Repository, "StartBranch")
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500485
Alex Klein1699fab2022-09-08 08:46:06 -0600486 self._branch_name = "test_branch"
487 self._target_manifest_branch = "cros/test"
488 self._branch = cros_mark_as_stable.GitBranch(
489 branch_name=self._branch_name,
490 tracking_branch=self._target_manifest_branch,
491 cwd=".",
492 )
Chris Sosadad0d322011-01-31 16:37:33 -0800493
Alex Klein1699fab2022-09-08 08:46:06 -0600494 def testCheckoutCreate(self):
495 """Test init with no previous branch existing."""
496 self.PatchObject(self._branch, "Exists", return_value=False)
497 cros_mark_as_stable.GitBranch.Checkout(self._branch)
498 self.start_mock.assert_called_with(
499 self._branch_name, projects=["."], cwd="."
500 )
Chris Sosadad0d322011-01-31 16:37:33 -0800501
Alex Klein1699fab2022-09-08 08:46:06 -0600502 def testCheckoutNoCreate(self):
503 """Test init with previous branch existing."""
504 self.PatchObject(self._branch, "Exists", return_value=True)
505 cros_mark_as_stable.GitBranch.Checkout(self._branch)
506 self.git_mock.assert_called_with(
507 ".", ["checkout", "-f", self._branch_name]
508 )
Chris Sosadad0d322011-01-31 16:37:33 -0800509
Alex Klein1699fab2022-09-08 08:46:06 -0600510 def testExists(self):
511 """Test if branch exists that is created."""
512 result = cros_build_lib.CompletedProcess(
513 stdout=self._branch_name + "\n"
514 )
515 self.PatchObject(git, "RunGit", return_value=result)
516 self.assertTrue(self._branch.Exists())