blob: 30222bef65ea0019d42e9bdc8432152f1e583eb6 [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Mike Frysinger6cb624a2012-05-24 18:17:38 -04002# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Sosadad0d322011-01-31 16:37:33 -08003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Unit tests for cros_mark_as_stable.py."""
7
Mike Frysinger383367e2014-09-16 15:06:17 -04008from __future__ import print_function
9
Ningning Xia783efc02018-01-24 13:39:51 -080010import os
Mike Frysinger32781402020-04-19 06:34:17 -040011import sys
Chris Sosadad0d322011-01-31 16:37:33 -080012
Mike Frysinger6db648e2018-07-24 19:57:58 -040013import mock
14
Don Garrett4fef8c32018-08-10 18:04:01 -070015from chromite.lib import constants
J. Richard Barnetted422f622011-11-17 09:39:46 -080016from chromite.lib import cros_build_lib
Brian Harringc92788f2012-09-21 18:07:15 -070017from chromite.lib import cros_test_lib
David James97d95872012-11-16 15:09:56 -080018from chromite.lib import git
David James59a0a2b2013-03-22 14:04:44 -070019from chromite.lib import osutils
Ningning Xia783efc02018-01-24 13:39:51 -080020from chromite.lib import parallel
Mike Frysingerde5ab0e2013-03-21 20:48:36 -040021from chromite.lib import parallel_unittest
22from chromite.lib import partial_mock
Ningning Xia783efc02018-01-24 13:39:51 -080023from chromite.lib import portage_util
Lann Martinb26e1292018-08-09 13:59:19 -060024from chromite.lib import repo_util
Mike Frysinger6cb624a2012-05-24 18:17:38 -040025from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080026
Greg Edelstonba9e3da2020-03-13 15:07:14 -060027pytestmark = cros_test_lib.pytestmark_inside_only
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070028
Mike Frysingeref6ccb22014-11-07 14:59:48 -050029
Mike Frysinger32781402020-04-19 06:34:17 -040030assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
31
32
Mike Frysingerc9785342014-12-08 00:47:08 -050033class RunGitMock(partial_mock.PartialCmdMock):
34 """Partial mock for git.RunMock."""
35 TARGET = 'chromite.lib.git'
36 ATTRS = ('RunGit',)
37 DEFAULT_ATTR = 'RunGit'
38
39 def RunGit(self, _git_repo, cmd, _retry=True, **kwargs):
40 return self._results['RunGit'].LookupResult(
41 (cmd,), hook_args=(cmd,), hook_kwargs=kwargs)
Mike Frysingeref6ccb22014-11-07 14:59:48 -050042
43
Mike Frysingerc9785342014-12-08 00:47:08 -050044class NonClassTests(cros_test_lib.MockTestCase):
Don Garrett25f309a2014-03-19 14:02:12 -070045 """Test the flow for pushing a change."""
Mike Frysingerc9785342014-12-08 00:47:08 -050046
Chris Sosadad0d322011-01-31 16:37:33 -080047 def setUp(self):
Chris Sosadad0d322011-01-31 16:37:33 -080048 self._branch = 'test_branch'
Brian Harringeb237932012-05-07 02:08:06 -070049 self._target_manifest_branch = 'cros/master'
Chris Sosadad0d322011-01-31 16:37:33 -080050
Matt Tennantcb522052013-11-25 14:23:43 -080051 def _TestPushChange(self, bad_cls):
Mike Frysingerc9785342014-12-08 00:47:08 -050052 side_effect = Exception('unittest says this should not be called')
53
Chris Sosadad0d322011-01-31 16:37:33 -080054 git_log = 'Marking test_one as stable\nMarking test_two as stable\n'
55 fake_description = 'Marking set of ebuilds as stable\n\n%s' % git_log
David James47959632015-10-23 07:56:01 -070056 self.PatchObject(git, 'DoesCommitExistInRepo', return_value=True)
Mike Frysingerc9785342014-12-08 00:47:08 -050057 self.PatchObject(cros_mark_as_stable, '_DoWeHaveLocalCommits',
58 return_value=True)
59 self.PatchObject(cros_mark_as_stable.GitBranch, 'CreateBranch',
60 side_effect=side_effect)
61 self.PatchObject(cros_mark_as_stable.GitBranch, 'Exists',
62 side_effect=side_effect)
Chris Sosadad0d322011-01-31 16:37:33 -080063
Mike Nicholsa6818c52018-04-09 11:05:42 -060064 push_mock = self.PatchObject(git, 'PushBranch')
Don Garrett99449592015-03-25 11:01:30 -070065 self.PatchObject(
66 git, 'GetTrackingBranch',
67 return_value=git.RemoteRef('gerrit', 'refs/remotes/gerrit/master'))
Mike Frysingerc9785342014-12-08 00:47:08 -050068 sync_mock = self.PatchObject(git, 'SyncPushBranch')
69 create_mock = self.PatchObject(git, 'CreatePushBranch')
70 git_mock = self.StartPatcher(RunGitMock())
Matt Tennantcb522052013-11-25 14:23:43 -080071
Paul Hobbsf52ea8f2015-10-21 17:24:23 -070072 git_mock.AddCmdResult(['checkout', self._branch])
73
Andrew Lamb7ef2c0b2019-07-17 09:43:27 -060074 cmd = [
75 'log', '--format=short', '--perl-regexp', '--author',
76 '^(?!chrome-bot|chromeos-ci-prod)',
77 'refs/remotes/gerrit/master..%s' % self._branch
78 ]
Matt Tennantcb522052013-11-25 14:23:43 -080079
80 if bad_cls:
Mike Frysingerc9785342014-12-08 00:47:08 -050081 push_mock.side_effect = side_effect
82 create_mock.side_effect = side_effect
83 git_mock.AddCmdResult(cmd, output='Found bad stuff')
Matt Tennantcb522052013-11-25 14:23:43 -080084 else:
Mike Frysingerc9785342014-12-08 00:47:08 -050085 git_mock.AddCmdResult(cmd, output='\n')
Matt Tennantcb522052013-11-25 14:23:43 -080086 cmd = ['log', '--format=format:%s%n%n%b',
87 'refs/remotes/gerrit/master..%s' % self._branch]
Mike Frysingerc9785342014-12-08 00:47:08 -050088 git_mock.AddCmdResult(cmd, output=git_log)
89 git_mock.AddCmdResult(['merge', '--squash', self._branch])
90 git_mock.AddCmdResult(['commit', '-m', fake_description])
91 git_mock.AddCmdResult(['config', 'push.default', 'tracking'])
Matt Tennantcb522052013-11-25 14:23:43 -080092
Paul Hobbs72d8e392015-10-21 17:24:23 -070093 cros_mark_as_stable.PushChange(self._branch, self._target_manifest_branch,
94 False, '.')
95 sync_mock.assert_called_with('.', 'gerrit', 'refs/remotes/gerrit/master')
96 if not bad_cls:
Ningning Xia52009062016-05-09 14:33:51 -070097 push_mock.assert_called_with('merge_branch', '.', dryrun=False,
Sean Abraham11b57f82019-09-20 19:33:17 +000098 staging_branch=None)
Paul Hobbsf52ea8f2015-10-21 17:24:23 -070099 create_mock.assert_called_with('merge_branch', '.',
100 remote_push_branch=mock.ANY)
Chris Sosadad0d322011-01-31 16:37:33 -0800101
Matt Tennantcb522052013-11-25 14:23:43 -0800102 def testPushChange(self):
Mike Frysingerc9785342014-12-08 00:47:08 -0500103 """Verify pushing changes works."""
Matt Tennantcb522052013-11-25 14:23:43 -0800104 self._TestPushChange(bad_cls=False)
105
106 def testPushChangeBadCls(self):
Mike Frysingerc9785342014-12-08 00:47:08 -0500107 """Verify we do not push bad CLs."""
Matt Tennantcb522052013-11-25 14:23:43 -0800108 self.assertRaises(AssertionError, self._TestPushChange, bad_cls=True)
109
Chris Sosadad0d322011-01-31 16:37:33 -0800110
Ningning Xia783efc02018-01-24 13:39:51 -0800111class EbuildMock(object):
112 """Mock portage_util.Ebuild."""
113
114 def __init__(self, path, new_package=True):
115 self.path = path
116 self.package = '%s_package' % path
117 self.cros_workon_vars = 'cros_workon_vars'
118 self._new_package = new_package
119
120 # pylint: disable=unused-argument
Mike Frysinger62ff8d72020-05-19 03:06:51 -0400121 def RevWorkOnEBuild(self, srcroot, manifest, reject_self_repo=True):
Ningning Xia783efc02018-01-24 13:39:51 -0800122 if self._new_package:
123 return ('%s_new_package' % self.path,
124 '%s_new_ebuild' % self.path,
125 '%s_old_ebuild' % self.path)
126
127
128# pylint: disable=protected-access
Ningning Xia419e4eb2018-02-05 10:30:36 -0800129class MarkAsStableCMDTest(cros_test_lib.MockTempDirTestCase):
130 """Test cros_mark_as_stable commands."""
Ningning Xia783efc02018-01-24 13:39:51 -0800131
132 def setUp(self):
Ningning Xia783efc02018-01-24 13:39:51 -0800133 self._manifest = 'manifest'
134 self._parser = cros_mark_as_stable.GetParser()
Ningning Xia419e4eb2018-02-05 10:30:36 -0800135 self._package_list = ['pkg1']
Ningning Xia783efc02018-01-24 13:39:51 -0800136
Ningning Xia419e4eb2018-02-05 10:30:36 -0800137 self._overlays = [os.path.join(self.tempdir, 'overlay_%s' % i)
138 for i in range(0, 3)]
139
140 self._overlay_remote_ref = {
141 self._overlays[0]: git.RemoteRef('remote', 'ref', 'project_1'),
142 self._overlays[1]: git.RemoteRef('remote', 'ref', 'project_1'),
143 self._overlays[2]: git.RemoteRef('remote', 'ref', 'project_2'),
144 }
145
146 self._git_project_overlays = {}
147 self._overlay_tracking_branch = {}
148 for overlay in self._overlays:
149 self._git_project_overlays.setdefault(
150 self._overlay_remote_ref[overlay], []).append(overlay)
151 self._overlay_tracking_branch[overlay] = (
152 self._overlay_remote_ref[overlay].ref)
Ningning Xia783efc02018-01-24 13:39:51 -0800153
154 self.PatchObject(git, 'GetTrackingBranchViaManifest')
Don Garrett4fef8c32018-08-10 18:04:01 -0700155 # TODO: Remove explicit --buildroot after --srcroot remove and a normal
156 # default is set.
157 self._commit_options = self._parser.parse_args(
158 ['commit', '--buildroot', constants.SOURCE_ROOT])
159 self._push_options = self._parser.parse_args(
160 ['push', '--buildroot', constants.SOURCE_ROOT])
Ningning Xia783efc02018-01-24 13:39:51 -0800161
Ningning Xia419e4eb2018-02-05 10:30:36 -0800162 def testWorkOnPush(self):
163 """Test _WorkOnPush."""
164 self.PatchObject(parallel, 'RunTasksInProcessPool')
165
166 cros_mark_as_stable._WorkOnPush(
167 self._push_options, self._overlay_tracking_branch,
168 self._git_project_overlays)
169
170 def testPushOverlays(self):
171 """Test _PushOverlays."""
172 self.PatchObject(os.path, 'isdir', return_value=True)
173 mock_push_change = self.PatchObject(cros_mark_as_stable, 'PushChange')
174
175 cros_mark_as_stable._PushOverlays(
176 self._push_options, self._overlays, self._overlay_tracking_branch)
177 self.assertEqual(mock_push_change.call_count, 3)
178
179 def testWorkOnCommit(self):
180 """Test _WorkOnCommit."""
181 self.PatchObject(parallel, 'RunTasksInProcessPool')
182 self.PatchObject(cros_mark_as_stable, '_CommitOverlays')
183 self.PatchObject(cros_mark_as_stable, '_GetOverlayToEbuildsMap',
184 return_value={})
185
186 cros_mark_as_stable._WorkOnCommit(
187 self._commit_options, self._overlays, self._overlay_tracking_branch,
188 self._git_project_overlays, self._manifest, self._package_list)
189
190 def testGetOverlayToEbuildsMap(self):
191 """Test _GetOverlayToEbuildsMap."""
192 self.PatchObject(portage_util, 'GetOverlayEBuilds', return_value=['ebuild'])
193
194 expected_overlay_dicts = {
195 overlay : ['ebuild'] for overlay in self._overlays}
196 overlay_ebuilds = cros_mark_as_stable._GetOverlayToEbuildsMap(
197 self._commit_options, self._overlays, self._package_list)
Mike Frysinger678735c2019-09-28 18:23:28 -0400198 self.assertCountEqual(expected_overlay_dicts, overlay_ebuilds)
Ningning Xia419e4eb2018-02-05 10:30:36 -0800199
200 def testCommitOverlays(self):
201 """Test _CommitOverlays."""
202 mock_run_process_pool = self.PatchObject(parallel, 'RunTasksInProcessPool')
203 self.PatchObject(os.path, 'isdir', return_value=True)
204 self.PatchObject(git, 'RunGit')
205 self.PatchObject(cros_mark_as_stable, '_WorkOnEbuild', return_value=None)
206 self.PatchObject(git, 'GetGitRepoRevision')
207 self.PatchObject(cros_mark_as_stable.GitBranch, 'CreateBranch')
208 self.PatchObject(cros_mark_as_stable.GitBranch, 'Exists', return_value=True)
209 self.PatchObject(portage_util.EBuild, 'CommitChange')
210
211 overlay_ebuilds = {
212 self._overlays[0]: ['ebuild_1_1', 'ebuild_1_2'],
213 self._overlays[1]: ['ebuild_2_1'],
214 self._overlays[2]: ['ebuild_3_1', 'ebuild_3_2'],
215 }
216
217 cros_mark_as_stable._CommitOverlays(
218 self._commit_options, self._manifest, self._overlays,
219 self._overlay_tracking_branch, overlay_ebuilds, list(), list())
220 self.assertEqual(3, mock_run_process_pool.call_count)
Ningning Xia783efc02018-01-24 13:39:51 -0800221
222 def testWorkOnEbuildWithNewPackage(self):
223 """Test _WorkOnEbuild with new packages."""
Ningning Xia419e4eb2018-02-05 10:30:36 -0800224 overlay = self._overlays[0]
Ningning Xia783efc02018-01-24 13:39:51 -0800225 ebuild = EbuildMock('ebuild')
Ningning Xia783efc02018-01-24 13:39:51 -0800226
Ningning Xia419e4eb2018-02-05 10:30:36 -0800227 with parallel.Manager() as manager:
228 revved_packages = manager.list()
229 new_package_atoms = manager.list()
230
231 messages = manager.list()
232 ebuild_paths_to_add = manager.list()
233 ebuild_paths_to_remove = manager.list()
234
235 cros_mark_as_stable._WorkOnEbuild(
236 overlay, ebuild, self._manifest, self._commit_options,
237 ebuild_paths_to_add, ebuild_paths_to_remove,
238 messages, revved_packages, new_package_atoms)
Mike Frysinger678735c2019-09-28 18:23:28 -0400239 self.assertCountEqual(ebuild_paths_to_add, ['ebuild_new_ebuild'])
240 self.assertCountEqual(ebuild_paths_to_remove, ['ebuild_old_ebuild'])
241 self.assertCountEqual(messages,
Ningning Xia419e4eb2018-02-05 10:30:36 -0800242 [cros_mark_as_stable._GIT_COMMIT_MESSAGE %
243 'ebuild_package'])
Mike Frysinger678735c2019-09-28 18:23:28 -0400244 self.assertCountEqual(revved_packages, ['ebuild_package'])
245 self.assertCountEqual(new_package_atoms, ['=ebuild_new_package'])
Ningning Xia783efc02018-01-24 13:39:51 -0800246
247 def testWorkOnEbuildWithoutNewPackage(self):
248 """Test _WorkOnEbuild without new packages."""
249 ebuild = EbuildMock('ebuild', new_package=False)
Ningning Xia419e4eb2018-02-05 10:30:36 -0800250 overlay = self._overlays[0]
Ningning Xia783efc02018-01-24 13:39:51 -0800251
Ningning Xia419e4eb2018-02-05 10:30:36 -0800252 with parallel.Manager() as manager:
253 revved_packages = manager.list()
254 new_package_atoms = manager.list()
Ningning Xia783efc02018-01-24 13:39:51 -0800255
Ningning Xia419e4eb2018-02-05 10:30:36 -0800256 messages = manager.list()
257 ebuild_paths_to_add = manager.list()
258 ebuild_paths_to_remove = manager.list()
Ningning Xia783efc02018-01-24 13:39:51 -0800259
Ningning Xia419e4eb2018-02-05 10:30:36 -0800260 cros_mark_as_stable._WorkOnEbuild(
261 overlay, ebuild, self._manifest, self._commit_options,
262 ebuild_paths_to_add, ebuild_paths_to_remove, messages,
263 revved_packages, new_package_atoms)
264 self.assertEqual(list(ebuild_paths_to_add), [])
265 self.assertEqual(list(ebuild_paths_to_remove), [])
266 self.assertEqual(list(messages), [])
267 self.assertEqual(list(revved_packages), [])
268 self.assertEqual(list(new_package_atoms), [])
Ningning Xia783efc02018-01-24 13:39:51 -0800269
270
Benjamin Gordon121a2aa2018-05-04 16:24:45 -0600271class MainTests(cros_test_lib.RunCommandTestCase,
Ningning Xiadb884322018-01-26 16:27:06 -0800272 cros_test_lib.MockTempDirTestCase):
273 """Tests for cros_mark_as_stable.main()."""
274
275 def setUp(self):
276 self.PatchObject(git.ManifestCheckout, 'Cached', return_value='manifest')
Ningning Xia419e4eb2018-02-05 10:30:36 -0800277 self.mock_work_on_push = self.PatchObject(
278 cros_mark_as_stable, '_WorkOnPush')
279 self.mock_work_on_commit = self.PatchObject(
280 cros_mark_as_stable, '_WorkOnCommit')
Ningning Xiadb884322018-01-26 16:27:06 -0800281
Ningning Xia419e4eb2018-02-05 10:30:36 -0800282 self._overlays = []
283 remote_refs = []
284 self._overlay_tracking_branch = {}
285 self._git_project_overlays = {}
Ningning Xiadb884322018-01-26 16:27:06 -0800286 for i in range(0, 3):
287 overlay = os.path.join(self.tempdir, 'overlay_%s' % i)
288 osutils.SafeMakedirs(overlay)
Ningning Xia419e4eb2018-02-05 10:30:36 -0800289 self._overlays.append(overlay)
Ningning Xiadb884322018-01-26 16:27:06 -0800290
Ningning Xia419e4eb2018-02-05 10:30:36 -0800291 remote_ref = git.RemoteRef('remote', 'ref', 'project_%s' % i)
292 remote_refs.append(remote_ref)
Ningning Xiadb884322018-01-26 16:27:06 -0800293
Ningning Xia419e4eb2018-02-05 10:30:36 -0800294 self._overlay_tracking_branch[overlay] = remote_ref.ref
295 self._git_project_overlays[remote_ref.project_name] = [overlay]
296
Don Garrettf9eff952018-08-10 16:50:04 -0700297 self.PatchObject(portage_util, 'FindOverlays',
298 return_value=self._overlays)
Ningning Xia419e4eb2018-02-05 10:30:36 -0800299 self.PatchObject(git, 'GetTrackingBranchViaManifest',
300 side_effect=remote_refs)
301
302 def testMainWithCommit(self):
303 """Test Main with Commit options."""
Ningning Xiadb884322018-01-26 16:27:06 -0800304 cros_mark_as_stable.main(
Ningning Xia419e4eb2018-02-05 10:30:36 -0800305 ['commit', '--all', '--overlays', ':'.join(self._overlays)])
306 self.mock_work_on_commit.assert_called_once_with(
307 mock.ANY, self._overlays, self._overlay_tracking_branch,
308 self._git_project_overlays, 'manifest', None)
309
310 def testMainWithPush(self):
311 """Test Main with Push options."""
312 cros_mark_as_stable.main(
313 ['push', '--all', '--overlays', ':'.join(self._overlays)])
314 self.mock_work_on_push.assert_called_once_with(
315 mock.ANY, self._overlay_tracking_branch, self._git_project_overlays)
Don Garrett4fef8c32018-08-10 18:04:01 -0700316 options = self.mock_work_on_push.call_args[0][0]
317 self.assertEqual(options.buildroot, constants.SOURCE_ROOT)
318 self.assertIsNone(options.srcroot)
319
320 def testMainWithOverlayTypeCommit(self):
321 """Test Main with Commit options."""
322 cros_mark_as_stable.main(
323 ['commit', '--all', '--overlay-type', 'both'])
324 self.mock_work_on_commit.assert_called_once_with(
325 mock.ANY, self._overlays, self._overlay_tracking_branch,
326 self._git_project_overlays, 'manifest', None)
327 options = self.mock_work_on_commit.call_args[0][0]
328 self.assertEqual(options.buildroot, constants.SOURCE_ROOT)
329 self.assertIsNone(options.srcroot)
330
331 def testMainWithBuildroot(self):
332 """Test Main with Commit options."""
333 self.PatchObject(os.path, 'isdir', side_effect=lambda p: p == '/buildroot')
334
335 cros_mark_as_stable.main(
336 ['commit', '--all', '--overlay-type', 'both',
337 '--buildroot', '/buildroot'])
338
339 options = self.mock_work_on_commit.call_args[0][0]
340 self.assertEqual(options.buildroot, '/buildroot')
341 self.assertIsNone(options.srcroot)
342
343 def testMainWithSrcroot(self):
344 """Test Main with Commit options."""
345 self.PatchObject(os.path, 'isdir', side_effect=lambda p: p == '/buildroot')
346
347 cros_mark_as_stable.main(
348 ['commit', '--all', '--overlay-type', 'both',
349 '--srcroot', '/buildroot/src'])
350
351 options = self.mock_work_on_commit.call_args[0][0]
352 self.assertEqual(options.buildroot, '/buildroot')
353 self.assertIsNone(options.srcroot)
Ningning Xiadb884322018-01-26 16:27:06 -0800354
355
Benjamin Gordon121a2aa2018-05-04 16:24:45 -0600356class CleanStalePackagesTest(cros_test_lib.RunCommandTestCase):
Don Garrett25f309a2014-03-19 14:02:12 -0700357 """Tests for cros_mark_as_stable.CleanStalePackages."""
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400358
David James59a0a2b2013-03-22 14:04:44 -0700359 def setUp(self):
360 self.PatchObject(osutils, 'FindMissingBinaries', return_value=[])
361
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400362 def testNormalClean(self):
363 """Clean up boards/packages with normal success"""
David James41124af2015-06-04 21:13:25 -0700364 cros_mark_as_stable.CleanStalePackages('.', ('board1', 'board2'),
365 ['cow', 'car'])
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400366
367 def testNothingToUnmerge(self):
368 """Clean up packages that don't exist (portage will exit 1)"""
369 self.rc.AddCmdResult(partial_mock.In('emerge'), returncode=1)
David James41124af2015-06-04 21:13:25 -0700370 cros_mark_as_stable.CleanStalePackages('.', (), ['no/pkg'])
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400371
372 def testUnmergeError(self):
373 """Make sure random exit errors are not ignored"""
374 self.rc.AddCmdResult(partial_mock.In('emerge'), returncode=123)
375 with parallel_unittest.ParallelMock():
Dean Liao6eddc8d2018-01-25 17:13:39 +0800376 with self.assertRaises(cros_build_lib.RunCommandError):
377 cros_mark_as_stable.CleanStalePackages('.', (), ['no/pkg'])
Mike Frysingerde5ab0e2013-03-21 20:48:36 -0400378
379
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500380class GitBranchTest(cros_test_lib.MockTestCase):
Don Garrett25f309a2014-03-19 14:02:12 -0700381 """Tests for cros_mark_as_stable.GitBranch."""
Chris Sosadad0d322011-01-31 16:37:33 -0800382
383 def setUp(self):
Chris Sosadad0d322011-01-31 16:37:33 -0800384 # Always stub RunCommmand out as we use it in every method.
Lann Martinb26e1292018-08-09 13:59:19 -0600385 self.git_mock = self.PatchObject(git, 'RunGit')
386 self.start_mock = self.PatchObject(repo_util.Repository, 'StartBranch')
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500387
Chris Sosadad0d322011-01-31 16:37:33 -0800388 self._branch_name = 'test_branch'
Brian Harringeb237932012-05-07 02:08:06 -0700389 self._target_manifest_branch = 'cros/test'
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500390 self._branch = cros_mark_as_stable.GitBranch(
391 branch_name=self._branch_name,
392 tracking_branch=self._target_manifest_branch,
393 cwd='.')
Chris Sosadad0d322011-01-31 16:37:33 -0800394
395 def testCheckoutCreate(self):
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500396 """Test init with no previous branch existing."""
397 self.PatchObject(self._branch, 'Exists', return_value=False)
Chris Sosadad0d322011-01-31 16:37:33 -0800398 cros_mark_as_stable.GitBranch.Checkout(self._branch)
Lann Martinb26e1292018-08-09 13:59:19 -0600399 self.start_mock.assert_called_with(self._branch_name,
400 projects=['.'], cwd='.')
Chris Sosadad0d322011-01-31 16:37:33 -0800401
402 def testCheckoutNoCreate(self):
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500403 """Test init with previous branch existing."""
404 self.PatchObject(self._branch, 'Exists', return_value=True)
Chris Sosadad0d322011-01-31 16:37:33 -0800405 cros_mark_as_stable.GitBranch.Checkout(self._branch)
Lann Martinb26e1292018-08-09 13:59:19 -0600406 self.git_mock.assert_called_with('.', ['checkout', '-f', self._branch_name],
407 quiet=True)
Chris Sosadad0d322011-01-31 16:37:33 -0800408
Chris Sosadad0d322011-01-31 16:37:33 -0800409 def testExists(self):
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500410 """Test if branch exists that is created."""
Mike Frysinger7dafd0e2012-05-08 15:47:16 -0400411 result = cros_build_lib.CommandResult(output=self._branch_name + '\n')
Mike Frysingeref6ccb22014-11-07 14:59:48 -0500412 self.PatchObject(git, 'RunGit', return_value=result)
413 self.assertTrue(self._branch.Exists())