blob: d10e2d45a7a7b5dbe49dc4e518005ae6d02965a1 [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -06001# Copyright 2019 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Packages service tests."""
6
Madeleine Hardt8ae7f102022-03-24 20:26:11 +00007import io
Andrew Lamb2bde9e42019-11-04 13:24:09 -07008import json
9import os
Michael Mortensen009cb662019-10-21 11:38:43 -060010import re
Madeleine Hardt8ae7f102022-03-24 20:26:11 +000011from unittest import mock
Michael Mortensen009cb662019-10-21 11:38:43 -060012
Alex Kleinf69bd802021-06-22 15:43:49 -060013import pytest
14
Mike Frysinger2c024062021-05-22 15:43:22 -040015from chromite.third_party.google.protobuf import json_format
16from chromite.third_party.google.protobuf.field_mask_pb2 import FieldMask
Andrew Lamb2bde9e42019-11-04 13:24:09 -070017
Chris McDonaldea0312c2020-05-04 23:33:15 -060018import chromite as cr
Andrew Lamb2bde9e42019-11-04 13:24:09 -070019from chromite.api.gen.config.replication_config_pb2 import (
Alex Klein627e04c2021-11-10 15:56:47 -070020 ReplicationConfig, FileReplicationRule, FILE_TYPE_JSON,
21 REPLICATION_TYPE_FILTER)
Michael Mortensen009cb662019-10-21 11:38:43 -060022from chromite.cbuildbot import manifest_version
Alex Klein2960c752020-03-09 13:43:38 -060023from chromite.lib import build_target_lib
Andrew Lamb2bde9e42019-11-04 13:24:09 -070024from chromite.lib import constants
Michael Mortensene0f4b542019-10-24 15:30:23 -060025from chromite.lib import cros_build_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060026from chromite.lib import cros_test_lib
Alex Klein6becabc2020-09-11 14:03:05 -060027from chromite.lib import depgraph
28from chromite.lib import dependency_graph
Michael Mortensenb70e8a82019-10-10 18:43:41 -060029from chromite.lib import osutils
Mike Frysinger88d96362020-02-14 19:05:45 -050030from chromite.lib import partial_mock
Alex Klein87531182019-08-12 15:23:37 -060031from chromite.lib import portage_util
Chris McDonaldea0312c2020-05-04 23:33:15 -060032from chromite.lib import uprev_lib
Alex Klein87531182019-08-12 15:23:37 -060033from chromite.lib.chroot_lib import Chroot
Alex Klein18a60af2020-06-11 12:08:47 -060034from chromite.lib.parser import package_info
Andrew Lamb2bde9e42019-11-04 13:24:09 -070035from chromite.lib.uprev_lib import GitRef
Shao-Chuan Lee05e51142021-11-24 12:27:37 +090036from chromite.service import android
Alex Kleineb77ffa2019-05-28 14:47:44 -060037from chromite.service import packages
38
Andrew Lamb2bde9e42019-11-04 13:24:09 -070039D = cros_test_lib.Directory
40
Alex Kleineb77ffa2019-05-28 14:47:44 -060041
Alex Klein4de25e82019-08-05 15:58:39 -060042class UprevAndroidTest(cros_test_lib.RunCommandTestCase):
43 """Uprev android tests."""
44
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090045 def _mock_successful_uprev(self):
46 self.rc.AddCmdResult(partial_mock.In('cros_mark_android_as_stable'),
Shao-Chuan Leedea458f2021-11-25 23:46:53 +090047 stdout=('{"revved": true,'
48 ' "android_atom": "android/android-1.0",'
49 ' "modified_files": ["file1", "file2"]}'))
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090050
Alex Klein4de25e82019-08-05 15:58:39 -060051 def test_success(self):
52 """Test successful run handling."""
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090053 self._mock_successful_uprev()
Alex Klein2960c752020-03-09 13:43:38 -060054 build_targets = [build_target_lib.BuildTarget(t) for t in ['foo', 'bar']]
Alex Klein4de25e82019-08-05 15:58:39 -060055
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090056 result = packages.uprev_android(
Alex Klein627e04c2021-11-10 15:56:47 -070057 'android/package', Chroot(), build_targets=build_targets)
58 self.assertCommandContains([
59 'cros_mark_android_as_stable', '--android_package=android/package',
60 '--boards=foo:bar'
61 ])
Alex Klein4de25e82019-08-05 15:58:39 -060062 self.assertCommandContains(['emerge-foo'])
63 self.assertCommandContains(['emerge-bar'])
64
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090065 self.assertTrue(result.revved)
66 self.assertEqual(result.android_atom, 'android/android-1.0')
Shao-Chuan Lee05e51142021-11-24 12:27:37 +090067 self.assertListEqual(result.modified_files, ['file1', 'file2'])
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090068
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090069 def test_android_build_branch(self):
70 """Test specifying android_build_branch option."""
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090071 self._mock_successful_uprev()
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090072
Alex Klein627e04c2021-11-10 15:56:47 -070073 packages.uprev_android(
74 'android/package',
75 Chroot(),
76 android_build_branch='android-build-branch')
77 self.assertCommandContains([
78 'cros_mark_android_as_stable', '--android_package=android/package',
79 '--android_build_branch=android-build-branch'
80 ])
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090081
82 def test_android_version(self):
83 """Test specifying android_version option."""
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090084 self._mock_successful_uprev()
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090085
Alex Klein627e04c2021-11-10 15:56:47 -070086 packages.uprev_android(
87 'android/package', Chroot(), android_version='7123456')
88 self.assertCommandContains([
89 'cros_mark_android_as_stable', '--android_package=android/package',
90 '--force_version=7123456'
91 ])
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090092
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +090093 def test_skip_commit(self):
94 """Test specifying skip_commit option."""
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090095 self._mock_successful_uprev()
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +090096
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090097 packages.uprev_android('android/package', Chroot(), skip_commit=True)
Alex Klein627e04c2021-11-10 15:56:47 -070098 self.assertCommandContains([
99 'cros_mark_android_as_stable', '--android_package=android/package',
100 '--skip_commit'
101 ])
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900102
Alex Klein4de25e82019-08-05 15:58:39 -0600103 def test_no_uprev(self):
104 """Test no uprev handling."""
Shao-Chuan Leedea458f2021-11-25 23:46:53 +0900105 self.rc.AddCmdResult(partial_mock.In('cros_mark_android_as_stable'),
106 stdout='{"revved": false}')
Alex Klein2960c752020-03-09 13:43:38 -0600107 build_targets = [build_target_lib.BuildTarget(t) for t in ['foo', 'bar']]
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +0900108 result = packages.uprev_android(
Alex Klein627e04c2021-11-10 15:56:47 -0700109 'android/package', Chroot(), build_targets=build_targets)
Alex Klein4de25e82019-08-05 15:58:39 -0600110
Alex Klein627e04c2021-11-10 15:56:47 -0700111 self.assertCommandContains(
112 ['cros_mark_android_as_stable', '--boards=foo:bar'])
Alex Klein4de25e82019-08-05 15:58:39 -0600113 self.assertCommandContains(['emerge-foo'], expected=False)
114 self.assertCommandContains(['emerge-bar'], expected=False)
115
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +0900116 self.assertFalse(result.revved)
117
Shao-Chuan Leedea458f2021-11-25 23:46:53 +0900118 def test_ignore_junk_in_stdout(self):
119 """Test when stdout contains junk messages."""
120 self.rc.AddCmdResult(partial_mock.In('cros_mark_android_as_stable'),
121 stdout='foo\nbar\n{"revved": false}\n')
122 result = packages.uprev_android('android/package', Chroot())
123
124 self.assertFalse(result.revved)
125
Alex Klein4de25e82019-08-05 15:58:39 -0600126
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900127class UprevAndroidLKGBTest(cros_test_lib.MockTestCase):
128 """Tests for uprevving Android with LKGB."""
129
130 def test_registered_handlers(self):
131 """Test that each Android package has an uprev handler registered."""
132 mock_handler = self.PatchObject(packages, 'uprev_android_lkgb')
133
134 for android_package in constants.ANDROID_ALL_PACKAGES:
135 cpv = package_info.SplitCPV('chromeos-base/' + android_package,
136 strict=False)
137 build_targets = [build_target_lib.BuildTarget('foo')]
138 chroot = Chroot()
139
140 packages.uprev_versioned_package(cpv, build_targets, [], chroot)
141
142 mock_handler.assert_called_once_with(android_package, build_targets,
143 chroot)
144 mock_handler.reset_mock()
145
146 def test_success(self):
147 """Test a successful uprev."""
Shao-Chuan Lee0e787d22021-12-13 21:33:35 +0900148 self.PatchObject(android, 'OVERLAY_DIR', new='overlay-dir')
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900149 self.PatchObject(android, 'ReadLKGB', return_value='android-lkgb')
150 self.PatchObject(packages, 'uprev_android',
151 return_value=packages.UprevAndroidResult(
152 revved=True, android_atom='android-atom',
153 modified_files=['file1', 'file2']))
154
155 result = packages.uprev_android_lkgb('android-package', [], Chroot())
156
157 self.assertListEqual(result.modified,
158 [uprev_lib.UprevVersionedPackageModifications(
Shao-Chuan Lee62cfbc72021-11-30 14:15:07 +0900159 'android-lkgb',
Shao-Chuan Lee0e787d22021-12-13 21:33:35 +0900160 [os.path.join('overlay-dir', 'file1'),
161 os.path.join('overlay-dir', 'file2')])])
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900162
163 def test_no_rev(self):
164 """Test when nothing revved."""
165 self.PatchObject(android, 'ReadLKGB', return_value='android-lkgb')
166 self.PatchObject(packages, 'uprev_android',
167 return_value=packages.UprevAndroidResult(revved=False))
168
169 result = packages.uprev_android_lkgb('android-package', [], Chroot())
170
171 self.assertListEqual(result.modified, [])
172
173
Alex Kleineb77ffa2019-05-28 14:47:44 -0600174class UprevBuildTargetsTest(cros_test_lib.RunCommandTestCase):
175 """uprev_build_targets tests."""
176
177 def test_invalid_type_fails(self):
178 """Test invalid type fails."""
179 with self.assertRaises(AssertionError):
Alex Klein2960c752020-03-09 13:43:38 -0600180 packages.uprev_build_targets([build_target_lib.BuildTarget('foo')],
Alex Kleineb77ffa2019-05-28 14:47:44 -0600181 'invalid')
182
183 def test_none_type_fails(self):
184 """Test None type fails."""
185 with self.assertRaises(AssertionError):
Alex Klein627e04c2021-11-10 15:56:47 -0700186 packages.uprev_build_targets([build_target_lib.BuildTarget('foo')], None)
Alex Kleineb77ffa2019-05-28 14:47:44 -0600187
188
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000189class PatchEbuildVarsTest(cros_test_lib.MockTestCase):
190 """patch_ebuild_vars test."""
191 def setUp(self):
192 self.mock_input = self.PatchObject(packages.fileinput, 'input')
193 self.mock_stdout_write = self.PatchObject(packages.sys.stdout, 'write')
194 self.ebuild_path = '/path/to/ebuild'
195 self.old_var_value = 'R100-5678.0.123456789'
196 self.new_var_value = 'R102-5678.0.234566789'
197
198 def test_patch_ebuild_vars_var_only(self):
199 """patch_ebuild_vars changes ^var=value$."""
200 ebuild_contents = (
201 'This line does not change.\n'
202 'AFDO_PROFILE_VERSION="{var_value}"\n'
203 '\n'
204 '# The line with AFDO_PROFILE_VERSION is also unchanged.'
205 )
206 # Ebuild contains old_var_value.
207 self.mock_input.return_value = io.StringIO(
208 ebuild_contents.format(var_value=self.old_var_value))
209 expected_calls = []
210 # Expect the line with new_var_value.
211 for line in io.StringIO(ebuild_contents.format(
212 var_value=self.new_var_value)):
213 expected_calls.append(mock.call(line))
214
215 packages.patch_ebuild_vars(self.ebuild_path,
216 {'AFDO_PROFILE_VERSION': self.new_var_value})
217
218 self.mock_stdout_write.assert_has_calls(expected_calls)
219
220 def test_patch_ebuild_vars_ignore_export(self):
221 """patch_ebuild_vars changes ^export var=value$ and keeps export."""
222 ebuild_contents = (
223 'This line does not change.\n'
224 'export AFDO_PROFILE_VERSION="{var_value}"\n'
225 '# This line is also unchanged.'
226 )
227 # Ebuild contains old_var_value.
228 self.mock_input.return_value = io.StringIO(
229 ebuild_contents.format(var_value=self.old_var_value))
230 expected_calls = []
231 # Expect the line with new_var_value.
232 for line in io.StringIO(ebuild_contents.format(
233 var_value=self.new_var_value)):
234 expected_calls.append(mock.call(line))
235
236 packages.patch_ebuild_vars(self.ebuild_path,
237 {'AFDO_PROFILE_VERSION': self.new_var_value})
238
239 self.mock_stdout_write.assert_has_calls(expected_calls)
240
241 def test_patch_ebuild_vars_partial_match(self):
242 """patch_ebuild_vars ignores ^{prefix}var=value$."""
243 ebuild_contents = (
244 'This and the line below do not change.\n'
245 'NEW_AFDO="{var_value}"'
246 )
247 # Ebuild contains old_var_value.
248 self.mock_input.return_value = io.StringIO(
249 ebuild_contents.format(var_value=self.old_var_value))
250 expected_calls = []
251 # Expect the line with UNCHANGED old_var_value.
252 for line in io.StringIO(ebuild_contents.format(
253 var_value=self.old_var_value)):
254 expected_calls.append(mock.call(line))
255
256 # Note that the var name partially matches the ebuild var and hence it has
257 # to be ignored.
258 packages.patch_ebuild_vars(self.ebuild_path,
259 {'AFDO': self.new_var_value})
260
261 self.mock_stdout_write.assert_has_calls(expected_calls)
262
263 def test_patch_ebuild_vars_no_vars(self):
264 """patch_ebuild_vars keeps ebuild intact if there are no vars."""
265 ebuild_contents = (
266 'This line does not change.\n'
267 'The line with AFDO_PROFILE_VERSION is also unchanged.'
268 )
269 self.mock_input.return_value = io.StringIO(ebuild_contents)
270 expected_calls = []
271 for line in io.StringIO(ebuild_contents):
272 expected_calls.append(mock.call(line))
273
274 packages.patch_ebuild_vars(self.ebuild_path,
275 {'AFDO_PROFILE_VERSION': self.new_var_value})
276
277 self.mock_stdout_write.assert_has_calls(expected_calls)
278
279
Alex Klein87531182019-08-12 15:23:37 -0600280class UprevsVersionedPackageTest(cros_test_lib.MockTestCase):
281 """uprevs_versioned_package decorator test."""
282
283 @packages.uprevs_versioned_package('category/package')
284 def uprev_category_package(self, *args, **kwargs):
285 """Registered function for testing."""
286
287 def test_calls_function(self):
288 """Test calling a registered function."""
Chris McDonaldea0312c2020-05-04 23:33:15 -0600289 self.PatchObject(self, 'uprev_category_package')
Alex Klein87531182019-08-12 15:23:37 -0600290
Alex Klein18a60af2020-06-11 12:08:47 -0600291 cpv = package_info.SplitCPV('category/package', strict=False)
Alex Klein87531182019-08-12 15:23:37 -0600292 packages.uprev_versioned_package(cpv, [], [], Chroot())
293
Chris McDonald3c689d32020-03-26 17:20:23 -0600294 # TODO(crbug/1065172): Invalid assertion that had previously been mocked.
295 # patch.assert_called()
Alex Klein87531182019-08-12 15:23:37 -0600296
297 def test_unregistered_package(self):
298 """Test calling with an unregistered package."""
Alex Klein18a60af2020-06-11 12:08:47 -0600299 cpv = package_info.SplitCPV('does-not/exist', strict=False)
Alex Klein87531182019-08-12 15:23:37 -0600300
301 with self.assertRaises(packages.UnknownPackageError):
302 packages.uprev_versioned_package(cpv, [], [], Chroot())
303
304
Trent Begin6daa8702020-01-29 14:58:12 -0700305class UprevEbuildFromPinTest(cros_test_lib.RunCommandTempDirTestCase):
Trent Begin315d9d92019-12-03 21:55:53 -0700306 """Tests uprev_ebuild_from_pin function"""
307
308 package = 'category/package'
309 version = '1.2.3'
310 new_version = '1.2.4'
311 ebuild_template = 'package-%s-r1.ebuild'
312 ebuild = ebuild_template % version
Fergus Dall2209d0b2020-08-06 11:51:43 +1000313 unstable_ebuild = 'package-9999.ebuild'
Trent Begin6daa8702020-01-29 14:58:12 -0700314 manifest = 'Manifest'
Trent Begin315d9d92019-12-03 21:55:53 -0700315
316 def test_uprev_ebuild(self):
317 """Tests uprev of ebuild with version path"""
Alex Klein627e04c2021-11-10 15:56:47 -0700318 file_layout = (D(self.package,
319 [self.ebuild, self.unstable_ebuild, self.manifest]),)
Trent Begin315d9d92019-12-03 21:55:53 -0700320 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
321
322 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700323
Fergus Dall2209d0b2020-08-06 11:51:43 +1000324 ebuild_path = os.path.join(package_path, self.ebuild)
325 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
326
Chris McDonald38409112020-09-24 11:24:51 -0600327 result = uprev_lib.uprev_ebuild_from_pin(
328 package_path, self.new_version, chroot=Chroot())
Alex Klein627e04c2021-11-10 15:56:47 -0700329 self.assertEqual(
330 len(result.modified), 1,
331 'unexpected number of results: %s' % len(result.modified))
Trent Begin315d9d92019-12-03 21:55:53 -0700332
333 mod = result.modified[0]
Fergus Dall2209d0b2020-08-06 11:51:43 +1000334 self.assertEqual(mod.new_version, self.new_version + '-r1',
Trent Begin315d9d92019-12-03 21:55:53 -0700335 'unexpected version number: %s' % mod.new_version)
Trent Begin315d9d92019-12-03 21:55:53 -0700336
David Burger15d104b2020-01-21 21:03:13 -0700337 old_ebuild_path = os.path.join(package_path,
338 self.ebuild_template % self.version)
Trent Begin315d9d92019-12-03 21:55:53 -0700339 new_ebuild_path = os.path.join(package_path,
340 self.ebuild_template % self.new_version)
Trent Begin4a11a632020-02-28 12:59:58 -0700341 manifest_path = os.path.join(package_path, 'Manifest')
Trent Begin2e5344f2020-03-02 10:46:55 -0700342
343 expected_modified_files = [old_ebuild_path, new_ebuild_path, manifest_path]
344 self.assertCountEqual(mod.files, expected_modified_files)
Trent Begin4a11a632020-02-28 12:59:58 -0700345
Trent Beginec16cf32020-02-24 11:26:02 -0700346 self.assertCommandContains(['ebuild', 'manifest'])
Trent Begin6daa8702020-01-29 14:58:12 -0700347
Fergus Dall2209d0b2020-08-06 11:51:43 +1000348 def test_uprev_ebuild_same_version(self):
349 """Tests uprev of ebuild with version path when the version has not changed.
350
351 This should result in bumping the revision number.
352 """
Alex Klein627e04c2021-11-10 15:56:47 -0700353 file_layout = (D(self.package,
354 [self.ebuild, self.unstable_ebuild, self.manifest]),)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000355 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
356
357 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000358
359 ebuild_path = os.path.join(package_path, self.ebuild)
360 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
361
Chris McDonald38409112020-09-24 11:24:51 -0600362 result = uprev_lib.uprev_ebuild_from_pin(
363 package_path, self.version, chroot=Chroot())
Alex Klein627e04c2021-11-10 15:56:47 -0700364 self.assertEqual(
365 len(result.modified), 1,
366 'unexpected number of results: %s' % len(result.modified))
Fergus Dall2209d0b2020-08-06 11:51:43 +1000367
368 mod = result.modified[0]
369 self.assertEqual(mod.new_version, self.version + '-r2',
370 'unexpected version number: %s' % mod.new_version)
371
372 old_ebuild_path = os.path.join(package_path,
373 self.ebuild_template % self.version)
374 new_ebuild_path = os.path.join(package_path,
375 'package-%s-r2.ebuild' % self.version)
376 manifest_path = os.path.join(package_path, 'Manifest')
377
378 expected_modified_files = [old_ebuild_path, new_ebuild_path, manifest_path]
379 self.assertCountEqual(mod.files, expected_modified_files)
380
381 self.assertCommandContains(['ebuild', 'manifest'])
382
Trent Begin315d9d92019-12-03 21:55:53 -0700383 def test_no_ebuild(self):
384 """Tests assertion is raised if package has no ebuilds"""
Alex Klein627e04c2021-11-10 15:56:47 -0700385 file_layout = (D(self.package, [self.manifest]),)
Trent Begin315d9d92019-12-03 21:55:53 -0700386 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
387
388 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700389
Chris McDonald38409112020-09-24 11:24:51 -0600390 with self.assertRaises(uprev_lib.EbuildUprevError):
391 uprev_lib.uprev_ebuild_from_pin(
392 package_path, self.new_version, chroot=Chroot())
Trent Begin315d9d92019-12-03 21:55:53 -0700393
Fergus Dall2209d0b2020-08-06 11:51:43 +1000394 def test_multiple_stable_ebuilds(self):
395 """Tests assertion is raised if multiple stable ebuilds are present"""
Alex Klein627e04c2021-11-10 15:56:47 -0700396 file_layout = (D(
397 self.package,
398 [self.ebuild, self.ebuild_template % '1.2.1', self.manifest]),)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000399 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
400
401 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000402
403 ebuild_path = os.path.join(package_path, self.ebuild)
404 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
405
406 ebuild_path = os.path.join(package_path, self.ebuild_template % '1.2.1')
407 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
408
Chris McDonald38409112020-09-24 11:24:51 -0600409 with self.assertRaises(uprev_lib.EbuildUprevError):
410 uprev_lib.uprev_ebuild_from_pin(
411 package_path, self.new_version, chroot=Chroot())
Fergus Dall2209d0b2020-08-06 11:51:43 +1000412
413 def test_multiple_unstable_ebuilds(self):
414 """Tests assertion is raised if multiple unstable ebuilds are present"""
Alex Klein627e04c2021-11-10 15:56:47 -0700415 file_layout = (D(
416 self.package,
417 [self.ebuild, self.ebuild_template % '1.2.1', self.manifest]),)
Trent Begin315d9d92019-12-03 21:55:53 -0700418 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
419
420 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700421
Chris McDonald38409112020-09-24 11:24:51 -0600422 with self.assertRaises(uprev_lib.EbuildUprevError):
423 uprev_lib.uprev_ebuild_from_pin(
424 package_path, self.new_version, chroot=Chroot())
Trent Begin315d9d92019-12-03 21:55:53 -0700425
426
Andrew Lamb9563a152019-12-04 11:42:18 -0700427class ReplicatePrivateConfigTest(cros_test_lib.RunCommandTempDirTestCase):
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700428 """replicate_private_config tests."""
429
430 def setUp(self):
431 # Set up fake public and private chromeos-config overlays.
432 private_package_root = (
Andrew Lambe836f222019-12-09 12:27:38 -0700433 'src/private-overlays/overlay-coral-private/chromeos-base/'
Alex Klein627e04c2021-11-10 15:56:47 -0700434 'chromeos-config-bsp')
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700435 self.public_package_root = (
Andrew Lambea9a8a22019-12-12 14:03:43 -0700436 'src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp')
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700437 file_layout = (
438 D(os.path.join(private_package_root, 'files'), ['build_config.json']),
439 D(private_package_root, ['replication_config.jsonpb']),
440 D(
441 os.path.join(self.public_package_root, 'files'),
442 ['build_config.json']),
443 )
444
445 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
446
447 # Private config contains 'a' and 'b' fields.
Andrew Lamb9563a152019-12-04 11:42:18 -0700448 self.private_config_path = os.path.join(private_package_root, 'files',
449 'build_config.json')
Andrew Lambca1f35b2019-12-04 09:37:11 -0700450 self.WriteTempFile(
Andrew Lamb9563a152019-12-04 11:42:18 -0700451 self.private_config_path,
Andrew Lambca1f35b2019-12-04 09:37:11 -0700452 json.dumps({'chromeos': {
453 'configs': [{
454 'a': 3,
455 'b': 2
456 }]
457 }}))
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700458
459 # Public config only contains the 'a' field. Note that the value of 'a' is
460 # 1 in the public config; it will get updated to 3 when the private config
461 # is replicated.
Andrew Lambca1f35b2019-12-04 09:37:11 -0700462 self.public_config_path = os.path.join(self.public_package_root, 'files',
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700463 'build_config.json')
Andrew Lambca1f35b2019-12-04 09:37:11 -0700464 self.WriteTempFile(self.public_config_path,
465 json.dumps({'chromeos': {
466 'configs': [{
467 'a': 1
468 }]
469 }}))
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700470
471 # Put a ReplicationConfig JSONPB in the private package. Note that it
472 # specifies only the 'a' field is replicated.
473 self.replication_config_path = os.path.join(self.tempdir,
474 private_package_root,
475 'replication_config.jsonpb')
476 replication_config = ReplicationConfig(file_replication_rules=[
477 FileReplicationRule(
Andrew Lamb9563a152019-12-04 11:42:18 -0700478 source_path=self.private_config_path,
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700479 destination_path=self.public_config_path,
480 file_type=FILE_TYPE_JSON,
481 replication_type=REPLICATION_TYPE_FILTER,
482 destination_fields=FieldMask(paths=['a']))
483 ])
484
485 osutils.WriteFile(self.replication_config_path,
486 json_format.MessageToJson(replication_config))
487 self.PatchObject(constants, 'SOURCE_ROOT', new=self.tempdir)
488
Andrew Lamb9563a152019-12-04 11:42:18 -0700489 self.rc.SetDefaultCmdResult(side_effect=self._write_generated_c_files)
490
491 def _write_generated_c_files(self, *_args, **_kwargs):
492 """Write fake generated C files to the public output dir.
493
494 Note that this function accepts args and kwargs so it can be used as a side
495 effect.
496 """
497 output_dir = os.path.join(self.public_package_root, 'files')
498 self.WriteTempFile(os.path.join(output_dir, 'config.c'), '')
499 self.WriteTempFile(os.path.join(output_dir, 'ec_config.c'), '')
500 self.WriteTempFile(os.path.join(output_dir, 'ec_config.h'), '')
501
502 def _write_incorrect_generated_c_files(self, *_args, **_kwargs):
503 """Similar to _write_generated_c_files, with an expected file missing.
504
505 Note that this function accepts args and kwargs so it can be used as a side
506 effect.
507 """
508 output_dir = os.path.join(self.public_package_root, 'files')
509 self.WriteTempFile(os.path.join(output_dir, 'config.c'), '')
510 self.WriteTempFile(os.path.join(output_dir, 'ec_config.c'), '')
511
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700512 def test_replicate_private_config(self):
513 """Basic replication test."""
Andrew Lambe836f222019-12-09 12:27:38 -0700514 refs = [
515 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700516 path='/chromeos/overlays/overlay-coral-private',
Alex Klein53834be2020-12-28 11:29:58 -0700517 ref='main',
Andrew Lambe836f222019-12-09 12:27:38 -0700518 revision='123')
519 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700520 chroot = Chroot()
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700521 result = packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700522 _build_targets=None, refs=refs, chroot=chroot)
Andrew Lamb9563a152019-12-04 11:42:18 -0700523
524 self.assertCommandContains([
525 'cros_config_schema', '-m',
526 os.path.join(constants.CHROOT_SOURCE_ROOT, self.public_config_path),
527 '-g',
528 os.path.join(constants.CHROOT_SOURCE_ROOT, self.public_package_root,
529 'files'), '-f', '"TRUE"'
530 ],
531 enter_chroot=True,
532 chroot_args=chroot.get_enter_args())
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700533
534 self.assertEqual(len(result.modified), 1)
Andrew Lamb9563a152019-12-04 11:42:18 -0700535 # The public build_config.json and generated C files were modified.
536 expected_modified_files = [
Andrew Lamb988f4da2019-12-10 10:16:43 -0700537 os.path.join(self.tempdir, self.public_config_path),
538 os.path.join(self.tempdir, self.public_package_root, 'files',
539 'config.c'),
540 os.path.join(self.tempdir, self.public_package_root, 'files',
541 'ec_config.c'),
542 os.path.join(self.tempdir, self.public_package_root, 'files',
543 'ec_config.h'),
Andrew Lamb9563a152019-12-04 11:42:18 -0700544 ]
545 self.assertEqual(result.modified[0].files, expected_modified_files)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700546 self.assertEqual(result.modified[0].new_version, '123')
547
548 # The update from the private build_config.json was copied to the public.
549 # Note that only the 'a' field is present, as per destination_fields.
Andrew Lambca1f35b2019-12-04 09:37:11 -0700550 self.assertEqual(
551 json.loads(self.ReadTempFile(self.public_config_path)),
552 {'chromeos': {
553 'configs': [{
554 'a': 3
555 }]
556 }})
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700557
Andrew Lamb9563a152019-12-04 11:42:18 -0700558 def test_replicate_private_config_no_build_config(self):
559 """If there is no build config, don't generate C files."""
560 # Modify the replication config to write to "other_config.json" instead of
561 # "build_config.json"
562 modified_destination_path = self.public_config_path.replace(
563 'build_config', 'other_config')
564 replication_config = ReplicationConfig(file_replication_rules=[
565 FileReplicationRule(
566 source_path=self.private_config_path,
567 destination_path=modified_destination_path,
568 file_type=FILE_TYPE_JSON,
569 replication_type=REPLICATION_TYPE_FILTER,
570 destination_fields=FieldMask(paths=['a']))
571 ])
572 osutils.WriteFile(self.replication_config_path,
573 json_format.MessageToJson(replication_config))
574
Andrew Lambe836f222019-12-09 12:27:38 -0700575 refs = [
576 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700577 path='/chromeos/overlays/overlay-coral-private',
Alex Klein53834be2020-12-28 11:29:58 -0700578 ref='main',
Andrew Lambe836f222019-12-09 12:27:38 -0700579 revision='123')
580 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700581 result = packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700582 _build_targets=None, refs=refs, chroot=Chroot())
Andrew Lamb9563a152019-12-04 11:42:18 -0700583
584 self.assertEqual(len(result.modified), 1)
Andrew Lamb988f4da2019-12-10 10:16:43 -0700585 self.assertEqual(result.modified[0].files,
586 [os.path.join(self.tempdir, modified_destination_path)])
Andrew Lamb9563a152019-12-04 11:42:18 -0700587
588 def test_replicate_private_config_multiple_build_configs(self):
589 """An error is thrown if there is more than one build config."""
590 replication_config = ReplicationConfig(file_replication_rules=[
591 FileReplicationRule(
592 source_path=self.private_config_path,
593 destination_path=self.public_config_path,
594 file_type=FILE_TYPE_JSON,
595 replication_type=REPLICATION_TYPE_FILTER,
596 destination_fields=FieldMask(paths=['a'])),
597 FileReplicationRule(
598 source_path=self.private_config_path,
599 destination_path=self.public_config_path,
600 file_type=FILE_TYPE_JSON,
601 replication_type=REPLICATION_TYPE_FILTER,
602 destination_fields=FieldMask(paths=['a']))
603 ])
604
605 osutils.WriteFile(self.replication_config_path,
606 json_format.MessageToJson(replication_config))
607
Andrew Lambe836f222019-12-09 12:27:38 -0700608 refs = [
609 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700610 path='/chromeos/overlays/overlay-coral-private',
Alex Klein53834be2020-12-28 11:29:58 -0700611 ref='main',
Andrew Lambe836f222019-12-09 12:27:38 -0700612 revision='123')
613 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700614 with self.assertRaisesRegex(
615 ValueError, 'Expected at most one build_config.json destination path.'):
616 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700617 _build_targets=None, refs=refs, chroot=Chroot())
Andrew Lamb9563a152019-12-04 11:42:18 -0700618
619 def test_replicate_private_config_generated_files_incorrect(self):
620 """An error is thrown if generated C files are missing."""
621 self.rc.SetDefaultCmdResult(
622 side_effect=self._write_incorrect_generated_c_files)
623
Andrew Lambe836f222019-12-09 12:27:38 -0700624 refs = [
625 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700626 path='/chromeos/overlays/overlay-coral-private',
Alex Klein53834be2020-12-28 11:29:58 -0700627 ref='main',
Andrew Lambe836f222019-12-09 12:27:38 -0700628 revision='123')
629 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700630 chroot = Chroot()
631
632 with self.assertRaisesRegex(packages.GeneratedCrosConfigFilesError,
633 'Expected to find generated C files'):
634 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700635 _build_targets=None, refs=refs, chroot=chroot)
Andrew Lamb9563a152019-12-04 11:42:18 -0700636
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700637 def test_replicate_private_config_wrong_number_of_refs(self):
638 """An error is thrown if there is not exactly one ref."""
639 with self.assertRaisesRegex(ValueError, 'Expected exactly one ref'):
640 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700641 _build_targets=None, refs=[], chroot=None)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700642
643 with self.assertRaisesRegex(ValueError, 'Expected exactly one ref'):
644 refs = [
Alex Klein53834be2020-12-28 11:29:58 -0700645 GitRef(path='a', ref='main', revision='1'),
646 GitRef(path='a', ref='main', revision='2')
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700647 ]
648 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700649 _build_targets=None, refs=refs, chroot=None)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700650
651 def test_replicate_private_config_replication_config_missing(self):
652 """An error is thrown if there is not a replication config."""
653 os.remove(self.replication_config_path)
654 with self.assertRaisesRegex(
655 ValueError, 'Expected ReplicationConfig missing at %s' %
656 self.replication_config_path):
657 refs = [
Andrew Lambe836f222019-12-09 12:27:38 -0700658 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700659 path='/chromeos/overlays/overlay-coral-private',
Alex Klein53834be2020-12-28 11:29:58 -0700660 ref='main',
Andrew Lambe836f222019-12-09 12:27:38 -0700661 revision='123')
662 ]
663 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700664 _build_targets=None, refs=refs, chroot=None)
Andrew Lambe836f222019-12-09 12:27:38 -0700665
666 def test_replicate_private_config_wrong_git_ref_path(self):
667 """An error is thrown if the git ref doesn't point to a private overlay."""
668 with self.assertRaisesRegex(ValueError, 'ref.path must match the pattern'):
Alex Klein627e04c2021-11-10 15:56:47 -0700669 refs = [GitRef(path='a/b/c', ref='main', revision='123')]
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700670 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700671 _build_targets=None, refs=refs, chroot=None)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700672
673
Alex Klein5caab872021-09-10 11:44:37 -0600674class GetBestVisibleTest(cros_test_lib.MockTestCase):
David Burger1e0fe232019-07-01 14:52:07 -0600675 """get_best_visible tests."""
676
677 def test_empty_atom_fails(self):
Alex Klein5caab872021-09-10 11:44:37 -0600678 """Test empty atom raises an error."""
David Burger1e0fe232019-07-01 14:52:07 -0600679 with self.assertRaises(AssertionError):
680 packages.get_best_visible('')
Alex Kleinda39c6d2019-09-16 14:36:36 -0600681
682
Alex Klein149fd3b2019-12-16 16:01:05 -0700683class HasPrebuiltTest(cros_test_lib.MockTestCase):
Alex Kleinda39c6d2019-09-16 14:36:36 -0600684 """has_prebuilt tests."""
685
686 def test_empty_atom_fails(self):
Alex Klein149fd3b2019-12-16 16:01:05 -0700687 """Test an empty atom results in an error."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600688 with self.assertRaises(AssertionError):
689 packages.has_prebuilt('')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600690
Alex Klein149fd3b2019-12-16 16:01:05 -0700691 def test_use_flags(self):
692 """Test use flags get propagated correctly."""
693 # We don't really care about the result, just the env handling.
694 patch = self.PatchObject(portage_util, 'HasPrebuilt', return_value=True)
LaMont Jonesa6162cf2020-06-05 18:05:42 -0600695 # Ignore any flags that may be in the environment.
696 self.PatchObject(os.environ, 'get', return_value='')
Alex Klein149fd3b2019-12-16 16:01:05 -0700697
698 packages.has_prebuilt('cat/pkg-1.2.3', useflags='useflag')
Alex Klein627e04c2021-11-10 15:56:47 -0700699 patch.assert_called_with(
700 'cat/pkg-1.2.3', board=None, extra_env={'USE': 'useflag'})
Alex Klein149fd3b2019-12-16 16:01:05 -0700701
702 def test_env_use_flags(self):
703 """Test env use flags get propagated correctly with passed useflags."""
704 # We don't really care about the result, just the env handling.
705 patch = self.PatchObject(portage_util, 'HasPrebuilt', return_value=True)
706 # Add some flags to the environment.
707 existing_flags = 'already set flags'
708 self.PatchObject(os.environ, 'get', return_value=existing_flags)
709
710 new_flags = 'useflag'
711 packages.has_prebuilt('cat/pkg-1.2.3', useflags=new_flags)
712 expected = '%s %s' % (existing_flags, new_flags)
Alex Klein627e04c2021-11-10 15:56:47 -0700713 patch.assert_called_with(
714 'cat/pkg-1.2.3', board=None, extra_env={'USE': expected})
Alex Klein149fd3b2019-12-16 16:01:05 -0700715
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600716
717class AndroidVersionsTest(cros_test_lib.MockTestCase):
718 """Tests getting android versions."""
Michael Mortensen14960d02019-10-18 07:53:59 -0600719
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600720 def setUp(self):
721 package_result = [
722 'chromeos-base/android-container-nyc-4717008-r1',
Alex Klein627e04c2021-11-10 15:56:47 -0700723 'chromeos-base/update_engine-0.0.3-r3408'
724 ]
725 self.PatchObject(
726 portage_util, 'GetPackageDependencies', return_value=package_result)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600727 self.board = 'board'
Alex Klein627e04c2021-11-10 15:56:47 -0700728 self.PatchObject(
729 portage_util,
730 'FindEbuildForBoardPackage',
731 return_value='chromeos-base/android-container-nyc')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600732 FakeEnvironment = {
Federico 'Morg' Pareschicd9165a2020-05-29 09:45:55 +0900733 'ARM_TARGET': '3-linux-target',
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600734 }
Alex Klein627e04c2021-11-10 15:56:47 -0700735 self.PatchObject(osutils, 'SourceEnvironment', return_value=FakeEnvironment)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600736
Alex Klein68a28712021-11-08 11:08:30 -0700737 # Clear the LRU cache for the function. We mock the function that provides
738 # the data this function processes to produce its result, so we need to
739 # clear it manually.
740 packages.determine_android_package.cache_clear()
741
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600742 def test_determine_android_version(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600743 """Tests that a valid android version is returned."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600744 version = packages.determine_android_version(self.board)
745 self.assertEqual(version, '4717008')
746
Michael Mortensenedf76532019-10-16 14:22:37 -0600747 def test_determine_android_version_when_not_present(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600748 """Tests that a None is returned for version when android is not present."""
Michael Mortensenedf76532019-10-16 14:22:37 -0600749 package_result = ['chromeos-base/update_engine-0.0.3-r3408']
Alex Klein627e04c2021-11-10 15:56:47 -0700750 self.PatchObject(
751 portage_util, 'GetPackageDependencies', return_value=package_result)
Michael Mortensenedf76532019-10-16 14:22:37 -0600752 version = packages.determine_android_version(self.board)
753 self.assertEqual(version, None)
754
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600755 def test_determine_android_branch(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600756 """Tests that a valid android branch is returned."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600757 branch = packages.determine_android_branch(self.board)
758 self.assertEqual(branch, '3')
759
Federico 'Morg' Pareschicd9165a2020-05-29 09:45:55 +0900760 def test_determine_android_branch_64bit_targets(self):
761 """Tests that a valid android branch is returned with only 64bit targets."""
Alex Klein627e04c2021-11-10 15:56:47 -0700762 self.PatchObject(
763 osutils,
764 'SourceEnvironment',
765 return_value={'ARM64_TARGET': '3-linux-target'})
Federico 'Morg' Pareschicd9165a2020-05-29 09:45:55 +0900766 branch = packages.determine_android_branch(self.board)
767 self.assertEqual(branch, '3')
768
Michael Mortensenedf76532019-10-16 14:22:37 -0600769 def test_determine_android_branch_when_not_present(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600770 """Tests that a None is returned for branch when android is not present."""
Michael Mortensenedf76532019-10-16 14:22:37 -0600771 package_result = ['chromeos-base/update_engine-0.0.3-r3408']
Alex Klein627e04c2021-11-10 15:56:47 -0700772 self.PatchObject(
773 portage_util, 'GetPackageDependencies', return_value=package_result)
Michael Mortensenedf76532019-10-16 14:22:37 -0600774 branch = packages.determine_android_branch(self.board)
775 self.assertEqual(branch, None)
776
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600777 def test_determine_android_target(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600778 """Tests that a valid android target is returned."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600779 target = packages.determine_android_target(self.board)
780 self.assertEqual(target, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600781
Michael Mortensenedf76532019-10-16 14:22:37 -0600782 def test_determine_android_target_when_not_present(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600783 """Tests that a None is returned for target when android is not present."""
Michael Mortensenedf76532019-10-16 14:22:37 -0600784 package_result = ['chromeos-base/update_engine-0.0.3-r3408']
Alex Klein627e04c2021-11-10 15:56:47 -0700785 self.PatchObject(
786 portage_util, 'GetPackageDependencies', return_value=package_result)
Michael Mortensenedf76532019-10-16 14:22:37 -0600787 target = packages.determine_android_target(self.board)
788 self.assertEqual(target, None)
789
Michael Mortensene0f4b542019-10-24 15:30:23 -0600790 def test_determine_android_version_handle_exception(self):
791 """Tests handling RunCommandError inside determine_android_version."""
792 # Mock what happens when portage returns that bubbles up (via RunCommand)
793 # inside portage_util.GetPackageDependencies.
Alex Klein627e04c2021-11-10 15:56:47 -0700794 self.PatchObject(
795 portage_util,
796 'GetPackageDependencies',
797 side_effect=cros_build_lib.RunCommandError('error'))
Michael Mortensene0f4b542019-10-24 15:30:23 -0600798 target = packages.determine_android_version(self.board)
799 self.assertEqual(target, None)
800
801 def test_determine_android_package_handle_exception(self):
802 """Tests handling RunCommandError inside determine_android_package."""
803 # Mock what happens when portage returns that bubbles up (via RunCommand)
804 # inside portage_util.GetPackageDependencies.
Alex Klein627e04c2021-11-10 15:56:47 -0700805 self.PatchObject(
806 portage_util,
807 'GetPackageDependencies',
808 side_effect=cros_build_lib.RunCommandError('error'))
Michael Mortensene0f4b542019-10-24 15:30:23 -0600809 target = packages.determine_android_package(self.board)
810 self.assertEqual(target, None)
811
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600812 def test_determine_android_package_callers_handle_exception(self):
813 """Tests handling RunCommandError by determine_android_package callers."""
814 # Mock what happens when portage returns that bubbles up (via RunCommand)
815 # inside portage_util.GetPackageDependencies.
Alex Klein627e04c2021-11-10 15:56:47 -0700816 self.PatchObject(
817 portage_util,
818 'GetPackageDependencies',
819 side_effect=cros_build_lib.RunCommandError('error'))
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600820 # Verify that target is None, as expected.
821 target = packages.determine_android_package(self.board)
822 self.assertEqual(target, None)
823 # determine_android_branch calls determine_android_package
824 branch = packages.determine_android_branch(self.board)
825 self.assertEqual(branch, None)
826 # determine_android_target calls determine_android_package
827 target = packages.determine_android_target(self.board)
828 self.assertEqual(target, None)
829
Michael Mortensene0f4b542019-10-24 15:30:23 -0600830
Michael Mortensende716a12020-05-15 11:27:00 -0600831@pytest.mark.usefixtures('testcase_caplog', 'testcase_monkeypatch')
832class FindFingerprintsTest(cros_test_lib.RunCommandTempDirTestCase):
833 """Tests for find_fingerprints."""
834
835 def setUp(self):
836 self.board = 'test-board'
837 # Create cheets-fingerprints.txt based on tempdir/src...
Alex Klein627e04c2021-11-10 15:56:47 -0700838 self.fingerprint_contents = ('google/test-board/test-board_cheets'
839 ':9/R99-12345.0.9999/123456:user/release-keys')
Michael Mortensende716a12020-05-15 11:27:00 -0600840 fingerprint_path = os.path.join(
841 self.tempdir,
842 'src/build/images/test-board/latest/cheets-fingerprint.txt')
843 self.chroot = Chroot(self.tempdir)
Alex Klein627e04c2021-11-10 15:56:47 -0700844 osutils.WriteFile(
845 fingerprint_path, self.fingerprint_contents, makedirs=True)
Michael Mortensende716a12020-05-15 11:27:00 -0600846
847 def test_find_fingerprints_with_test_path(self):
848 """Tests get_firmware_versions with mocked output."""
849 self.monkeypatch.setattr(constants, 'SOURCE_ROOT', self.tempdir)
850 build_target = build_target_lib.BuildTarget(self.board)
851 result = packages.find_fingerprints(build_target)
852 self.assertEqual(result, [self.fingerprint_contents])
853 self.assertIn('Reading fingerprint file', self.caplog.text)
854
855 def test_find_fingerprints(self):
856 """Tests get_firmware_versions with mocked output."""
857 # Use board name whose path for fingerprint file does not exist.
858 # Verify that fingerprint file is not found and None is returned.
859 build_target = build_target_lib.BuildTarget('wrong-boardname')
860 self.monkeypatch.setattr(constants, 'SOURCE_ROOT', self.tempdir)
861 result = packages.find_fingerprints(build_target)
Michael Mortensend81d81e2020-06-09 14:20:59 -0600862 self.assertEqual(result, [])
Michael Mortensende716a12020-05-15 11:27:00 -0600863 self.assertIn('Fingerprint file not found', self.caplog.text)
864
865
Michael Mortensen59e30872020-05-18 14:12:49 -0600866class GetAllFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
867 """Tests for get_firmware_versions."""
868
869 def setUp(self):
870 self.board = 'test-board'
871 self.rc.SetDefaultCmdResult(output="""
872
873flashrom(8): 68935ee2fcfcffa47af81b966269cd2b */build/reef/usr/sbin/flashrom
874 ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e102cc98d45300b50088999d53775acbeff407dc, stripped
875 0.9.9 : bbb2d6a : Jul 28 2017 15:12:34 UTC
876
877Model: reef
878BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
879BIOS version: Google_Reef.9042.87.1
880BIOS (RW) image: 0ef265eb8f2d228c09f75b011adbdcbb */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.binrw
881BIOS (RW) version: Google_Reef.9042.110.0
882EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
883EC version: reef_v1.1.5900-ab1ee51
884EC (RW) version: reef_v1.1.5909-bd1f0c9
885
886Model: pyro
887BIOS image: 9e62447ebf22a724a4a835018ab6234e */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/image.bin
888BIOS version: Google_Pyro.9042.87.1
889BIOS (RW) image: 1897457303c85de99f3e98b2eaa0eccc */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/image.binrw
890BIOS (RW) version: Google_Pyro.9042.110.0
891EC image: 44b93ed591733519e752e05aa0529eb5 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/ec.bin
892EC version: pyro_v1.1.5900-ab1ee51
893EC (RW) version: pyro_v1.1.5909-bd1f0c9
894
895Model: snappy
896BIOS image: 3ab63ff080596bd7de4e7619f003bb64 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/image.bin
897BIOS version: Google_Snappy.9042.110.0
898EC image: c4db159e84428391d2ee25368c5fe5b6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/ec.bin
899EC version: snappy_v1.1.5909-bd1f0c9
900
901Model: sand
902BIOS image: 387da034a4f0a3f53e278ebfdcc2a412 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/image.bin
903BIOS version: Google_Sand.9042.110.0
904EC image: 411562e0589dacec131f5fdfbe95a561 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/ec.bin
905EC version: sand_v1.1.5909-bd1f0c9
906
907Model: electro
908BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
909BIOS version: Google_Reef.9042.87.1
910BIOS (RW) image: 0ef265eb8f2d228c09f75b011adbdcbb */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.binrw
911BIOS (RW) version: Google_Reef.9042.110.0
912EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
913EC version: reef_v1.1.5900-ab1ee51
914EC (RW) version: reef_v1.1.5909-bd1f0c9
915
916Package Content:
917612e7bb6ed1fb0a05abf2ebdc834c18b *./updater4.sh
9180eafbee07282315829d0f42135ec7c0c *./gbb_utility
9196074e3ca424cb30a67c378c1d9681f9c *./mosys
92068935ee2fcfcffa47af81b966269cd2b *./flashrom
9210eafbee07282315829d0f42135ec7c0c *./dump_fmap
922490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
92360899148600b8673ddb711faa55aee40 *./common.sh
9243c3a99346d1ca1273cbcd86c104851ff *./shflags
925de7ce035e1f82a89f8909d888ee402c0 *./crosutil.sh
926f9334372bdb9036ba09a6fd9bf30e7a2 *./crossystem
92722257a8d5f0adc1f50a1916c3a4a35dd *./models/reef/ec.bin
928faf12dbb7cdaf21ce153bdffb67841fd *./models/reef/bios.bin
929c9bbb417b7921b85a7ed999ee42f550e *./models/reef/setvars.sh
93029823d46f1ec1491ecacd7b830fd2686 *./models/pyro/ec.bin
9312320463aba8b22eb5ea836f094d281b3 *./models/pyro/bios.bin
93281614833ad77c9cd093360ba7bea76b8 *./models/pyro/setvars.sh
933411562e0589dacec131f5fdfbe95a561 *./models/sand/ec.bin
934387da034a4f0a3f53e278ebfdcc2a412 *./models/sand/bios.bin
935fcd8cb0ac0e2ed6be220aaae435d43ff *./models/sand/setvars.sh
936c4db159e84428391d2ee25368c5fe5b6 *./models/snappy/ec.bin
9373ab63ff080596bd7de4e7619f003bb64 *./models/snappy/bios.bin
938fe5d699f2e9e4a7de031497953313dbd *./models/snappy/setvars.sh
93979aabd7cd8a215a54234c53d7bb2e6fb *./vpd
940""")
941
942 def test_get_firmware_versions(self):
943 """Tests get_firmware_versions with mocked output."""
944 build_target = build_target_lib.BuildTarget(self.board)
945 result = packages.get_all_firmware_versions(build_target)
946 self.assertEqual(len(result), 5)
947 self.assertEqual(
948 result['reef'],
Alex Klein627e04c2021-11-10 15:56:47 -0700949 packages.FirmwareVersions('reef', 'Google_Reef.9042.87.1',
950 'Google_Reef.9042.110.0',
951 'reef_v1.1.5900-ab1ee51',
952 'reef_v1.1.5909-bd1f0c9'))
Michael Mortensen59e30872020-05-18 14:12:49 -0600953 self.assertEqual(
954 result['pyro'],
Alex Klein627e04c2021-11-10 15:56:47 -0700955 packages.FirmwareVersions('pyro', 'Google_Pyro.9042.87.1',
956 'Google_Pyro.9042.110.0',
957 'pyro_v1.1.5900-ab1ee51',
958 'pyro_v1.1.5909-bd1f0c9'))
Michael Mortensen59e30872020-05-18 14:12:49 -0600959 self.assertEqual(
960 result['snappy'],
Alex Klein627e04c2021-11-10 15:56:47 -0700961 packages.FirmwareVersions('snappy', 'Google_Snappy.9042.110.0', None,
962 'snappy_v1.1.5909-bd1f0c9', None))
Michael Mortensen59e30872020-05-18 14:12:49 -0600963 self.assertEqual(
964 result['sand'],
Alex Klein627e04c2021-11-10 15:56:47 -0700965 packages.FirmwareVersions('sand', 'Google_Sand.9042.110.0', None,
966 'sand_v1.1.5909-bd1f0c9', None))
Michael Mortensen59e30872020-05-18 14:12:49 -0600967 self.assertEqual(
968 result['electro'],
Alex Klein627e04c2021-11-10 15:56:47 -0700969 packages.FirmwareVersions('electro', 'Google_Reef.9042.87.1',
970 'Google_Reef.9042.110.0',
971 'reef_v1.1.5900-ab1ee51',
972 'reef_v1.1.5909-bd1f0c9'))
Michael Mortensen59e30872020-05-18 14:12:49 -0600973
Benjamin Shai12c767e2022-01-12 15:17:44 +0000974 def test_get_firmware_versions_error(self):
975 """Tests get_firmware_versions with no output."""
976 # Throw an exception when running the command.
977 self.PatchObject(
978 cros_build_lib,
979 'run',
980 side_effect=cros_build_lib.RunCommandError('error'))
981 build_target = build_target_lib.BuildTarget(self.board)
982 result = packages.get_all_firmware_versions(build_target)
983 self.assertEqual(result, {})
984
Michael Mortensen59e30872020-05-18 14:12:49 -0600985
Michael Mortensen71ef5682020-05-07 14:29:24 -0600986class GetFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
987 """Tests for get_firmware_versions."""
988
989 def setUp(self):
990 self.board = 'test-board'
991 self.rc.SetDefaultCmdResult(output="""
992
993flashrom(8): a8f99c2e61e7dc09c4b25ef5a76ef692 */build/kevin/usr/sbin/flashrom
994 ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.d
995 0.9.4 : 860875a : Apr 10 2017 23:54:29 UTC
996
997BIOS image: 6b5b855a0b8fd1657546d1402c15b206 *chromeos-firmware-kevin-0.0.1/.dist/kevin_fw_8785.178.0.n
998BIOS version: Google_Kevin.8785.178.0
999EC image: 1ebfa9518e6cac0558a80b7ab2f5b489 *chromeos-firmware-kevin-0.0.1/.dist/kevin_ec_8785.178.0.n
1000EC version:kevin_v1.10.184-459421c
1001
1002Package Content:
1003a8f99c2e61e7dc09c4b25ef5a76ef692 *./flashrom
10043c3a99346d1ca1273cbcd86c104851ff *./shflags
1005457a8dc8546764affc9700f8da328d23 *./dump_fmap
1006c392980ddb542639edf44a965a59361a *./updater5.sh
1007490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
10086b5b855a0b8fd1657546d1402c15b206 *./bios.bin
10097b5bef0d2da90c23ff2e157250edf0fa *./crosutil.sh
1010d78722e4f1a0dc2d8c3d6b0bc7010ae3 *./crossystem
1011457a8dc8546764affc9700f8da328d23 *./gbb_utility
10121ebfa9518e6cac0558a80b7ab2f5b489 *./ec.bin
1013c98ca54db130886142ad582a58e90ddc *./common.sh
10145ba978bdec0f696f47f0f0de90936880 *./mosys
1015312e8ee6122057f2a246d7bcf1572f49 *./vpd
1016""")
1017
1018 def test_get_firmware_versions(self):
1019 """Tests get_firmware_versions with mocked output."""
1020 build_target = build_target_lib.BuildTarget(self.board)
1021 result = packages.get_firmware_versions(build_target)
Alex Klein627e04c2021-11-10 15:56:47 -07001022 versions = packages.FirmwareVersions(None, 'Google_Kevin.8785.178.0', None,
1023 'kevin_v1.10.184-459421c', None)
Michael Mortensen71ef5682020-05-07 14:29:24 -06001024 self.assertEqual(result, versions)
1025
1026
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001027class DetermineKernelVersionTest(cros_test_lib.RunCommandTempDirTestCase):
1028 """Tests for determine_kernel_version."""
1029
1030 def setUp(self):
1031 self.board = 'test-board'
1032 self.build_target = build_target_lib.BuildTarget(self.board)
1033
1034 def test_determine_kernel_version(self):
1035 """Tests that a valid kernel version is returned."""
Alex Klein627e04c2021-11-10 15:56:47 -07001036 package_result = [
1037 'sys-kernel/linux-headers-4.14-r24', 'sys-devel/flex-2.6.4-r1',
1038 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209'
1039 ]
1040 self.PatchObject(
1041 portage_util, 'GetPackageDependencies', return_value=package_result)
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001042
1043 result = packages.determine_kernel_version(self.build_target)
1044 self.assertEqual(result, '4.4.223-r2209')
1045
1046 def test_determine_kernel_version_exception(self):
1047 """Tests that portage_util exceptions result in returning None."""
Alex Klein627e04c2021-11-10 15:56:47 -07001048 self.PatchObject(
1049 portage_util,
1050 'GetPackageDependencies',
1051 side_effect=cros_build_lib.RunCommandError('error'))
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001052 result = packages.determine_kernel_version(self.build_target)
1053 self.assertEqual(result, None)
1054
Alex Klein627e04c2021-11-10 15:56:47 -07001055
Michael Mortensenc2615b72019-10-15 08:12:24 -06001056class ChromeVersionsTest(cros_test_lib.MockTestCase):
1057 """Tests getting chrome version."""
Michael Mortensen14960d02019-10-18 07:53:59 -06001058
Michael Mortensenc2615b72019-10-15 08:12:24 -06001059 def setUp(self):
Alex Klein2960c752020-03-09 13:43:38 -06001060 self.build_target = build_target_lib.BuildTarget('board')
Michael Mortensenc2615b72019-10-15 08:12:24 -06001061
1062 def test_determine_chrome_version(self):
Michael Mortensen14960d02019-10-18 07:53:59 -06001063 """Tests that a valid chrome version is returned."""
Michael Mortensenc2615b72019-10-15 08:12:24 -06001064 # Mock PortageqBestVisible to return a valid chrome version string.
1065 r1_cpf = 'chromeos-base/chromeos-chrome-78.0.3900.0_rc-r1'
Alex Klein18a60af2020-06-11 12:08:47 -06001066 r1_cpv = package_info.SplitCPV(r1_cpf)
Alex Klein627e04c2021-11-10 15:56:47 -07001067 self.PatchObject(portage_util, 'PortageqBestVisible', return_value=r1_cpv)
Michael Mortensenc2615b72019-10-15 08:12:24 -06001068
Michael Mortensenb51a1f02019-10-16 13:28:20 -06001069 chrome_version = packages.determine_chrome_version(self.build_target)
Michael Mortensenc2615b72019-10-15 08:12:24 -06001070 version_numbers = chrome_version.split('.')
1071 self.assertEqual(len(version_numbers), 4)
1072 self.assertEqual(int(version_numbers[0]), 78)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001073
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001074 def test_determine_chrome_version_handle_exception(self):
1075 # Mock what happens when portage throws an exception that bubbles up (via
1076 # RunCommand)inside portage_util.PortageqBestVisible.
Alex Klein627e04c2021-11-10 15:56:47 -07001077 self.PatchObject(
1078 portage_util,
1079 'PortageqBestVisible',
1080 side_effect=cros_build_lib.RunCommandError('error'))
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001081 target = packages.determine_chrome_version(self.build_target)
1082 self.assertEqual(target, None)
1083
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001084
1085class PlatformVersionsTest(cros_test_lib.MockTestCase):
1086 """Tests getting platform version."""
1087
1088 def test_determine_platform_version(self):
1089 """Test checking that a valid platform version is returned."""
1090 platform_version = packages.determine_platform_version()
1091 # The returned platform version is something like 12603.0.0.
1092 version_string_list = platform_version.split('.')
1093 self.assertEqual(len(version_string_list), 3)
1094 # We don't want to check an exact version, but the first number should be
1095 # non-zero.
1096 self.assertGreaterEqual(int(version_string_list[0]), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001097
1098 def test_determine_milestone_version(self):
1099 """Test checking that a valid milestone version is returned."""
1100 milestone_version = packages.determine_milestone_version()
1101 # Milestone version should be non-zero
1102 self.assertGreaterEqual(int(milestone_version), 1)
1103
1104 def test_determine_full_version(self):
1105 """Test checking that a valid full version is returned."""
1106 full_version = packages.determine_full_version()
1107 pattern = r'^R(\d+)-(\d+.\d+.\d+(-rc\d+)*)'
1108 m = re.match(pattern, full_version)
1109 self.assertTrue(m)
1110 milestone_version = m.group(1)
1111 self.assertGreaterEqual(int(milestone_version), 1)
1112
1113 def test_versions_based_on_mock(self):
1114 # Create a test version_info object, and than mock VersionInfo.from_repo
1115 # return it.
1116 test_platform_version = '12575.0.0'
1117 test_chrome_branch = '75'
1118 version_info_mock = manifest_version.VersionInfo(test_platform_version)
1119 version_info_mock.chrome_branch = test_chrome_branch
Alex Klein627e04c2021-11-10 15:56:47 -07001120 self.PatchObject(
1121 manifest_version.VersionInfo,
1122 'from_repo',
1123 return_value=version_info_mock)
Michael Mortensen009cb662019-10-21 11:38:43 -06001124 test_full_version = 'R' + test_chrome_branch + '-' + test_platform_version
1125 platform_version = packages.determine_platform_version()
1126 milestone_version = packages.determine_milestone_version()
1127 full_version = packages.determine_full_version()
1128 self.assertEqual(platform_version, test_platform_version)
1129 self.assertEqual(milestone_version, test_chrome_branch)
1130 self.assertEqual(full_version, test_full_version)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001131
1132
1133# Each of the columns in the following table is a separate dimension along
1134# which Chrome uprev test cases can vary in behavior. The full test space would
1135# be the Cartesian product of the possible values of each column.
1136# 'CHROME_EBUILD' refers to the relationship between the version of the existing
1137# Chrome ebuild vs. the requested uprev version. 'FOLLOWER_EBUILDS' refers to
1138# the same relationship but for the packages defined in OTHER_CHROME_PACKAGES.
1139# 'EBUILDS MODIFIED' refers to whether any of the existing 9999 ebuilds have
1140# modified contents relative to their corresponding stable ebuilds.
1141#
1142# CHROME_EBUILD FOLLOWER_EBUILDS EBUILDS_MODIFIED
1143#
1144# HIGHER HIGHER YES
1145# SAME SAME NO
1146# LOWER LOWER
1147# DOESN'T EXIST YET
1148
1149# These test cases cover both CHROME & FOLLOWER ebuilds being identically
1150# higher, lower, or the same versions, with no modified ebuilds.
1151UPREV_VERSION_CASES = (
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001152 # Uprev.
Chris McDonaldea0312c2020-05-04 23:33:15 -06001153 pytest.param(
1154 '80.0.8080.0',
1155 '81.0.8181.0',
1156 # One added and one deleted for chrome and each "other" package.
1157 2 * (1 + len(constants.OTHER_CHROME_PACKAGES)),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001158 False,
Chris McDonaldea0312c2020-05-04 23:33:15 -06001159 id='newer_chrome_version',
1160 ),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001161 # Revbump.
1162 pytest.param(
1163 '80.0.8080.0',
1164 '80.0.8080.0',
1165 2,
1166 True,
1167 id='chrome_revbump',
1168 ),
Chris McDonaldea0312c2020-05-04 23:33:15 -06001169 # No files should be changed in these cases.
1170 pytest.param(
1171 '80.0.8080.0',
1172 '80.0.8080.0',
1173 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001174 False,
Chris McDonaldea0312c2020-05-04 23:33:15 -06001175 id='same_chrome_version',
1176 ),
1177 pytest.param(
1178 '80.0.8080.0',
1179 '79.0.7979.0',
1180 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001181 False,
Chris McDonaldea0312c2020-05-04 23:33:15 -06001182 id='older_chrome_version',
1183 ),
1184)
1185
1186
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001187@pytest.mark.parametrize(
1188 'old_version, new_version, expected_count, modify_unstable',
1189 UPREV_VERSION_CASES)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001190def test_uprev_chrome_all_files_already_exist(old_version, new_version,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001191 expected_count, modify_unstable,
1192 monkeypatch, overlay_stack):
Chris McDonaldea0312c2020-05-04 23:33:15 -06001193 """Test Chrome uprevs work as expected when all packages already exist."""
1194 overlay, = overlay_stack(1)
1195 monkeypatch.setattr(uprev_lib, '_CHROME_OVERLAY_PATH', overlay.path)
1196
1197 unstable_chrome = cr.test.Package(
1198 'chromeos-base', 'chromeos-chrome', version='9999', keywords='~*')
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001199 if modify_unstable:
1200 # Add some field not set in stable.
1201 unstable_chrome.depend = 'foo/bar'
1202
Chris McDonaldea0312c2020-05-04 23:33:15 -06001203 stable_chrome = cr.test.Package(
1204 'chromeos-base', 'chromeos-chrome', version=f'{old_version}_rc-r1')
1205
1206 overlay.add_package(unstable_chrome)
1207 overlay.add_package(stable_chrome)
1208
1209 for pkg_str in constants.OTHER_CHROME_PACKAGES:
1210 category, pkg_name = pkg_str.split('/')
1211 unstable_pkg = cr.test.Package(
1212 category, pkg_name, version='9999', keywords='~*')
1213 stable_pkg = cr.test.Package(
1214 category, pkg_name, version=f'{old_version}_rc-r1')
1215
1216 overlay.add_package(unstable_pkg)
1217 overlay.add_package(stable_pkg)
1218
1219 git_refs = [
1220 GitRef(
Mike Frysingera5c6e792022-03-15 23:42:12 -04001221 path='/foo', ref=f'refs/tags/{new_version}', revision='stubcommit')
Chris McDonaldea0312c2020-05-04 23:33:15 -06001222 ]
Alex Klein4e839252022-01-06 13:29:18 -07001223 res = packages.uprev_chrome_from_ref(None, git_refs, None)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001224
1225 modified_file_count = sum(len(m.files) for m in res.modified)
1226 assert modified_file_count == expected_count
Michael Mortensen125bb012020-05-21 14:02:10 -06001227
1228
1229@pytest.mark.usefixtures('testcase_monkeypatch')
1230class GetModelsTest(cros_test_lib.RunCommandTempDirTestCase):
1231 """Tests for get_models."""
1232
1233 def setUp(self):
1234 self.board = 'test-board'
1235 self.rc.SetDefaultCmdResult(output='pyro\nreef\nsnappy\n')
1236 self.monkeypatch.setattr(constants, 'SOURCE_ROOT', self.tempdir)
Alex Klein627e04c2021-11-10 15:56:47 -07001237 build_bin = os.path.join(self.tempdir, constants.DEFAULT_CHROOT_DIR, 'usr',
1238 'bin')
Michael Mortensen125bb012020-05-21 14:02:10 -06001239 osutils.Touch(os.path.join(build_bin, 'cros_config_host'), makedirs=True)
1240
Michael Mortensen125bb012020-05-21 14:02:10 -06001241 def testGetModels(self):
1242 """Test get_models."""
1243 build_target = build_target_lib.BuildTarget(self.board)
1244 result = packages.get_models(build_target)
1245 self.assertEqual(result, ['pyro', 'reef', 'snappy'])
Michael Mortensen359c1f32020-05-28 19:35:42 -06001246
1247
1248class GetKeyIdTest(cros_test_lib.MockTestCase):
1249 """Tests for get_key_id."""
1250
1251 def setUp(self):
1252 self.board = 'test-board'
1253 self.build_target = build_target_lib.BuildTarget(self.board)
1254
1255 def testGetKeyId(self):
1256 """Test get_key_id when _run_cros_config_host returns a key."""
Alex Klein627e04c2021-11-10 15:56:47 -07001257 self.PatchObject(packages, '_run_cros_config_host', return_value=['key'])
Michael Mortensen359c1f32020-05-28 19:35:42 -06001258 result = packages.get_key_id(self.build_target, 'model')
1259 self.assertEqual(result, 'key')
1260
1261 def testGetKeyIdNoKey(self):
1262 """Test get_key_id when None should be returned."""
Alex Klein627e04c2021-11-10 15:56:47 -07001263 self.PatchObject(
1264 packages, '_run_cros_config_host', return_value=['key1', 'key2'])
Michael Mortensen359c1f32020-05-28 19:35:42 -06001265 result = packages.get_key_id(self.build_target, 'model')
1266 self.assertEqual(result, None)
Ben Reiche779cf42020-12-15 03:21:31 +00001267
1268
Harvey Yang3eee06c2021-03-18 15:47:56 +08001269class GetLatestVersionTest(cros_test_lib.TestCase):
1270 """Tests for get_latest_version_from_refs."""
Ben Reiche779cf42020-12-15 03:21:31 +00001271
1272 def setUp(self):
Harvey Yang3eee06c2021-03-18 15:47:56 +08001273 self.prefix = 'refs/tags/drivefs_'
Ben Reiche779cf42020-12-15 03:21:31 +00001274 # The tag ref template.
Harvey Yang3eee06c2021-03-18 15:47:56 +08001275 ref_tpl = self.prefix + '%s'
Ben Reiche779cf42020-12-15 03:21:31 +00001276
1277 self.latest = '44.0.20'
1278 self.versions = ['42.0.1', self.latest, '44.0.19', '39.0.15']
1279 self.latest_ref = uprev_lib.GitRef('/path', ref_tpl % self.latest, 'abc123')
Alex Klein627e04c2021-11-10 15:56:47 -07001280 self.refs = [
1281 uprev_lib.GitRef('/path', ref_tpl % v, 'abc123') for v in self.versions
1282 ]
Ben Reiche779cf42020-12-15 03:21:31 +00001283
1284 def test_single_ref(self):
1285 """Test a single ref is supplied."""
Harvey Yang3eee06c2021-03-18 15:47:56 +08001286 # pylint: disable=protected-access
Alex Klein627e04c2021-11-10 15:56:47 -07001287 self.assertEqual(
1288 self.latest,
Harvey Yang3eee06c2021-03-18 15:47:56 +08001289 packages._get_latest_version_from_refs(self.prefix, [self.latest_ref]))
Ben Reiche779cf42020-12-15 03:21:31 +00001290
1291 def test_multiple_ref_versions(self):
1292 """Test multiple refs supplied."""
Harvey Yang3eee06c2021-03-18 15:47:56 +08001293 # pylint: disable=protected-access
Alex Klein627e04c2021-11-10 15:56:47 -07001294 self.assertEqual(
1295 self.latest,
Harvey Yang3eee06c2021-03-18 15:47:56 +08001296 packages._get_latest_version_from_refs(self.prefix, self.refs))
Ben Reiche779cf42020-12-15 03:21:31 +00001297
1298 def test_no_refs_returns_none(self):
1299 """Test no refs supplied."""
Harvey Yang3eee06c2021-03-18 15:47:56 +08001300 # pylint: disable=protected-access
Alex Klein627e04c2021-11-10 15:56:47 -07001301 self.assertEqual(
1302 packages._get_latest_version_from_refs(self.prefix, []), None)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001303
1304
Alex Klein6becabc2020-09-11 14:03:05 -06001305class NeedsChromeSourceTest(cros_test_lib.MockTestCase):
1306 """Tests for needs_chrome_source."""
1307
1308 def _build_graph(self, with_chrome: bool, with_followers: bool):
1309 root = '/build/build_target'
1310 foo_bar = package_info.parse('foo/bar-1')
1311 chrome = package_info.parse(f'{constants.CHROME_CP}-1.2.3.4')
1312 followers = [
1313 package_info.parse(f'{pkg}-1.2.3.4')
1314 for pkg in constants.OTHER_CHROME_PACKAGES
1315 ]
1316 nodes = [dependency_graph.PackageNode(foo_bar, root)]
1317 root_pkgs = ['foo/bar-1']
1318 if with_chrome:
1319 nodes.append(dependency_graph.PackageNode(chrome, root))
1320 root_pkgs.append(chrome.cpvr)
1321 if with_followers:
1322 nodes.extend([dependency_graph.PackageNode(f, root) for f in followers])
1323 root_pkgs.extend([f.cpvr for f in followers])
1324
1325 return dependency_graph.DependencyGraph(nodes, root, root_pkgs)
1326
1327 def test_needs_all(self):
1328 """Verify we need source when we have no prebuilts."""
1329 graph = self._build_graph(with_chrome=True, with_followers=True)
Alex Klein627e04c2021-11-10 15:56:47 -07001330 self.PatchObject(
1331 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Klein6becabc2020-09-11 14:03:05 -06001332 self.PatchObject(packages, 'has_prebuilt', return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001333 self.PatchObject(
1334 packages,
1335 'uprev_chrome',
1336 return_value=uprev_lib.UprevVersionedPackageResult())
Alex Klein6becabc2020-09-11 14:03:05 -06001337
1338 build_target = build_target_lib.BuildTarget('build_target')
1339
1340 result = packages.needs_chrome_source(build_target)
1341
1342 self.assertTrue(result.needs_chrome_source)
1343 self.assertTrue(result.builds_chrome)
1344 self.assertTrue(result.packages)
Alex Klein627e04c2021-11-10 15:56:47 -07001345 self.assertEqual(
1346 len(result.packages),
1347 len(constants.OTHER_CHROME_PACKAGES) + 1)
Alex Klein6becabc2020-09-11 14:03:05 -06001348 self.assertTrue(result.missing_chrome_prebuilt)
1349 self.assertTrue(result.missing_follower_prebuilt)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001350 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001351
1352 def test_needs_none(self):
1353 """Verify not building any of the chrome packages prevents needing it."""
1354 graph = self._build_graph(with_chrome=False, with_followers=False)
Alex Klein627e04c2021-11-10 15:56:47 -07001355 self.PatchObject(
1356 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Klein6becabc2020-09-11 14:03:05 -06001357 self.PatchObject(packages, 'has_prebuilt', return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001358 self.PatchObject(
1359 packages,
1360 'uprev_chrome',
1361 return_value=uprev_lib.UprevVersionedPackageResult())
Alex Klein6becabc2020-09-11 14:03:05 -06001362
1363 build_target = build_target_lib.BuildTarget('build_target')
1364
1365 result = packages.needs_chrome_source(build_target)
1366
1367 self.assertFalse(result.needs_chrome_source)
1368 self.assertFalse(result.builds_chrome)
1369 self.assertFalse(result.packages)
1370 self.assertFalse(result.missing_chrome_prebuilt)
1371 self.assertFalse(result.missing_follower_prebuilt)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001372 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001373
1374 def test_needs_chrome_only(self):
1375 """Verify only chrome triggers needs chrome source."""
1376 graph = self._build_graph(with_chrome=True, with_followers=False)
Alex Klein627e04c2021-11-10 15:56:47 -07001377 self.PatchObject(
1378 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Klein6becabc2020-09-11 14:03:05 -06001379 self.PatchObject(packages, 'has_prebuilt', return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001380 self.PatchObject(
1381 packages,
1382 'uprev_chrome',
1383 return_value=uprev_lib.UprevVersionedPackageResult())
Alex Klein6becabc2020-09-11 14:03:05 -06001384
1385 build_target = build_target_lib.BuildTarget('build_target')
1386
1387 result = packages.needs_chrome_source(build_target)
1388
1389 self.assertTrue(result.needs_chrome_source)
1390 self.assertTrue(result.builds_chrome)
1391 self.assertTrue(result.packages)
Alex Klein627e04c2021-11-10 15:56:47 -07001392 self.assertEqual(
1393 set([p.atom for p in result.packages]), {constants.CHROME_CP})
Alex Klein6becabc2020-09-11 14:03:05 -06001394 self.assertTrue(result.missing_chrome_prebuilt)
1395 self.assertFalse(result.missing_follower_prebuilt)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001396 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001397
1398 def test_needs_followers_only(self):
1399 """Verify only chrome followers triggers needs chrome source."""
1400 graph = self._build_graph(with_chrome=False, with_followers=True)
Alex Klein627e04c2021-11-10 15:56:47 -07001401 self.PatchObject(
1402 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Klein6becabc2020-09-11 14:03:05 -06001403 self.PatchObject(packages, 'has_prebuilt', return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001404 self.PatchObject(
1405 packages,
1406 'uprev_chrome',
1407 return_value=uprev_lib.UprevVersionedPackageResult())
Alex Klein6becabc2020-09-11 14:03:05 -06001408
1409 build_target = build_target_lib.BuildTarget('build_target')
1410
1411 result = packages.needs_chrome_source(build_target)
1412
1413 self.assertTrue(result.needs_chrome_source)
1414 self.assertFalse(result.builds_chrome)
1415 self.assertTrue(result.packages)
Alex Klein627e04c2021-11-10 15:56:47 -07001416 self.assertEqual(
1417 set([p.atom for p in result.packages]),
1418 set(constants.OTHER_CHROME_PACKAGES))
Alex Klein6becabc2020-09-11 14:03:05 -06001419 self.assertFalse(result.missing_chrome_prebuilt)
1420 self.assertTrue(result.missing_follower_prebuilt)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001421 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001422
1423 def test_has_prebuilts(self):
1424 """Test prebuilts prevent us from needing chrome source."""
1425 graph = self._build_graph(with_chrome=True, with_followers=True)
Alex Klein627e04c2021-11-10 15:56:47 -07001426 self.PatchObject(
1427 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Klein6becabc2020-09-11 14:03:05 -06001428 self.PatchObject(packages, 'has_prebuilt', return_value=True)
Alex Klein75110572021-07-14 10:44:39 -06001429 self.PatchObject(
1430 packages,
1431 'uprev_chrome',
1432 return_value=uprev_lib.UprevVersionedPackageResult())
Alex Klein6becabc2020-09-11 14:03:05 -06001433
1434 build_target = build_target_lib.BuildTarget('build_target')
1435
1436 result = packages.needs_chrome_source(build_target)
1437
1438 self.assertFalse(result.needs_chrome_source)
1439 self.assertTrue(result.builds_chrome)
1440 self.assertFalse(result.packages)
1441 self.assertFalse(result.missing_chrome_prebuilt)
1442 self.assertFalse(result.missing_follower_prebuilt)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001443 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001444
1445 def test_compile_source(self):
1446 """Test compile source ignores prebuilts."""
1447 graph = self._build_graph(with_chrome=True, with_followers=True)
Alex Klein627e04c2021-11-10 15:56:47 -07001448 self.PatchObject(
1449 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Klein6becabc2020-09-11 14:03:05 -06001450 self.PatchObject(packages, 'has_prebuilt', return_value=True)
Alex Klein75110572021-07-14 10:44:39 -06001451 self.PatchObject(
1452 packages,
1453 'uprev_chrome',
1454 return_value=uprev_lib.UprevVersionedPackageResult())
Alex Klein6becabc2020-09-11 14:03:05 -06001455
1456 build_target = build_target_lib.BuildTarget('build_target')
1457
1458 result = packages.needs_chrome_source(build_target, compile_source=True)
1459
1460 self.assertTrue(result.needs_chrome_source)
1461 self.assertTrue(result.builds_chrome)
1462 self.assertTrue(result.packages)
Alex Klein627e04c2021-11-10 15:56:47 -07001463 self.assertEqual(
1464 len(result.packages),
1465 len(constants.OTHER_CHROME_PACKAGES) + 1)
Alex Klein6becabc2020-09-11 14:03:05 -06001466 self.assertTrue(result.missing_chrome_prebuilt)
1467 self.assertTrue(result.missing_follower_prebuilt)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001468 self.assertFalse(result.local_uprev)
1469
1470 def test_local_uprev(self):
1471 """Test compile source ignores prebuilts."""
1472 graph = self._build_graph(with_chrome=True, with_followers=True)
Alex Klein627e04c2021-11-10 15:56:47 -07001473 self.PatchObject(
1474 depgraph, 'get_sysroot_dependency_graph', return_value=graph)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001475 self.PatchObject(packages, 'has_prebuilt', return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001476
1477 uprev_result = uprev_lib.UprevVersionedPackageResult()
1478 uprev_result.add_result('1.2.3.4', ['/tmp/foo'])
1479 self.PatchObject(packages, 'uprev_chrome', return_value=uprev_result)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001480
1481 build_target = build_target_lib.BuildTarget('build_target')
1482
1483 result = packages.needs_chrome_source(build_target, compile_source=True)
1484
1485 self.assertTrue(result.needs_chrome_source)
1486 self.assertTrue(result.builds_chrome)
1487 self.assertTrue(result.packages)
Alex Klein627e04c2021-11-10 15:56:47 -07001488 self.assertEqual(
1489 len(result.packages),
1490 len(constants.OTHER_CHROME_PACKAGES) + 1)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001491 self.assertTrue(result.missing_chrome_prebuilt)
1492 self.assertTrue(result.missing_follower_prebuilt)
1493 self.assertTrue(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001494
1495
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001496class UprevDrivefsTest(cros_test_lib.MockTestCase):
1497 """Tests for uprev_drivefs."""
1498
1499 def setUp(self):
1500 self.refs = [
1501 GitRef(
1502 path='/chromeos/platform/drivefs-google3/',
1503 ref='refs/tags/drivefs_45.0.2',
1504 revision='123')
1505 ]
1506 self.MOCK_DRIVEFS_EBUILD_PATH = 'drivefs.45.0.2-r1.ebuild'
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001507
1508 def revisionBumpOutcome(self, ebuild_path):
1509 return uprev_lib.UprevResult(uprev_lib.Outcome.REVISION_BUMP, [ebuild_path])
1510
1511 def majorBumpOutcome(self, ebuild_path):
1512 return uprev_lib.UprevResult(uprev_lib.Outcome.VERSION_BUMP, [ebuild_path])
1513
1514 def sameVersionOutcome(self):
1515 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
1516
1517 def test_latest_version_returns_none(self):
1518 """Test no refs were supplied"""
1519 output = packages.uprev_drivefs(None, [], None)
1520 self.assertFalse(output.uprevved)
1521
1522 def test_drivefs_uprev_fails(self):
1523 """Test a single ref is supplied."""
1524 self.PatchObject(
1525 uprev_lib, 'uprev_workon_ebuild_to_version', side_effect=[None, None])
1526 output = packages.uprev_drivefs(None, self.refs, None)
1527 self.assertFalse(output.uprevved)
1528
1529 def test_same_version_exists(self):
1530 """Test the same version exists uprev should not happen."""
1531 drivefs_outcome = self.sameVersionOutcome()
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001532 self.PatchObject(
1533 uprev_lib,
1534 'uprev_workon_ebuild_to_version',
Ben Reich70895da2022-01-27 11:43:04 +11001535 side_effect=[drivefs_outcome])
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001536 output = packages.uprev_drivefs(None, self.refs, None)
1537 self.assertFalse(output.uprevved)
1538
1539 def test_revision_bump_both_packages(self):
1540 """Test both packages uprev, should succeed."""
1541 drivefs_outcome = self.revisionBumpOutcome(self.MOCK_DRIVEFS_EBUILD_PATH)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001542 self.PatchObject(
1543 uprev_lib,
1544 'uprev_workon_ebuild_to_version',
Ben Reich70895da2022-01-27 11:43:04 +11001545 side_effect=[drivefs_outcome])
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001546 output = packages.uprev_drivefs(None, self.refs, None)
1547 self.assertTrue(output.uprevved)
1548
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001549 def test_major_bump_both_packages(self):
1550 """Test both packages uprev, should succeed."""
1551 drivefs_outcome = self.majorBumpOutcome(self.MOCK_DRIVEFS_EBUILD_PATH)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001552 self.PatchObject(
1553 uprev_lib,
1554 'uprev_workon_ebuild_to_version',
Ben Reich70895da2022-01-27 11:43:04 +11001555 side_effect=[drivefs_outcome])
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001556 output = packages.uprev_drivefs(None, self.refs, None)
1557 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001558
1559
1560# TODO(chenghaoyang): Shouldn't use uprev_workon_ebuild_to_version.
1561class UprevPerfettoTest(cros_test_lib.MockTestCase):
1562 """Tests for uprev_perfetto."""
1563
1564 def setUp(self):
Alex Klein627e04c2021-11-10 15:56:47 -07001565 self.refs = [GitRef(path='/foo', ref='refs/tags/v12.0', revision='123')]
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001566 self.MOCK_PERFETTO_EBUILD_PATH = 'perfetto-12.0-r1.ebuild'
1567
1568 def revisionBumpOutcome(self, ebuild_path):
1569 return uprev_lib.UprevResult(uprev_lib.Outcome.REVISION_BUMP, [ebuild_path])
1570
1571 def majorBumpOutcome(self, ebuild_path):
1572 return uprev_lib.UprevResult(uprev_lib.Outcome.VERSION_BUMP, [ebuild_path])
1573
Harvey Yang3eee06c2021-03-18 15:47:56 +08001574 def newerVersionOutcome(self):
1575 return uprev_lib.UprevResult(uprev_lib.Outcome.NEWER_VERSION_EXISTS)
1576
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001577 def sameVersionOutcome(self):
1578 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
1579
1580 def test_latest_version_returns_none(self):
1581 """Test no refs were supplied"""
1582 output = packages.uprev_perfetto(None, [], None)
1583 self.assertFalse(output.uprevved)
1584
1585 def test_perfetto_uprev_fails(self):
1586 """Test a single ref is supplied."""
1587 self.PatchObject(
1588 uprev_lib, 'uprev_workon_ebuild_to_version', side_effect=[None])
1589 output = packages.uprev_perfetto(None, self.refs, None)
1590 self.assertFalse(output.uprevved)
1591
Harvey Yang3eee06c2021-03-18 15:47:56 +08001592 def test_newer_version_exists(self):
1593 """Test the newer version exists uprev should not happen."""
1594 perfetto_outcome = self.newerVersionOutcome()
1595 self.PatchObject(
1596 uprev_lib,
1597 'uprev_workon_ebuild_to_version',
1598 side_effect=[perfetto_outcome])
1599 output = packages.uprev_perfetto(None, self.refs, None)
1600 self.assertFalse(output.uprevved)
1601
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001602 def test_same_version_exists(self):
1603 """Test the same version exists uprev should not happen."""
1604 perfetto_outcome = self.sameVersionOutcome()
1605 self.PatchObject(
1606 uprev_lib,
1607 'uprev_workon_ebuild_to_version',
1608 side_effect=[perfetto_outcome])
1609 output = packages.uprev_perfetto(None, self.refs, None)
1610 self.assertFalse(output.uprevved)
1611
1612 def test_revision_bump_perfetto_package(self):
1613 """Test perfetto package uprev."""
1614 perfetto_outcome = self.revisionBumpOutcome(self.MOCK_PERFETTO_EBUILD_PATH)
1615 self.PatchObject(
1616 uprev_lib,
1617 'uprev_workon_ebuild_to_version',
1618 side_effect=[perfetto_outcome])
1619 output = packages.uprev_perfetto(None, self.refs, None)
1620 self.assertTrue(output.uprevved)
1621
1622 def test_major_bump_perfetto_package(self):
1623 """Test perfetto package uprev."""
1624 perfetto_outcome = self.majorBumpOutcome(self.MOCK_PERFETTO_EBUILD_PATH)
1625 self.PatchObject(
1626 uprev_lib,
1627 'uprev_workon_ebuild_to_version',
1628 side_effect=[perfetto_outcome])
1629 output = packages.uprev_perfetto(None, self.refs, None)
1630 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00001631
Alex Klein627e04c2021-11-10 15:56:47 -07001632
Julio Hurtadof1befec2021-05-05 21:34:26 +00001633class UprevLacrosTest(cros_test_lib.MockTestCase):
1634 """Tests for uprev_lacros"""
1635
1636 def setUp(self):
1637 self.refs = [
Alex Klein627e04c2021-11-10 15:56:47 -07001638 GitRef(path='/lacros', ref='refs/heads/main', revision='123.456.789.0')
Julio Hurtadof1befec2021-05-05 21:34:26 +00001639 ]
1640 self.MOCK_LACROS_EBUILD_PATH = 'chromeos-lacros-123.456.789.0-r1.ebuild'
1641
1642 def revisionBumpOutcome(self, ebuild_path):
1643 return uprev_lib.UprevResult(uprev_lib.Outcome.REVISION_BUMP, [ebuild_path])
1644
1645 def majorBumpOutcome(self, ebuild_path):
1646 return uprev_lib.UprevResult(uprev_lib.Outcome.VERSION_BUMP, [ebuild_path])
1647
Julio Hurtadoa994e002021-07-07 17:57:45 +00001648 def newerVersionOutcome(self, ebuild_path):
Alex Klein627e04c2021-11-10 15:56:47 -07001649 return uprev_lib.UprevResult(uprev_lib.Outcome.NEWER_VERSION_EXISTS,
1650 [ebuild_path])
Julio Hurtadoa994e002021-07-07 17:57:45 +00001651
1652 def sameVersionOutcome(self, ebuild_path):
Alex Klein627e04c2021-11-10 15:56:47 -07001653 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS,
1654 [ebuild_path])
Julio Hurtadoa994e002021-07-07 17:57:45 +00001655
Julio Hurtadof1befec2021-05-05 21:34:26 +00001656 def newEbuildCreatedOutcome(self, ebuild_path):
Alex Klein627e04c2021-11-10 15:56:47 -07001657 return uprev_lib.UprevResult(uprev_lib.Outcome.NEW_EBUILD_CREATED,
1658 [ebuild_path])
Julio Hurtadof1befec2021-05-05 21:34:26 +00001659
1660 def test_lacros_uprev_fails(self):
Julio Hurtado870ed322021-12-03 18:22:40 +00001661 """Test a lacros package uprev with no triggers"""
Julio Hurtadof1befec2021-05-05 21:34:26 +00001662 self.PatchObject(
Alex Klein627e04c2021-11-10 15:56:47 -07001663 uprev_lib, 'uprev_workon_ebuild_to_version', side_effect=[None])
Julio Hurtadof1befec2021-05-05 21:34:26 +00001664 with self.assertRaises(IndexError):
1665 packages.uprev_lacros(None, [], None)
1666
1667 def test_lacros_uprev_revision_bump(self):
Julio Hurtado870ed322021-12-03 18:22:40 +00001668 """Test lacros package uprev."""
Julio Hurtadof1befec2021-05-05 21:34:26 +00001669 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
1670 self.PatchObject(
Alex Klein627e04c2021-11-10 15:56:47 -07001671 uprev_lib,
1672 'uprev_workon_ebuild_to_version',
1673 side_effect=[lacros_outcome])
Julio Hurtadof1befec2021-05-05 21:34:26 +00001674 output = packages.uprev_lacros(None, self.refs, None)
Julio Hurtadoa994e002021-07-07 17:57:45 +00001675 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00001676
1677 def test_lacros_uprev_version_bump(self):
Julio Hurtado870ed322021-12-03 18:22:40 +00001678 """Test lacros package uprev."""
Julio Hurtadof1befec2021-05-05 21:34:26 +00001679 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
1680 self.PatchObject(
Alex Klein627e04c2021-11-10 15:56:47 -07001681 uprev_lib,
1682 'uprev_workon_ebuild_to_version',
1683 side_effect=[lacros_outcome])
Julio Hurtadof1befec2021-05-05 21:34:26 +00001684 output = packages.uprev_lacros(None, self.refs, None)
Julio Hurtadoa994e002021-07-07 17:57:45 +00001685 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00001686
1687 def test_lacros_uprev_new_ebuild_created(self):
Julio Hurtado870ed322021-12-03 18:22:40 +00001688 """Test lacros package uprev."""
Julio Hurtadof1befec2021-05-05 21:34:26 +00001689 lacros_outcome = self.newEbuildCreatedOutcome(self.MOCK_LACROS_EBUILD_PATH)
1690 self.PatchObject(
Alex Klein627e04c2021-11-10 15:56:47 -07001691 uprev_lib,
1692 'uprev_workon_ebuild_to_version',
1693 side_effect=[lacros_outcome])
Julio Hurtadof1befec2021-05-05 21:34:26 +00001694 output = packages.uprev_lacros(None, self.refs, None)
Julio Hurtadoa994e002021-07-07 17:57:45 +00001695 self.assertTrue(output.uprevved)
1696
1697 def test_lacros_uprev_newer_version_exist(self):
Julio Hurtado870ed322021-12-03 18:22:40 +00001698 """Test the newer version exists uprev should not happen."""
Julio Hurtadoa994e002021-07-07 17:57:45 +00001699 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
1700 self.PatchObject(
Alex Klein627e04c2021-11-10 15:56:47 -07001701 uprev_lib,
1702 'uprev_workon_ebuild_to_version',
1703 side_effect=[lacros_outcome])
Julio Hurtadoa994e002021-07-07 17:57:45 +00001704 output = packages.uprev_lacros(None, self.refs, None)
1705 self.assertFalse(output.uprevved)
1706
1707 def test_lacros_uprev_same_version_exist(self):
Julio Hurtado870ed322021-12-03 18:22:40 +00001708 """Test the same version exists uprev should not happen."""
Julio Hurtadoa994e002021-07-07 17:57:45 +00001709 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
1710 self.PatchObject(
Alex Klein627e04c2021-11-10 15:56:47 -07001711 uprev_lib,
1712 'uprev_workon_ebuild_to_version',
1713 side_effect=[lacros_outcome])
Julio Hurtadoa994e002021-07-07 17:57:45 +00001714 output = packages.uprev_lacros(None, self.refs, None)
1715 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00001716
1717
1718class UprevLacrosInParallelTest(cros_test_lib.MockTestCase):
1719 """Tests for uprev_lacros"""
1720
1721 def setUp(self):
1722 self.refs = [
1723 GitRef(path='/lacros', revision='abc123', ref='refs/tags/123.456.789.0')
1724 ]
1725 self.MOCK_LACROS_EBUILD_PATH = 'chromeos-lacros-123.456.789.0-r1.ebuild'
1726
1727 def revisionBumpOutcome(self, ebuild_path):
1728 return uprev_lib.UprevResult(uprev_lib.Outcome.REVISION_BUMP, [ebuild_path])
1729
1730 def majorBumpOutcome(self, ebuild_path):
1731 return uprev_lib.UprevResult(uprev_lib.Outcome.VERSION_BUMP, [ebuild_path])
1732
1733 def newerVersionOutcome(self, ebuild_path):
1734 return uprev_lib.UprevResult(uprev_lib.Outcome.NEWER_VERSION_EXISTS,
1735 [ebuild_path])
1736
1737 def sameVersionOutcome(self, ebuild_path):
1738 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS,
1739 [ebuild_path])
1740
1741 def newEbuildCreatedOutcome(self, ebuild_path):
1742 return uprev_lib.UprevResult(uprev_lib.Outcome.NEW_EBUILD_CREATED,
1743 [ebuild_path])
1744
1745 def test_lacros_uprev_fails(self):
1746 """Test a lacros package uprev with no triggers"""
1747 self.PatchObject(
1748 uprev_lib, 'uprev_workon_ebuild_to_version', side_effect=[None])
1749 with self.assertRaises(TypeError):
1750 packages.uprev_lacros_in_parallel(None, [], None)
1751
1752 def test_lacros_uprev_revision_bump(self):
1753 """Test lacros package uprev."""
1754 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
1755 self.PatchObject(
1756 uprev_lib,
1757 'uprev_workon_ebuild_to_version',
1758 side_effect=[lacros_outcome])
1759 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
1760 self.assertTrue(output.uprevved)
1761
1762 def test_lacros_uprev_version_bump(self):
1763 """Test lacros package uprev."""
1764 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
1765 self.PatchObject(
1766 uprev_lib,
1767 'uprev_workon_ebuild_to_version',
1768 side_effect=[lacros_outcome])
1769 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
1770 self.assertTrue(output.uprevved)
1771
1772 def test_lacros_uprev_new_ebuild_created(self):
1773 """Test lacros package uprev."""
1774 lacros_outcome = self.newEbuildCreatedOutcome(self.MOCK_LACROS_EBUILD_PATH)
1775 self.PatchObject(
1776 uprev_lib,
1777 'uprev_workon_ebuild_to_version',
1778 side_effect=[lacros_outcome])
1779 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
1780 self.assertTrue(output.uprevved)
1781
1782 def test_lacros_uprev_newer_version_exist(self):
1783 """Test the newer version exists uprev should not happen."""
1784 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
1785 self.PatchObject(
1786 uprev_lib,
1787 'uprev_workon_ebuild_to_version',
1788 side_effect=[lacros_outcome])
1789 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
1790 self.assertFalse(output.uprevved)
1791
1792 def test_lacros_uprev_same_version_exist(self):
1793 """Test the same version exists uprev should not happen."""
1794 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
1795 self.PatchObject(
1796 uprev_lib,
1797 'uprev_workon_ebuild_to_version',
1798 side_effect=[lacros_outcome])
1799 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
1800 self.assertFalse(output.uprevved)