blob: 5065f1287a127f5a23651140722d41ffda3a8dc2 [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2013 The ChromiumOS Authors
Mike Frysingerd13faeb2013-09-05 16:00:46 -04002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Unittests for pushimage.py"""
6
Mike Frysingerd7c93092019-10-14 00:12:50 -04007import collections
Mike Frysingerd13faeb2013-09-05 16:00:46 -04008import os
Mike Frysinger166fea02021-02-12 05:30:33 -05009from unittest import mock
Mike Frysingerd13faeb2013-09-05 16:00:46 -040010
Mike Frysinger6791b1d2014-03-04 20:52:22 -050011from chromite.lib import cros_build_lib
Mike Frysingerd13faeb2013-09-05 16:00:46 -040012from chromite.lib import cros_test_lib
Don Garrett9fd20a82014-09-04 11:37:22 -070013from chromite.lib import gs
Mike Frysingerd13faeb2013-09-05 16:00:46 -040014from chromite.lib import gs_unittest
15from chromite.lib import osutils
Mike Frysinger4495b032014-03-05 17:24:03 -050016from chromite.lib import partial_mock
Mike Frysingerd13faeb2013-09-05 16:00:46 -040017from chromite.lib import signing
18from chromite.scripts import pushimage
19
20
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070021# Use our local copy of insns for testing as the main one is not available in
22# the public manifest. Even though _REL is a relative path, this works because
23# os.join leaves absolute paths on the right hand side alone.
24signing.INPUT_INSN_DIR_REL = signing.TEST_INPUT_INSN_DIR
25
26
Mike Frysingerd13faeb2013-09-05 16:00:46 -040027class InputInsnsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060028 """Tests for InputInsns"""
Mike Frysingerd13faeb2013-09-05 16:00:46 -040029
Alex Klein1699fab2022-09-08 08:46:06 -060030 def setUp(self):
31 self.StartPatcher(gs_unittest.GSContextMock())
Don Garrettac529772015-04-29 15:09:26 -070032
Alex Klein1699fab2022-09-08 08:46:06 -060033 def testBasic(self):
34 """Simple smoke test"""
35 insns = pushimage.InputInsns("test.board")
36 insns.GetInsnFile("recovery")
37 self.assertEqual(insns.GetChannels(), ["dev", "canary"])
38 self.assertEqual(insns.GetKeysets(), ["stumpy-mp-v3"])
Mike Frysingerd13faeb2013-09-05 16:00:46 -040039
Alex Klein1699fab2022-09-08 08:46:06 -060040 def testGetInsnFile(self):
41 """Verify various inputs result in right insns path"""
42 testdata = (
43 ("UPPER_CAPS", "UPPER_CAPS"),
44 ("recovery", "test.board"),
45 ("firmware", "test.board.firmware"),
46 ("factory", "test.board.factory"),
47 )
48 insns = pushimage.InputInsns("test.board")
49 for image_type, filename in testdata:
50 ret = insns.GetInsnFile(image_type)
51 self.assertEqual(
52 os.path.basename(ret), "%s.instructions" % (filename)
53 )
Mike Frysingerd13faeb2013-09-05 16:00:46 -040054
Alex Klein1699fab2022-09-08 08:46:06 -060055 def testSplitCfgField(self):
56 """Verify splitting behavior behaves"""
57 testdata = (
58 ("", []),
59 ("a b c", ["a", "b", "c"]),
60 ("a, b", ["a", "b"]),
61 ("a,b", ["a", "b"]),
62 ("a,\tb", ["a", "b"]),
63 ("a\tb", ["a", "b"]),
64 )
65 for val, exp in testdata:
66 ret = pushimage.InputInsns.SplitCfgField(val)
67 self.assertEqual(ret, exp)
Mike Frysingerd13faeb2013-09-05 16:00:46 -040068
Alex Klein1699fab2022-09-08 08:46:06 -060069 def testOutputInsnsBasic(self):
70 """Verify output instructions are correct"""
71 exp_content = """[insns]
Mike Frysingerd13faeb2013-09-05 16:00:46 -040072channel = dev canary
Mike Frysingerd84d91e2015-11-05 18:02:24 -050073keyset = stumpy-mp-v3
Mike Frysingerd13faeb2013-09-05 16:00:46 -040074chromeos_shell = false
75ensure_no_password = true
76firmware_update = true
77security_checks = true
78create_nplusone = true
79
80[general]
81"""
82
Alex Klein1699fab2022-09-08 08:46:06 -060083 insns = pushimage.InputInsns("test.board")
84 self.assertEqual(insns.GetAltInsnSets(), [None])
85 m = self.PatchObject(osutils, "WriteFile")
86 insns.OutputInsns("/bogus", {}, {})
87 self.assertTrue(m.called)
88 content = m.call_args_list[0][0][1]
89 self.assertEqual(content.rstrip(), exp_content.rstrip())
Mike Frysingerd13faeb2013-09-05 16:00:46 -040090
Alex Klein1699fab2022-09-08 08:46:06 -060091 def testOutputInsnsReplacements(self):
92 """Verify output instructions can be updated"""
93 exp_content = """[insns]
Mike Frysingerd13faeb2013-09-05 16:00:46 -040094channel = dev
Mike Frysingerd84d91e2015-11-05 18:02:24 -050095keyset = batman
Mike Frysingerd13faeb2013-09-05 16:00:46 -040096chromeos_shell = false
97ensure_no_password = true
98firmware_update = true
99security_checks = true
100create_nplusone = true
101
102[general]
103board = board
104config_board = test.board
105"""
Alex Klein1699fab2022-09-08 08:46:06 -0600106 sect_insns = {
107 "channel": "dev",
108 "keyset": "batman",
109 }
110 sect_general = collections.OrderedDict(
111 (
112 ("board", "board"),
113 ("config_board", "test.board"),
114 )
115 )
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400116
Alex Klein1699fab2022-09-08 08:46:06 -0600117 insns = pushimage.InputInsns("test.board")
118 m = self.PatchObject(osutils, "WriteFile")
119 insns.OutputInsns("/a/file", sect_insns, sect_general)
120 self.assertTrue(m.called)
121 content = m.call_args_list[0][0][1]
122 self.assertEqual(content.rstrip(), exp_content.rstrip())
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400123
Alex Klein1699fab2022-09-08 08:46:06 -0600124 def testOutputInsnsMergeAlts(self):
125 """Verify handling of alternative insns.xxx sections"""
126 TEMPLATE_CONTENT = """[insns]
Mike Frysinger37ccc2b2015-11-11 17:16:51 -0500127channel = %(channel)s
128chromeos_shell = false
129ensure_no_password = true
130firmware_update = true
131security_checks = true
132create_nplusone = true
133override = sect_insns
134keyset = %(keyset)s
135%(extra)s
136[general]
137board = board
138config_board = test.board
139"""
140
Alex Klein1699fab2022-09-08 08:46:06 -0600141 exp_alts = ["insns.one", "insns.two", "insns.hotsoup"]
142 exp_fields = {
143 "one": {
144 "channel": "dev canary",
145 "keyset": "OneKeyset",
146 "extra": "",
147 },
148 "two": {"channel": "best", "keyset": "TwoKeyset", "extra": ""},
149 "hotsoup": {
150 "channel": "dev canary",
151 "keyset": "ColdKeyset",
152 "extra": "soup = cheddar\n",
153 },
154 }
Mike Frysinger37ccc2b2015-11-11 17:16:51 -0500155
Alex Klein1699fab2022-09-08 08:46:06 -0600156 # Make sure this overrides the insn sections.
157 sect_insns = {
158 "override": "sect_insns",
159 }
160 sect_insns_copy = sect_insns.copy()
161 sect_general = collections.OrderedDict(
162 (
163 ("board", "board"),
164 ("config_board", "test.board"),
165 )
166 )
Mike Frysinger37ccc2b2015-11-11 17:16:51 -0500167
Alex Klein1699fab2022-09-08 08:46:06 -0600168 insns = pushimage.InputInsns("test.multi")
169 self.assertEqual(insns.GetAltInsnSets(), exp_alts)
170 m = self.PatchObject(osutils, "WriteFile")
Mike Frysinger37ccc2b2015-11-11 17:16:51 -0500171
Alex Klein1699fab2022-09-08 08:46:06 -0600172 for alt in exp_alts:
173 m.reset_mock()
174 insns.OutputInsns(
175 "/a/file", sect_insns, sect_general, insns_merge=alt
176 )
177 self.assertEqual(sect_insns, sect_insns_copy)
178 self.assertTrue(m.called)
179 content = m.call_args_list[0][0][1]
180 exp_content = TEMPLATE_CONTENT % exp_fields[alt[6:]]
181 self.assertEqual(content.rstrip(), exp_content.rstrip())
Mike Frysinger37ccc2b2015-11-11 17:16:51 -0500182
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400183
Mike Frysinger4495b032014-03-05 17:24:03 -0500184class MarkImageToBeSignedTest(gs_unittest.AbstractGSContextTest):
Alex Klein1699fab2022-09-08 08:46:06 -0600185 """Tests for MarkImageToBeSigned()"""
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400186
Alex Klein1699fab2022-09-08 08:46:06 -0600187 def setUp(self):
188 # Minor optimization -- we call this for logging purposes in the main
189 # code, but don't really care about it for testing. It just slows us.
190 self.PatchObject(
191 cros_build_lib, "MachineDetails", return_value="1234\n"
192 )
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400193
Alex Klein1699fab2022-09-08 08:46:06 -0600194 def testBasic(self):
195 """Simple smoke test"""
196 tbs_base = "gs://some-bucket"
197 insns_path = "chan/board/ver/file.instructions"
198 tbs_file = (
199 "%s/tobesigned/90,chan,board,ver,file.instructions" % tbs_base
200 )
201 ret = pushimage.MarkImageToBeSigned(self.ctx, tbs_base, insns_path, 90)
202 self.assertEqual(ret, tbs_file)
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400203
Alex Klein1699fab2022-09-08 08:46:06 -0600204 def testPriority(self):
205 """Verify diff priority values get used correctly"""
206 for prio, sprio in ((0, "00"), (9, "09"), (35, "35"), (99, "99")):
207 ret = pushimage.MarkImageToBeSigned(self.ctx, "", "", prio)
208 self.assertEqual(ret, "/tobesigned/%s," % sprio)
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400209
Alex Klein1699fab2022-09-08 08:46:06 -0600210 def testBadPriority(self):
211 """Verify we reject bad priority values"""
212 for prio in (-10, -1, 100, 91239):
213 self.assertRaises(
214 ValueError,
215 pushimage.MarkImageToBeSigned,
216 self.ctx,
217 "",
218 "",
219 prio,
220 )
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400221
Alex Klein1699fab2022-09-08 08:46:06 -0600222 def testTbsUpload(self):
223 """Make sure we actually try to upload the file"""
224 pushimage.MarkImageToBeSigned(self.ctx, "", "", 50)
225 self.gs_mock.assertCommandContains(["cp", "--"])
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400226
227
Mike Frysinger4495b032014-03-05 17:24:03 -0500228class PushImageTests(gs_unittest.AbstractGSContextTest):
Alex Klein1699fab2022-09-08 08:46:06 -0600229 """Tests for PushImage()"""
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400230
Alex Klein1699fab2022-09-08 08:46:06 -0600231 def setUp(self):
232 self.mark_mock = self.PatchObject(pushimage, "MarkImageToBeSigned")
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400233
Alex Klein1699fab2022-09-08 08:46:06 -0600234 def testBasic(self):
235 """Simple smoke test"""
236 EXPECTED = {
237 "canary": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000238 "gs://chromeos-releases/canary-channel/test.board-hi/5126.0.0/"
239 "ChromeOS-recovery-R34-5126.0.0-test.board-hi.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600240 ],
241 "dev": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000242 "gs://chromeos-releases/dev-channel/test.board-hi/5126.0.0/"
243 "ChromeOS-recovery-R34-5126.0.0-test.board-hi.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600244 ],
245 }
246 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
247 urls = pushimage.PushImage(
248 "/src", "test.board", "R34-5126.0.0", profile="hi"
249 )
Don Garrett9459c2f2014-01-22 18:20:24 -0800250
Alex Klein1699fab2022-09-08 08:46:06 -0600251 self.assertEqual(urls, EXPECTED)
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400252
Alex Klein1699fab2022-09-08 08:46:06 -0600253 def testBasic_SignTypesEmptyList(self):
254 """Tests PushImage behavior when |sign_types| is empty instead of None.
Amey Deshpande3c487952015-09-03 12:11:13 -0700255
Alex Klein1699fab2022-09-08 08:46:06 -0600256 As part of the buildbots, PushImage function always receives a tuple for
257 |sign_types| argument. This test checks the behavior for empty tuple.
258 """
259 EXPECTED = {
260 "canary": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000261 "gs://chromeos-releases/canary-channel/test.board-hi/5126.0.0/"
262 "ChromeOS-recovery-R34-5126.0.0-test.board-hi.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600263 ],
264 "dev": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000265 "gs://chromeos-releases/dev-channel/test.board-hi/5126.0.0/"
266 "ChromeOS-recovery-R34-5126.0.0-test.board-hi.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600267 ],
268 }
269 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
270 urls = pushimage.PushImage(
271 "/src",
272 "test.board",
273 "R34-5126.0.0",
274 profile="hi",
275 sign_types=(),
276 )
Amey Deshpande3c487952015-09-03 12:11:13 -0700277
Alex Klein1699fab2022-09-08 08:46:06 -0600278 self.assertEqual(urls, EXPECTED)
Amey Deshpande3c487952015-09-03 12:11:13 -0700279
Alex Klein1699fab2022-09-08 08:46:06 -0600280 def testBasic_RealBoardName(self):
281 """Runs a simple smoke test using a real board name."""
282 EXPECTED = {
283 "canary": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000284 "gs://chromeos-releases/canary-channel/x86-alex/5126.0.0/"
285 "ChromeOS-recovery-R34-5126.0.0-x86-alex.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600286 ],
287 "dev": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000288 "gs://chromeos-releases/dev-channel/x86-alex/5126.0.0/"
289 "ChromeOS-recovery-R34-5126.0.0-x86-alex.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600290 ],
291 }
292 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
293 urls = pushimage.PushImage("/src", "x86-alex", "R34-5126.0.0")
Amey Deshpandea936c622015-08-12 17:27:54 -0700294
Alex Klein1699fab2022-09-08 08:46:06 -0600295 self.assertEqual(urls, EXPECTED)
Amey Deshpandea936c622015-08-12 17:27:54 -0700296
Alex Klein1699fab2022-09-08 08:46:06 -0600297 def testBasicMock(self):
298 """Simple smoke test in mock mode"""
299 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
300 pushimage.PushImage(
Mike Frysinger9d1253c2023-02-02 09:00:07 -0500301 "/src", "test.board", "R34-5126.0.0", dryrun=True, mock=True
Alex Klein1699fab2022-09-08 08:46:06 -0600302 )
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400303
Alex Klein1699fab2022-09-08 08:46:06 -0600304 def testBadVersion(self):
305 """Make sure we barf on bad version strings"""
306 self.assertRaises(ValueError, pushimage.PushImage, "", "", "asdf")
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400307
Alex Klein1699fab2022-09-08 08:46:06 -0600308 def testNoInsns(self):
309 """Boards w/out insn files should get skipped"""
310 urls = pushimage.PushImage("/src", "a bad bad board", "R34-5126.0.0")
311 self.assertEqual(self.gs_mock.call_count, 0)
312 self.assertEqual(urls, None)
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400313
Alex Klein1699fab2022-09-08 08:46:06 -0600314 def testSignTypesRecovery(self):
315 """Only sign the requested recovery type"""
316 EXPECTED = {
317 "canary": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000318 "gs://chromeos-releases/canary-channel/test.board/5126.0.0/"
319 "ChromeOS-recovery-R34-5126.0.0-test.board.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600320 ],
321 "dev": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000322 "gs://chromeos-releases/dev-channel/test.board/5126.0.0/"
323 "ChromeOS-recovery-R34-5126.0.0-test.board.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600324 ],
325 }
Don Garrett9459c2f2014-01-22 18:20:24 -0800326
Alex Klein1699fab2022-09-08 08:46:06 -0600327 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
328 urls = pushimage.PushImage(
329 "/src", "test.board", "R34-5126.0.0", sign_types=["recovery"]
330 )
Shuhei Takahashi7e05dbf2023-05-19 10:40:47 +0900331 self.assertEqual(self.gs_mock.call_count, 26)
Alex Klein1699fab2022-09-08 08:46:06 -0600332 self.assertTrue(self.mark_mock.called)
333 self.assertEqual(urls, EXPECTED)
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400334
Alex Klein1699fab2022-09-08 08:46:06 -0600335 def testSignTypesBase(self):
336 """Only sign the requested recovery type"""
337 EXPECTED = {
338 "canary": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000339 "gs://chromeos-releases/canary-channel/test.board/5126.0.0/"
340 "ChromeOS-base-R34-5126.0.0-test.board.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600341 ],
342 "dev": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000343 "gs://chromeos-releases/dev-channel/test.board/5126.0.0/"
344 "ChromeOS-base-R34-5126.0.0-test.board.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600345 ],
346 }
Amey Deshpandea936c622015-08-12 17:27:54 -0700347
Alex Klein1699fab2022-09-08 08:46:06 -0600348 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
349 urls = pushimage.PushImage(
350 "/src", "test.board", "R34-5126.0.0", sign_types=["base"]
351 )
Shuhei Takahashi7e05dbf2023-05-19 10:40:47 +0900352 self.assertEqual(self.gs_mock.call_count, 28)
Alex Klein1699fab2022-09-08 08:46:06 -0600353 self.assertTrue(self.mark_mock.called)
354 self.assertEqual(urls, EXPECTED)
LaMont Jones7d6c98f2019-09-27 12:37:33 -0600355
Alex Klein1699fab2022-09-08 08:46:06 -0600356 def testSignTypesGscFirmware(self):
357 """Only sign the requested type"""
358 EXPECTED = {
359 "canary": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000360 "gs://chromeos-releases/canary-channel/board2/5126.0.0/"
361 "ChromeOS-gsc_firmware-R34-5126.0.0-board2.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600362 ],
363 "dev": [
Trent Aptedc4f366a2023-05-16 15:32:48 +1000364 "gs://chromeos-releases/dev-channel/board2/5126.0.0/"
365 "ChromeOS-gsc_firmware-R34-5126.0.0-board2.instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600366 ],
367 }
LaMont Jones7d6c98f2019-09-27 12:37:33 -0600368
Alex Klein1699fab2022-09-08 08:46:06 -0600369 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
370 urls = pushimage.PushImage(
371 "/src", "board2", "R34-5126.0.0", sign_types=["gsc_firmware"]
372 )
Shuhei Takahashi7e05dbf2023-05-19 10:40:47 +0900373 self.assertEqual(self.gs_mock.call_count, 28)
Alex Klein1699fab2022-09-08 08:46:06 -0600374 self.assertTrue(self.mark_mock.called)
375 self.assertEqual(urls, EXPECTED)
Amey Deshpandea936c622015-08-12 17:27:54 -0700376
Alex Klein1699fab2022-09-08 08:46:06 -0600377 def testSignTypesNone(self):
378 """Verify nothing is signed when we request an unavailable type"""
379 urls = pushimage.PushImage(
380 "/src", "test.board", "R34-5126.0.0", sign_types=["nononononono"]
381 )
Shuhei Takahashi7e05dbf2023-05-19 10:40:47 +0900382 self.assertEqual(self.gs_mock.call_count, 24)
Alex Klein1699fab2022-09-08 08:46:06 -0600383 self.assertFalse(self.mark_mock.called)
384 self.assertEqual(urls, {})
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400385
Alex Klein1699fab2022-09-08 08:46:06 -0600386 def testGsError(self):
387 """Verify random GS errors don't make us blow up entirely"""
388 self.gs_mock.AddCmdResult(
389 partial_mock.In("stat"), returncode=1, stdout="gobblety gook\n"
390 )
391 with cros_test_lib.LoggingCapturer("chromite"):
392 self.assertRaises(
393 pushimage.PushError,
394 pushimage.PushImage,
395 "/src",
396 "test.board",
397 "R34-5126.0.0",
398 )
Mike Frysinger4495b032014-03-05 17:24:03 -0500399
Alex Klein1699fab2022-09-08 08:46:06 -0600400 def testMultipleKeysets(self):
401 """Verify behavior when processing an insn w/multiple keysets"""
402 EXPECTED = {
403 "canary": [
404 (
405 "gs://chromeos-releases/canary-channel/test.board/5126.0.0/"
406 "ChromeOS-recovery-R34-5126.0.0-test.board.instructions"
407 ),
408 (
409 "gs://chromeos-releases/canary-channel/test.board/5126.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000410 "ChromeOS-recovery-R34-5126.0.0-test.board-key2."
411 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600412 ),
413 (
414 "gs://chromeos-releases/canary-channel/test.board/5126.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000415 "ChromeOS-recovery-R34-5126.0.0-test.board-key3."
416 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600417 ),
418 ],
419 "dev": [
420 (
421 "gs://chromeos-releases/dev-channel/test.board/5126.0.0/"
422 "ChromeOS-recovery-R34-5126.0.0-test.board.instructions"
423 ),
424 (
425 "gs://chromeos-releases/dev-channel/test.board/5126.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000426 "ChromeOS-recovery-R34-5126.0.0-test.board-key2."
427 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600428 ),
429 (
430 "gs://chromeos-releases/dev-channel/test.board/5126.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000431 "ChromeOS-recovery-R34-5126.0.0-test.board-key3."
432 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600433 ),
434 ],
435 }
436 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
437 urls = pushimage.PushImage(
438 "/src",
439 "test.board",
440 "R34-5126.0.0",
441 force_keysets=("key1", "key2", "key3"),
442 )
443 self.assertEqual(urls, EXPECTED)
Mike Frysingerd84d91e2015-11-05 18:02:24 -0500444
Alex Klein1699fab2022-09-08 08:46:06 -0600445 def testForceChannel(self):
446 """Verify behavior when user has specified custom channel"""
447 EXPECTED = {
448 "meep": [
449 (
450 "gs://chromeos-releases/meep-channel/test.board/5126.0.0/"
451 "ChromeOS-recovery-R34-5126.0.0-test.board.instructions"
452 ),
453 ],
454 }
455 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
456 urls = pushimage.PushImage(
457 "/src", "test.board", "R34-5126.0.0", force_channels=("meep",)
458 )
459 self.assertEqual(urls, EXPECTED)
Mike Frysinger77912102017-08-30 18:35:46 -0400460
Alex Klein1699fab2022-09-08 08:46:06 -0600461 def testMultipleAltInsns(self):
462 """Verify behavior when processing an insn w/multiple insn overlays"""
463 EXPECTED = {
464 "canary": [
465 (
466 "gs://chromeos-releases/canary-channel/test.multi/1.0.0/"
467 "ChromeOS-recovery-R1-1.0.0-test.multi.instructions"
468 ),
469 (
470 "gs://chromeos-releases/canary-channel/test.multi/1.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000471 "ChromeOS-recovery-R1-1.0.0-test.multi-TwoKeyset."
472 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600473 ),
474 (
475 "gs://chromeos-releases/canary-channel/test.multi/1.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000476 "ChromeOS-recovery-R1-1.0.0-test.multi-ColdKeyset."
477 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600478 ),
479 ],
480 "dev": [
481 (
482 "gs://chromeos-releases/dev-channel/test.multi/1.0.0/"
483 "ChromeOS-recovery-R1-1.0.0-test.multi.instructions"
484 ),
485 (
486 "gs://chromeos-releases/dev-channel/test.multi/1.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000487 "ChromeOS-recovery-R1-1.0.0-test.multi-TwoKeyset."
488 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600489 ),
490 (
491 "gs://chromeos-releases/dev-channel/test.multi/1.0.0/"
Trent Aptedc4f366a2023-05-16 15:32:48 +1000492 "ChromeOS-recovery-R1-1.0.0-test.multi-ColdKeyset."
493 "instructions"
Alex Klein1699fab2022-09-08 08:46:06 -0600494 ),
495 ],
496 }
497 with mock.patch.object(gs.GSContext, "Exists", return_value=True):
498 urls = pushimage.PushImage("/src", "test.multi", "R1-1.0.0")
499 self.assertEqual(urls, EXPECTED)
Mike Frysinger37ccc2b2015-11-11 17:16:51 -0500500
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400501
502class MainTests(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600503 """Tests for main()"""
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400504
Alex Klein1699fab2022-09-08 08:46:06 -0600505 def setUp(self):
506 self.PatchObject(pushimage, "PushImage")
Mike Frysingerd13faeb2013-09-05 16:00:46 -0400507
Alex Klein1699fab2022-09-08 08:46:06 -0600508 def testBasic(self):
509 """Simple smoke test"""
510 pushimage.main(["--board", "test.board", "/src", "--yes"])