blob: 52b15bfdd75ea228cfa71c1b74bb37d681520ad2 [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
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -070011import time
Don Garrett86881cb2017-02-15 15:41:55 -080012
Mike Frysinger6db648e2018-07-24 19:57:58 -040013import mock
14
Mike Frysingerc263d092019-09-18 15:11:47 -040015from chromite.cbuildbot import commands
Don Garrett86881cb2017-02-15 15:41:55 -080016from chromite.cbuildbot import repository
Benjamin Gordon90b2dd92018-04-12 14:04:21 -060017from chromite.lib import build_summary
Don Garrett861e9182017-05-15 15:30:23 -070018from chromite.lib import constants
Benjamin Gordon74645232018-05-04 17:40:42 -060019from chromite.lib import cros_sdk_lib
Don Garrett7ade05a2017-02-17 13:31:47 -080020from chromite.lib import cros_test_lib
Don Garrett86881cb2017-02-15 15:41:55 -080021from chromite.lib import osutils
Mike Frysingerf0146252019-09-02 13:31:05 -040022from chromite.lib import timeout_util
Don Garrett0c54ed72017-03-03 11:18:57 -080023from chromite.scripts import cbuildbot_launch
Don Garrett86881cb2017-02-15 15:41:55 -080024
Don Garrett86881cb2017-02-15 15:41:55 -080025EXPECTED_MANIFEST_URL = 'https://chrome-internal-review.googlesource.com/chromeos/manifest-internal' # pylint: disable=line-too-long
Don Garrettc4114cc2016-11-01 20:04:06 -070026
27
Don Garrettacbb2392017-05-11 18:27:41 -070028# It's reasonable for unittests to look at internals.
29# pylint: disable=protected-access
30
31
Don Garrett8d314792017-05-18 13:11:42 -070032class FakeException(Exception):
33 """Test exception to raise during tests."""
34
35
Don Garrett0c54ed72017-03-03 11:18:57 -080036class CbuildbotLaunchTest(cros_test_lib.MockTestCase):
37 """Tests for cbuildbot_launch script."""
Don Garrettc4114cc2016-11-01 20:04:06 -070038
Don Garrett86881cb2017-02-15 15:41:55 -080039 def testPreParseArguments(self):
Don Garrettc4114cc2016-11-01 20:04:06 -070040 """Test that we can correctly extract branch values from cbuildbot args."""
Don Garrett597ddff2017-02-17 18:29:37 -080041 CASES = (
42 (['--buildroot', '/buildroot', 'daisy-incremental'],
43 (None, '/buildroot', None)),
44
45 (['--buildbot', '--buildroot', '/buildroot',
46 '--git-cache-dir', '/git-cache',
47 '-b', 'release-R57-9202.B',
48 'daisy-incremental'],
49 ('release-R57-9202.B', '/buildroot', '/git-cache')),
50
51 (['--debug', '--buildbot', '--notests',
52 '--buildroot', '/buildroot',
53 '--git-cache-dir', '/git-cache',
54 '--branch', 'release-R57-9202.B',
55 'daisy-incremental'],
56 ('release-R57-9202.B', '/buildroot', '/git-cache')),
Don Garrettc4114cc2016-11-01 20:04:06 -070057 )
58
Don Garrett597ddff2017-02-17 18:29:37 -080059 for cmd_args, expected in CASES:
60 expected_branch, expected_buildroot, expected_cache_dir = expected
61
Don Garrett0c54ed72017-03-03 11:18:57 -080062 options = cbuildbot_launch.PreParseArguments(cmd_args)
Don Garrett597ddff2017-02-17 18:29:37 -080063
64 self.assertEqual(options.branch, expected_branch)
65 self.assertEqual(options.buildroot, expected_buildroot)
66 self.assertEqual(options.git_cache_dir, expected_cache_dir)
Don Garrett86881cb2017-02-15 15:41:55 -080067
Don Garrettf324bc32017-05-23 14:00:53 -070068 def testInitialCheckout(self):
Don Garrett86881cb2017-02-15 15:41:55 -080069 """Test InitialCheckout with minimum settings."""
Don Garrettf324bc32017-05-23 14:00:53 -070070 mock_repo = mock.MagicMock()
71 mock_repo.branch = 'branch'
Don Garrett86881cb2017-02-15 15:41:55 -080072
Don Garrettf324bc32017-05-23 14:00:53 -070073 cbuildbot_launch.InitialCheckout(mock_repo)
Don Garrett86881cb2017-02-15 15:41:55 -080074
75 self.assertEqual(mock_repo.mock_calls, [
Don Garrett5516acb2018-11-15 16:02:59 -080076 mock.call.PreLoad('/preload/chromeos'),
Don Garrettf324bc32017-05-23 14:00:53 -070077 mock.call.Sync(detach=True),
Don Garrett8d314792017-05-18 13:11:42 -070078 ])
79
Don Garrettf15d65b2017-04-12 12:39:55 -070080 def testConfigureGlobalEnvironment(self):
Don Garrett60967922017-04-12 18:51:44 -070081 """Ensure that we can setup our global runtime environment correctly."""
Don Garrett86fec482017-05-17 18:13:33 -070082
83 os.environ.pop('LANG', None)
84 os.environ['LC_MONETARY'] = 'bad'
85
Don Garrettf15d65b2017-04-12 12:39:55 -070086 cbuildbot_launch.ConfigureGlobalEnvironment()
87
Don Garrett86fec482017-05-17 18:13:33 -070088 # Verify umask is updated.
Don Garrettf15d65b2017-04-12 12:39:55 -070089 self.assertEqual(os.umask(0), 0o22)
90
Don Garrett86fec482017-05-17 18:13:33 -070091 # Verify ENVs are cleaned up.
92 self.assertEqual(os.environ['LANG'], 'en_US.UTF-8')
93 self.assertNotIn('LC_MONETARY', os.environ)
94
Don Garrettf15d65b2017-04-12 12:39:55 -070095
Benjamin Gordon121a2aa2018-05-04 16:24:45 -060096class RunTests(cros_test_lib.RunCommandTestCase):
Don Garrett0c54ed72017-03-03 11:18:57 -080097 """Tests for cbuildbot_launch script."""
Don Garrett597ddff2017-02-17 18:29:37 -080098
99 ARGS_BASE = ['--buildroot', '/buildroot']
Don Garrett5cd946b2017-07-20 13:42:20 -0700100 EXPECTED_ARGS_BASE = ['--buildroot', '/cbuildbot_buildroot']
Don Garrett597ddff2017-02-17 18:29:37 -0800101 ARGS_GIT_CACHE = ['--git-cache-dir', '/git-cache']
102 ARGS_CONFIG = ['config']
Don Garrettbf90cdf2017-05-19 15:54:02 -0700103 CMD = ['/cbuildbot_buildroot/chromite/bin/cbuildbot']
Don Garrett597ddff2017-02-17 18:29:37 -0800104
Don Garrett6e5c6b92018-04-06 17:58:49 -0700105 def verifyCbuildbot(self, args, expected_cmd, version):
Don Garrett86881cb2017-02-15 15:41:55 -0800106 """Ensure we invoke cbuildbot correctly."""
Don Garrett597ddff2017-02-17 18:29:37 -0800107 self.PatchObject(
Mike Frysingerc263d092019-09-18 15:11:47 -0400108 commands, 'GetTargetChromiteApiVersion', autospec=True,
Don Garrett597ddff2017-02-17 18:29:37 -0800109 return_value=version)
110
Don Garrett6e5c6b92018-04-06 17:58:49 -0700111 cbuildbot_launch.Cbuildbot('/cbuildbot_buildroot', '/depot_tools', args)
Don Garrett597ddff2017-02-17 18:29:37 -0800112
113 self.assertCommandCalled(
Don Garretta50bf492017-09-28 18:33:02 -0700114 expected_cmd, extra_env={'PATH': mock.ANY},
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500115 cwd='/cbuildbot_buildroot', check=False)
Don Garrett597ddff2017-02-17 18:29:37 -0800116
Don Garrett6e5c6b92018-04-06 17:58:49 -0700117 def testCbuildbotSimple(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800118 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700119 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800120 self.ARGS_BASE + self.ARGS_CONFIG,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700121 self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE,
Don Garrett597ddff2017-02-17 18:29:37 -0800122 (0, 4))
123
Don Garrett6e5c6b92018-04-06 17:58:49 -0700124 def testCbuildbotNotFiltered(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 + self.ARGS_GIT_CACHE,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700128 (self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE +
129 self.ARGS_GIT_CACHE),
Don Garrett597ddff2017-02-17 18:29:37 -0800130 (0, 4))
131
Don Garrett6e5c6b92018-04-06 17:58:49 -0700132 def testCbuildbotFiltered(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800133 """Ensure we invoke cbuildbot correctly."""
Don Garrett6e5c6b92018-04-06 17:58:49 -0700134 self.verifyCbuildbot(
Don Garrett597ddff2017-02-17 18:29:37 -0800135 self.ARGS_BASE + self.ARGS_CONFIG + self.ARGS_GIT_CACHE,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700136 self.CMD + self.ARGS_CONFIG + self.EXPECTED_ARGS_BASE,
Don Garrett597ddff2017-02-17 18:29:37 -0800137 (0, 2))
Don Garrettc4114cc2016-11-01 20:04:06 -0700138
Don Garrett86881cb2017-02-15 15:41:55 -0800139 def testMainMin(self):
140 """Test a minimal set of command line options."""
Don Garrett597ddff2017-02-17 18:29:37 -0800141 self.PatchObject(osutils, 'SafeMakedirs', autospec=True)
Mike Frysingerc263d092019-09-18 15:11:47 -0400142 self.PatchObject(commands, 'GetTargetChromiteApiVersion',
Don Garrett861e9182017-05-15 15:30:23 -0700143 autospec=True, return_value=(constants.REEXEC_API_MAJOR,
144 constants.REEXEC_API_MINOR))
Don Garrettf324bc32017-05-23 14:00:53 -0700145 mock_repo = mock.MagicMock()
146 mock_repo.branch = 'master'
Don Garrettbf90cdf2017-05-19 15:54:02 -0700147 mock_repo.directory = '/root/repository'
148
Don Garrettf324bc32017-05-23 14:00:53 -0700149 mock_repo_create = self.PatchObject(repository, 'RepoRepository',
150 autospec=True, return_value=mock_repo)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700151 mock_clean = self.PatchObject(cbuildbot_launch, 'CleanBuildRoot',
Don Garrett0c54ed72017-03-03 11:18:57 -0800152 autospec=True)
153 mock_checkout = self.PatchObject(cbuildbot_launch, 'InitialCheckout',
Don Garrett86881cb2017-02-15 15:41:55 -0800154 autospec=True)
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700155 mock_cleanup_chroot = self.PatchObject(cbuildbot_launch, 'CleanupChroot',
156 autospec=True)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600157 mock_set_last_build_state = self.PatchObject(
158 cbuildbot_launch, 'SetLastBuildState', autospec=True)
159
160 expected_build_state = build_summary.BuildSummary(
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600161 build_number=0, master_build_id=0, status=mock.ANY,
162 buildroot_layout=2, branch='master')
Don Garrett7ade05a2017-02-17 13:31:47 -0800163
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600164 argv = ['-r', '/root', 'config']
165 options = cbuildbot_launch.PreParseArguments(argv)
166 cbuildbot_launch._main(options, argv)
Don Garrettc4114cc2016-11-01 20:04:06 -0700167
Don Garrettf324bc32017-05-23 14:00:53 -0700168 # Did we create the repo instance correctly?
169 self.assertEqual(mock_repo_create.mock_calls,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700170 [mock.call(EXPECTED_MANIFEST_URL, '/root/repository',
Don Garrett33872502018-08-03 22:30:40 +0000171 git_cache_dir=None, branch='master')])
Don Garrettf324bc32017-05-23 14:00:53 -0700172
Don Garrett7ade05a2017-02-17 13:31:47 -0800173 # Ensure we clean, as expected.
Don Garrettbf90cdf2017-05-19 15:54:02 -0700174 self.assertEqual(mock_clean.mock_calls, [
Don Garrett61ce1ee2019-02-26 16:20:25 -0800175 mock.call('/root', mock_repo, '/root/repository/.cache',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600176 expected_build_state)])
Don Garrett7ade05a2017-02-17 13:31:47 -0800177
Don Garrett86881cb2017-02-15 15:41:55 -0800178 # Ensure we checkout, as expected.
179 self.assertEqual(mock_checkout.mock_calls,
Don Garrettf324bc32017-05-23 14:00:53 -0700180 [mock.call(mock_repo)])
Don Garrettc4114cc2016-11-01 20:04:06 -0700181
Don Garrett86881cb2017-02-15 15:41:55 -0800182 # Ensure we invoke cbuildbot, as expected.
183 self.assertCommandCalled(
Don Garrett5cd946b2017-07-20 13:42:20 -0700184 [
185 '/root/repository/chromite/bin/cbuildbot',
186 'config',
187 '-r', '/root/repository',
Don Garrettb497f552018-07-09 16:01:13 -0700188 '--workspace', '/root/workspace',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800189 '--cache-dir', '/root/repository/.cache',
190 # The duplication is a bug, but not harmful.
191 '--cache-dir', '/root/repository/.cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700192 ],
Don Garretta50bf492017-09-28 18:33:02 -0700193 extra_env={'PATH': mock.ANY},
Don Garrettbf90cdf2017-05-19 15:54:02 -0700194 cwd='/root/repository',
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500195 check=False)
Don Garrettc4114cc2016-11-01 20:04:06 -0700196
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600197 # Ensure we saved the final state, as expected.
198 self.assertEqual(expected_build_state.status,
199 constants.BUILDER_STATUS_PASSED)
200 self.assertEqual(mock_set_last_build_state.mock_calls, [
201 mock.call('/root', expected_build_state)])
202
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700203 # Ensure we clean the chroot, as expected.
Mike Frysingerf0146252019-09-02 13:31:05 -0400204 mock_cleanup_chroot.assert_called_once_with('/root/repository')
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700205
Don Garrett86881cb2017-02-15 15:41:55 -0800206 def testMainMax(self):
Don Garrett597ddff2017-02-17 18:29:37 -0800207 """Test a larger set of command line options."""
208 self.PatchObject(osutils, 'SafeMakedirs', autospec=True)
Mike Frysingerc263d092019-09-18 15:11:47 -0400209 self.PatchObject(commands, 'GetTargetChromiteApiVersion',
Don Garrett861e9182017-05-15 15:30:23 -0700210 autospec=True, return_value=(constants.REEXEC_API_MAJOR,
211 constants.REEXEC_API_MINOR))
Don Garrettf324bc32017-05-23 14:00:53 -0700212 mock_repo = mock.MagicMock()
213 mock_repo.branch = 'branch'
Don Garrettbf90cdf2017-05-19 15:54:02 -0700214 mock_repo.directory = '/root/repository'
215
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600216 mock_summary = build_summary.BuildSummary(
217 build_number=313,
218 master_build_id=123123123,
219 status=constants.BUILDER_STATUS_FAILED,
220 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
221 branch='branch')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600222
223 mock_get_last_build_state = self.PatchObject(
224 cbuildbot_launch, 'GetLastBuildState', autospec=True,
225 return_value=mock_summary)
Don Garrettf324bc32017-05-23 14:00:53 -0700226 mock_repo_create = self.PatchObject(repository, 'RepoRepository',
227 autospec=True, return_value=mock_repo)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700228 mock_clean = self.PatchObject(cbuildbot_launch, 'CleanBuildRoot',
Don Garrett0c54ed72017-03-03 11:18:57 -0800229 autospec=True)
230 mock_checkout = self.PatchObject(cbuildbot_launch, 'InitialCheckout',
Don Garrett86881cb2017-02-15 15:41:55 -0800231 autospec=True)
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700232 mock_cleanup_chroot = self.PatchObject(cbuildbot_launch, 'CleanupChroot',
233 autospec=True)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600234 mock_set_last_build_state = self.PatchObject(
235 cbuildbot_launch, 'SetLastBuildState', autospec=True)
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600236 argv = ['--buildroot', '/root',
237 '--branch', 'branch',
238 '--git-cache-dir', '/git-cache',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800239 '--cache-dir', '/cache',
Dhanya Ganesh95c5c152018-10-08 16:48:29 -0600240 '--remote-trybot',
241 '--master-build-id', '123456789',
242 '--buildnumber', '314',
243 'config']
244 options = cbuildbot_launch.PreParseArguments(argv)
245 cbuildbot_launch._main(options, argv)
Don Garrettc4114cc2016-11-01 20:04:06 -0700246
Don Garrettf324bc32017-05-23 14:00:53 -0700247 # Did we create the repo instance correctly?
248 self.assertEqual(mock_repo_create.mock_calls,
Don Garrettbf90cdf2017-05-19 15:54:02 -0700249 [mock.call(EXPECTED_MANIFEST_URL, '/root/repository',
Don Garrett33872502018-08-03 22:30:40 +0000250 git_cache_dir='/git-cache', branch='branch')])
Don Garrettf324bc32017-05-23 14:00:53 -0700251
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600252 # Ensure we look up the previous status.
253 self.assertEqual(mock_get_last_build_state.mock_calls, [
254 mock.call('/root')])
255
Don Garrett7ade05a2017-02-17 13:31:47 -0800256 # Ensure we clean, as expected.
Don Garrettbf90cdf2017-05-19 15:54:02 -0700257 self.assertEqual(mock_clean.mock_calls, [
Don Garrettd1d90dd2017-06-13 17:35:52 -0700258 mock.call('/root',
259 mock_repo,
Don Garrett61ce1ee2019-02-26 16:20:25 -0800260 '/cache',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600261 build_summary.BuildSummary(
262 build_number=314,
263 master_build_id=123456789,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600264 status=mock.ANY,
265 branch='branch',
266 buildroot_layout=2
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600267 ))])
Don Garrett7ade05a2017-02-17 13:31:47 -0800268
Don Garrett86881cb2017-02-15 15:41:55 -0800269 # Ensure we checkout, as expected.
270 self.assertEqual(mock_checkout.mock_calls,
Don Garrettf324bc32017-05-23 14:00:53 -0700271 [mock.call(mock_repo)])
Don Garrett86881cb2017-02-15 15:41:55 -0800272
273 # Ensure we invoke cbuildbot, as expected.
274 self.assertCommandCalled(
Don Garrett5cd946b2017-07-20 13:42:20 -0700275 [
276 '/root/repository/chromite/bin/cbuildbot',
277 'config',
278 '--buildroot', '/root/repository',
279 '--branch', 'branch',
280 '--git-cache-dir', '/git-cache',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800281 '--cache-dir', '/cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700282 '--remote-trybot',
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600283 '--master-build-id', '123456789',
284 '--buildnumber', '314',
285 '--previous-build-state',
Mike Frysinger1a443332019-11-24 02:48:03 -0500286 'eyJicmFuY2giOiAiYnJhbmNoIiwgImJ1aWxkX251bWJlciI6IDMxMywgImJ1aWx'
287 'kcm9vdF9sYXlvdXQiOiAyLCAibWFzdGVyX2J1aWxkX2lkIjogMTIzMTIzMTIzLC'
288 'Aic3RhdHVzIjogImZhaWwifQ==',
Don Garrettb497f552018-07-09 16:01:13 -0700289 '--workspace', '/root/workspace',
Don Garrett61ce1ee2019-02-26 16:20:25 -0800290 '--cache-dir', '/cache',
Don Garrett5cd946b2017-07-20 13:42:20 -0700291 ],
Don Garretta50bf492017-09-28 18:33:02 -0700292 extra_env={'PATH': mock.ANY},
Don Garrettbf90cdf2017-05-19 15:54:02 -0700293 cwd='/root/repository',
Mike Frysingerf5a3b2d2019-12-12 14:36:17 -0500294 check=False)
Don Garrett7ade05a2017-02-17 13:31:47 -0800295
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600296 # Ensure we write the final build state, as expected.
297 final_state = build_summary.BuildSummary(
298 build_number=314,
299 master_build_id=123456789,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600300 status=constants.BUILDER_STATUS_PASSED,
301 buildroot_layout=2,
302 branch='branch')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600303 self.assertEqual(mock_set_last_build_state.mock_calls, [
304 mock.call('/root', final_state)])
305
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700306 # Ensure we clean the chroot, as expected.
Mike Frysingerf0146252019-09-02 13:31:05 -0400307 mock_cleanup_chroot.assert_called_once_with('/root/repository')
Benjamin Gordonaee36b82018-02-05 14:25:26 -0700308
Don Garrett7ade05a2017-02-17 13:31:47 -0800309
Don Garrettbf90cdf2017-05-19 15:54:02 -0700310class CleanBuildRootTest(cros_test_lib.MockTempDirTestCase):
311 """Tests for CleanBuildRoot method."""
Don Garrett7ade05a2017-02-17 13:31:47 -0800312
313 def setUp(self):
314 """Create standard buildroot contents for cleanup."""
Don Garrettbf90cdf2017-05-19 15:54:02 -0700315 self.root = os.path.join(self.tempdir)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600316 self.previous_build_state = os.path.join(
317 self.root, '.cbuildbot_build_state.json')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700318 self.buildroot = os.path.join(self.root, 'buildroot')
319 self.repo = os.path.join(self.buildroot, '.repo/repo')
Don Garrett36650112018-06-28 15:54:34 -0700320 self.chroot = os.path.join(self.buildroot, 'chroot')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700321 self.general = os.path.join(self.buildroot, 'general/general')
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700322 self.cache = os.path.join(self.buildroot, '.cache')
323 self.distfiles = os.path.join(self.cache, 'distfiles')
Don Garrett7ade05a2017-02-17 13:31:47 -0800324
Don Garrett4166d182018-12-17 12:52:02 -0800325 self.mock_repo = mock.Mock(repository.RepoRepository)
Don Garrettbf90cdf2017-05-19 15:54:02 -0700326 self.mock_repo.directory = self.buildroot
Don Garrettf324bc32017-05-23 14:00:53 -0700327
Benjamin Gordon8642bcc2018-05-01 13:49:56 -0600328 def populateBuildroot(self, previous_build_state=None):
Don Garrett7ade05a2017-02-17 13:31:47 -0800329 """Create standard buildroot contents for cleanup."""
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600330 if previous_build_state:
331 osutils.SafeMakedirs(self.root)
332 osutils.WriteFile(self.previous_build_state, previous_build_state)
333
Don Garrett7ade05a2017-02-17 13:31:47 -0800334 # Create files.
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700335 for f in (self.repo, self.chroot, self.general, self.distfiles):
Don Garrette17e1d92017-04-12 15:28:19 -0700336 osutils.Touch(f, makedirs=True)
Don Garrett7ade05a2017-02-17 13:31:47 -0800337
Don Garrette17e1d92017-04-12 15:28:19 -0700338 def testNoBuildroot(self):
Don Garrettbf90cdf2017-05-19 15:54:02 -0700339 """Test CleanBuildRoot with no history."""
Don Garrettf324bc32017-05-23 14:00:53 -0700340 self.mock_repo.branch = 'master'
341
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600342 build_state = build_summary.BuildSummary(
343 status=constants.BUILDER_STATUS_INFLIGHT,
344 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
345 branch='master')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700346 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800347 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800348
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600349 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600350 self.assertEqual(new_summary.buildroot_layout, 2)
351 self.assertEqual(new_summary.branch, 'master')
352 self.assertIsNotNone(new_summary.distfiles_ts)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600353 self.assertEqual(new_summary, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800354
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600355 self.assertExists(self.previous_build_state)
356
Don Garrett7ade05a2017-02-17 13:31:47 -0800357 def testBuildrootNoState(self):
Don Garrettbf90cdf2017-05-19 15:54:02 -0700358 """Test CleanBuildRoot with no state information."""
Don Garrett7ade05a2017-02-17 13:31:47 -0800359 self.populateBuildroot()
Don Garrettf324bc32017-05-23 14:00:53 -0700360 self.mock_repo.branch = 'master'
Don Garrett7ade05a2017-02-17 13:31:47 -0800361
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600362 build_state = build_summary.BuildSummary(
363 status=constants.BUILDER_STATUS_INFLIGHT,
364 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
365 branch='master')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700366 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800367 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800368
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600369 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600370 self.assertEqual(new_summary.buildroot_layout, 2)
371 self.assertEqual(new_summary.branch, 'master')
372 self.assertIsNotNone(new_summary.distfiles_ts)
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600373 self.assertEqual(new_summary, build_state)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700374
Don Garrett60967922017-04-12 18:51:44 -0700375 self.assertNotExists(self.repo)
Don Garrett7ade05a2017-02-17 13:31:47 -0800376 self.assertNotExists(self.chroot)
Don Garrett60967922017-04-12 18:51:44 -0700377 self.assertNotExists(self.general)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700378 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600379 self.assertExists(self.previous_build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800380
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600381 def testBuildrootFormatMismatch(self):
382 """Test CleanBuildRoot with buildroot layout mismatch."""
383 old_build_state = build_summary.BuildSummary(
384 status=constants.BUILDER_STATUS_PASSED,
385 buildroot_layout=1,
386 branch='master')
387 self.populateBuildroot(previous_build_state=old_build_state.to_json())
388 self.mock_repo.branch = 'master'
389
390 build_state = build_summary.BuildSummary(
391 status=constants.BUILDER_STATUS_INFLIGHT,
392 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
393 branch='master')
394 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800395 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600396
397 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
398 self.assertEqual(new_summary.buildroot_layout, 2)
399 self.assertEqual(new_summary.branch, 'master')
400 self.assertIsNotNone(new_summary.distfiles_ts)
401 self.assertEqual(new_summary, build_state)
402
403 self.assertNotExists(self.repo)
404 self.assertNotExists(self.chroot)
405 self.assertNotExists(self.general)
406 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600407 self.assertExists(self.previous_build_state)
408
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600409 def testBuildrootBranchChange(self):
410 """Test CleanBuildRoot with a change in branches."""
411 old_build_state = build_summary.BuildSummary(
412 status=constants.BUILDER_STATUS_PASSED,
413 buildroot_layout=2,
414 branch='branchA')
415 self.populateBuildroot(previous_build_state=old_build_state.to_json())
416 self.mock_repo.branch = 'branchB'
Benjamin Gordon74645232018-05-04 17:40:42 -0600417 m = self.PatchObject(cros_sdk_lib, 'CleanupChrootMount')
Don Garrett7ade05a2017-02-17 13:31:47 -0800418
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600419 build_state = build_summary.BuildSummary(
420 status=constants.BUILDER_STATUS_INFLIGHT,
421 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
422 branch='branchB')
Don Garrettbf90cdf2017-05-19 15:54:02 -0700423 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800424 self.root, self.mock_repo, self.cache, build_state)
Don Garrett7ade05a2017-02-17 13:31:47 -0800425
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600426 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600427 self.assertEqual(new_summary.buildroot_layout, 2)
428 self.assertEqual(new_summary.branch, 'branchB')
429 self.assertIsNotNone(new_summary.distfiles_ts)
430 self.assertEqual(new_summary, build_state)
431
Don Garrett4166d182018-12-17 12:52:02 -0800432 # self.assertExists(self.repo)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600433 self.assertExists(self.general)
434 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600435 self.assertExists(self.previous_build_state)
Don Garrett36650112018-06-28 15:54:34 -0700436 m.assert_called_with(self.chroot, delete=True)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600437
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600438 def testBuildrootBranchMatch(self):
439 """Test CleanBuildRoot with no change in branch."""
440 old_build_state = build_summary.BuildSummary(
441 status=constants.BUILDER_STATUS_PASSED,
442 buildroot_layout=2,
443 branch='branchA')
444 self.populateBuildroot(previous_build_state=old_build_state.to_json())
445 self.mock_repo.branch = 'branchA'
446
447 build_state = build_summary.BuildSummary(
448 status=constants.BUILDER_STATUS_INFLIGHT,
449 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
450 branch='branchA')
451 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800452 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600453
454 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
455 self.assertEqual(new_summary.buildroot_layout, 2)
456 self.assertEqual(new_summary.branch, 'branchA')
457 self.assertIsNotNone(new_summary.distfiles_ts)
458 self.assertEqual(new_summary, build_state)
459
460 self.assertExists(self.repo)
461 self.assertExists(self.chroot)
462 self.assertExists(self.general)
463 self.assertExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600464 self.assertExists(self.previous_build_state)
Prathmesh Prabhuc41a0f52018-04-03 13:26:52 -0700465
Don Garrett4166d182018-12-17 12:52:02 -0800466 def testBuildrootGitLocksPrevPass(self):
467 """Verify not CleanStaleLocks, if previous build was in passed."""
468 old_build_state = build_summary.BuildSummary(
469 status=constants.BUILDER_STATUS_PASSED,
470 buildroot_layout=2,
471 branch='branchA')
472 self.populateBuildroot(previous_build_state=old_build_state.to_json())
473 self.mock_repo.branch = 'branchA'
474
475 build_state = build_summary.BuildSummary(
476 status=constants.BUILDER_STATUS_INFLIGHT,
477 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
478 branch='branchA')
479 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800480 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800481
482 self.assertEqual(
483 self.mock_repo.mock_calls, [
484 mock.call.PreLoad(),
485 mock.call.BuildRootGitCleanup(prune_all=True),
486 ])
487
488 def testBuildrootGitLocksPrevFail(self):
489 """Verify not CleanStaleLocks, if previous build was in failed."""
490 old_build_state = build_summary.BuildSummary(
491 status=constants.BUILDER_STATUS_FAILED,
492 buildroot_layout=2,
493 branch='branchA')
494 self.populateBuildroot(previous_build_state=old_build_state.to_json())
495 self.mock_repo.branch = 'branchA'
496
497 build_state = build_summary.BuildSummary(
498 status=constants.BUILDER_STATUS_INFLIGHT,
499 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
500 branch='branchA')
501 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800502 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800503
504 self.assertEqual(
505 self.mock_repo.mock_calls, [
506 mock.call.PreLoad(),
507 mock.call.BuildRootGitCleanup(prune_all=True),
508 ])
509
510 def testBuildrootGitLocksPrevInFlight(self):
511 """Verify CleanStaleLocks, if previous build was in flight."""
512 old_build_state = build_summary.BuildSummary(
513 status=constants.BUILDER_STATUS_INFLIGHT,
514 buildroot_layout=2,
515 branch='branchA')
516 self.populateBuildroot(previous_build_state=old_build_state.to_json())
517 self.mock_repo.branch = 'branchA'
518
519 build_state = build_summary.BuildSummary(
520 status=constants.BUILDER_STATUS_INFLIGHT,
521 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
522 branch='branchA')
523 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800524 self.root, self.mock_repo, self.cache, build_state)
Don Garrett4166d182018-12-17 12:52:02 -0800525
526
527 self.assertEqual(
528 self.mock_repo.method_calls, [
529 mock.call.PreLoad(),
530 mock.call.CleanStaleLocks(),
531 mock.call.BuildRootGitCleanup(prune_all=True),
532 ])
533
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600534 def testBuildrootDistfilesRecentCache(self):
535 """Test CleanBuildRoot does not delete distfiles when cache is recent."""
536 seed_distfiles_ts = time.time() - 60
537 old_build_state = build_summary.BuildSummary(
538 status=constants.BUILDER_STATUS_PASSED,
539 buildroot_layout=2,
540 branch='branchA',
541 distfiles_ts=seed_distfiles_ts)
542 self.populateBuildroot(previous_build_state=old_build_state.to_json())
543 self.mock_repo.branch = 'branchA'
544
545 build_state = build_summary.BuildSummary(
546 status=constants.BUILDER_STATUS_INFLIGHT,
547 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
548 branch='branchA')
549 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800550 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600551
552 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
553 self.assertEqual(new_summary.buildroot_layout, 2)
554 self.assertEqual(new_summary.branch, 'branchA')
555 # Same cache creation timestamp is rewritten to state.
556 self.assertEqual(new_summary.distfiles_ts, seed_distfiles_ts)
557 self.assertEqual(new_summary, build_state)
558
559 self.assertExists(self.repo)
560 self.assertExists(self.chroot)
561 self.assertExists(self.general)
562 self.assertExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600563 self.assertExists(self.previous_build_state)
Don Garrette17e1d92017-04-12 15:28:19 -0700564
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600565 def testBuildrootDistfilesCacheExpired(self):
566 """Test CleanBuildRoot when the distfiles cache is too old."""
567 old_build_state = build_summary.BuildSummary(
568 status=constants.BUILDER_STATUS_PASSED,
569 buildroot_layout=2,
570 branch='branchA',
571 distfiles_ts=100.0)
572 self.populateBuildroot(previous_build_state=old_build_state.to_json())
573 self.mock_repo.branch = 'branchA'
574
575 build_state = build_summary.BuildSummary(
576 status=constants.BUILDER_STATUS_INFLIGHT,
577 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
578 branch='branchA')
579 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800580 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600581
582 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
583 self.assertEqual(new_summary.buildroot_layout, 2)
584 self.assertEqual(new_summary.branch, 'branchA')
585 self.assertIsNotNone(new_summary.distfiles_ts)
586 self.assertEqual(new_summary, build_state)
587
588 self.assertExists(self.repo)
589 self.assertExists(self.chroot)
590 self.assertExists(self.general)
591 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600592 self.assertExists(self.previous_build_state)
593
Don Garrett61ce1ee2019-02-26 16:20:25 -0800594 def testRootOwnedCache(self):
595 """Test CleanBuildRoot with no history."""
596 seed_distfiles_ts = time.time() - 60
597 old_build_state = build_summary.BuildSummary(
598 status=constants.BUILDER_STATUS_PASSED,
599 buildroot_layout=2,
600 branch='branchA',
601 distfiles_ts=seed_distfiles_ts)
602 self.populateBuildroot(previous_build_state=old_build_state.to_json())
603 self.mock_repo.branch = 'branchA'
604
605 osutils.Chown(self.cache, 'root', 'root')
606
607 build_state = build_summary.BuildSummary(
608 status=constants.BUILDER_STATUS_INFLIGHT,
609 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
610 branch='branchA')
611 cbuildbot_launch.CleanBuildRoot(
612 self.root, self.mock_repo, self.cache, build_state)
613
614 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
615 self.assertEqual(new_summary.buildroot_layout, 2)
616 self.assertEqual(new_summary.branch, 'branchA')
617 # Same cache creation timestamp is rewritten to state.
618 self.assertEqual(new_summary.distfiles_ts, seed_distfiles_ts)
619 self.assertEqual(new_summary, build_state)
620
621 self.assertExists(self.repo)
622 self.assertExists(self.chroot)
623 self.assertExists(self.general)
624 self.assertNotExists(self.distfiles)
625 self.assertExists(self.previous_build_state)
626
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600627 def testBuildrootRepoCleanFailure(self):
628 """Test CleanBuildRoot with repo checkout failure."""
629 old_build_state = build_summary.BuildSummary(
630 status=constants.BUILDER_STATUS_PASSED,
631 buildroot_layout=1,
632 branch='branchA')
633 self.populateBuildroot(previous_build_state=old_build_state.to_json())
634 self.mock_repo.branch = 'branchA'
635 self.mock_repo.BuildRootGitCleanup.side_effect = Exception
636
637 build_state = build_summary.BuildSummary(
638 status=constants.BUILDER_STATUS_INFLIGHT,
639 buildroot_layout=cbuildbot_launch.BUILDROOT_BUILDROOT_LAYOUT,
640 branch='branchA')
641 cbuildbot_launch.CleanBuildRoot(
Don Garrett61ce1ee2019-02-26 16:20:25 -0800642 self.root, self.mock_repo, self.cache, build_state)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600643
644 new_summary = cbuildbot_launch.GetLastBuildState(self.root)
645 self.assertEqual(new_summary.buildroot_layout, 2)
646 self.assertEqual(new_summary.branch, 'branchA')
647 self.assertIsNotNone(new_summary.distfiles_ts)
648 self.assertEqual(new_summary, build_state)
649
650 self.assertNotExists(self.repo)
651 self.assertNotExists(self.chroot)
652 self.assertNotExists(self.general)
653 self.assertNotExists(self.distfiles)
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600654 self.assertExists(self.previous_build_state)
Don Garrettf324bc32017-05-23 14:00:53 -0700655
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600656 def testGetCurrentBuildStateNoArgs(self):
657 """Tests GetCurrentBuildState without arguments."""
658 options = cbuildbot_launch.PreParseArguments([
659 '--buildroot', self.root, 'config'
660 ])
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600661 state = cbuildbot_launch.GetCurrentBuildState(options, 'master')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600662
663 expected_state = build_summary.BuildSummary(
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600664 status=constants.BUILDER_STATUS_INFLIGHT,
665 buildroot_layout=2,
666 branch='master')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600667 self.assertEqual(state, expected_state)
668
669 def testGetCurrentBuildStateHasArgs(self):
670 """Tests GetCurrentBuildState with arguments."""
671 options = cbuildbot_launch.PreParseArguments([
672 '--buildroot', self.root,
673 '--buildnumber', '20',
674 '--master-build-id', '50',
675 'config'
676 ])
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600677 state = cbuildbot_launch.GetCurrentBuildState(options, 'branchA')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600678
679 expected_state = build_summary.BuildSummary(
680 build_number=20,
681 master_build_id=50,
Benjamin Gordon8b6d4122018-04-26 13:38:39 -0600682 status=constants.BUILDER_STATUS_INFLIGHT,
683 buildroot_layout=2,
684 branch='branchA')
685 self.assertEqual(state, expected_state)
686
687 def testGetCurrentBuildStateLayout(self):
688 """Test that GetCurrentBuildState uses the current buildroot layout."""
689 # Change to a future version.
690 self.PatchObject(cbuildbot_launch, 'BUILDROOT_BUILDROOT_LAYOUT', 22)
691
692 options = cbuildbot_launch.PreParseArguments([
693 '--buildroot', self.root, 'config'
694 ])
695 state = cbuildbot_launch.GetCurrentBuildState(options, 'branchA')
696
697 expected_state = build_summary.BuildSummary(
698 status=constants.BUILDER_STATUS_INFLIGHT,
699 buildroot_layout=22,
700 branch='branchA')
Benjamin Gordon90b2dd92018-04-12 14:04:21 -0600701 self.assertEqual(state, expected_state)
702
703 def testGetLastBuildStateNoFile(self):
704 """Tests GetLastBuildState if the file is missing."""
705 osutils.SafeMakedirs(self.root)
706 state = cbuildbot_launch.GetLastBuildState(self.root)
707 self.assertEqual(state, build_summary.BuildSummary())
708
709 def testGetLastBuildStateBadFile(self):
710 """Tests GetLastBuildState if the file contains invalid JSON."""
711 osutils.SafeMakedirs(self.root)
712 osutils.WriteFile(self.previous_build_state, '}}')
713 state = cbuildbot_launch.GetLastBuildState(self.root)
714 self.assertEqual(state, build_summary.BuildSummary())
715
716 def testGetLastBuildStateMissingBuildStatus(self):
717 """Tests GetLastBuildState if the file doesn't have a valid status."""
718 osutils.SafeMakedirs(self.root)
719 osutils.WriteFile(self.previous_build_state, '{"build_number": "3"}')
720 state = cbuildbot_launch.GetLastBuildState(self.root)
721 self.assertEqual(state, build_summary.BuildSummary())
722
723 def testGetLastBuildStateGoodFile(self):
724 """Tests GetLastBuildState on a good file."""
725 osutils.SafeMakedirs(self.root)
726 osutils.WriteFile(
727 self.previous_build_state,
728 '{"build_number": 1, "master_build_id": 3, "status": "pass"}')
729 state = cbuildbot_launch.GetLastBuildState(self.root)
730 self.assertEqual(
731 state,
732 build_summary.BuildSummary(
733 build_number=1, master_build_id=3, status='pass'))
734
735 def testSetLastBuildState(self):
736 """Verifies that SetLastBuildState writes to the expected file."""
737 osutils.SafeMakedirs(self.root)
738 old_state = build_summary.BuildSummary(
739 build_number=314,
740 master_build_id=2178,
741 status=constants.BUILDER_STATUS_PASSED)
742 cbuildbot_launch.SetLastBuildState(self.root, old_state)
743
744 saved_state = osutils.ReadFile(self.previous_build_state)
745 new_state = build_summary.BuildSummary()
746 new_state.from_json(saved_state)
747
748 self.assertEqual(old_state, new_state)
Mike Frysingerf0146252019-09-02 13:31:05 -0400749
750 def testCleanupChrootNoChroot(self):
751 """Check CleanupChroot without a chroot."""
752 self.StartPatcher(cros_test_lib.RunCommandMock())
753 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount'):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400754 cbuildbot_launch.CleanupChroot(self.buildroot)
Mike Frysingerf0146252019-09-02 13:31:05 -0400755
756 def testCleanupChrootNormal(self):
757 """Check normal CleanupChroot."""
758 osutils.SafeMakedirs(self.chroot)
759 osutils.Touch(self.chroot + '.img')
760 self.StartPatcher(cros_test_lib.RunCommandMock())
761 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount'):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400762 cbuildbot_launch.CleanupChroot(self.buildroot)
Mike Frysingerf0146252019-09-02 13:31:05 -0400763
764 def testCleanupChrootTimeout(self):
765 """Check timeouts in CleanupChroot."""
766 osutils.SafeMakedirs(self.chroot)
767 osutils.Touch(self.chroot + '.img')
768 rc_mock = self.StartPatcher(cros_test_lib.RunCommandMock())
769 rc_mock.SetDefaultCmdResult()
770 with mock.patch.object(cros_sdk_lib, 'CleanupChrootMount',
771 side_effect=timeout_util.TimeoutError):
Mike Frysinger7a63ee72019-09-03 14:24:06 -0400772 cbuildbot_launch.CleanupChroot(self.buildroot)