blob: bff89737e566b99c62659cbcf6e80195ecaa8fde [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'
Don Garrett86881cb2017-02-15 15:41:55 -080077
Don Garrettf324bc32017-05-23 14:00:53 -070078 cbuildbot_launch.InitialCheckout(mock_repo)
Don Garrett86881cb2017-02-15 15:41:55 -080079
80 self.assertEqual(mock_repo.mock_calls, [
Don Garrett5516acb2018-11-15 16:02:59 -080081 mock.call.PreLoad('/preload/chromeos'),
Don Garrettf324bc32017-05-23 14:00:53 -070082 mock.call.Sync(detach=True),
Don Garrett8d314792017-05-18 13:11:42 -070083 ])
84
Don Garrettf15d65b2017-04-12 12:39:55 -070085 def testConfigureGlobalEnvironment(self):
Don Garrett60967922017-04-12 18:51:44 -070086 """Ensure that we can setup our global runtime environment correctly."""
Don Garrett86fec482017-05-17 18:13:33 -070087
88 os.environ.pop('LANG', None)
89 os.environ['LC_MONETARY'] = 'bad'
90
Don Garrettf15d65b2017-04-12 12:39:55 -070091 cbuildbot_launch.ConfigureGlobalEnvironment()
92
Don Garrett86fec482017-05-17 18:13:33 -070093 # Verify umask is updated.
Don Garrettf15d65b2017-04-12 12:39:55 -070094 self.assertEqual(os.umask(0), 0o22)
95
Don Garrett86fec482017-05-17 18:13:33 -070096 # Verify ENVs are cleaned up.
97 self.assertEqual(os.environ['LANG'], 'en_US.UTF-8')
98 self.assertNotIn('LC_MONETARY', os.environ)
99
Don Garrettf15d65b2017-04-12 12:39:55 -0700100
Benjamin Gordon121a2aa2018-05-04 16:24:45 -0600101class RunTests(cros_test_lib.RunCommandTestCase):
Don Garrett0c54ed72017-03-03 11:18:57 -0800102 """Tests for cbuildbot_launch script."""
Don Garrett597ddff2017-02-17 18:29:37 -0800103
104 ARGS_BASE = ['--buildroot', '/buildroot']
Don Garrett5cd946b2017-07-20 13:42:20 -0700105 EXPECTED_ARGS_BASE = ['--buildroot', '/cbuildbot_buildroot']
Don Garrett597ddff2017-02-17 18:29:37 -0800106 ARGS_GIT_CACHE = ['--git-cache-dir', '/git-cache']
107 ARGS_CONFIG = ['config']
Don Garrettbf90cdf2017-05-19 15:54:02 -0700108 CMD = ['/cbuildbot_buildroot/chromite/bin/cbuildbot']
Don Garrett597ddff2017-02-17 18:29:37 -0800109
Don Garrett6e5c6b92018-04-06 17:58:49 -0700110 def verifyCbuildbot(self, args, expected_cmd, version):
Don Garrett86881cb2017-02-15 15:41:55 -0800111 """Ensure we invoke cbuildbot correctly."""
Don Garrett597ddff2017-02-17 18:29:37 -0800112 self.PatchObject(
Mike Frysingerc263d092019-09-18 15:11:47 -0400113 commands, 'GetTargetChromiteApiVersion', autospec=True,
Don Garrett597ddff2017-02-17 18:29:37 -0800114 return_value=version)
115
Don Garrett6e5c6b92018-04-06 17:58:49 -0700116 cbuildbot_launch.Cbuildbot('/cbuildbot_buildroot', '/depot_tools', args)
Don Garrett597ddff2017-02-17 18:29:37 -0800117
118 self.assertCommandCalled(
Don Garretta50bf492017-09-28 18:33:02 -0700119 expected_cmd, extra_env={'PATH': mock.ANY},
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500120 cwd='/cbuildbot_buildroot', check=False)
Don Garrett597ddff2017-02-17 18:29:37 -0800121
Don Garrett6e5c6b92018-04-06 17:58:49 -0700122 def testCbuildbotSimple(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800123 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700124 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800125 self.ARGS_BASE + self.ARGS_CONFIG,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700126 self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE,
Don Garrett597ddff2017-02-17 18:29:37 -0800127 (0, 4))
128
Don Garrett6e5c6b92018-04-06 17:58:49 -0700129 def testCbuildbotNotFiltered(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800130 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700131 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800132 self.ARGS_BASE + self.ARGS_CONFIG + self.ARGS_GIT_CACHE,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700133 (self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE +
134 self.ARGS_GIT_CACHE),
Don Garrett597ddff2017-02-17 18:29:37 -0800135 (0, 4))
136
Don Garrett6e5c6b92018-04-06 17:58:49 -0700137 def testCbuildbotFiltered(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800138 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700139 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800140 self.ARGS_BASE + self.ARGS_CONFIG + self.ARGS_GIT_CACHE,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700141 self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE,
Don Garrett597ddff2017-02-17 18:29:37 -0800142 (0, 2))
Don Garrettc4114cc2016-11-01 20:04:06 -0700143
Don Garrett86881cb2017-02-15 15:41:55 -0800144 def testMainMin(self):
145 """Test a minimal set of command line options."""
Don Garrett597ddff2017-02-17 18:29:37 -0800146 self.PatchObject(osutils, 'SafeMakedirs', autospec=True)
Mike Frysingerc263d092019-09-18 15:11:47 -0400147 self.PatchObject(commands, 'GetTargetChromiteApiVersion',
Don Garrett861e9182017-05-15 15:30:23 -0700148 autospec=True, return_value=(constants.REEXEC_API_MAJOR,
149 constants.REEXEC_API_MINOR))
Don Garrettf324bc32017-05-23 14:00:53 -0700150 mock_repo = mock.MagicMock()
151 mock_repo.branch = 'master'
Don Garrettbf90cdf2017-05-19 15:54:02 -0700152 mock_repo.directory = '/root/repository'
153
Don Garrettf324bc32017-05-23 14:00:53 -0700154 mock_repo_create = self.PatchObject(repository, 'RepoRepository',
155 autospec=True, return_value=mock_repo)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700156 mock_clean = self.PatchObject(cbuildbot_launch, 'CleanBuildRoot',
Don Garrett0c54ed72017-03-03 11:18:57 -0800157 autospec=True)
158 mock_checkout = self.PatchObject(cbuildbot_launch, 'InitialCheckout',
Don Garrett86881cb2017-02-15 15:41:55 -0800159 autospec=True)
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700160 mock_cleanup_chroot = self.PatchObject(cbuildbot_launch, 'CleanupChroot',
161 autospec=True)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600162 mock_set_last_build_state = self.PatchObject(
163 cbuildbot_launch, 'SetLastBuildState', autospec=True)
164
165 expected_build_state = build_summary.BuildSummary(
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600166 build_number=0, master_build_id=0, status=mock.ANY,
167 buildroot_layout=2, branch='master')
Don Garrett7ade05a2017-02-17 13:31:47 -0800168
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600169 argv = ['-r', '/root', 'config']
170 options = cbuildbot_launch.PreParseArguments(argv)
171 cbuildbot_launch._main(options, argv)
Don Garrettc4114cc2016-11-01 20:04:06 -0700172
Don Garrettf324bc32017-05-23 14:00:53 -0700173 # Did we create the repo instance correctly?
174 self.assertEqual(mock_repo_create.mock_calls,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700175 [mock.call(EXPECTED_MANIFEST_URL, '/root/repository',
Don Garrett33872502018-08-03 22:30:40 +0000176 git_cache_dir=None, branch='master')])
Don Garrettf324bc32017-05-23 14:00:53 -0700177
Don Garrett7ade05a2017-02-17 13:31:47 -0800178 # Ensure we clean, as expected.
Don Garrettbf90cdf2017-05-19 15:54:02 -0700179 self.assertEqual(mock_clean.mock_calls, [
Don Garrett61ce1ee2019-02-26 16:20:25 -0800180 mock.call('/root', mock_repo, '/root/repository/.cache',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600181 expected_build_state)])
Don Garrett7ade05a2017-02-17 13:31:47 -0800182
Don Garrett86881cb2017-02-15 15:41:55 -0800183 # Ensure we checkout, as expected.
184 self.assertEqual(mock_checkout.mock_calls,
Don Garrettf324bc32017-05-23 14:00:53 -0700185 [mock.call(mock_repo)])
Don Garrettc4114cc2016-11-01 20:04:06 -0700186
Don Garrett86881cb2017-02-15 15:41:55 -0800187 # Ensure we invoke cbuildbot, as expected.
188 self.assertCommandCalled(
Don Garrett5cd946b2017-07-20 13:42:20 -0700189 [
190 '/root/repository/chromite/bin/cbuildbot',
191 'config',
192 '-r', '/root/repository',
Don Garrettb497f552018-07-09 16:01:13 -0700193 '--workspace', '/root/workspace',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800194 '--cache-dir', '/root/repository/.cache',
195 # The duplication is a bug, but not harmful.
196 '--cache-dir', '/root/repository/.cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700197 ],
Don Garretta50bf492017-09-28 18:33:02 -0700198 extra_env={'PATH': mock.ANY},
Don Garrettbf90cdf2017-05-19 15:54:02 -0700199 cwd='/root/repository',
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500200 check=False)
Don Garrettc4114cc2016-11-01 20:04:06 -0700201
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600202 # Ensure we saved the final state, as expected.
203 self.assertEqual(expected_build_state.status,
204 constants.BUILDER_STATUS_PASSED)
205 self.assertEqual(mock_set_last_build_state.mock_calls, [
206 mock.call('/root', expected_build_state)])
207
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700208 # Ensure we clean the chroot, as expected.
Mike Frysingerf0146252019-09-02 13:31:05 -0400209 mock_cleanup_chroot.assert_called_once_with('/root/repository')
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700210
Don Garrett86881cb2017-02-15 15:41:55 -0800211 def testMainMax(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800212 """Test a larger set of command line options."""
213 self.PatchObject(osutils, 'SafeMakedirs', autospec=True)
Mike Frysingerc263d092019-09-18 15:11:47 -0400214 self.PatchObject(commands, 'GetTargetChromiteApiVersion',
Don Garrett861e9182017-05-15 15:30:23 -0700215 autospec=True, return_value=(constants.REEXEC_API_MAJOR,
216 constants.REEXEC_API_MINOR))
Don Garrettf324bc32017-05-23 14:00:53 -0700217 mock_repo = mock.MagicMock()
218 mock_repo.branch = 'branch'
Don Garrettbf90cdf2017-05-19 15:54:02 -0700219 mock_repo.directory = '/root/repository'
220
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600221 mock_summary = build_summary.BuildSummary(
222 build_number=313,
223 master_build_id=123123123,
224 status=constants.BUILDER_STATUS_FAILED,
225 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
226 branch='branch')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600227
228 mock_get_last_build_state = self.PatchObject(
229 cbuildbot_launch, 'GetLastBuildState', autospec=True,
230 return_value=mock_summary)
Don Garrettf324bc32017-05-23 14:00:53 -0700231 mock_repo_create = self.PatchObject(repository, 'RepoRepository',
232 autospec=True, return_value=mock_repo)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700233 mock_clean = self.PatchObject(cbuildbot_launch, 'CleanBuildRoot',
Don Garrett0c54ed72017-03-03 11:18:57 -0800234 autospec=True)
235 mock_checkout = self.PatchObject(cbuildbot_launch, 'InitialCheckout',
Don Garrett86881cb2017-02-15 15:41:55 -0800236 autospec=True)
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700237 mock_cleanup_chroot = self.PatchObject(cbuildbot_launch, 'CleanupChroot',
238 autospec=True)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600239 mock_set_last_build_state = self.PatchObject(
240 cbuildbot_launch, 'SetLastBuildState', autospec=True)
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600241 argv = ['--buildroot', '/root',
242 '--branch', 'branch',
243 '--git-cache-dir', '/git-cache',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800244 '--cache-dir', '/cache',
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600245 '--remote-trybot',
246 '--master-build-id', '123456789',
247 '--buildnumber', '314',
248 'config']
249 options = cbuildbot_launch.PreParseArguments(argv)
250 cbuildbot_launch._main(options, argv)
Don Garrettc4114cc2016-11-01 20:04:06 -0700251
Don Garrettf324bc32017-05-23 14:00:53 -0700252 # Did we create the repo instance correctly?
253 self.assertEqual(mock_repo_create.mock_calls,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700254 [mock.call(EXPECTED_MANIFEST_URL, '/root/repository',
Don Garrett33872502018-08-03 22:30:40 +0000255 git_cache_dir='/git-cache', branch='branch')])
Don Garrettf324bc32017-05-23 14:00:53 -0700256
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600257 # Ensure we look up the previous status.
258 self.assertEqual(mock_get_last_build_state.mock_calls, [
259 mock.call('/root')])
260
Don Garrett7ade05a2017-02-17 13:31:47 -0800261 # Ensure we clean, as expected.
Don Garrettbf90cdf2017-05-19 15:54:02 -0700262 self.assertEqual(mock_clean.mock_calls, [
Don Garrettd1d90dd2017-06-13 17:35:52 -0700263 mock.call('/root',
264 mock_repo,
Don Garrett61ce1ee2019-02-26 16:20:25 -0800265 '/cache',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600266 build_summary.BuildSummary(
267 build_number=314,
268 master_build_id=123456789,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600269 status=mock.ANY,
270 branch='branch',
271 buildroot_layout=2
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600272 ))])
Don Garrett7ade05a2017-02-17 13:31:47 -0800273
Don Garrett86881cb2017-02-15 15:41:55 -0800274 # Ensure we checkout, as expected.
275 self.assertEqual(mock_checkout.mock_calls,
Don Garrettf324bc32017-05-23 14:00:53 -0700276 [mock.call(mock_repo)])
Don Garrett86881cb2017-02-15 15:41:55 -0800277
278 # Ensure we invoke cbuildbot, as expected.
279 self.assertCommandCalled(
Don Garrett5cd946b2017-07-20 13:42:20 -0700280 [
281 '/root/repository/chromite/bin/cbuildbot',
282 'config',
283 '--buildroot', '/root/repository',
284 '--branch', 'branch',
285 '--git-cache-dir', '/git-cache',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800286 '--cache-dir', '/cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700287 '--remote-trybot',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600288 '--master-build-id', '123456789',
289 '--buildnumber', '314',
290 '--previous-build-state',
Mike Frysinger1a443332019-11-24 02:48:03 -0500291 'eyJicmFuY2giOiAiYnJhbmNoIiwgImJ1aWxkX251bWJlciI6IDMxMywgImJ1aWx'
292 'kcm9vdF9sYXlvdXQiOiAyLCAibWFzdGVyX2J1aWxkX2lkIjogMTIzMTIzMTIzLC'
293 'Aic3RhdHVzIjogImZhaWwifQ==',
Don Garrettb497f552018-07-09 16:01:13 -0700294 '--workspace', '/root/workspace',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800295 '--cache-dir', '/cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700296 ],
Don Garretta50bf492017-09-28 18:33:02 -0700297 extra_env={'PATH': mock.ANY},
Don Garrettbf90cdf2017-05-19 15:54:02 -0700298 cwd='/root/repository',
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500299 check=False)
Don Garrett7ade05a2017-02-17 13:31:47 -0800300
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600301 # Ensure we write the final build state, as expected.
302 final_state = build_summary.BuildSummary(
303 build_number=314,
304 master_build_id=123456789,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600305 status=constants.BUILDER_STATUS_PASSED,
306 buildroot_layout=2,
307 branch='branch')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600308 self.assertEqual(mock_set_last_build_state.mock_calls, [
309 mock.call('/root', final_state)])
310
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700311 # Ensure we clean the chroot, as expected.
Mike Frysingerf0146252019-09-02 13:31:05 -0400312 mock_cleanup_chroot.assert_called_once_with('/root/repository')
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700313
Don Garrett7ade05a2017-02-17 13:31:47 -0800314
Don Garrettbf90cdf2017-05-19 15:54:02 -0700315class CleanBuildRootTest(cros_test_lib.MockTempDirTestCase):
316 """Tests for CleanBuildRoot method."""
Don Garrett7ade05a2017-02-17 13:31:47 -0800317
318 def setUp(self):
319 """Create standard buildroot contents for cleanup."""
Don Garrettbf90cdf2017-05-19 15:54:02 -0700320 self.root = os.path.join(self.tempdir)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600321 self.previous_build_state = os.path.join(
322 self.root, '.cbuildbot_build_state.json')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700323 self.buildroot = os.path.join(self.root, 'buildroot')
324 self.repo = os.path.join(self.buildroot, '.repo/repo')
Don Garrett36650112018-06-28 15:54:34 -0700325 self.chroot = os.path.join(self.buildroot, 'chroot')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700326 self.general = os.path.join(self.buildroot, 'general/general')
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700327 self.cache = os.path.join(self.buildroot, '.cache')
328 self.distfiles = os.path.join(self.cache, 'distfiles')
Don Garrett7ade05a2017-02-17 13:31:47 -0800329
Don Garrett4166d182018-12-17 12:52:02 -0800330 self.mock_repo = mock.Mock(repository.RepoRepository)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700331 self.mock_repo.directory = self.buildroot
Don Garrettf324bc32017-05-23 14:00:53 -0700332
Benjamin Gordon8642bcc2018-05-01 13:49:56 -0600333 def populateBuildroot(self, previous_build_state=None):
Don Garrett7ade05a2017-02-17 13:31:47 -0800334 """Create standard buildroot contents for cleanup."""
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600335 if previous_build_state:
336 osutils.SafeMakedirs(self.root)
337 osutils.WriteFile(self.previous_build_state, previous_build_state)
338
Don Garrett7ade05a2017-02-17 13:31:47 -0800339 # Create files.
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700340 for f in (self.repo, self.chroot, self.general, self.distfiles):
Don Garrette17e1d92017-04-12 15:28:19 -0700341 osutils.Touch(f, makedirs=True)
Don Garrett7ade05a2017-02-17 13:31:47 -0800342
Don Garrette17e1d92017-04-12 15:28:19 -0700343 def testNoBuildroot(self):
Don Garrettbf90cdf2017-05-19 15:54:02 -0700344 """Test CleanBuildRoot with no history."""
Don Garrettf324bc32017-05-23 14:00:53 -0700345 self.mock_repo.branch = 'master'
346
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600347 build_state = build_summary.BuildSummary(
348 status=constants.BUILDER_STATUS_INFLIGHT,
349 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
350 branch='master')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700351 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800352 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800353
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600354 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600355 self.assertEqual(new_summary.buildroot_layout, 2)
356 self.assertEqual(new_summary.branch, 'master')
357 self.assertIsNotNone(new_summary.distfiles_ts)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600358 self.assertEqual(new_summary, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800359
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600360 self.assertExists(self.previous_build_state)
361
Don Garrett7ade05a2017-02-17 13:31:47 -0800362 def testBuildrootNoState(self):
Don Garrettbf90cdf2017-05-19 15:54:02 -0700363 """Test CleanBuildRoot with no state information."""
Don Garrett7ade05a2017-02-17 13:31:47 -0800364 self.populateBuildroot()
Don Garrettf324bc32017-05-23 14:00:53 -0700365 self.mock_repo.branch = 'master'
Don Garrett7ade05a2017-02-17 13:31:47 -0800366
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600367 build_state = build_summary.BuildSummary(
368 status=constants.BUILDER_STATUS_INFLIGHT,
369 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
370 branch='master')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700371 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800372 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800373
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600374 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600375 self.assertEqual(new_summary.buildroot_layout, 2)
376 self.assertEqual(new_summary.branch, 'master')
377 self.assertIsNotNone(new_summary.distfiles_ts)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600378 self.assertEqual(new_summary, build_state)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700379
Don Garrett60967922017-04-12 18:51:44 -0700380 self.assertNotExists(self.repo)
Don Garrett7ade05a2017-02-17 13:31:47 -0800381 self.assertNotExists(self.chroot)
Don Garrett60967922017-04-12 18:51:44 -0700382 self.assertNotExists(self.general)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700383 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600384 self.assertExists(self.previous_build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800385
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600386 def testBuildrootFormatMismatch(self):
387 """Test CleanBuildRoot with buildroot layout mismatch."""
388 old_build_state = build_summary.BuildSummary(
389 status=constants.BUILDER_STATUS_PASSED,
390 buildroot_layout=1,
391 branch='master')
392 self.populateBuildroot(previous_build_state=old_build_state.to_json())
393 self.mock_repo.branch = 'master'
394
395 build_state = build_summary.BuildSummary(
396 status=constants.BUILDER_STATUS_INFLIGHT,
397 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
398 branch='master')
399 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800400 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600401
402 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
403 self.assertEqual(new_summary.buildroot_layout, 2)
404 self.assertEqual(new_summary.branch, 'master')
405 self.assertIsNotNone(new_summary.distfiles_ts)
406 self.assertEqual(new_summary, build_state)
407
408 self.assertNotExists(self.repo)
409 self.assertNotExists(self.chroot)
410 self.assertNotExists(self.general)
411 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600412 self.assertExists(self.previous_build_state)
413
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600414 def testBuildrootBranchChange(self):
415 """Test CleanBuildRoot with a change in branches."""
416 old_build_state = build_summary.BuildSummary(
417 status=constants.BUILDER_STATUS_PASSED,
418 buildroot_layout=2,
419 branch='branchA')
420 self.populateBuildroot(previous_build_state=old_build_state.to_json())
421 self.mock_repo.branch = 'branchB'
Benjamin Gordon74645232018-05-04 17:40:42 -0600422 m = self.PatchObject(cros_sdk_lib, 'CleanupChrootMount')
Don Garrett7ade05a2017-02-17 13:31:47 -0800423
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600424 build_state = build_summary.BuildSummary(
425 status=constants.BUILDER_STATUS_INFLIGHT,
426 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
427 branch='branchB')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700428 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800429 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800430
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600431 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600432 self.assertEqual(new_summary.buildroot_layout, 2)
433 self.assertEqual(new_summary.branch, 'branchB')
434 self.assertIsNotNone(new_summary.distfiles_ts)
435 self.assertEqual(new_summary, build_state)
436
Don Garrett4166d182018-12-17 12:52:02 -0800437 # self.assertExists(self.repo)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600438 self.assertExists(self.general)
439 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600440 self.assertExists(self.previous_build_state)
Don Garrett36650112018-06-28 15:54:34 -0700441 m.assert_called_with(self.chroot, delete=True)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600442
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600443 def testBuildrootBranchMatch(self):
444 """Test CleanBuildRoot with no change in branch."""
445 old_build_state = build_summary.BuildSummary(
446 status=constants.BUILDER_STATUS_PASSED,
447 buildroot_layout=2,
448 branch='branchA')
449 self.populateBuildroot(previous_build_state=old_build_state.to_json())
450 self.mock_repo.branch = 'branchA'
451
452 build_state = build_summary.BuildSummary(
453 status=constants.BUILDER_STATUS_INFLIGHT,
454 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
455 branch='branchA')
456 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800457 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600458
459 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
460 self.assertEqual(new_summary.buildroot_layout, 2)
461 self.assertEqual(new_summary.branch, 'branchA')
462 self.assertIsNotNone(new_summary.distfiles_ts)
463 self.assertEqual(new_summary, build_state)
464
465 self.assertExists(self.repo)
466 self.assertExists(self.chroot)
467 self.assertExists(self.general)
468 self.assertExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600469 self.assertExists(self.previous_build_state)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700470
Don Garrett4166d182018-12-17 12:52:02 -0800471 def testBuildrootGitLocksPrevPass(self):
472 """Verify not CleanStaleLocks, if previous build was in passed."""
473 old_build_state = build_summary.BuildSummary(
474 status=constants.BUILDER_STATUS_PASSED,
475 buildroot_layout=2,
476 branch='branchA')
477 self.populateBuildroot(previous_build_state=old_build_state.to_json())
478 self.mock_repo.branch = 'branchA'
479
480 build_state = build_summary.BuildSummary(
481 status=constants.BUILDER_STATUS_INFLIGHT,
482 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
483 branch='branchA')
484 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800485 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800486
487 self.assertEqual(
488 self.mock_repo.mock_calls, [
489 mock.call.PreLoad(),
490 mock.call.BuildRootGitCleanup(prune_all=True),
491 ])
492
493 def testBuildrootGitLocksPrevFail(self):
494 """Verify not CleanStaleLocks, if previous build was in failed."""
495 old_build_state = build_summary.BuildSummary(
496 status=constants.BUILDER_STATUS_FAILED,
497 buildroot_layout=2,
498 branch='branchA')
499 self.populateBuildroot(previous_build_state=old_build_state.to_json())
500 self.mock_repo.branch = 'branchA'
501
502 build_state = build_summary.BuildSummary(
503 status=constants.BUILDER_STATUS_INFLIGHT,
504 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
505 branch='branchA')
506 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800507 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800508
509 self.assertEqual(
510 self.mock_repo.mock_calls, [
511 mock.call.PreLoad(),
512 mock.call.BuildRootGitCleanup(prune_all=True),
513 ])
514
515 def testBuildrootGitLocksPrevInFlight(self):
516 """Verify CleanStaleLocks, if previous build was in flight."""
517 old_build_state = build_summary.BuildSummary(
518 status=constants.BUILDER_STATUS_INFLIGHT,
519 buildroot_layout=2,
520 branch='branchA')
521 self.populateBuildroot(previous_build_state=old_build_state.to_json())
522 self.mock_repo.branch = 'branchA'
523
524 build_state = build_summary.BuildSummary(
525 status=constants.BUILDER_STATUS_INFLIGHT,
526 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
527 branch='branchA')
528 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800529 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800530
531
532 self.assertEqual(
533 self.mock_repo.method_calls, [
534 mock.call.PreLoad(),
535 mock.call.CleanStaleLocks(),
536 mock.call.BuildRootGitCleanup(prune_all=True),
537 ])
538
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600539 def testBuildrootDistfilesRecentCache(self):
540 """Test CleanBuildRoot does not delete distfiles when cache is recent."""
541 seed_distfiles_ts = time.time() - 60
542 old_build_state = build_summary.BuildSummary(
543 status=constants.BUILDER_STATUS_PASSED,
544 buildroot_layout=2,
545 branch='branchA',
546 distfiles_ts=seed_distfiles_ts)
547 self.populateBuildroot(previous_build_state=old_build_state.to_json())
548 self.mock_repo.branch = 'branchA'
549
550 build_state = build_summary.BuildSummary(
551 status=constants.BUILDER_STATUS_INFLIGHT,
552 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
553 branch='branchA')
554 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800555 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600556
557 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
558 self.assertEqual(new_summary.buildroot_layout, 2)
559 self.assertEqual(new_summary.branch, 'branchA')
560 # Same cache creation timestamp is rewritten to state.
561 self.assertEqual(new_summary.distfiles_ts, seed_distfiles_ts)
562 self.assertEqual(new_summary, build_state)
563
564 self.assertExists(self.repo)
565 self.assertExists(self.chroot)
566 self.assertExists(self.general)
567 self.assertExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600568 self.assertExists(self.previous_build_state)
Don Garrette17e1d92017-04-12 15:28:19 -0700569
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600570 def testBuildrootDistfilesCacheExpired(self):
571 """Test CleanBuildRoot when the distfiles cache is too old."""
572 old_build_state = build_summary.BuildSummary(
573 status=constants.BUILDER_STATUS_PASSED,
574 buildroot_layout=2,
575 branch='branchA',
576 distfiles_ts=100.0)
577 self.populateBuildroot(previous_build_state=old_build_state.to_json())
578 self.mock_repo.branch = 'branchA'
579
580 build_state = build_summary.BuildSummary(
581 status=constants.BUILDER_STATUS_INFLIGHT,
582 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
583 branch='branchA')
584 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800585 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600586
587 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
588 self.assertEqual(new_summary.buildroot_layout, 2)
589 self.assertEqual(new_summary.branch, 'branchA')
590 self.assertIsNotNone(new_summary.distfiles_ts)
591 self.assertEqual(new_summary, build_state)
592
593 self.assertExists(self.repo)
594 self.assertExists(self.chroot)
595 self.assertExists(self.general)
596 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600597 self.assertExists(self.previous_build_state)
598
Don Garrett61ce1ee2019-02-26 16:20:25 -0800599 def testRootOwnedCache(self):
600 """Test CleanBuildRoot with no history."""
601 seed_distfiles_ts = time.time() - 60
602 old_build_state = build_summary.BuildSummary(
603 status=constants.BUILDER_STATUS_PASSED,
604 buildroot_layout=2,
605 branch='branchA',
606 distfiles_ts=seed_distfiles_ts)
607 self.populateBuildroot(previous_build_state=old_build_state.to_json())
608 self.mock_repo.branch = 'branchA'
609
610 osutils.Chown(self.cache, 'root', 'root')
611
612 build_state = build_summary.BuildSummary(
613 status=constants.BUILDER_STATUS_INFLIGHT,
614 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
615 branch='branchA')
616 cbuildbot_launch.CleanBuildRoot(
617 self.root, self.mock_repo, self.cache, build_state)
618
619 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
620 self.assertEqual(new_summary.buildroot_layout, 2)
621 self.assertEqual(new_summary.branch, 'branchA')
622 # Same cache creation timestamp is rewritten to state.
623 self.assertEqual(new_summary.distfiles_ts, seed_distfiles_ts)
624 self.assertEqual(new_summary, build_state)
625
626 self.assertExists(self.repo)
627 self.assertExists(self.chroot)
628 self.assertExists(self.general)
629 self.assertNotExists(self.distfiles)
630 self.assertExists(self.previous_build_state)
631
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600632 def testBuildrootRepoCleanFailure(self):
633 """Test CleanBuildRoot with repo checkout failure."""
634 old_build_state = build_summary.BuildSummary(
635 status=constants.BUILDER_STATUS_PASSED,
636 buildroot_layout=1,
637 branch='branchA')
638 self.populateBuildroot(previous_build_state=old_build_state.to_json())
639 self.mock_repo.branch = 'branchA'
640 self.mock_repo.BuildRootGitCleanup.side_effect = Exception
641
642 build_state = build_summary.BuildSummary(
643 status=constants.BUILDER_STATUS_INFLIGHT,
644 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
645 branch='branchA')
646 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800647 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600648
649 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
650 self.assertEqual(new_summary.buildroot_layout, 2)
651 self.assertEqual(new_summary.branch, 'branchA')
652 self.assertIsNotNone(new_summary.distfiles_ts)
653 self.assertEqual(new_summary, build_state)
654
655 self.assertNotExists(self.repo)
656 self.assertNotExists(self.chroot)
657 self.assertNotExists(self.general)
658 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600659 self.assertExists(self.previous_build_state)
Don Garrettf324bc32017-05-23 14:00:53 -0700660
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600661 def testGetCurrentBuildStateNoArgs(self):
662 """Tests GetCurrentBuildState without arguments."""
663 options = cbuildbot_launch.PreParseArguments([
664 '--buildroot', self.root, 'config'
665 ])
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600666 state = cbuildbot_launch.GetCurrentBuildState(options, 'master')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600667
668 expected_state = build_summary.BuildSummary(
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600669 status=constants.BUILDER_STATUS_INFLIGHT,
670 buildroot_layout=2,
671 branch='master')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600672 self.assertEqual(state, expected_state)
673
674 def testGetCurrentBuildStateHasArgs(self):
675 """Tests GetCurrentBuildState with arguments."""
676 options = cbuildbot_launch.PreParseArguments([
677 '--buildroot', self.root,
678 '--buildnumber', '20',
679 '--master-build-id', '50',
680 'config'
681 ])
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600682 state = cbuildbot_launch.GetCurrentBuildState(options, 'branchA')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600683
684 expected_state = build_summary.BuildSummary(
685 build_number=20,
686 master_build_id=50,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600687 status=constants.BUILDER_STATUS_INFLIGHT,
688 buildroot_layout=2,
689 branch='branchA')
690 self.assertEqual(state, expected_state)
691
692 def testGetCurrentBuildStateLayout(self):
693 """Test that GetCurrentBuildState uses the current buildroot layout."""
694 # Change to a future version.
695 self.PatchObject(cbuildbot_launch, 'BUILDROOT_BUILDROOT_LAYOUT', 22)
696
697 options = cbuildbot_launch.PreParseArguments([
698 '--buildroot', self.root, 'config'
699 ])
700 state = cbuildbot_launch.GetCurrentBuildState(options, 'branchA')
701
702 expected_state = build_summary.BuildSummary(
703 status=constants.BUILDER_STATUS_INFLIGHT,
704 buildroot_layout=22,
705 branch='branchA')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600706 self.assertEqual(state, expected_state)
707
708 def testGetLastBuildStateNoFile(self):
709 """Tests GetLastBuildState if the file is missing."""
710 osutils.SafeMakedirs(self.root)
711 state = cbuildbot_launch.GetLastBuildState(self.root)
712 self.assertEqual(state, build_summary.BuildSummary())
713
714 def testGetLastBuildStateBadFile(self):
715 """Tests GetLastBuildState if the file contains invalid JSON."""
716 osutils.SafeMakedirs(self.root)
717 osutils.WriteFile(self.previous_build_state, '}}')
718 state = cbuildbot_launch.GetLastBuildState(self.root)
719 self.assertEqual(state, build_summary.BuildSummary())
720
721 def testGetLastBuildStateMissingBuildStatus(self):
722 """Tests GetLastBuildState if the file doesn't have a valid status."""
723 osutils.SafeMakedirs(self.root)
724 osutils.WriteFile(self.previous_build_state, '{"build_number": "3"}')
725 state = cbuildbot_launch.GetLastBuildState(self.root)
726 self.assertEqual(state, build_summary.BuildSummary())
727
728 def testGetLastBuildStateGoodFile(self):
729 """Tests GetLastBuildState on a good file."""
730 osutils.SafeMakedirs(self.root)
731 osutils.WriteFile(
732 self.previous_build_state,
733 '{"build_number": 1, "master_build_id": 3, "status": "pass"}')
734 state = cbuildbot_launch.GetLastBuildState(self.root)
735 self.assertEqual(
736 state,
737 build_summary.BuildSummary(
738 build_number=1, master_build_id=3, status='pass'))
739
740 def testSetLastBuildState(self):
741 """Verifies that SetLastBuildState writes to the expected file."""
742 osutils.SafeMakedirs(self.root)
743 old_state = build_summary.BuildSummary(
744 build_number=314,
745 master_build_id=2178,
746 status=constants.BUILDER_STATUS_PASSED)
747 cbuildbot_launch.SetLastBuildState(self.root, old_state)
748
749 saved_state = osutils.ReadFile(self.previous_build_state)
750 new_state = build_summary.BuildSummary()
751 new_state.from_json(saved_state)
752
753 self.assertEqual(old_state, new_state)
Mike Frysingerf0146252019-09-02 13:31:05 -0400754
755 def testCleanupChrootNoChroot(self):
756 """Check CleanupChroot without a chroot."""
757 self.StartPatcher(cros_test_lib.RunCommandMock())
758 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount'):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400759 cbuildbot_launch.CleanupChroot(self.buildroot)
Mike Frysingerf0146252019-09-02 13:31:05 -0400760
761 def testCleanupChrootNormal(self):
762 """Check normal CleanupChroot."""
763 osutils.SafeMakedirs(self.chroot)
764 osutils.Touch(self.chroot + '.img')
765 self.StartPatcher(cros_test_lib.RunCommandMock())
766 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount'):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400767 cbuildbot_launch.CleanupChroot(self.buildroot)
Mike Frysingerf0146252019-09-02 13:31:05 -0400768
769 def testCleanupChrootTimeout(self):
770 """Check timeouts in CleanupChroot."""
771 osutils.SafeMakedirs(self.chroot)
772 osutils.Touch(self.chroot + '.img')
773 rc_mock = self.StartPatcher(cros_test_lib.RunCommandMock())
774 rc_mock.SetDefaultCmdResult()
775 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount',
776 side_effect=timeout_util.TimeoutError):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400777 cbuildbot_launch.CleanupChroot(self.buildroot)