blob: 9bb3db15ca294efae5a0fa8f339670e64516b75d [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Don Garrettc4114cc2016-11-01 20:04:06 -07002# Copyright 2016 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -07006"""Unit tests for chromite.scripts.cbuildbot_launch."""
Don Garrettc4114cc2016-11-01 20:04:06 -07007
8from __future__ import print_function
9
Don Garrett7ade05a2017-02-17 13:31:47 -080010import os
Mike Frysinger3c831a72020-02-19 02:47:04 -050011import sys
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -070012import time
Don Garrett86881cb2017-02-15 15:41:55 -080013
Mike Frysinger6db648e2018-07-24 19:57:58 -040014import mock
15
Mike Frysingerc263d092019-09-18 15:11:47 -040016from chromite.cbuildbot import commands
Don Garrett86881cb2017-02-15 15:41:55 -080017from chromite.cbuildbot import repository
Benjamin Gordon90b2dd92018-04-12 14:04:21 -060018from chromite.lib import build_summary
Don Garrett861e9182017-05-15 15:30:23 -070019from chromite.lib import constants
Benjamin Gordon74645232018-05-04 17:40:42 -060020from chromite.lib import cros_sdk_lib
Don Garrett7ade05a2017-02-17 13:31:47 -080021from chromite.lib import cros_test_lib
Don Garrett86881cb2017-02-15 15:41:55 -080022from chromite.lib import osutils
Mike Frysingerf0146252019-09-02 13:31:05 -040023from chromite.lib import timeout_util
Don Garrett0c54ed72017-03-03 11:18:57 -080024from chromite.scripts import cbuildbot_launch
Don Garrett86881cb2017-02-15 15:41:55 -080025
Mike Frysinger3c831a72020-02-19 02:47:04 -050026
27assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
28
29
Don Garrett86881cb2017-02-15 15:41:55 -080030EXPECTED_MANIFEST_URL = 'https://chrome-internal-review.googlesource.com/chromeos/manifest-internal' # pylint: disable=line-too-long
Don Garrettc4114cc2016-11-01 20:04:06 -070031
32
Don Garrettacbb2392017-05-11 18:27:41 -070033# It's reasonable for unittests to look at internals.
34# pylint: disable=protected-access
35
36
Don Garrett8d314792017-05-18 13:11:42 -070037class FakeException(Exception):
38 """Test exception to raise during tests."""
39
40
Don Garrett0c54ed72017-03-03 11:18:57 -080041class CbuildbotLaunchTest(cros_test_lib.MockTestCase):
42 """Tests for cbuildbot_launch script."""
Don Garrettc4114cc2016-11-01 20:04:06 -070043
Don Garrett86881cb2017-02-15 15:41:55 -080044 def testPreParseArguments(self):
Don Garrettc4114cc2016-11-01 20:04:06 -070045 """Test that we can correctly extract branch values from cbuildbot args."""
Don Garrett597ddff2017-02-17 18:29:37 -080046 CASES = (
47 (['--buildroot', '/buildroot', 'daisy-incremental'],
48 (None, '/buildroot', None)),
49
50 (['--buildbot', '--buildroot', '/buildroot',
51 '--git-cache-dir', '/git-cache',
52 '-b', 'release-R57-9202.B',
53 'daisy-incremental'],
54 ('release-R57-9202.B', '/buildroot', '/git-cache')),
55
56 (['--debug', '--buildbot', '--notests',
57 '--buildroot', '/buildroot',
58 '--git-cache-dir', '/git-cache',
59 '--branch', 'release-R57-9202.B',
60 'daisy-incremental'],
61 ('release-R57-9202.B', '/buildroot', '/git-cache')),
Don Garrettc4114cc2016-11-01 20:04:06 -070062 )
63
Don Garrett597ddff2017-02-17 18:29:37 -080064 for cmd_args, expected in CASES:
65 expected_branch, expected_buildroot, expected_cache_dir = expected
66
Don Garrett0c54ed72017-03-03 11:18:57 -080067 options = cbuildbot_launch.PreParseArguments(cmd_args)
Don Garrett597ddff2017-02-17 18:29:37 -080068
69 self.assertEqual(options.branch, expected_branch)
70 self.assertEqual(options.buildroot, expected_buildroot)
71 self.assertEqual(options.git_cache_dir, expected_cache_dir)
Don Garrett86881cb2017-02-15 15:41:55 -080072
Don Garrettf324bc32017-05-23 14:00:53 -070073 def testInitialCheckout(self):
Don Garrett86881cb2017-02-15 15:41:55 -080074 """Test InitialCheckout with minimum settings."""
Don Garrettf324bc32017-05-23 14:00:53 -070075 mock_repo = mock.MagicMock()
76 mock_repo.branch = 'branch'
Mike Nichols9fb48832021-01-29 14:47:15 -070077 argv = ['-r', '/root', 'config']
78 options = cbuildbot_launch.PreParseArguments(argv)
Don Garrett86881cb2017-02-15 15:41:55 -080079
Mike Nichols9fb48832021-01-29 14:47:15 -070080 cbuildbot_launch.InitialCheckout(mock_repo, options)
Don Garrett86881cb2017-02-15 15:41:55 -080081
82 self.assertEqual(mock_repo.mock_calls, [
Don Garrett5516acb2018-11-15 16:02:59 -080083 mock.call.PreLoad('/preload/chromeos'),
Mike Nichols9fb48832021-01-29 14:47:15 -070084 mock.call.Sync(detach=True, downgrade_repo=False),
Don Garrett8d314792017-05-18 13:11:42 -070085 ])
86
Don Garrettf15d65b2017-04-12 12:39:55 -070087 def testConfigureGlobalEnvironment(self):
Don Garrett60967922017-04-12 18:51:44 -070088 """Ensure that we can setup our global runtime environment correctly."""
Don Garrett86fec482017-05-17 18:13:33 -070089
90 os.environ.pop('LANG', None)
91 os.environ['LC_MONETARY'] = 'bad'
92
Don Garrettf15d65b2017-04-12 12:39:55 -070093 cbuildbot_launch.ConfigureGlobalEnvironment()
94
Don Garrett86fec482017-05-17 18:13:33 -070095 # Verify umask is updated.
Don Garrettf15d65b2017-04-12 12:39:55 -070096 self.assertEqual(os.umask(0), 0o22)
97
Don Garrett86fec482017-05-17 18:13:33 -070098 # Verify ENVs are cleaned up.
99 self.assertEqual(os.environ['LANG'], 'en_US.UTF-8')
100 self.assertNotIn('LC_MONETARY', os.environ)
101
Don Garrettf15d65b2017-04-12 12:39:55 -0700102
Benjamin Gordon121a2aa2018-05-04 16:24:45 -0600103class RunTests(cros_test_lib.RunCommandTestCase):
Don Garrett0c54ed72017-03-03 11:18:57 -0800104 """Tests for cbuildbot_launch script."""
Don Garrett597ddff2017-02-17 18:29:37 -0800105
106 ARGS_BASE = ['--buildroot', '/buildroot']
Don Garrett5cd946b2017-07-20 13:42:20 -0700107 EXPECTED_ARGS_BASE = ['--buildroot', '/cbuildbot_buildroot']
Don Garrett597ddff2017-02-17 18:29:37 -0800108 ARGS_GIT_CACHE = ['--git-cache-dir', '/git-cache']
109 ARGS_CONFIG = ['config']
Don Garrettbf90cdf2017-05-19 15:54:02 -0700110 CMD = ['/cbuildbot_buildroot/chromite/bin/cbuildbot']
Don Garrett597ddff2017-02-17 18:29:37 -0800111
Don Garrett6e5c6b92018-04-06 17:58:49 -0700112 def verifyCbuildbot(self, args, expected_cmd, version):
Don Garrett86881cb2017-02-15 15:41:55 -0800113 """Ensure we invoke cbuildbot correctly."""
Don Garrett597ddff2017-02-17 18:29:37 -0800114 self.PatchObject(
Mike Frysingerc263d092019-09-18 15:11:47 -0400115 commands, 'GetTargetChromiteApiVersion', autospec=True,
Don Garrett597ddff2017-02-17 18:29:37 -0800116 return_value=version)
117
Don Garrett6e5c6b92018-04-06 17:58:49 -0700118 cbuildbot_launch.Cbuildbot('/cbuildbot_buildroot', '/depot_tools', args)
Don Garrett597ddff2017-02-17 18:29:37 -0800119
120 self.assertCommandCalled(
Don Garretta50bf492017-09-28 18:33:02 -0700121 expected_cmd, extra_env={'PATH': mock.ANY},
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500122 cwd='/cbuildbot_buildroot', check=False)
Don Garrett597ddff2017-02-17 18:29:37 -0800123
Don Garrett6e5c6b92018-04-06 17:58:49 -0700124 def testCbuildbotSimple(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800125 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700126 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800127 self.ARGS_BASE + self.ARGS_CONFIG,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700128 self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE,
Don Garrett597ddff2017-02-17 18:29:37 -0800129 (0, 4))
130
Don Garrett6e5c6b92018-04-06 17:58:49 -0700131 def testCbuildbotNotFiltered(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800132 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700133 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800134 self.ARGS_BASE + self.ARGS_CONFIG + self.ARGS_GIT_CACHE,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700135 (self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE +
136 self.ARGS_GIT_CACHE),
Don Garrett597ddff2017-02-17 18:29:37 -0800137 (0, 4))
138
Don Garrett6e5c6b92018-04-06 17:58:49 -0700139 def testCbuildbotFiltered(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800140 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700141 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800142 self.ARGS_BASE + self.ARGS_CONFIG + self.ARGS_GIT_CACHE,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700143 self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE,
Don Garrett597ddff2017-02-17 18:29:37 -0800144 (0, 2))
Don Garrettc4114cc2016-11-01 20:04:06 -0700145
Don Garrett86881cb2017-02-15 15:41:55 -0800146 def testMainMin(self):
147 """Test a minimal set of command line options."""
Don Garrett597ddff2017-02-17 18:29:37 -0800148 self.PatchObject(osutils, 'SafeMakedirs', autospec=True)
Mike Frysingerc263d092019-09-18 15:11:47 -0400149 self.PatchObject(commands, 'GetTargetChromiteApiVersion',
Don Garrett861e9182017-05-15 15:30:23 -0700150 autospec=True, return_value=(constants.REEXEC_API_MAJOR,
151 constants.REEXEC_API_MINOR))
Don Garrettf324bc32017-05-23 14:00:53 -0700152 mock_repo = mock.MagicMock()
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000153 mock_repo.branch = 'main'
Don Garrettbf90cdf2017-05-19 15:54:02 -0700154 mock_repo.directory = '/root/repository'
155
Don Garrettf324bc32017-05-23 14:00:53 -0700156 mock_repo_create = self.PatchObject(repository, 'RepoRepository',
157 autospec=True, return_value=mock_repo)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700158 mock_clean = self.PatchObject(cbuildbot_launch, 'CleanBuildRoot',
Don Garrett0c54ed72017-03-03 11:18:57 -0800159 autospec=True)
160 mock_checkout = self.PatchObject(cbuildbot_launch, 'InitialCheckout',
Don Garrett86881cb2017-02-15 15:41:55 -0800161 autospec=True)
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700162 mock_cleanup_chroot = self.PatchObject(cbuildbot_launch, 'CleanupChroot',
163 autospec=True)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600164 mock_set_last_build_state = self.PatchObject(
165 cbuildbot_launch, 'SetLastBuildState', autospec=True)
166
167 expected_build_state = build_summary.BuildSummary(
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600168 build_number=0, master_build_id=0, status=mock.ANY,
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000169 buildroot_layout=2, branch='main')
Don Garrett7ade05a2017-02-17 13:31:47 -0800170
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600171 argv = ['-r', '/root', 'config']
172 options = cbuildbot_launch.PreParseArguments(argv)
173 cbuildbot_launch._main(options, argv)
Don Garrettc4114cc2016-11-01 20:04:06 -0700174
Don Garrettf324bc32017-05-23 14:00:53 -0700175 # Did we create the repo instance correctly?
176 self.assertEqual(mock_repo_create.mock_calls,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700177 [mock.call(EXPECTED_MANIFEST_URL, '/root/repository',
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000178 git_cache_dir=None, branch='main')])
Don Garrettf324bc32017-05-23 14:00:53 -0700179
Don Garrett7ade05a2017-02-17 13:31:47 -0800180 # Ensure we clean, as expected.
Don Garrettbf90cdf2017-05-19 15:54:02 -0700181 self.assertEqual(mock_clean.mock_calls, [
Don Garrett61ce1ee2019-02-26 16:20:25 -0800182 mock.call('/root', mock_repo, '/root/repository/.cache',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600183 expected_build_state)])
Don Garrett7ade05a2017-02-17 13:31:47 -0800184
Don Garrett86881cb2017-02-15 15:41:55 -0800185 # Ensure we checkout, as expected.
186 self.assertEqual(mock_checkout.mock_calls,
Mike Nichols9fb48832021-01-29 14:47:15 -0700187 [mock.call(mock_repo, options)])
Don Garrettc4114cc2016-11-01 20:04:06 -0700188
Don Garrett86881cb2017-02-15 15:41:55 -0800189 # Ensure we invoke cbuildbot, as expected.
190 self.assertCommandCalled(
Don Garrett5cd946b2017-07-20 13:42:20 -0700191 [
192 '/root/repository/chromite/bin/cbuildbot',
193 'config',
194 '-r', '/root/repository',
Don Garrettb497f552018-07-09 16:01:13 -0700195 '--workspace', '/root/workspace',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800196 '--cache-dir', '/root/repository/.cache',
197 # The duplication is a bug, but not harmful.
198 '--cache-dir', '/root/repository/.cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700199 ],
Don Garretta50bf492017-09-28 18:33:02 -0700200 extra_env={'PATH': mock.ANY},
Don Garrettbf90cdf2017-05-19 15:54:02 -0700201 cwd='/root/repository',
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500202 check=False)
Don Garrettc4114cc2016-11-01 20:04:06 -0700203
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600204 # Ensure we saved the final state, as expected.
205 self.assertEqual(expected_build_state.status,
206 constants.BUILDER_STATUS_PASSED)
207 self.assertEqual(mock_set_last_build_state.mock_calls, [
208 mock.call('/root', expected_build_state)])
209
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700210 # Ensure we clean the chroot, as expected.
Mike Frysingerf0146252019-09-02 13:31:05 -0400211 mock_cleanup_chroot.assert_called_once_with('/root/repository')
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700212
Don Garrett86881cb2017-02-15 15:41:55 -0800213 def testMainMax(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800214 """Test a larger set of command line options."""
215 self.PatchObject(osutils, 'SafeMakedirs', autospec=True)
Mike Frysingerc263d092019-09-18 15:11:47 -0400216 self.PatchObject(commands, 'GetTargetChromiteApiVersion',
Don Garrett861e9182017-05-15 15:30:23 -0700217 autospec=True, return_value=(constants.REEXEC_API_MAJOR,
218 constants.REEXEC_API_MINOR))
Don Garrettf324bc32017-05-23 14:00:53 -0700219 mock_repo = mock.MagicMock()
220 mock_repo.branch = 'branch'
Don Garrettbf90cdf2017-05-19 15:54:02 -0700221 mock_repo.directory = '/root/repository'
222
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600223 mock_summary = build_summary.BuildSummary(
224 build_number=313,
225 master_build_id=123123123,
226 status=constants.BUILDER_STATUS_FAILED,
227 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
228 branch='branch')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600229
230 mock_get_last_build_state = self.PatchObject(
231 cbuildbot_launch, 'GetLastBuildState', autospec=True,
232 return_value=mock_summary)
Don Garrettf324bc32017-05-23 14:00:53 -0700233 mock_repo_create = self.PatchObject(repository, 'RepoRepository',
234 autospec=True, return_value=mock_repo)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700235 mock_clean = self.PatchObject(cbuildbot_launch, 'CleanBuildRoot',
Don Garrett0c54ed72017-03-03 11:18:57 -0800236 autospec=True)
237 mock_checkout = self.PatchObject(cbuildbot_launch, 'InitialCheckout',
Don Garrett86881cb2017-02-15 15:41:55 -0800238 autospec=True)
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700239 mock_cleanup_chroot = self.PatchObject(cbuildbot_launch, 'CleanupChroot',
240 autospec=True)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600241 mock_set_last_build_state = self.PatchObject(
242 cbuildbot_launch, 'SetLastBuildState', autospec=True)
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600243 argv = ['--buildroot', '/root',
244 '--branch', 'branch',
245 '--git-cache-dir', '/git-cache',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800246 '--cache-dir', '/cache',
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600247 '--remote-trybot',
248 '--master-build-id', '123456789',
249 '--buildnumber', '314',
250 'config']
251 options = cbuildbot_launch.PreParseArguments(argv)
252 cbuildbot_launch._main(options, argv)
Don Garrettc4114cc2016-11-01 20:04:06 -0700253
Don Garrettf324bc32017-05-23 14:00:53 -0700254 # Did we create the repo instance correctly?
255 self.assertEqual(mock_repo_create.mock_calls,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700256 [mock.call(EXPECTED_MANIFEST_URL, '/root/repository',
Don Garrett33872502018-08-03 22:30:40 +0000257 git_cache_dir='/git-cache', branch='branch')])
Don Garrettf324bc32017-05-23 14:00:53 -0700258
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600259 # Ensure we look up the previous status.
260 self.assertEqual(mock_get_last_build_state.mock_calls, [
261 mock.call('/root')])
262
Don Garrett7ade05a2017-02-17 13:31:47 -0800263 # Ensure we clean, as expected.
Don Garrettbf90cdf2017-05-19 15:54:02 -0700264 self.assertEqual(mock_clean.mock_calls, [
Don Garrettd1d90dd2017-06-13 17:35:52 -0700265 mock.call('/root',
266 mock_repo,
Don Garrett61ce1ee2019-02-26 16:20:25 -0800267 '/cache',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600268 build_summary.BuildSummary(
269 build_number=314,
270 master_build_id=123456789,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600271 status=mock.ANY,
272 branch='branch',
273 buildroot_layout=2
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600274 ))])
Don Garrett7ade05a2017-02-17 13:31:47 -0800275
Don Garrett86881cb2017-02-15 15:41:55 -0800276 # Ensure we checkout, as expected.
277 self.assertEqual(mock_checkout.mock_calls,
Mike Nichols9fb48832021-01-29 14:47:15 -0700278 [mock.call(mock_repo, options)])
Don Garrett86881cb2017-02-15 15:41:55 -0800279
280 # Ensure we invoke cbuildbot, as expected.
281 self.assertCommandCalled(
Don Garrett5cd946b2017-07-20 13:42:20 -0700282 [
283 '/root/repository/chromite/bin/cbuildbot',
284 'config',
285 '--buildroot', '/root/repository',
286 '--branch', 'branch',
287 '--git-cache-dir', '/git-cache',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800288 '--cache-dir', '/cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700289 '--remote-trybot',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600290 '--master-build-id', '123456789',
291 '--buildnumber', '314',
292 '--previous-build-state',
Mike Frysingerd0960812020-06-09 01:53:32 -0400293 'eyJicmFuY2giOiJicmFuY2giLCJidWlsZF9udW1iZXIiOjMxMywiYnVpbGRyb290X'
294 '2xheW91dCI6MiwibWFzdGVyX2J1aWxkX2lkIjoxMjMxMjMxMjMsInN0YXR1cyI6Im'
295 'ZhaWwifQ==',
Don Garrettb497f552018-07-09 16:01:13 -0700296 '--workspace', '/root/workspace',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800297 '--cache-dir', '/cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700298 ],
Don Garretta50bf492017-09-28 18:33:02 -0700299 extra_env={'PATH': mock.ANY},
Don Garrettbf90cdf2017-05-19 15:54:02 -0700300 cwd='/root/repository',
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500301 check=False)
Don Garrett7ade05a2017-02-17 13:31:47 -0800302
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600303 # Ensure we write the final build state, as expected.
304 final_state = build_summary.BuildSummary(
305 build_number=314,
306 master_build_id=123456789,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600307 status=constants.BUILDER_STATUS_PASSED,
308 buildroot_layout=2,
309 branch='branch')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600310 self.assertEqual(mock_set_last_build_state.mock_calls, [
311 mock.call('/root', final_state)])
312
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700313 # Ensure we clean the chroot, as expected.
Mike Frysingerf0146252019-09-02 13:31:05 -0400314 mock_cleanup_chroot.assert_called_once_with('/root/repository')
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700315
Don Garrett7ade05a2017-02-17 13:31:47 -0800316
Don Garrettbf90cdf2017-05-19 15:54:02 -0700317class CleanBuildRootTest(cros_test_lib.MockTempDirTestCase):
318 """Tests for CleanBuildRoot method."""
Don Garrett7ade05a2017-02-17 13:31:47 -0800319
320 def setUp(self):
321 """Create standard buildroot contents for cleanup."""
Don Garrettbf90cdf2017-05-19 15:54:02 -0700322 self.root = os.path.join(self.tempdir)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600323 self.previous_build_state = os.path.join(
324 self.root, '.cbuildbot_build_state.json')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700325 self.buildroot = os.path.join(self.root, 'buildroot')
326 self.repo = os.path.join(self.buildroot, '.repo/repo')
Don Garrett36650112018-06-28 15:54:34 -0700327 self.chroot = os.path.join(self.buildroot, 'chroot')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700328 self.general = os.path.join(self.buildroot, 'general/general')
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700329 self.cache = os.path.join(self.buildroot, '.cache')
330 self.distfiles = os.path.join(self.cache, 'distfiles')
Don Garrett7ade05a2017-02-17 13:31:47 -0800331
Don Garrett4166d182018-12-17 12:52:02 -0800332 self.mock_repo = mock.Mock(repository.RepoRepository)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700333 self.mock_repo.directory = self.buildroot
Don Garrettf324bc32017-05-23 14:00:53 -0700334
Benjamin Gordon8642bcc2018-05-01 13:49:56 -0600335 def populateBuildroot(self, previous_build_state=None):
Don Garrett7ade05a2017-02-17 13:31:47 -0800336 """Create standard buildroot contents for cleanup."""
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600337 if previous_build_state:
338 osutils.SafeMakedirs(self.root)
339 osutils.WriteFile(self.previous_build_state, previous_build_state)
340
Don Garrett7ade05a2017-02-17 13:31:47 -0800341 # Create files.
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700342 for f in (self.repo, self.chroot, self.general, self.distfiles):
Don Garrette17e1d92017-04-12 15:28:19 -0700343 osutils.Touch(f, makedirs=True)
Don Garrett7ade05a2017-02-17 13:31:47 -0800344
Don Garrette17e1d92017-04-12 15:28:19 -0700345 def testNoBuildroot(self):
Don Garrettbf90cdf2017-05-19 15:54:02 -0700346 """Test CleanBuildRoot with no history."""
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000347 self.mock_repo.branch = 'main'
Don Garrettf324bc32017-05-23 14:00:53 -0700348
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600349 build_state = build_summary.BuildSummary(
350 status=constants.BUILDER_STATUS_INFLIGHT,
351 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000352 branch='main')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700353 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800354 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800355
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600356 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600357 self.assertEqual(new_summary.buildroot_layout, 2)
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000358 self.assertEqual(new_summary.branch, 'main')
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600359 self.assertIsNotNone(new_summary.distfiles_ts)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600360 self.assertEqual(new_summary, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800361
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600362 self.assertExists(self.previous_build_state)
363
Don Garrett7ade05a2017-02-17 13:31:47 -0800364 def testBuildrootNoState(self):
Don Garrettbf90cdf2017-05-19 15:54:02 -0700365 """Test CleanBuildRoot with no state information."""
Don Garrett7ade05a2017-02-17 13:31:47 -0800366 self.populateBuildroot()
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000367 self.mock_repo.branch = 'main'
Don Garrett7ade05a2017-02-17 13:31:47 -0800368
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600369 build_state = build_summary.BuildSummary(
370 status=constants.BUILDER_STATUS_INFLIGHT,
371 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000372 branch='main')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700373 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800374 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800375
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600376 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600377 self.assertEqual(new_summary.buildroot_layout, 2)
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000378 self.assertEqual(new_summary.branch, 'main')
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600379 self.assertIsNotNone(new_summary.distfiles_ts)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600380 self.assertEqual(new_summary, build_state)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700381
Don Garrett60967922017-04-12 18:51:44 -0700382 self.assertNotExists(self.repo)
Don Garrett7ade05a2017-02-17 13:31:47 -0800383 self.assertNotExists(self.chroot)
Don Garrett60967922017-04-12 18:51:44 -0700384 self.assertNotExists(self.general)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700385 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600386 self.assertExists(self.previous_build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800387
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600388 def testBuildrootFormatMismatch(self):
389 """Test CleanBuildRoot with buildroot layout mismatch."""
390 old_build_state = build_summary.BuildSummary(
391 status=constants.BUILDER_STATUS_PASSED,
392 buildroot_layout=1,
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000393 branch='main')
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600394 self.populateBuildroot(previous_build_state=old_build_state.to_json())
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000395 self.mock_repo.branch = 'main'
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600396
397 build_state = build_summary.BuildSummary(
398 status=constants.BUILDER_STATUS_INFLIGHT,
399 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000400 branch='main')
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600401 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800402 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600403
404 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
405 self.assertEqual(new_summary.buildroot_layout, 2)
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000406 self.assertEqual(new_summary.branch, 'main')
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600407 self.assertIsNotNone(new_summary.distfiles_ts)
408 self.assertEqual(new_summary, build_state)
409
410 self.assertNotExists(self.repo)
411 self.assertNotExists(self.chroot)
412 self.assertNotExists(self.general)
413 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600414 self.assertExists(self.previous_build_state)
415
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600416 def testBuildrootBranchChange(self):
417 """Test CleanBuildRoot with a change in branches."""
418 old_build_state = build_summary.BuildSummary(
419 status=constants.BUILDER_STATUS_PASSED,
420 buildroot_layout=2,
421 branch='branchA')
422 self.populateBuildroot(previous_build_state=old_build_state.to_json())
423 self.mock_repo.branch = 'branchB'
Benjamin Gordon74645232018-05-04 17:40:42 -0600424 m = self.PatchObject(cros_sdk_lib, 'CleanupChrootMount')
Don Garrett7ade05a2017-02-17 13:31:47 -0800425
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600426 build_state = build_summary.BuildSummary(
427 status=constants.BUILDER_STATUS_INFLIGHT,
428 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
429 branch='branchB')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700430 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800431 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800432
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600433 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600434 self.assertEqual(new_summary.buildroot_layout, 2)
435 self.assertEqual(new_summary.branch, 'branchB')
436 self.assertIsNotNone(new_summary.distfiles_ts)
437 self.assertEqual(new_summary, build_state)
438
Don Garrett4166d182018-12-17 12:52:02 -0800439 # self.assertExists(self.repo)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600440 self.assertExists(self.general)
441 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600442 self.assertExists(self.previous_build_state)
Don Garrett36650112018-06-28 15:54:34 -0700443 m.assert_called_with(self.chroot, delete=True)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600444
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600445 def testBuildrootBranchMatch(self):
446 """Test CleanBuildRoot with no change in branch."""
447 old_build_state = build_summary.BuildSummary(
448 status=constants.BUILDER_STATUS_PASSED,
449 buildroot_layout=2,
450 branch='branchA')
451 self.populateBuildroot(previous_build_state=old_build_state.to_json())
452 self.mock_repo.branch = 'branchA'
453
454 build_state = build_summary.BuildSummary(
455 status=constants.BUILDER_STATUS_INFLIGHT,
456 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
457 branch='branchA')
458 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800459 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600460
461 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
462 self.assertEqual(new_summary.buildroot_layout, 2)
463 self.assertEqual(new_summary.branch, 'branchA')
464 self.assertIsNotNone(new_summary.distfiles_ts)
465 self.assertEqual(new_summary, build_state)
466
467 self.assertExists(self.repo)
468 self.assertExists(self.chroot)
469 self.assertExists(self.general)
470 self.assertExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600471 self.assertExists(self.previous_build_state)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700472
Don Garrett4166d182018-12-17 12:52:02 -0800473 def testBuildrootGitLocksPrevPass(self):
474 """Verify not CleanStaleLocks, if previous build was in passed."""
475 old_build_state = build_summary.BuildSummary(
476 status=constants.BUILDER_STATUS_PASSED,
477 buildroot_layout=2,
478 branch='branchA')
479 self.populateBuildroot(previous_build_state=old_build_state.to_json())
480 self.mock_repo.branch = 'branchA'
481
482 build_state = build_summary.BuildSummary(
483 status=constants.BUILDER_STATUS_INFLIGHT,
484 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
485 branch='branchA')
486 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800487 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800488
489 self.assertEqual(
490 self.mock_repo.mock_calls, [
491 mock.call.PreLoad(),
492 mock.call.BuildRootGitCleanup(prune_all=True),
493 ])
494
495 def testBuildrootGitLocksPrevFail(self):
496 """Verify not CleanStaleLocks, if previous build was in failed."""
497 old_build_state = build_summary.BuildSummary(
498 status=constants.BUILDER_STATUS_FAILED,
499 buildroot_layout=2,
500 branch='branchA')
501 self.populateBuildroot(previous_build_state=old_build_state.to_json())
502 self.mock_repo.branch = 'branchA'
503
504 build_state = build_summary.BuildSummary(
505 status=constants.BUILDER_STATUS_INFLIGHT,
506 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
507 branch='branchA')
508 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800509 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800510
511 self.assertEqual(
512 self.mock_repo.mock_calls, [
513 mock.call.PreLoad(),
514 mock.call.BuildRootGitCleanup(prune_all=True),
515 ])
516
517 def testBuildrootGitLocksPrevInFlight(self):
518 """Verify CleanStaleLocks, if previous build was in flight."""
519 old_build_state = build_summary.BuildSummary(
520 status=constants.BUILDER_STATUS_INFLIGHT,
521 buildroot_layout=2,
522 branch='branchA')
523 self.populateBuildroot(previous_build_state=old_build_state.to_json())
524 self.mock_repo.branch = 'branchA'
525
526 build_state = build_summary.BuildSummary(
527 status=constants.BUILDER_STATUS_INFLIGHT,
528 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
529 branch='branchA')
530 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800531 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800532
533
534 self.assertEqual(
535 self.mock_repo.method_calls, [
536 mock.call.PreLoad(),
537 mock.call.CleanStaleLocks(),
538 mock.call.BuildRootGitCleanup(prune_all=True),
539 ])
540
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600541 def testBuildrootDistfilesRecentCache(self):
542 """Test CleanBuildRoot does not delete distfiles when cache is recent."""
543 seed_distfiles_ts = time.time() - 60
544 old_build_state = build_summary.BuildSummary(
545 status=constants.BUILDER_STATUS_PASSED,
546 buildroot_layout=2,
547 branch='branchA',
548 distfiles_ts=seed_distfiles_ts)
549 self.populateBuildroot(previous_build_state=old_build_state.to_json())
550 self.mock_repo.branch = 'branchA'
551
552 build_state = build_summary.BuildSummary(
553 status=constants.BUILDER_STATUS_INFLIGHT,
554 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
555 branch='branchA')
556 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800557 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600558
559 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
560 self.assertEqual(new_summary.buildroot_layout, 2)
561 self.assertEqual(new_summary.branch, 'branchA')
562 # Same cache creation timestamp is rewritten to state.
563 self.assertEqual(new_summary.distfiles_ts, seed_distfiles_ts)
564 self.assertEqual(new_summary, build_state)
565
566 self.assertExists(self.repo)
567 self.assertExists(self.chroot)
568 self.assertExists(self.general)
569 self.assertExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600570 self.assertExists(self.previous_build_state)
Don Garrette17e1d92017-04-12 15:28:19 -0700571
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600572 def testBuildrootDistfilesCacheExpired(self):
573 """Test CleanBuildRoot when the distfiles cache is too old."""
574 old_build_state = build_summary.BuildSummary(
575 status=constants.BUILDER_STATUS_PASSED,
576 buildroot_layout=2,
577 branch='branchA',
578 distfiles_ts=100.0)
579 self.populateBuildroot(previous_build_state=old_build_state.to_json())
580 self.mock_repo.branch = 'branchA'
581
582 build_state = build_summary.BuildSummary(
583 status=constants.BUILDER_STATUS_INFLIGHT,
584 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
585 branch='branchA')
586 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800587 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600588
589 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
590 self.assertEqual(new_summary.buildroot_layout, 2)
591 self.assertEqual(new_summary.branch, 'branchA')
592 self.assertIsNotNone(new_summary.distfiles_ts)
593 self.assertEqual(new_summary, build_state)
594
595 self.assertExists(self.repo)
596 self.assertExists(self.chroot)
597 self.assertExists(self.general)
598 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600599 self.assertExists(self.previous_build_state)
600
Don Garrett61ce1ee2019-02-26 16:20:25 -0800601 def testRootOwnedCache(self):
602 """Test CleanBuildRoot with no history."""
603 seed_distfiles_ts = time.time() - 60
604 old_build_state = build_summary.BuildSummary(
605 status=constants.BUILDER_STATUS_PASSED,
606 buildroot_layout=2,
607 branch='branchA',
608 distfiles_ts=seed_distfiles_ts)
609 self.populateBuildroot(previous_build_state=old_build_state.to_json())
610 self.mock_repo.branch = 'branchA'
611
612 osutils.Chown(self.cache, 'root', 'root')
613
614 build_state = build_summary.BuildSummary(
615 status=constants.BUILDER_STATUS_INFLIGHT,
616 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
617 branch='branchA')
618 cbuildbot_launch.CleanBuildRoot(
619 self.root, self.mock_repo, self.cache, build_state)
620
621 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
622 self.assertEqual(new_summary.buildroot_layout, 2)
623 self.assertEqual(new_summary.branch, 'branchA')
624 # Same cache creation timestamp is rewritten to state.
625 self.assertEqual(new_summary.distfiles_ts, seed_distfiles_ts)
626 self.assertEqual(new_summary, build_state)
627
628 self.assertExists(self.repo)
629 self.assertExists(self.chroot)
630 self.assertExists(self.general)
631 self.assertNotExists(self.distfiles)
632 self.assertExists(self.previous_build_state)
633
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600634 def testBuildrootRepoCleanFailure(self):
635 """Test CleanBuildRoot with repo checkout failure."""
636 old_build_state = build_summary.BuildSummary(
637 status=constants.BUILDER_STATUS_PASSED,
638 buildroot_layout=1,
639 branch='branchA')
640 self.populateBuildroot(previous_build_state=old_build_state.to_json())
641 self.mock_repo.branch = 'branchA'
642 self.mock_repo.BuildRootGitCleanup.side_effect = Exception
643
644 build_state = build_summary.BuildSummary(
645 status=constants.BUILDER_STATUS_INFLIGHT,
646 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
647 branch='branchA')
648 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800649 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600650
651 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
652 self.assertEqual(new_summary.buildroot_layout, 2)
653 self.assertEqual(new_summary.branch, 'branchA')
654 self.assertIsNotNone(new_summary.distfiles_ts)
655 self.assertEqual(new_summary, build_state)
656
657 self.assertNotExists(self.repo)
658 self.assertNotExists(self.chroot)
659 self.assertNotExists(self.general)
660 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600661 self.assertExists(self.previous_build_state)
Don Garrettf324bc32017-05-23 14:00:53 -0700662
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600663 def testGetCurrentBuildStateNoArgs(self):
664 """Tests GetCurrentBuildState without arguments."""
665 options = cbuildbot_launch.PreParseArguments([
666 '--buildroot', self.root, 'config'
667 ])
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000668 state = cbuildbot_launch.GetCurrentBuildState(options, 'main')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600669
670 expected_state = build_summary.BuildSummary(
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600671 status=constants.BUILDER_STATUS_INFLIGHT,
672 buildroot_layout=2,
Julio Hurtado9265c7e2021-04-19 23:04:44 +0000673 branch='main')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600674 self.assertEqual(state, expected_state)
675
676 def testGetCurrentBuildStateHasArgs(self):
677 """Tests GetCurrentBuildState with arguments."""
678 options = cbuildbot_launch.PreParseArguments([
679 '--buildroot', self.root,
680 '--buildnumber', '20',
681 '--master-build-id', '50',
682 'config'
683 ])
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600684 state = cbuildbot_launch.GetCurrentBuildState(options, 'branchA')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600685
686 expected_state = build_summary.BuildSummary(
687 build_number=20,
688 master_build_id=50,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600689 status=constants.BUILDER_STATUS_INFLIGHT,
690 buildroot_layout=2,
691 branch='branchA')
692 self.assertEqual(state, expected_state)
693
694 def testGetCurrentBuildStateLayout(self):
695 """Test that GetCurrentBuildState uses the current buildroot layout."""
696 # Change to a future version.
697 self.PatchObject(cbuildbot_launch, 'BUILDROOT_BUILDROOT_LAYOUT', 22)
698
699 options = cbuildbot_launch.PreParseArguments([
700 '--buildroot', self.root, 'config'
701 ])
702 state = cbuildbot_launch.GetCurrentBuildState(options, 'branchA')
703
704 expected_state = build_summary.BuildSummary(
705 status=constants.BUILDER_STATUS_INFLIGHT,
706 buildroot_layout=22,
707 branch='branchA')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600708 self.assertEqual(state, expected_state)
709
710 def testGetLastBuildStateNoFile(self):
711 """Tests GetLastBuildState if the file is missing."""
712 osutils.SafeMakedirs(self.root)
713 state = cbuildbot_launch.GetLastBuildState(self.root)
714 self.assertEqual(state, build_summary.BuildSummary())
715
716 def testGetLastBuildStateBadFile(self):
717 """Tests GetLastBuildState if the file contains invalid JSON."""
718 osutils.SafeMakedirs(self.root)
719 osutils.WriteFile(self.previous_build_state, '}}')
720 state = cbuildbot_launch.GetLastBuildState(self.root)
721 self.assertEqual(state, build_summary.BuildSummary())
722
723 def testGetLastBuildStateMissingBuildStatus(self):
724 """Tests GetLastBuildState if the file doesn't have a valid status."""
725 osutils.SafeMakedirs(self.root)
726 osutils.WriteFile(self.previous_build_state, '{"build_number": "3"}')
727 state = cbuildbot_launch.GetLastBuildState(self.root)
728 self.assertEqual(state, build_summary.BuildSummary())
729
730 def testGetLastBuildStateGoodFile(self):
731 """Tests GetLastBuildState on a good file."""
732 osutils.SafeMakedirs(self.root)
733 osutils.WriteFile(
734 self.previous_build_state,
735 '{"build_number": 1, "master_build_id": 3, "status": "pass"}')
736 state = cbuildbot_launch.GetLastBuildState(self.root)
737 self.assertEqual(
738 state,
739 build_summary.BuildSummary(
740 build_number=1, master_build_id=3, status='pass'))
741
742 def testSetLastBuildState(self):
743 """Verifies that SetLastBuildState writes to the expected file."""
744 osutils.SafeMakedirs(self.root)
745 old_state = build_summary.BuildSummary(
746 build_number=314,
747 master_build_id=2178,
748 status=constants.BUILDER_STATUS_PASSED)
749 cbuildbot_launch.SetLastBuildState(self.root, old_state)
750
751 saved_state = osutils.ReadFile(self.previous_build_state)
752 new_state = build_summary.BuildSummary()
753 new_state.from_json(saved_state)
754
755 self.assertEqual(old_state, new_state)
Mike Frysingerf0146252019-09-02 13:31:05 -0400756
757 def testCleanupChrootNoChroot(self):
758 """Check CleanupChroot without a chroot."""
759 self.StartPatcher(cros_test_lib.RunCommandMock())
760 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount'):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400761 cbuildbot_launch.CleanupChroot(self.buildroot)
Mike Frysingerf0146252019-09-02 13:31:05 -0400762
763 def testCleanupChrootNormal(self):
764 """Check normal CleanupChroot."""
765 osutils.SafeMakedirs(self.chroot)
766 osutils.Touch(self.chroot + '.img')
767 self.StartPatcher(cros_test_lib.RunCommandMock())
768 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount'):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400769 cbuildbot_launch.CleanupChroot(self.buildroot)
Mike Frysingerf0146252019-09-02 13:31:05 -0400770
771 def testCleanupChrootTimeout(self):
772 """Check timeouts in CleanupChroot."""
773 osutils.SafeMakedirs(self.chroot)
774 osutils.Touch(self.chroot + '.img')
775 rc_mock = self.StartPatcher(cros_test_lib.RunCommandMock())
776 rc_mock.SetDefaultCmdResult()
777 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount',
778 side_effect=timeout_util.TimeoutError):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400779 cbuildbot_launch.CleanupChroot(self.buildroot)