2 # Copyright (c) 2013 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.
6 """Tests for paygen_build_lib."""
8 from __future__ import print_function
18 fixup_path.FixupPath()
20 from chromite.cbuildbot import cbuildbot_config
21 from chromite.cbuildbot import commands
23 from chromite.lib import cros_build_lib
24 from chromite.lib import cros_test_lib
25 from chromite.lib import osutils
26 from chromite.lib import parallel
28 from chromite.lib.paygen import download_cache
29 from chromite.lib.paygen import gslock
30 from chromite.lib.paygen import gslib
31 from chromite.lib.paygen import gspaths
32 from chromite.lib.paygen import urilib
33 from chromite.lib.paygen import paygen_build_lib
34 from chromite.lib.paygen import paygen_payload_lib
35 from chromite.lib.paygen import utils
38 # pylint: disable-msg=F0401
39 from site_utils.autoupdate.lib import test_control
40 # pylint: enable-msg=F0401
43 # We access a lot of protected members during testing.
44 # pylint: disable-msg=W0212
47 class PaygenBuildLibTest(mox.MoxTestBase):
48 """Test PaygenBuildLib class."""
50 def __init__(self, test_case_names):
51 mox.MoxTestBase.__init__(self, test_case_names)
52 self.work_dir = '/work/foo'
55 self.prev_image = gspaths.Image(channel='foo-channel',
59 self.prev2_image = gspaths.Image(channel='foo-channel',
64 self.foo_build = gspaths.Build(bucket='crt',
65 channel='foo-channel',
69 # Create an additional 'special' image like NPO that isn't NPO,
70 # and keyed with a weird key. It should match none of the filters.
71 self.special_image = gspaths.Image(bucket='crt',
72 channel='foo-channel',
76 image_channel='special-channel')
78 self.images = self._GetBuildImages(self.foo_build)
79 (self.basic_image, self.premp_image,
80 self.npo_image, self.premp_npo_image) = self.images
82 self.test_image = self._GetBuildTestImage(self.foo_build)
84 def _GetPaygenBuildInstance(self):
85 """Helper method to create a standard Paygen instance."""
86 return paygen_build_lib._PaygenBuild(self.foo_build, self.work_dir,
87 control_dir='/tmp/foo')
89 def _GetBuildImages(self, build):
90 """Create basic_image, npo_image, premp_image, premp_npo_image.
93 build: gspaths.Build object describing the build to create fake images
96 # NPOs should have image_version incremented, but it doesn't matter for our
98 basic_image = gspaths.Image(key='mp-v2', **build)
99 npo_image = gspaths.Image(key='mp-v2',
100 image_channel='nplusone-channel',
101 image_version=build.version,
103 premp_image = gspaths.Image(key='premp', **build)
104 premp_npo_image = gspaths.Image(key='premp',
105 image_channel='nplusone-channel',
106 image_version=build.version,
109 # Code in several places depends on the order.
110 return [basic_image, premp_image, npo_image, premp_npo_image]
112 def _GetBuildTestImage(self, build):
113 """Returns a test image object for the build.
116 build: gspaths.Build object describing the build to create fake images
119 return gspaths.UnsignedImageArchive(bucket=build.bucket,
120 channel=build.channel,
122 version=build.version,
126 def testGetFlagURI(self):
127 """Validate the helper method to create flag URIs for our current build."""
128 paygen = self._GetPaygenBuildInstance()
131 paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK),
132 'gs://crt/foo-channel/foo-board/1.2.3/payloads/LOCK_flag')
134 paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP),
135 'gs://crt/foo-channel/foo-board/1.2.3/payloads/SKIP_flag')
137 paygen._GetFlagURI(gspaths.ChromeosReleases.FINISHED),
138 'gs://crt/foo-channel/foo-board/1.2.3/payloads/FINISHED_flag')
140 def testFilterHelpers(self):
141 """Test _FilterForMp helper method."""
143 # All of the filter helpers should handle empty list.
144 self.assertEqual(paygen_build_lib._FilterForMp([]), [])
145 self.assertEqual(paygen_build_lib._FilterForPremp([]), [])
146 self.assertEqual(paygen_build_lib._FilterForBasic([]), [])
147 self.assertEqual(paygen_build_lib._FilterForNpo([]), [])
149 # prev_image lets us test with an 'mp' key, instead of an 'mp-v2' key.
150 images = list(self.images) + [self.special_image, self.prev_image]
152 self.assertEqual(paygen_build_lib._FilterForMp(images),
153 [self.basic_image, self.npo_image, self.prev_image])
155 self.assertEqual(paygen_build_lib._FilterForPremp(images),
156 [self.premp_image, self.premp_npo_image])
158 self.assertEqual(paygen_build_lib._FilterForBasic(images),
159 [self.basic_image, self.premp_image, self.prev_image])
161 self.assertEqual(paygen_build_lib._FilterForNpo(images),
162 [self.npo_image, self.premp_npo_image])
164 def testValidateExpectedBuildImages(self):
165 """Test a function that validates expected images are found on a build."""
166 paygen = self._GetPaygenBuildInstance()
168 # Test with basic mp image only.
169 paygen._ValidateExpectedBuildImages(self.foo_build, (self.basic_image,))
171 # Test with basic mp and mp npo images.
172 paygen._ValidateExpectedBuildImages(self.foo_build, (self.basic_image,
174 # Test with basic mp and premp images.
175 paygen._ValidateExpectedBuildImages(self.foo_build, (self.basic_image,
178 # Test with basic mp and premp images.
179 paygen._ValidateExpectedBuildImages(self.foo_build, (self.basic_image,
183 # Test with 4 different images.
184 paygen._ValidateExpectedBuildImages(self.foo_build, (self.basic_image,
187 self.premp_npo_image))
189 # No images isn't valid.
190 with self.assertRaises(paygen_build_lib.ImageMissing):
191 paygen._ValidateExpectedBuildImages(self.foo_build, [])
193 # NPO image only isn't valid.
194 with self.assertRaises(paygen_build_lib.ImageMissing):
195 paygen._ValidateExpectedBuildImages(self.foo_build, (self.npo_image,))
197 # NPO without matching basic isn't valid.
198 with self.assertRaises(paygen_build_lib.ImageMissing):
199 paygen._ValidateExpectedBuildImages(self.foo_build,
202 self.premp_npo_image))
204 # More than one of the same type of image should trigger BuildCorrupt
205 with self.assertRaises(paygen_build_lib.BuildCorrupt):
206 paygen._ValidateExpectedBuildImages(self.foo_build, (self.basic_image,
209 # Unexpected images should trigger BuildCorrupt
210 with self.assertRaises(paygen_build_lib.BuildCorrupt):
211 paygen._ValidateExpectedBuildImages(self.foo_build,
216 def _TestDiscoverArtifacts(self, list_files_uri, list_files_result,
217 test_func, test_args, should_succeed,
219 """Test artifact discovery using mocked gsutil results."""
220 self.mox.StubOutWithMock(urilib, 'ListFiles')
221 urilib.ListFiles(list_files_uri).AndReturn(list_files_result)
225 self.assertEqual(test_func(*test_args), expected_result)
227 self.assertRaises(expected_result, test_func, *test_args)
229 def testDiscoverImages(self):
230 """Test _DiscoverImages."""
231 paygen = self._GetPaygenBuildInstance()
232 uri_base = 'gs://crt/foo-channel/foo-board/1.2.3'
234 uri_basic = os.path.join(
235 uri_base, 'chromeos_1.2.3_foo-board_recovery_foo-channel_mp-v3.bin')
236 uri_premp = os.path.join(
237 uri_base, 'chromeos_1.2.3_foo-board_recovery_foo-channel_premp.bin')
238 uri_npo = os.path.join(
240 'chromeos_1.2.4_foo-board_recovery_nplusone-channel_mp-v3.bin')
241 file_list_result = [uri_basic, uri_premp, uri_npo]
243 base_image_params = {'channel': 'foo-channel',
244 'board': 'foo-board',
247 expected_basic = gspaths.Image(key='mp-v3', uri=uri_basic,
249 expected_premp = gspaths.Image(key='premp', uri=uri_premp,
251 expected_npo = gspaths.Image(key='mp-v3', image_channel='nplusone-channel',
252 image_version='1.2.4', uri=uri_npo,
254 expected_result = [expected_basic, expected_premp, expected_npo]
256 self._TestDiscoverArtifacts(
257 os.path.join(uri_base, 'chromeos_*_foo-board_recovery_*_*.bin'),
259 paygen._DiscoverImages,
264 def testDiscoverTestImageArchives(self):
265 """Test _DiscoverTestImageArchives (success)."""
266 paygen = self._GetPaygenBuildInstance()
267 uri_base = 'gs://crt/foo-channel/foo-board/1.2.3'
269 uri_test_archive = os.path.join(
270 uri_base, 'ChromeOS-test-R12-1.2.3-foo-board.tar.xz')
271 file_list_result = [uri_test_archive]
273 expected_test_archive = gspaths.UnsignedImageArchive(
274 channel='foo-channel',
278 uri=uri_test_archive,
281 expected_result = [expected_test_archive]
283 self._TestDiscoverArtifacts(
284 os.path.join(uri_base, 'ChromeOS-test-*-1.2.3-foo-board.tar.xz'),
286 paygen._DiscoverTestImageArchives,
291 def testDiscoverTestImageArchivesMultipleResults(self):
292 """Test _DiscoverTestImageArchives (fails due to multiple results)."""
293 paygen = self._GetPaygenBuildInstance()
294 uri_base = 'gs://crt/foo-channel/foo-board/1.2.3'
296 uri_test_archive1 = os.path.join(
297 uri_base, 'ChromeOS-test-R12-1.2.3-foo-board.tar.xz')
298 uri_test_archive2 = os.path.join(
299 uri_base, 'ChromeOS-test-R13-1.2.3-foo-board.tar.xz')
300 file_list_result = [uri_test_archive1, uri_test_archive2]
302 self._TestDiscoverArtifacts(
303 os.path.join(uri_base, 'ChromeOS-test-*-1.2.3-foo-board.tar.xz'),
305 paygen._DiscoverTestImageArchives,
308 paygen_build_lib.BuildCorrupt)
310 def testDiscoverTestImageArchivesMissing(self):
311 """Test _DiscoverTestImageArchives (fails due to missing images)."""
312 paygen = self._GetPaygenBuildInstance()
313 uri_base = 'gs://crt/foo-channel/foo-board/1.2.3'
315 self._TestDiscoverArtifacts(
316 os.path.join(uri_base, 'ChromeOS-test-*-1.2.3-foo-board.tar.xz'),
318 paygen._DiscoverTestImageArchives,
321 paygen_build_lib.ImageMissing)
323 @unittest.skipIf(not paygen_build_lib.config, 'Internal crostools required.')
324 def testDiscoverFsiBuilds(self):
325 """Using test release.conf values, test _DiscoverFsiBuilds."""
329 fsi_images: 2913.331.0,2465.105.0
333 paygen_build_lib.config.LoadTestConfig(test_config)
335 # Test a board with FSI values on stable-channel.
336 paygen = paygen_build_lib._PaygenBuild(
337 gspaths.Build(channel='stable-channel', board='valid-board',
342 sorted(paygen._DiscoverFsiBuilds()),
343 [gspaths.Build(board='valid-board',
344 channel='stable-channel',
345 version='2465.105.0'),
346 gspaths.Build(board='valid-board',
347 channel='stable-channel',
348 version='2913.331.0')])
350 # Test a board without FSI values on stable-channel.
351 paygen = paygen_build_lib._PaygenBuild(
352 gspaths.Build(channel='stable-channel', board='no-fsi-board',
356 self.assertEqual(paygen._DiscoverFsiBuilds(), [])
358 # Test a board with FSI values on non-stable-channel.
359 paygen = paygen_build_lib._PaygenBuild(
360 gspaths.Build(channel='beta-channel', board='valid-board',
364 self.assertEqual(paygen._DiscoverFsiBuilds(), [])
366 paygen_build_lib.config.LoadGlobalConfig()
368 @unittest.skipIf(not paygen_build_lib.query, 'Internal crostools required.')
369 def testDiscoverNmoBuild(self):
370 """Test _DiscoverNmoBuild (N minus One)."""
371 paygen = self._GetPaygenBuildInstance()
373 self.mox.StubOutWithMock(paygen_build_lib.query, 'FindLatestPublished')
375 # Set up the test replay script.
376 paygen_build_lib.query.FindLatestPublished(
377 'foo-channel', 'foo-board').AndReturn('1.0.0')
379 paygen_build_lib.query.FindLatestPublished(
380 'foo-channel', 'foo-board').AndReturn(None)
382 # Run the test verification.
385 self.assertEqual(paygen._DiscoverNmoBuild(),
386 [gspaths.Build(bucket='crt',
387 channel='foo-channel',
391 self.assertEqual(paygen._DiscoverNmoBuild(), [])
393 def testDiscoverRequiredFullPayloads(self):
394 """Test _DiscoverRequiredFullPayloads."""
395 paygen = self._GetPaygenBuildInstance()
397 self.assertEqual(paygen._DiscoverRequiredFullPayloads([]), [])
399 self.assertItemsEqual(
400 paygen._DiscoverRequiredFullPayloads(self.images + [self.test_image]),
401 [gspaths.Payload(tgt_image=self.basic_image),
402 gspaths.Payload(tgt_image=self.npo_image),
403 gspaths.Payload(tgt_image=self.premp_image),
404 gspaths.Payload(tgt_image=self.premp_npo_image),
405 gspaths.Payload(tgt_image=self.test_image)])
407 def testDiscoverRequiredNpoDeltas(self):
408 """Test _DiscoverRequiredNpoDeltas."""
409 paygen = self._GetPaygenBuildInstance()
411 self.assertEqual(paygen._DiscoverRequiredNpoDeltas([]), [])
413 self.assertEqual(paygen._DiscoverRequiredNpoDeltas([self.basic_image]), [])
415 self.assertEqual(paygen._DiscoverRequiredNpoDeltas([self.npo_image]), [])
417 expected = [gspaths.Payload(tgt_image=self.npo_image,
418 src_image=self.basic_image)]
419 self.assertEqual(paygen._DiscoverRequiredNpoDeltas([self.basic_image,
423 self.assertEqual(paygen._DiscoverRequiredNpoDeltas([self.npo_image,
427 self.assertEqual(paygen._DiscoverRequiredNpoDeltas([self.premp_image,
428 self.premp_npo_image]),
429 [gspaths.Payload(tgt_image=self.premp_npo_image,
430 src_image=self.premp_image)])
432 def testDiscoverRequiredTestNpoDeltas(self):
433 """Test _DiscoverRequiredTestNpoDeltas."""
434 paygen = self._GetPaygenBuildInstance()
437 paygen._DiscoverRequiredTestNpoDeltas([]), [])
438 self.assertItemsEqual(
439 paygen._DiscoverRequiredTestNpoDeltas([self.test_image]),
440 [gspaths.Payload(tgt_image=self.test_image,
441 src_image=self.test_image)])
443 def testDiscoverRequiredFromPreviousDeltas(self):
444 """Test _DiscoverRequiredFromPreviousDeltas."""
445 paygen = self._GetPaygenBuildInstance()
447 images = [self.basic_image]
448 prevs = [self.prev_image, self.prev2_image]
451 results = paygen._DiscoverRequiredFromPreviousDeltas([], [])
453 self.assertEqual(results, expected)
455 # Empty previous list.
456 results = paygen._DiscoverRequiredFromPreviousDeltas(images, [])
458 self.assertEqual(results, expected)
461 results = paygen._DiscoverRequiredFromPreviousDeltas([], prevs)
463 self.assertEqual(results, expected)
466 results = paygen._DiscoverRequiredFromPreviousDeltas(images, prevs)
467 expected = [gspaths.Payload(tgt_image=self.basic_image,
468 src_image=self.prev_image),
469 gspaths.Payload(tgt_image=self.basic_image,
470 src_image=self.prev2_image)]
471 self.assertEqual(results, expected)
473 # Inverted order (should return nothing).
474 results = paygen._DiscoverRequiredFromPreviousDeltas(
475 [self.prev_image], images)
477 self.assertEqual(results, expected)
479 def testDiscoverRequiredPayloadsIncompleteBuild(self):
480 """Test _DiscoverRequiredPayloads."""
482 paygen = self._GetPaygenBuildInstance()
484 self.mox.StubOutWithMock(paygen, '_DiscoverImages')
485 self.mox.StubOutWithMock(paygen, '_DiscoverNmoBuild')
486 self.mox.StubOutWithMock(paygen, '_DiscoverFsiBuilds')
488 paygen.BUILD_DISCOVER_RETRY_SLEEP = 0
490 # Check that we retry 3 times.
491 paygen._DiscoverImages(paygen._build).AndRaise(
492 paygen_build_lib.ImageMissing())
493 paygen._DiscoverImages(paygen._build).AndRaise(
494 paygen_build_lib.ImageMissing())
495 paygen._DiscoverImages(paygen._build).AndRaise(
496 paygen_build_lib.ImageMissing())
497 paygen._DiscoverImages(paygen._build).AndRaise(
498 paygen_build_lib.ImageMissing())
500 # Run the test verification.
503 with self.assertRaises(paygen_build_lib.BuildNotReady):
504 paygen._DiscoverRequiredPayloads()
506 def testDiscoverRequiredPayloads(self):
507 """Test _DiscoverRequiredPayloads."""
509 paygen = self._GetPaygenBuildInstance()
511 output_uri = 'gs://foo'
513 self.mox.StubOutWithMock(paygen, '_DiscoverImages')
514 self.mox.StubOutWithMock(paygen, '_DiscoverTestImageArchives')
515 self.mox.StubOutWithMock(paygen, '_DiscoverNmoBuild')
516 self.mox.StubOutWithMock(paygen, '_DiscoverFsiBuilds')
517 self.mox.StubOutWithMock(paygen_payload_lib, 'DefaultPayloadUri')
519 nmo_build = gspaths.Build(bucket='crt',
520 channel='foo-channel',
523 fsi1_build = gspaths.Build(bucket='crt',
524 channel='foo-channel',
527 fsi2_build = gspaths.Build(bucket='crt',
528 channel='foo-channel',
532 nmo_images = self._GetBuildImages(nmo_build)
533 nmo_test_image = self._GetBuildTestImage(nmo_build)
534 fsi1_images = self._GetBuildImages(fsi1_build)
535 fsi1_test_image = self._GetBuildTestImage(fsi1_build)
536 fsi2_images = self._GetBuildImages(fsi2_build)
537 fsi2_test_image = self._GetBuildTestImage(fsi2_build)
539 paygen._DiscoverImages(paygen._build).AndReturn(self.images)
540 paygen._DiscoverTestImageArchives(paygen._build).AndReturn(
542 paygen._DiscoverNmoBuild().AndReturn([nmo_build])
543 paygen._DiscoverFsiBuilds().AndReturn([fsi1_build, fsi2_build])
544 paygen._DiscoverImages(nmo_build).AndReturn(nmo_images)
545 paygen._DiscoverTestImageArchives(nmo_build).AndReturn([nmo_test_image])
546 paygen._DiscoverImages(fsi1_build).AndReturn(fsi1_images)
547 paygen._DiscoverTestImageArchives(fsi1_build).AndReturn([fsi1_test_image])
548 paygen._DiscoverImages(fsi2_build).AndReturn(fsi2_images)
549 paygen._DiscoverTestImageArchives(fsi2_build).AndReturn([fsi2_test_image])
551 # Simplify the output URIs, so it's easy to check them below.
552 paygen_payload_lib.DefaultPayloadUri(
553 mox.IsA(gspaths.Payload), None).MultipleTimes().AndReturn(output_uri)
555 # Run the test verification.
558 results = paygen._DiscoverRequiredPayloads()
560 expected = [gspaths.Payload(tgt_image=self.basic_image, uri=output_uri),
561 gspaths.Payload(tgt_image=self.npo_image, uri=output_uri),
562 gspaths.Payload(tgt_image=self.premp_image, uri=output_uri),
563 gspaths.Payload(tgt_image=self.premp_npo_image, uri=output_uri),
565 gspaths.Payload(tgt_image=self.npo_image,
566 src_image=self.basic_image,
568 gspaths.Payload(tgt_image=self.premp_npo_image,
569 src_image=self.premp_image,
572 gspaths.Payload(tgt_image=self.basic_image,
573 src_image=nmo_images[0],
575 gspaths.Payload(tgt_image=self.premp_image,
576 src_image=nmo_images[1],
579 gspaths.Payload(tgt_image=self.basic_image,
580 src_image=fsi1_images[0],
582 gspaths.Payload(tgt_image=self.premp_image,
583 src_image=fsi1_images[1],
585 gspaths.Payload(tgt_image=self.basic_image,
586 src_image=fsi2_images[0],
588 gspaths.Payload(tgt_image=self.premp_image,
589 src_image=fsi2_images[1],
593 gspaths.Payload(tgt_image=self.test_image,
597 gspaths.Payload(tgt_image=self.test_image,
598 src_image=self.test_image,
602 gspaths.Payload(tgt_image=self.test_image,
603 src_image=nmo_test_image,
607 gspaths.Payload(tgt_image=self.test_image,
608 src_image=fsi1_test_image,
610 gspaths.Payload(tgt_image=self.test_image,
611 src_image=fsi2_test_image,
614 expected = zip(expected, itertools.repeat(False))
616 self.assertItemsEqual(sorted(results), sorted(expected))
618 def testDiscoverRequiredPayloadsPreviousSkipped(self):
619 """Test _DiscoverRequiredPayload.
621 Ensures that no test delta payload is generated if generation of a
622 signed delta from the same build was skipped.
625 paygen = self._GetPaygenBuildInstance()
627 output_uri = 'gs://foo'
629 self.mox.StubOutWithMock(paygen, '_DiscoverImages')
630 self.mox.StubOutWithMock(paygen, '_DiscoverTestImageArchives')
631 self.mox.StubOutWithMock(paygen, '_DiscoverNmoBuild')
632 self.mox.StubOutWithMock(paygen, '_DiscoverFsiBuilds')
633 self.mox.StubOutWithMock(paygen_payload_lib, 'DefaultPayloadUri')
635 nmo_build = gspaths.Build(bucket='crt',
636 channel='foo-channel',
639 fsi1_build = gspaths.Build(bucket='crt',
640 channel='foo-channel',
643 fsi2_build = gspaths.Build(bucket='crt',
644 channel='foo-channel',
648 fsi1_images = self._GetBuildImages(fsi1_build)
649 fsi1_test_image = self._GetBuildTestImage(fsi1_build)
650 fsi2_images = self._GetBuildImages(fsi2_build)
651 fsi2_test_image = self._GetBuildTestImage(fsi2_build)
653 paygen._DiscoverImages(paygen._build).AndReturn(self.images)
654 paygen._DiscoverTestImageArchives(paygen._build).AndReturn(
656 paygen._DiscoverNmoBuild().AndReturn([nmo_build])
657 paygen._DiscoverFsiBuilds().AndReturn([fsi1_build, fsi2_build])
658 paygen._DiscoverImages(nmo_build).AndRaise(
659 paygen_build_lib.ImageMissing('nmo build is missing some image'))
660 # _DiscoverTestImageArchives(nmo_build) should NOT be called.
661 paygen._DiscoverImages(fsi1_build).AndReturn(fsi1_images)
662 paygen._DiscoverTestImageArchives(fsi1_build).AndReturn([fsi1_test_image])
663 paygen._DiscoverImages(fsi2_build).AndReturn(fsi2_images)
664 paygen._DiscoverTestImageArchives(fsi2_build).AndReturn([fsi2_test_image])
666 # Simplify the output URIs, so it's easy to check them below.
667 paygen_payload_lib.DefaultPayloadUri(
668 mox.IsA(gspaths.Payload), None).MultipleTimes().AndReturn(output_uri)
670 # Run the test verification.
673 results = paygen._DiscoverRequiredPayloads()
675 # IMPORTANT: we intentionally omit the NMO payload from the expected list
676 # of payloads as it is a duplicate of one of the FSIs.
677 expected = [gspaths.Payload(tgt_image=self.basic_image, uri=output_uri),
678 gspaths.Payload(tgt_image=self.npo_image, uri=output_uri),
679 gspaths.Payload(tgt_image=self.premp_image, uri=output_uri),
680 gspaths.Payload(tgt_image=self.premp_npo_image, uri=output_uri),
682 gspaths.Payload(tgt_image=self.npo_image,
683 src_image=self.basic_image,
685 gspaths.Payload(tgt_image=self.premp_npo_image,
686 src_image=self.premp_image,
689 gspaths.Payload(tgt_image=self.basic_image,
690 src_image=fsi1_images[0],
692 gspaths.Payload(tgt_image=self.premp_image,
693 src_image=fsi1_images[1],
695 gspaths.Payload(tgt_image=self.basic_image,
696 src_image=fsi2_images[0],
698 gspaths.Payload(tgt_image=self.premp_image,
699 src_image=fsi2_images[1],
703 gspaths.Payload(tgt_image=self.test_image,
707 gspaths.Payload(tgt_image=self.test_image,
708 src_image=self.test_image,
712 gspaths.Payload(tgt_image=self.test_image,
713 src_image=fsi1_test_image,
715 gspaths.Payload(tgt_image=self.test_image,
716 src_image=fsi2_test_image,
719 expected = zip(expected, itertools.repeat(False))
721 self.assertItemsEqual(sorted(results), sorted(expected))
723 def testDiscoverRequiredPayloadsNmoIsAlsoFsi(self):
724 """Test _DiscoverRequiredPayloads."""
726 paygen = self._GetPaygenBuildInstance()
728 output_uri = 'gs://foo'
730 self.mox.StubOutWithMock(paygen, '_DiscoverImages')
731 self.mox.StubOutWithMock(paygen, '_DiscoverTestImageArchives')
732 self.mox.StubOutWithMock(paygen, '_DiscoverNmoBuild')
733 self.mox.StubOutWithMock(paygen, '_DiscoverFsiBuilds')
734 self.mox.StubOutWithMock(paygen_payload_lib, 'DefaultPayloadUri')
736 nmo_build = gspaths.Build(bucket='crt',
737 channel='foo-channel',
740 fsi1_build = gspaths.Build(bucket='crt',
741 channel='foo-channel',
744 fsi2_build = gspaths.Build(bucket='crt',
745 channel='foo-channel',
749 nmo_images = self._GetBuildImages(nmo_build)
750 nmo_test_image = self._GetBuildTestImage(nmo_build)
751 fsi1_images = self._GetBuildImages(fsi1_build)
752 fsi1_test_image = self._GetBuildTestImage(fsi1_build)
754 paygen._DiscoverImages(paygen._build).AndReturn(self.images)
755 paygen._DiscoverTestImageArchives(paygen._build).AndReturn(
757 paygen._DiscoverNmoBuild().AndReturn([nmo_build])
758 paygen._DiscoverFsiBuilds().AndReturn([fsi1_build, fsi2_build])
759 paygen._DiscoverImages(nmo_build).AndReturn(nmo_images)
760 paygen._DiscoverTestImageArchives(nmo_build).AndReturn([nmo_test_image])
761 paygen._DiscoverImages(fsi1_build).AndReturn(fsi1_images)
762 paygen._DiscoverTestImageArchives(fsi1_build).AndReturn([fsi1_test_image])
764 # Simplify the output URIs, so it's easy to check them below.
765 paygen_payload_lib.DefaultPayloadUri(
766 mox.IsA(gspaths.Payload), None).MultipleTimes().AndReturn(output_uri)
768 # Run the test verification.
771 results = paygen._DiscoverRequiredPayloads()
773 expected = [gspaths.Payload(tgt_image=self.basic_image, uri=output_uri),
774 gspaths.Payload(tgt_image=self.npo_image, uri=output_uri),
775 gspaths.Payload(tgt_image=self.premp_image, uri=output_uri),
776 gspaths.Payload(tgt_image=self.premp_npo_image, uri=output_uri),
778 gspaths.Payload(tgt_image=self.npo_image,
779 src_image=self.basic_image,
781 gspaths.Payload(tgt_image=self.premp_npo_image,
782 src_image=self.premp_image,
785 gspaths.Payload(tgt_image=self.basic_image,
786 src_image=nmo_images[0],
788 gspaths.Payload(tgt_image=self.premp_image,
789 src_image=nmo_images[1],
792 gspaths.Payload(tgt_image=self.basic_image,
793 src_image=fsi1_images[0],
795 gspaths.Payload(tgt_image=self.premp_image,
796 src_image=fsi1_images[1],
800 gspaths.Payload(tgt_image=self.test_image,
804 gspaths.Payload(tgt_image=self.test_image,
805 src_image=self.test_image,
809 gspaths.Payload(tgt_image=self.test_image,
810 src_image=nmo_test_image,
814 gspaths.Payload(tgt_image=self.test_image,
815 src_image=fsi1_test_image,
818 expected = zip(expected, itertools.repeat(False))
820 self.assertItemsEqual(sorted(results), sorted(expected))
822 @osutils.TempDirDecorator
823 def DoGeneratePayloadsTest(self, run_parallel, test_dry_run):
824 """Test paygen_build_lib._GeneratePayloads."""
825 paygen = paygen_build_lib._PaygenBuild(self.foo_build, self.tempdir,
826 dry_run=test_dry_run,
827 run_parallel=run_parallel)
829 basic_payload = gspaths.Payload(tgt_image=self.npo_image,
830 src_image=self.basic_image)
831 premp_payload = gspaths.Payload(tgt_image=self.premp_npo_image,
832 src_image=self.premp_image)
834 self.mox.StubOutWithMock(parallel, 'RunTasksInProcessPool')
835 self.mox.StubOutWithMock(paygen_build_lib, '_GenerateSinglePayload')
837 expected_payload_args = [
838 (basic_payload, mox.IsA(str), True, test_dry_run),
839 (premp_payload, mox.IsA(str), True, test_dry_run)
843 parallel.RunTasksInProcessPool(paygen_build_lib._GenerateSinglePayload,
844 expected_payload_args)
846 paygen_build_lib._GenerateSinglePayload(basic_payload, mox.IsA(str),
849 paygen_build_lib._GenerateSinglePayload(premp_payload, mox.IsA(str),
852 # Run the test verification.
855 paygen._GeneratePayloads((basic_payload, premp_payload), lock=None)
857 self.mox.UnsetStubs()
859 def testGeneratePayloads(self):
860 """Test paygen_build_lib._GeneratePayloads, no dry_run."""
862 # Test every combination of the boolean arguments.
863 for run_parallel in (True, False):
864 for test_dry_run in (True, False):
865 self.DoGeneratePayloadsTest(run_parallel, test_dry_run)
867 @osutils.TempDirDecorator
868 def testGeneratePayloadInProcess(self):
869 """Make sure the _GenerateSinglePayload calls into paygen_payload_lib."""
871 basic_payload = gspaths.Payload(tgt_image=self.npo_image,
872 src_image=self.basic_image)
874 self.mox.StubOutWithMock(paygen_payload_lib, 'CreateAndUploadPayload')
876 # Verify that we actually generate the payload.
877 paygen_payload_lib.CreateAndUploadPayload(
879 mox.IsA(download_cache.DownloadCache),
880 work_dir=self.tempdir,
884 # Run the test verification.
887 paygen_build_lib._GenerateSinglePayload(basic_payload, self.tempdir,
888 sign=False, dry_run=True)
890 def testCleanupBuild(self):
891 """Test _PaygenBuild._CleanupBuild."""
892 paygen = self._GetPaygenBuildInstance()
894 self.mox.StubOutWithMock(gslib, 'Remove')
895 gslib.Remove('gs://crt/foo-channel/foo-board/1.2.3/payloads/signing',
896 recurse=True, ignore_no_match=True)
899 paygen._CleanupBuild()
901 def _CreatePayloadsSetup(self):
902 """Helper method for related CreatePayloads tests."""
903 paygen = self._GetPaygenBuildInstance()
905 self.mox.StubOutWithMock(gslock, 'Lock')
906 self.mox.StubOutWithMock(gslib, 'CreateWithContents')
907 self.mox.StubOutWithMock(gslib, 'Exists')
908 self.mox.StubOutWithMock(gslib, 'Remove')
909 self.mox.StubOutWithMock(paygen, '_DiscoverRequiredPayloads')
910 self.mox.StubOutWithMock(paygen, '_GeneratePayloads')
911 self.mox.StubOutWithMock(paygen, '_AutotestPayloads')
912 self.mox.StubOutWithMock(paygen, '_CreatePayloadTests')
913 self.mox.StubOutWithMock(paygen, '_CleanupBuild')
917 def testCreatePayloadsLockedBuild(self):
918 """Test paygen_build_lib._GeneratePayloads if the build is locked."""
919 paygen = self._CreatePayloadsSetup()
920 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
922 # Pylint is confused because of helper stubbing things out.
923 # pylint: disable-msg=E1101
924 gslock.Lock(lock_uri, dry_run=False).AndRaise(gslock.LockNotAcquired())
926 # Run the test verification.
929 with self.assertRaises(paygen_build_lib.BuildLocked):
930 paygen.CreatePayloads()
932 def testCreatePayloadsSkipBuild(self):
933 """Test paygen_build_lib._GeneratePayloads if the build marked skip."""
934 paygen = self._CreatePayloadsSetup()
935 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
936 skip_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP)
938 lock = self.mox.CreateMockAnything()
940 gslock.Lock(lock_uri, dry_run=False).AndReturn(lock)
941 lock.__enter__().AndReturn(lock)
942 gslib.Exists(skip_uri).AndReturn(True)
944 mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(None)
946 # Run the test verification.
949 with self.assertRaises(paygen_build_lib.BuildSkip):
950 paygen.CreatePayloads()
952 def testCreatePayloadsFinishedBuild(self):
953 """Test paygen_build_lib._GeneratePayloads if the build marked finished."""
954 paygen = self._CreatePayloadsSetup()
956 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
957 skip_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP)
958 finished_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.FINISHED)
960 lock = self.mox.CreateMockAnything()
962 gslock.Lock(lock_uri, dry_run=False).AndReturn(lock)
963 lock.__enter__().AndReturn(lock)
964 gslib.Exists(skip_uri).AndReturn(False)
965 gslib.Exists(finished_uri).AndReturn(True)
967 mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(None)
969 # Run the test verification.
972 with self.assertRaises(paygen_build_lib.BuildFinished):
973 paygen.CreatePayloads()
975 def testCreatePayloadsBuildNotReady(self):
976 """Test paygen_build_lib._GeneratePayloads if not all images are there."""
977 paygen = self._CreatePayloadsSetup()
979 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
980 skip_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP)
981 finished_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.FINISHED)
983 lock = self.mox.CreateMockAnything()
985 gslock.Lock(lock_uri, dry_run=False).AndReturn(lock)
986 lock.__enter__().AndReturn(lock)
987 gslib.Exists(skip_uri).AndReturn(False)
988 gslib.Exists(finished_uri).AndReturn(False)
989 # This method is being mocked out.
990 # pylint: disable=E1101
991 paygen._DiscoverRequiredPayloads(
992 ).AndRaise(paygen_build_lib.BuildNotReady())
994 mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(None)
996 # Run the test verification.
999 with self.assertRaises(paygen_build_lib.BuildNotReady):
1000 paygen.CreatePayloads()
1002 def testCreatePayloadsCreateFailed(self):
1003 """Test paygen_build_lib._GeneratePayloads if payload generation failed."""
1004 paygen = self._CreatePayloadsSetup()
1006 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
1007 skip_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP)
1008 finished_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.FINISHED)
1010 lock = self.mox.CreateMockAnything()
1012 payload_list = [payload]
1013 payload_skip_list = [(payload, False)]
1014 mock_exception = Exception()
1016 gslock.Lock(lock_uri, dry_run=False).AndReturn(lock)
1017 lock.__enter__().AndReturn(lock)
1018 gslib.Exists(skip_uri).AndReturn(False)
1019 gslib.Exists(finished_uri).AndReturn(False)
1020 paygen._DiscoverRequiredPayloads(
1021 ).AndReturn(payload_skip_list)
1022 self.mox.StubOutWithMock(paygen_payload_lib, 'FindExistingPayloads')
1023 paygen_payload_lib.FindExistingPayloads(payload).AndReturn([])
1024 paygen._GeneratePayloads(payload_list, lock).AndRaise(mock_exception)
1026 mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(None)
1028 # Run the test verification.
1029 self.mox.ReplayAll()
1031 with self.assertRaises(Exception):
1032 paygen.CreatePayloads()
1034 def testCreatePayloadsSuccess(self):
1035 """Test paygen_build_lib._GeneratePayloads success."""
1036 paygen = self._CreatePayloadsSetup()
1038 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
1039 skip_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP)
1040 finished_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.FINISHED)
1042 lock = self.mox.CreateMockAnything()
1044 payload_list = [payload]
1045 payload_skip_list = [(payload, False)]
1047 gslock.Lock(lock_uri, dry_run=False).AndReturn(lock)
1048 lock.__enter__().AndReturn(lock)
1049 gslib.Exists(skip_uri).AndReturn(False)
1050 gslib.Exists(finished_uri).AndReturn(False)
1051 paygen._DiscoverRequiredPayloads(
1052 ).AndReturn(payload_skip_list)
1053 self.mox.StubOutWithMock(paygen_payload_lib, 'FindExistingPayloads')
1054 paygen_payload_lib.FindExistingPayloads(payload).AndReturn([])
1055 paygen._GeneratePayloads(payload_list, lock)
1056 paygen._CleanupBuild()
1058 mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(None)
1060 # Run the test verification.
1061 self.mox.ReplayAll()
1063 paygen.CreatePayloads()
1065 def testCreatePayloadsAlreadyExists(self):
1066 """Test paygen_build_lib._GeneratePayloads success."""
1067 paygen = self._CreatePayloadsSetup()
1069 lock_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.LOCK)
1070 skip_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.SKIP)
1071 finished_uri = paygen._GetFlagURI(gspaths.ChromeosReleases.FINISHED)
1073 lock = self.mox.CreateMockAnything()
1074 self.mox.StubOutWithMock(paygen_payload_lib, 'FindExistingPayloads')
1075 self.mox.StubOutWithMock(paygen_payload_lib, 'SetPayloadUri')
1076 payload_existing = 'foo'
1078 payload_list = [(payload_existing, False), (payload_new, False)]
1080 gslock.Lock(lock_uri, dry_run=False).AndReturn(lock)
1081 lock.__enter__().AndReturn(lock)
1082 gslib.Exists(skip_uri).AndReturn(False)
1083 gslib.Exists(finished_uri).AndReturn(False)
1084 paygen._DiscoverRequiredPayloads(
1085 ).AndReturn(payload_list)
1086 paygen_payload_lib.FindExistingPayloads(payload_existing).AndReturn(
1088 paygen_payload_lib.FindExistingPayloads(payload_new).AndReturn([])
1089 paygen_payload_lib.SetPayloadUri(payload_existing, payload_existing)
1090 paygen._GeneratePayloads([payload_new], lock)
1091 paygen._CleanupBuild()
1093 mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(None)
1095 # Run the test verification.
1096 self.mox.ReplayAll()
1098 paygen.CreatePayloads()
1100 @osutils.TempDirDecorator
1101 def testFindControlFileDir(self):
1102 """Test that we find control files in the proper directory."""
1103 # Test default dir in /tmp.
1104 result = paygen_build_lib._FindControlFileDir(None)
1105 self.assertTrue(os.path.isdir(result))
1106 self.assertTrue(result.startswith('/tmp/paygen_build-control_files'))
1107 shutil.rmtree(result)
1109 # Test in specified dir.
1110 result = paygen_build_lib._FindControlFileDir(self.tempdir)
1111 self.assertTrue(os.path.isdir(result))
1112 self.assertTrue(result.startswith(
1113 os.path.join(self.tempdir, 'paygen_build-control_files')))
1115 @unittest.skipIf(not paygen_build_lib.config,
1116 'Internal crostools repository needed.')
1117 def testEmitControlFile(self):
1118 """Test that we emit control files correctly."""
1119 payload = gspaths.Payload(tgt_image=self.npo_image,
1120 src_image=self.basic_image)
1122 suite_name = 'paygen_foo'
1123 control_dir = tempfile.mkdtemp(prefix='control_dir-')
1124 paygen = paygen_build_lib._PaygenBuild(
1125 self.foo_build, self.tempdir, control_dir=control_dir)
1126 with tempfile.NamedTemporaryFile(prefix='control_file-', delete=False) as f:
1127 control_file_name = f.name
1129 AUTHOR = "Chromium OS"
1130 NAME = "autoupdate_EndToEndTest"
1132 TEST_CATEGORY = "Functional"
1133 TEST_CLASS = "platform"
1134 TEST_TYPE = "server"
1139 self.mox.StubOutWithMock(cbuildbot_config, 'FindFullConfigsForBoard')
1140 cbuildbot_config.FindFullConfigsForBoard().AndReturn(
1141 ([{'boards': ['foo_board']}], []))
1143 self.mox.StubOutWithMock(urilib, 'ListFiles')
1145 gspaths.ChromeosReleases.PayloadUri(
1146 self.basic_image.channel, self.basic_image.board,
1147 self.basic_image.version,
1148 '*', bucket=self.basic_image.bucket)).AndReturn(
1149 ['gs://foo/bar.tar.bz2'])
1151 gspaths.ChromeosImageArchive.BuildUri(
1152 'foo_board', '*', self.basic_image.version)).AndReturn(
1153 ['gs://foo-archive/src-build'])
1155 self.mox.StubOutWithMock(test_control, 'get_control_file_name')
1156 test_control.get_control_file_name().AndReturn(control_file_name)
1158 self.mox.ReplayAll()
1160 payload_test = paygen_build_lib._PaygenBuild.PayloadTest(payload)
1161 paygen._EmitControlFile(payload_test, suite_name, control_dir)
1163 shutil.rmtree(control_dir)
1164 os.remove(control_file_name)
1166 def testAutotestPayloads(self):
1167 """Test the process of scheduling HWLab tests."""
1168 control_dir = '/tmp/control_dir'
1169 paygen = paygen_build_lib._PaygenBuild(
1170 self.foo_build, self.tempdir, control_dir=control_dir)
1171 control_dump_dir = os.path.join(control_dir, paygen.CONTROL_FILE_SUBDIR)
1172 payloads = ['foo', 'bar']
1173 test_channel = self.foo_build.channel.rpartition('-')[0]
1174 suite_name = paygen.PAYGEN_AU_SUITE_TEMPLATE % test_channel
1175 tarball_name = paygen.CONTROL_TARBALL_TEMPLATE % test_channel
1176 tarball_path = os.path.join(control_dir, tarball_name)
1177 test_archive_build = '%s-release/R99-%s' % (self.foo_build.board,
1178 self.foo_build.version)
1179 test_archive_build_uri = ('gs://chromeos-image-archive/%s' %
1181 test_upload_path = os.path.join(test_archive_build_uri, tarball_name)
1183 self.mox.StubOutWithMock(os, 'makedirs')
1184 os.makedirs(os.path.join(control_dir, paygen.CONTROL_FILE_SUBDIR))
1186 self.mox.StubOutWithMock(paygen, '_EmitControlFile')
1187 paygen._EmitControlFile('foo', suite_name, control_dump_dir)
1188 paygen._EmitControlFile('bar', suite_name, control_dump_dir)
1190 self.mox.StubOutWithMock(cros_build_lib, 'CreateTarball')
1191 cros_build_lib.CreateTarball(
1192 tarball_path, control_dir,
1193 compression=cros_build_lib.COMP_BZIP2,
1194 inputs=[paygen.CONTROL_FILE_SUBDIR]).AndReturn(
1195 cros_build_lib.CommandResult(returncode=0))
1197 # Setup preliminary values needed for running autotests.
1198 paygen._archive_board = self.foo_build.board
1199 paygen._archive_build = test_archive_build
1200 paygen._archive_build_uri = test_archive_build_uri
1202 self.mox.StubOutWithMock(gslib, 'Copy')
1203 gslib.Copy(tarball_path, test_upload_path, acl='public-read')
1205 # TODO(garnold) remove the dryrun argument.
1206 self.mox.StubOutWithMock(utils, 'RunCommand')
1208 timeout_mins = cbuildbot_config.HWTestConfig.DEFAULT_HW_TEST_TIMEOUT / 60
1209 expected_command = [
1210 mox.StrContains('site_utils/run_suite.py'),
1211 '--board', 'foo-board',
1212 '--build', 'foo-board-release/R99-1.2.3',
1213 '--suite_name', 'paygen_au_foo',
1214 '--file_bugs', 'True',
1217 '--timeout_mins', str(timeout_mins),
1218 '--no_wait', 'False']
1220 utils.RunCommand(expected_command, error_ok=True, redirect_stdout=True,
1221 redirect_stderr=True, return_result=True).AndReturn(
1222 utils.CommandResult(returncode=0))
1224 self.mox.ReplayAll()
1226 paygen._AutotestPayloads(payloads)
1228 def testScheduleAutotestTestsNormal(self):
1229 """Test scheduling autotest tests with run_suite.py."""
1230 paygen = paygen_build_lib._PaygenBuild(
1231 self.foo_build, self.tempdir)
1233 self.mox.StubOutWithMock(paygen_build_lib.commands,
1235 self.mox.StubOutWithMock(paygen_build_lib.utils,
1238 timeout_mins = cbuildbot_config.HWTestConfig.DEFAULT_HW_TEST_TIMEOUT / 60
1239 expected_command = [
1240 mox.StrContains('site_utils/run_suite.py'),
1241 '--board', 'foo-board',
1242 '--build', 'foo-board-release/R99-1.2.3',
1243 '--suite_name', 'paygen_au_foo',
1244 '--file_bugs', 'True',
1247 '--timeout_mins', str(timeout_mins),
1248 '--no_wait', 'False']
1249 utils.RunCommand(expected_command, error_ok=True, redirect_stdout=True,
1250 redirect_stderr=True, return_result=True).AndReturn(
1251 utils.CommandResult(returncode=0))
1253 self.mox.ReplayAll()
1255 # Setup preliminary values needed for scheduling autotests.
1256 paygen._archive_board = 'foo-board'
1257 paygen._archive_build = 'foo-board-release/R99-1.2.3'
1259 paygen._ScheduleAutotestTests('paygen_au_foo')
1261 def testScheduleAutotestTestsBuilderEnvironment(self):
1262 """Test scheduling autotest tests with build autotest proxy."""
1263 paygen = paygen_build_lib._PaygenBuild(
1264 self.foo_build, self.tempdir, run_on_builder=True)
1266 self.mox.StubOutWithMock(paygen_build_lib.commands,
1268 self.mox.StubOutWithMock(paygen_build_lib.utils,
1271 timeout_mins = cbuildbot_config.HWTestConfig.DEFAULT_HW_TEST_TIMEOUT / 60
1272 paygen_build_lib.commands.RunHWTestSuite(
1273 board='foo-board', build='foo-board-release/R99-1.2.3', file_bugs=True,
1274 pool='bvt', suite='paygen_au_foo', timeout_mins=timeout_mins,
1275 retry=True, wait_for_results=True, debug=False)
1277 self.mox.ReplayAll()
1279 # Setup preliminary values needed for scheduling autotests.
1280 paygen._archive_board = 'foo-board'
1281 paygen._archive_build = 'foo-board-release/R99-1.2.3'
1283 paygen._ScheduleAutotestTests('paygen_au_foo')
1285 def testScheduleAutotestTestsBuilderEnvironmentWarn(self):
1286 """Test scheduling autotest tests with build autotest proxy."""
1287 paygen = paygen_build_lib._PaygenBuild(
1288 self.foo_build, self.tempdir, run_on_builder=True)
1290 self.mox.StubOutWithMock(paygen_build_lib.commands,
1292 self.mox.StubOutWithMock(paygen_build_lib.utils,
1295 timeout_mins = cbuildbot_config.HWTestConfig.DEFAULT_HW_TEST_TIMEOUT / 60
1296 paygen_build_lib.commands.RunHWTestSuite(
1297 board='foo-board', build='foo-board-release/R99-1.2.3', file_bugs=True,
1298 pool='bvt', suite='paygen_au_foo', timeout_mins=timeout_mins,
1299 retry=True, wait_for_results=True, debug=False).AndRaise(
1300 commands.TestWarning('** Suite passed with a warning code **'))
1302 self.mox.ReplayAll()
1304 # Setup preliminary values needed for scheduling autotests.
1305 paygen._archive_board = 'foo-board'
1306 paygen._archive_build = 'foo-board-release/R99-1.2.3'
1308 paygen._ScheduleAutotestTests('paygen_au_foo')
1310 def testMapToArchive(self):
1311 """Test that mapping to images archive names/locations works."""
1312 self.mox.StubOutWithMock(cbuildbot_config, 'FindFullConfigsForBoard')
1313 cbuildbot_config.FindFullConfigsForBoard().MultipleTimes().AndReturn(
1314 ([{'boards': ['foo_board', 'bar_board', 'bar-board']}], []))
1316 self.mox.StubOutWithMock(urilib, 'ListFiles')
1318 gspaths.ChromeosImageArchive.BuildUri(
1319 'foo_board', '*', '1.2.3')).AndReturn(
1320 ['gs://foo-archive/foo_board/R11-1.2.3/somefile'])
1322 self.mox.ReplayAll()
1324 # Case 1: mapping successful.
1326 paygen_build_lib._PaygenBuild._MapToArchive('foo-board', '1.2.3'),
1327 ('foo_board', 'foo_board/R11-1.2.3',
1328 'gs://foo-archive/foo_board/R11-1.2.3'))
1330 # Case 2: failure, too many build board names found.
1331 with self.assertRaises(paygen_build_lib.ArchiveError):
1332 paygen_build_lib._PaygenBuild._MapToArchive('bar-board', '1.2.3')
1334 # Case 3: failure, build board name not found.
1335 with self.assertRaises(paygen_build_lib.ArchiveError):
1336 paygen_build_lib._PaygenBuild._MapToArchive('baz-board', '1.2.3')
1338 def testValidateBoardConfig(self):
1339 """Test ValidateBoardConfig."""
1341 # If we are running on an external builder, we can't see the config.
1342 # Without the config, we can't validate.
1343 if not paygen_build_lib.config:
1346 # Test a known board works.
1347 paygen_build_lib.ValidateBoardConfig('x86-mario')
1349 # Test an unknown board doesn't.
1350 self.assertRaises(paygen_build_lib.BoardNotConfigured,
1351 paygen_build_lib.ValidateBoardConfig, 'goofy-board')
1354 if __name__ == '__main__':
1355 cros_test_lib.main()