2 # Copyright (c) 2012 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 """Test gspaths library."""
8 from __future__ import print_function
13 fixup_path.FixupPath()
15 from chromite.lib import cros_test_lib
16 from chromite.lib.paygen import gspaths
19 class GsPathsDataTest(mox.MoxTestBase):
20 """Tests for structs defined in GsPaths."""
25 default_input = { 'channel': 'foo-channel',
26 'board': 'board-name',
29 default_expected = { 'bucket': None,
30 'channel': 'foo-channel',
31 'board': 'board-name',
35 expected_str = ("Build definition (board='board-name',"
36 " version='1.2.3', channel='foo-channel')")
38 build = gspaths.Build(default_input)
39 self.assertEqual(build, default_expected)
41 self.assertEqual(expected_str, str(build))
44 class GsPathsChromeosReleasesTest(mox.MoxTestBase):
45 """Tests for gspaths.ChromeosReleases."""
46 # Standard Chrome OS releases names.
47 _CHROMEOS_RELEASES_BUCKET = 'chromeos-releases'
48 _AU_GENERATOR_FILE_NAME = 'au-generator.zip'
50 # Google Storage path, image and payload name base templates.
51 _GS_BUILD_PATH_TEMPLATE = 'gs://%(bucket)s/%(channel)s/%(board)s/%(version)s'
52 _IMAGE_NAME_TEMPLATE = (
53 'chromeos_%(image_version)s_%(board)s_recovery_%(image_channel)s_'
55 _UNSIGNED_IMAGE_ARCHIVE_NAME_TEMPLATE = (
56 'ChromeOS-%(image_type)s-%(milestone)s-%(image_version)s-'
58 _FULL_PAYLOAD_NAME_TEMPLATE = (
59 'chromeos_%(image_version)s_%(board)s_%(image_channel)s_full_%(key)s.bin-'
60 '%(random_str)s.signed')
61 _DELTA_PAYLOAD_NAME_TEMPLATE = (
62 'chromeos_%(src_version)s-%(image_version)s_%(board)s_%(image_channel)s_'
63 'delta_%(key)s.bin-%(random_str)s.signed')
64 _UNSIGNED_FULL_PAYLOAD_NAME_TEMPLATE = (
65 'chromeos_%(image_version)s_%(board)s_%(image_channel)s_full_'
66 '%(image_type)s.bin-%(random_str)s')
67 _UNSIGNED_DELTA_PAYLOAD_NAME_TEMPLATE = (
68 'chromeos_%(src_version)s-%(image_version)s_%(board)s_%(image_channel)s_'
69 'delta_%(image_type)s.bin-%(random_str)s')
72 _GS_IMAGE_PATH_TEMPLATE = '/'.join(
73 (_GS_BUILD_PATH_TEMPLATE, _IMAGE_NAME_TEMPLATE))
74 _GS_UNSIGNED_IMAGE_ARCHIVE_PATH_TEMPLATE = '/'.join(
75 (_GS_BUILD_PATH_TEMPLATE, _UNSIGNED_IMAGE_ARCHIVE_NAME_TEMPLATE))
76 _GS_PAYLOADS_PATH_TEMPLATE = '/'.join((_GS_BUILD_PATH_TEMPLATE, 'payloads'))
77 _GS_PAYLOADS_SIGNING_PATH_TEMPLATE = '/'.join((_GS_BUILD_PATH_TEMPLATE,
78 'payloads', 'signing'))
79 _GS_FULL_PAYLOAD_PATH_TEMPLATE = '/'.join(
80 (_GS_PAYLOADS_PATH_TEMPLATE, _FULL_PAYLOAD_NAME_TEMPLATE))
81 _GS_DELTA_PAYLOAD_PATH_TEMPLATE = '/'.join(
82 (_GS_PAYLOADS_PATH_TEMPLATE, _DELTA_PAYLOAD_NAME_TEMPLATE))
87 # Shared attributes (signed + unsigned images).
89 self.channel = 'foo-channel'
90 self.board = 'board-name'
91 self.version = '1.2.3'
93 # Signed image attributes.
96 # Unsigned (test) image attributes.
97 self.milestone = 'R12'
98 self.image_type = 'test'
100 # Attributes used for payload testing.
101 self.src_version = '1.1.1'
102 self.random_str = '1234567890'
104 # Dictionaries for populating templates.
105 self.image_attrs = dict(
107 channel=self.channel,
108 image_channel=self.channel,
110 version=self.version,
111 image_version=self.version,
113 self.unsigned_image_archive_attrs = dict(
115 channel=self.channel,
116 image_channel=self.channel,
118 version=self.version,
119 image_version=self.version,
120 milestone=self.milestone,
121 image_type=self.image_type)
122 self.all_attrs = dict(self.image_attrs,
123 src_version=self.src_version,
124 random_str=self.random_str,
125 **self.unsigned_image_archive_attrs)
128 self.mox.UnsetStubs()
130 def _Populate(self, template, **kwargs):
131 """Populates a template string with override attributes.
133 This will use the default test attributes to populate a given string
134 template. It will further override default field values with the values
135 provided by the optional named arguments.
138 template: a string with named substitution fields
139 kwargs: named attributes to override the defaults
142 attrs = dict(self.all_attrs, **kwargs)
143 return template % attrs
145 def _PopulateGsPath(self, base_path, suffix=None, **kwargs):
146 """Populates a Google Storage path template w/ optional suffix.
149 base_path: a path string template with named substitution fields
150 suffix: a path suffix to append to the given base path
151 kwargs: named attributes to override the defaults
156 template += '/' + suffix
158 return self._Populate(template, **kwargs)
160 def testBuildUri(self):
162 gspaths.ChromeosReleases.BuildUri(self.channel,
166 self._PopulateGsPath(self._GS_BUILD_PATH_TEMPLATE))
169 gspaths.ChromeosReleases.BuildUri(self.channel,
172 self._PopulateGsPath(self._GS_BUILD_PATH_TEMPLATE,
173 bucket=self._CHROMEOS_RELEASES_BUCKET))
175 def testGeneratorUri(self):
177 gspaths.ChromeosReleases.GeneratorUri(self.channel,
181 self._PopulateGsPath(self._GS_BUILD_PATH_TEMPLATE,
182 suffix=self._AU_GENERATOR_FILE_NAME))
185 gspaths.ChromeosReleases.GeneratorUri(self.channel,
188 self._PopulateGsPath(self._GS_BUILD_PATH_TEMPLATE,
189 suffix=self._AU_GENERATOR_FILE_NAME,
190 bucket=self._CHROMEOS_RELEASES_BUCKET))
192 def testBuildPayloadsUri(self):
194 gspaths.ChromeosReleases.BuildPayloadsUri(self.channel,
198 self._PopulateGsPath(self._GS_PAYLOADS_PATH_TEMPLATE))
201 gspaths.ChromeosReleases.BuildPayloadsUri(self.channel,
204 self._PopulateGsPath(self._GS_PAYLOADS_PATH_TEMPLATE,
205 bucket=self._CHROMEOS_RELEASES_BUCKET))
207 def testBuildPayloadsSigningUri(self):
209 gspaths.ChromeosReleases.BuildPayloadsSigningUri(self.channel,
213 self._PopulateGsPath(self._GS_PAYLOADS_SIGNING_PATH_TEMPLATE))
216 gspaths.ChromeosReleases.BuildPayloadsSigningUri(self.channel,
219 self._PopulateGsPath(self._GS_PAYLOADS_SIGNING_PATH_TEMPLATE,
220 bucket=self._CHROMEOS_RELEASES_BUCKET))
222 def testBuildPayloadsFlagUri(self):
224 gspaths.ChromeosReleases.BuildPayloadsFlagUri(
228 gspaths.ChromeosReleases.SKIP,
230 self._PopulateGsPath(self._GS_PAYLOADS_PATH_TEMPLATE,
234 gspaths.ChromeosReleases.BuildPayloadsFlagUri(
238 gspaths.ChromeosReleases.FINISHED,
240 self._PopulateGsPath(self._GS_PAYLOADS_PATH_TEMPLATE,
241 suffix='FINISHED_flag'))
244 gspaths.ChromeosReleases.BuildPayloadsFlagUri(
248 gspaths.ChromeosReleases.LOCK,
250 self._PopulateGsPath(self._GS_PAYLOADS_PATH_TEMPLATE,
255 gspaths.ChromeosReleases.BuildPayloadsFlagUri(
259 gspaths.ChromeosReleases.SKIP),
260 self._PopulateGsPath(self._GS_PAYLOADS_PATH_TEMPLATE,
262 bucket=self._CHROMEOS_RELEASES_BUCKET))
264 def testImageName(self):
266 gspaths.ChromeosReleases.ImageName(self.channel,
270 self._Populate(self._IMAGE_NAME_TEMPLATE))
272 def testUnsignedImageArchiveName(self):
274 gspaths.ChromeosReleases.UnsignedImageArchiveName(
279 self._Populate(self._UNSIGNED_IMAGE_ARCHIVE_NAME_TEMPLATE))
281 def testImageUri(self):
283 gspaths.ChromeosReleases.ImageUri(self.channel,
288 self._Populate(self._GS_IMAGE_PATH_TEMPLATE))
290 def testUnsignedImageArchiveUri(self):
292 gspaths.ChromeosReleases.UnsignedImageArchiveUri(
293 self.channel, self.board, self.version, self.milestone,
294 self.image_type, bucket=self.bucket),
295 self._Populate(self._GS_UNSIGNED_IMAGE_ARCHIVE_PATH_TEMPLATE))
298 def _IncrementVersion(version, inc_amount=1):
299 version_part = version.rpartition('.')
300 return '.'.join((version_part[0], str(int(version_part[2]) + inc_amount)))
302 def testParseImageUri(self):
303 npo_version = self._IncrementVersion(self.version)
304 npo_channel = 'nplusone-channel'
306 basic_dict = dict(self.image_attrs)
307 npo_dict = dict(self.image_attrs,
308 bucket=self._CHROMEOS_RELEASES_BUCKET,
309 image_version=npo_version,
310 image_channel=npo_channel)
311 basic_dict['uri'] = uri_basic = self._GS_IMAGE_PATH_TEMPLATE % basic_dict
312 npo_dict['uri'] = uri_npo = self._GS_IMAGE_PATH_TEMPLATE % npo_dict
314 expected_basic = gspaths.Image(bucket=self.bucket,
315 channel=self.channel,
317 version=self.version,
320 expected_basic_str = gspaths.ChromeosReleases.ImageName(
321 expected_basic.channel, expected_basic.board, expected_basic.version,
324 expected_npo = gspaths.Image(channel=self.channel,
326 version=self.version,
328 image_channel=npo_channel,
329 image_version=npo_version,
332 expected_npo_str = gspaths.ChromeosReleases.ImageName(
333 expected_npo.image_channel, expected_npo.board,
334 expected_npo.image_version, expected_npo.key)
336 basic_image = gspaths.ChromeosReleases.ParseImageUri(uri_basic)
337 self.assertEqual(basic_image, expected_basic)
338 self.assertEqual(str(basic_image), expected_basic_str)
340 npo_image = gspaths.ChromeosReleases.ParseImageUri(uri_npo)
341 self.assertEqual(npo_image, expected_npo)
342 self.assertEqual(str(npo_image), expected_npo_str)
344 signer_output = ('gs://chromeos-releases/dev-channel/link/4537.7.0/'
345 'chromeos_4537.7.1_link_recovery_nplusone-channel_'
346 'mp-v4.bin.1.payload.hash.update_signer.signed.bin')
348 bad_image = gspaths.ChromeosReleases.ParseImageUri(signer_output)
349 self.assertEqual(bad_image, None)
351 def testParseUnsignedImageArchiveUri(self):
352 attr_dict = dict(self.unsigned_image_archive_attrs)
353 attr_dict['uri'] = uri = (
354 self._GS_UNSIGNED_IMAGE_ARCHIVE_PATH_TEMPLATE % attr_dict)
356 expected = gspaths.UnsignedImageArchive(bucket=self.bucket,
357 channel=self.channel,
359 version=self.version,
360 milestone=self.milestone,
361 image_type=self.image_type,
363 expected_str = gspaths.ChromeosReleases.UnsignedImageArchiveName(
364 expected.board, expected.version, expected.milestone,
367 image = gspaths.ChromeosReleases.ParseUnsignedImageArchiveUri(uri)
368 self.assertEqual(image, expected)
369 self.assertEqual(str(image), expected_str)
371 def testPayloadNamePreset(self):
372 full = gspaths.ChromeosReleases.PayloadName(channel=self.channel,
374 version=self.version,
376 random_str=self.random_str)
378 delta = gspaths.ChromeosReleases.PayloadName(channel=self.channel,
380 version=self.version,
382 src_version=self.src_version,
383 random_str=self.random_str)
385 full_unsigned = gspaths.ChromeosReleases.PayloadName(
386 channel=self.channel,
388 version=self.version,
389 random_str=self.random_str,
390 unsigned_image_type=self.image_type)
392 delta_unsigned = gspaths.ChromeosReleases.PayloadName(
393 channel=self.channel,
395 version=self.version,
396 src_version=self.src_version,
397 random_str=self.random_str,
398 unsigned_image_type=self.image_type)
400 self.assertEqual(full, self._Populate(self._FULL_PAYLOAD_NAME_TEMPLATE))
401 self.assertEqual(delta, self._Populate(self._DELTA_PAYLOAD_NAME_TEMPLATE))
402 self.assertEqual(full_unsigned,
403 self._Populate(self._UNSIGNED_FULL_PAYLOAD_NAME_TEMPLATE))
404 self.assertEqual(delta_unsigned,
405 self._Populate(self._UNSIGNED_DELTA_PAYLOAD_NAME_TEMPLATE))
407 def testPayloadNameRandom(self):
408 full = gspaths.ChromeosReleases.PayloadName(channel=self.channel,
410 version=self.version,
413 delta = gspaths.ChromeosReleases.PayloadName(channel=self.channel,
415 version=self.version,
417 src_version=self.src_version)
419 # Isolate the actual random string, transplant it in the reference template.
420 full_random_str = full.split('-')[-1].partition('.')[0]
423 self._Populate(self._FULL_PAYLOAD_NAME_TEMPLATE,
424 random_str=full_random_str))
425 delta_random_str = delta.split('-')[-1].partition('.')[0]
428 self._Populate(self._DELTA_PAYLOAD_NAME_TEMPLATE,
429 random_str=delta_random_str))
431 def testPayloadUri(self):
432 test_random_channel = 'test_random_channel'
433 test_max_version = '4.5.6'
434 test_min_version = '0.12.1.0'
436 min_full = gspaths.ChromeosReleases.PayloadUri(
437 channel=self.channel,
439 version=self.version,
440 random_str=self.random_str,
445 self._Populate(self._GS_FULL_PAYLOAD_PATH_TEMPLATE,
446 bucket=self._CHROMEOS_RELEASES_BUCKET))
448 max_full = gspaths.ChromeosReleases.PayloadUri(
449 channel=self.channel,
451 version=self.version,
452 random_str=self.random_str,
454 image_channel=test_random_channel,
455 image_version=test_max_version,
460 self._Populate(self._GS_FULL_PAYLOAD_PATH_TEMPLATE,
461 image_channel=test_random_channel,
462 image_version=test_max_version))
464 min_delta = gspaths.ChromeosReleases.PayloadUri(
465 channel=self.channel,
467 version=self.version,
468 random_str=self.random_str,
470 src_version=test_min_version)
474 self._Populate(self._GS_DELTA_PAYLOAD_PATH_TEMPLATE,
475 bucket=self._CHROMEOS_RELEASES_BUCKET,
476 src_version=test_min_version))
478 max_delta = gspaths.ChromeosReleases.PayloadUri(
479 channel=self.channel,
481 version=self.version,
482 random_str=self.random_str,
484 image_channel=test_random_channel,
485 image_version=test_max_version,
486 src_version=test_min_version,
491 self._Populate(self._GS_DELTA_PAYLOAD_PATH_TEMPLATE,
492 src_version=test_min_version,
493 image_version=test_max_version,
494 image_channel=test_random_channel))
496 def testParsePayloadUri(self):
497 """Test gsutils.ChromeosReleases.ParsePayloadUri()."""
499 image_version = '1.2.4'
501 full_uri = self._Populate(self._GS_FULL_PAYLOAD_PATH_TEMPLATE,
502 bucket='chromeos-releases')
504 delta_uri = self._Populate(self._GS_DELTA_PAYLOAD_PATH_TEMPLATE,
505 bucket='chromeos-releases')
507 max_full_uri = self._Populate(self._GS_FULL_PAYLOAD_PATH_TEMPLATE,
508 image_channel='image-channel',
509 image_version=image_version)
511 max_delta_uri = self._Populate(self._GS_DELTA_PAYLOAD_PATH_TEMPLATE,
512 image_channel='image-channel',
513 image_version=image_version)
515 self.assertDictEqual(
516 gspaths.ChromeosReleases.ParsePayloadUri(full_uri),
518 'tgt_image': gspaths.Image(board=self.board,
519 channel=self.channel,
520 version=self.version,
526 self.assertDictEqual(
527 gspaths.ChromeosReleases.ParsePayloadUri(delta_uri),
529 'src_image': gspaths.Image(board=self.board,
530 channel=self.channel,
531 version=self.src_version),
532 'tgt_image': gspaths.Image(board=self.board,
533 channel=self.channel,
534 version=self.version,
539 self.assertDictEqual(
540 gspaths.ChromeosReleases.ParsePayloadUri(max_full_uri),
542 'tgt_image': gspaths.Image(bucket=self.bucket,
544 channel=self.channel,
545 version=self.version,
547 image_version=image_version,
548 image_channel='image-channel'),
553 self.assertDictEqual(
554 gspaths.ChromeosReleases.ParsePayloadUri(max_delta_uri),
556 'src_image': gspaths.Image(bucket=self.bucket,
558 channel=self.channel,
559 version=self.src_version),
560 'tgt_image': gspaths.Image(bucket=self.bucket,
562 channel=self.channel,
563 version=self.version,
565 image_version=image_version,
566 image_channel='image-channel'),
567 'uri': max_delta_uri,
571 class GsPathsTest(mox.MoxTestBase):
572 """Test general gspaths utilities."""
573 def testVersionKey(self):
574 """Test VersionKey, especially for new-style versus old-style."""
576 values = ['1.2.3', '1.2.2', '2.0.0', '1.1.4',
577 '1.2.3.4', '1.2.3.3', '1.2.4.4', '1.2.4.5', '1.3.3.4',
578 '0.1.2.3', '0.14.45.32']
580 sorted_values = sorted(values, key=gspaths.VersionKey)
581 reverse_sorted_values = sorted(reversed(values), key=gspaths.VersionKey)
583 expected_values = ['0.1.2.3', '0.14.45.32',
584 '1.2.3.3', '1.2.3.4', '1.2.4.4', '1.2.4.5', '1.3.3.4',
585 '1.1.4', '1.2.2', '1.2.3', '2.0.0',]
587 self.assertEquals(sorted_values, expected_values)
588 self.assertEquals(reverse_sorted_values, expected_values)
590 def testVersionGreater(self):
591 """Test VersionGreater, especially for new-style versus old-style."""
593 self.assertTrue(gspaths.VersionGreater('1.2.3', '1.2.2'))
594 self.assertTrue(gspaths.VersionGreater('1.2.3', '1.1.4'))
595 self.assertTrue(gspaths.VersionGreater('2.0.0', '1.2.3'))
597 self.assertFalse(gspaths.VersionGreater('1.2.3', '1.2.3'))
599 self.assertFalse(gspaths.VersionGreater('1.2.2', '1.2.3'))
600 self.assertFalse(gspaths.VersionGreater('1.1.4', '1.2.3'))
601 self.assertFalse(gspaths.VersionGreater('1.2.3', '2.0.0'))
603 self.assertTrue(gspaths.VersionGreater('1.2.3.4', '1.2.3.3'))
604 self.assertTrue(gspaths.VersionGreater('1.2.4.4', '1.2.3.4'))
605 self.assertTrue(gspaths.VersionGreater('1.3.3.4', '1.2.4.5'))
606 self.assertTrue(gspaths.VersionGreater('2.0.0.0', '1.2.3.4'))
608 self.assertFalse(gspaths.VersionGreater('1.2.3.4', '1.2.3.4'))
610 self.assertFalse(gspaths.VersionGreater('1.2.3.3', '1.2.3.4'))
611 self.assertFalse(gspaths.VersionGreater('1.2.3.4', '1.2.4.4'))
612 self.assertFalse(gspaths.VersionGreater('1.2.4.5', '1.3.3.4'))
613 self.assertFalse(gspaths.VersionGreater('1.2.3.4', '2.0.0.0'))
615 self.assertTrue(gspaths.VersionGreater('1.2.3', '1.2.3.4'))
616 self.assertTrue(gspaths.VersionGreater('1.2.3', '0.1.2.3'))
618 self.assertFalse(gspaths.VersionGreater('1.2.3.4', '1.2.3'))
619 self.assertFalse(gspaths.VersionGreater('0.1.2.3', '1.2.3'))
622 if __name__ == '__main__':