blob: dcbaef8761ea4edae991eecf83c30d759567752d [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
Alex Kleineb77ffa2019-05-28 14:47:44 -06002# 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
Mike Frysinger2c024062021-05-22 15:43:22 -040013from chromite.third_party.google.protobuf import json_format
14from chromite.third_party.google.protobuf.field_mask_pb2 import FieldMask
Mike Frysinger68796b52019-08-25 00:04:27 -040015import pytest
Andrew Lamb2bde9e42019-11-04 13:24:09 -070016
Chris McDonaldea0312c2020-05-04 23:33:15 -060017import chromite as cr
Andrew Lamb2bde9e42019-11-04 13:24:09 -070018from chromite.api.gen.config.replication_config_pb2 import (
Mike Frysinger68796b52019-08-25 00:04:27 -040019 FILE_TYPE_JSON,
20 FileReplicationRule,
21 REPLICATION_TYPE_FILTER,
22 ReplicationConfig,
23)
Alex Klein2960c752020-03-09 13:43:38 -060024from chromite.lib import build_target_lib
Ram Chandrasekar60f69f32022-06-03 22:49:30 +000025from chromite.lib import chromeos_version
Andrew Lamb2bde9e42019-11-04 13:24:09 -070026from chromite.lib import constants
Michael Mortensene0f4b542019-10-24 15:30:23 -060027from chromite.lib import cros_build_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060028from chromite.lib import cros_test_lib
Alex Klein6becabc2020-09-11 14:03:05 -060029from chromite.lib import dependency_graph
Mike Frysinger68796b52019-08-25 00:04:27 -040030from chromite.lib import depgraph
Michael Mortensenb70e8a82019-10-10 18:43:41 -060031from chromite.lib import osutils
Mike Frysinger88d96362020-02-14 19:05:45 -050032from chromite.lib import partial_mock
Alex Klein87531182019-08-12 15:23:37 -060033from chromite.lib import portage_util
Chris McDonaldea0312c2020-05-04 23:33:15 -060034from chromite.lib import uprev_lib
Alex Klein87531182019-08-12 15:23:37 -060035from chromite.lib.chroot_lib import Chroot
Alex Klein18a60af2020-06-11 12:08:47 -060036from chromite.lib.parser import package_info
Andrew Lamb2bde9e42019-11-04 13:24:09 -070037from chromite.lib.uprev_lib import GitRef
Shao-Chuan Lee05e51142021-11-24 12:27:37 +090038from chromite.service import android
Alex Kleineb77ffa2019-05-28 14:47:44 -060039from chromite.service import packages
40
Mike Frysinger68796b52019-08-25 00:04:27 -040041
Andrew Lamb2bde9e42019-11-04 13:24:09 -070042D = cros_test_lib.Directory
43
Alex Kleineb77ffa2019-05-28 14:47:44 -060044
Alex Klein4de25e82019-08-05 15:58:39 -060045class UprevAndroidTest(cros_test_lib.RunCommandTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060046 """Uprev android tests."""
Alex Klein4de25e82019-08-05 15:58:39 -060047
Alex Klein1699fab2022-09-08 08:46:06 -060048 def _mock_successful_uprev(self):
49 self.rc.AddCmdResult(
50 partial_mock.In("cros_mark_android_as_stable"),
51 stdout=(
52 '{"revved": true,'
53 ' "android_atom": "android/android-1.0",'
54 ' "modified_files": ["file1", "file2"]}'
55 ),
56 )
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090057
Alex Klein1699fab2022-09-08 08:46:06 -060058 def test_success(self):
59 """Test successful run handling."""
60 self._mock_successful_uprev()
61 build_targets = [
62 build_target_lib.BuildTarget(t) for t in ["foo", "bar"]
63 ]
Alex Klein4de25e82019-08-05 15:58:39 -060064
Alex Klein1699fab2022-09-08 08:46:06 -060065 result = packages.uprev_android(
66 "android/package", Chroot(), build_targets=build_targets
67 )
68 self.assertCommandContains(
69 [
70 "cros_mark_android_as_stable",
71 "--android_package=android/package",
72 "--boards=foo:bar",
73 ]
74 )
75 self.assertCommandContains(["emerge-foo"])
76 self.assertCommandContains(["emerge-bar"])
Alex Klein4de25e82019-08-05 15:58:39 -060077
Alex Klein1699fab2022-09-08 08:46:06 -060078 self.assertTrue(result.revved)
79 self.assertEqual(result.android_atom, "android/android-1.0")
80 self.assertListEqual(result.modified_files, ["file1", "file2"])
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +090081
Alex Klein1699fab2022-09-08 08:46:06 -060082 def test_android_build_branch(self):
83 """Test specifying android_build_branch option."""
84 self._mock_successful_uprev()
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090085
Alex Klein1699fab2022-09-08 08:46:06 -060086 packages.uprev_android(
87 "android/package",
88 Chroot(),
89 android_build_branch="android-build-branch",
90 )
91 self.assertCommandContains(
92 [
93 "cros_mark_android_as_stable",
94 "--android_package=android/package",
95 "--android_build_branch=android-build-branch",
96 ]
97 )
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090098
Alex Klein1699fab2022-09-08 08:46:06 -060099 def test_android_version(self):
100 """Test specifying android_version option."""
101 self._mock_successful_uprev()
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900102
Alex Klein1699fab2022-09-08 08:46:06 -0600103 packages.uprev_android(
104 "android/package", Chroot(), android_version="7123456"
105 )
106 self.assertCommandContains(
107 [
108 "cros_mark_android_as_stable",
109 "--android_package=android/package",
110 "--force_version=7123456",
111 ]
112 )
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900113
Alex Klein1699fab2022-09-08 08:46:06 -0600114 def test_skip_commit(self):
115 """Test specifying skip_commit option."""
116 self._mock_successful_uprev()
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900117
Alex Klein1699fab2022-09-08 08:46:06 -0600118 packages.uprev_android("android/package", Chroot(), skip_commit=True)
119 self.assertCommandContains(
120 [
121 "cros_mark_android_as_stable",
122 "--android_package=android/package",
123 "--skip_commit",
124 ]
125 )
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900126
Alex Klein1699fab2022-09-08 08:46:06 -0600127 def test_no_uprev(self):
128 """Test no uprev handling."""
129 self.rc.AddCmdResult(
130 partial_mock.In("cros_mark_android_as_stable"),
131 stdout='{"revved": false}',
132 )
133 build_targets = [
134 build_target_lib.BuildTarget(t) for t in ["foo", "bar"]
135 ]
136 result = packages.uprev_android(
137 "android/package", Chroot(), build_targets=build_targets
138 )
Alex Klein4de25e82019-08-05 15:58:39 -0600139
Alex Klein1699fab2022-09-08 08:46:06 -0600140 self.assertCommandContains(
141 ["cros_mark_android_as_stable", "--boards=foo:bar"]
142 )
143 self.assertCommandContains(["emerge-foo"], expected=False)
144 self.assertCommandContains(["emerge-bar"], expected=False)
Alex Klein4de25e82019-08-05 15:58:39 -0600145
Alex Klein1699fab2022-09-08 08:46:06 -0600146 self.assertFalse(result.revved)
Shao-Chuan Lee84bf9a22021-11-19 17:42:11 +0900147
Alex Klein1699fab2022-09-08 08:46:06 -0600148 def test_ignore_junk_in_stdout(self):
149 """Test when stdout contains junk messages."""
150 self.rc.AddCmdResult(
151 partial_mock.In("cros_mark_android_as_stable"),
152 stdout='foo\nbar\n{"revved": false}\n',
153 )
154 result = packages.uprev_android("android/package", Chroot())
Shao-Chuan Leedea458f2021-11-25 23:46:53 +0900155
Alex Klein1699fab2022-09-08 08:46:06 -0600156 self.assertFalse(result.revved)
Shao-Chuan Leedea458f2021-11-25 23:46:53 +0900157
Alex Klein4de25e82019-08-05 15:58:39 -0600158
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900159class UprevAndroidLKGBTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600160 """Tests for uprevving Android with LKGB."""
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900161
Alex Klein1699fab2022-09-08 08:46:06 -0600162 def test_registered_handlers(self):
163 """Test that each Android package has an uprev handler registered."""
164 mock_handler = self.PatchObject(packages, "uprev_android_lkgb")
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900165
Shao-Chuan Leeca2cbcc2022-11-02 08:28:31 +0900166 for android_package in android.GetAllAndroidPackages():
Alex Klein1699fab2022-09-08 08:46:06 -0600167 cpv = package_info.SplitCPV(
168 "chromeos-base/" + android_package, strict=False
169 )
170 build_targets = [build_target_lib.BuildTarget("foo")]
171 chroot = Chroot()
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900172
Alex Klein1699fab2022-09-08 08:46:06 -0600173 packages.uprev_versioned_package(cpv, build_targets, [], chroot)
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900174
Alex Klein1699fab2022-09-08 08:46:06 -0600175 mock_handler.assert_called_once_with(
176 android_package, build_targets, chroot
177 )
178 mock_handler.reset_mock()
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900179
Alex Klein1699fab2022-09-08 08:46:06 -0600180 def test_success(self):
181 """Test a successful uprev."""
182 self.PatchObject(android, "OVERLAY_DIR", new="overlay-dir")
183 self.PatchObject(android, "ReadLKGB", return_value="android-lkgb")
184 self.PatchObject(
185 packages,
186 "uprev_android",
187 return_value=packages.UprevAndroidResult(
188 revved=True,
189 android_atom="android-atom",
190 modified_files=["file1", "file2"],
191 ),
192 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900193
Alex Klein1699fab2022-09-08 08:46:06 -0600194 result = packages.uprev_android_lkgb("android-package", [], Chroot())
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900195
Alex Klein1699fab2022-09-08 08:46:06 -0600196 self.assertListEqual(
197 result.modified,
198 [
199 uprev_lib.UprevVersionedPackageModifications(
200 "android-lkgb",
201 [
202 os.path.join("overlay-dir", "file1"),
203 os.path.join("overlay-dir", "file2"),
204 ],
205 )
206 ],
207 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900208
Alex Klein1699fab2022-09-08 08:46:06 -0600209 def test_no_rev(self):
210 """Test when nothing revved."""
211 self.PatchObject(android, "ReadLKGB", return_value="android-lkgb")
212 self.PatchObject(
213 packages,
214 "uprev_android",
215 return_value=packages.UprevAndroidResult(revved=False),
216 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900217
Alex Klein1699fab2022-09-08 08:46:06 -0600218 result = packages.uprev_android_lkgb("android-package", [], Chroot())
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900219
Alex Klein1699fab2022-09-08 08:46:06 -0600220 self.assertListEqual(result.modified, [])
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900221
222
Jeremy Bettisaf96afb2023-01-11 16:09:58 -0700223class UprevECUtilsTest(cros_test_lib.MockTestCase):
224 """Tests for upreving ecutils."""
225
226 def test_success(self):
227 """Test a successful uprev."""
228
229 def fakeRunTasks(func, inputs):
230 results = []
231 for args in inputs:
232 results.append(func(*args))
233 return results
234
235 self.PatchObject(
236 packages.uprev_lib.parallel,
237 "RunTasksInProcessPool",
238 side_effect=fakeRunTasks,
239 )
240 mock_devutils = mock.MagicMock(name="dev-utils")
241 mock_ecutils = mock.MagicMock(name="ec-utils")
242 mock_ecutilstest = mock.MagicMock(name="ec-utils-test")
243 self.PatchObject(
244 packages.uprev_lib.portage_util,
245 "GetOverlayEBuilds",
246 return_value=[
247 mock_devutils,
248 mock_ecutils,
249 mock_ecutilstest,
250 ],
251 )
252 mock_overlay_mgr = mock.MagicMock(name="overlay-manager")
253 mock_overlay_mgr.modified_ebuilds = ["file1", "file2"]
254 self.PatchObject(
255 packages.uprev_lib,
256 "UprevOverlayManager",
257 return_value=mock_overlay_mgr,
258 )
259 cpv = package_info.SplitCPV("chromeos-base/ec-utils", strict=False)
260 assert cpv is not None
261 build_targets = [build_target_lib.BuildTarget("foo")]
262 refs = [
263 GitRef(
264 path="/platform/ec",
265 ref="main",
266 revision="123",
267 )
268 ]
269 chroot = Chroot()
270
271 result = packages.uprev_versioned_package(
272 cpv, build_targets, refs, chroot
273 )
274
275 self.assertEqual(1, len(result.modified))
276 self.assertEqual("123", result.modified[0].new_version)
277 self.assertListEqual(result.modified[0].files, ["file1", "file2"])
278
279 mock_overlay_mgr.uprev.assert_called_once_with(
280 package_list=[
281 "chromeos-base/ec-devutils",
282 "chromeos-base/ec-utils",
283 "chromeos-base/ec-utils-test",
284 ],
285 force=True,
286 )
287
288
Alex Kleineb77ffa2019-05-28 14:47:44 -0600289class UprevBuildTargetsTest(cros_test_lib.RunCommandTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600290 """uprev_build_targets tests."""
Alex Kleineb77ffa2019-05-28 14:47:44 -0600291
Alex Klein1699fab2022-09-08 08:46:06 -0600292 def test_invalid_type_fails(self):
293 """Test invalid type fails."""
294 with self.assertRaises(AssertionError):
295 packages.uprev_build_targets(
296 [build_target_lib.BuildTarget("foo")], "invalid"
297 )
Alex Kleineb77ffa2019-05-28 14:47:44 -0600298
Alex Klein1699fab2022-09-08 08:46:06 -0600299 def test_none_type_fails(self):
300 """Test None type fails."""
301 with self.assertRaises(AssertionError):
302 packages.uprev_build_targets(
303 [build_target_lib.BuildTarget("foo")], None
304 )
Alex Kleineb77ffa2019-05-28 14:47:44 -0600305
306
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000307class PatchEbuildVarsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600308 """patch_ebuild_vars test."""
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000309
Alex Klein1699fab2022-09-08 08:46:06 -0600310 def setUp(self):
311 self.mock_input = self.PatchObject(packages.fileinput, "input")
312 self.mock_stdout_write = self.PatchObject(packages.sys.stdout, "write")
313 self.ebuild_path = "/path/to/ebuild"
314 self.old_var_value = "R100-5678.0.123456789"
315 self.new_var_value = "R102-5678.0.234566789"
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000316
Alex Klein1699fab2022-09-08 08:46:06 -0600317 def test_patch_ebuild_vars_var_only(self):
318 """patch_ebuild_vars changes ^var=value$."""
319 ebuild_contents = (
320 "This line does not change.\n"
321 'AFDO_PROFILE_VERSION="{var_value}"\n'
322 "\n"
323 "# The line with AFDO_PROFILE_VERSION is also unchanged."
324 )
325 # Ebuild contains old_var_value.
326 self.mock_input.return_value = io.StringIO(
327 ebuild_contents.format(var_value=self.old_var_value)
328 )
329 expected_calls = []
330 # Expect the line with new_var_value.
331 for line in io.StringIO(
332 ebuild_contents.format(var_value=self.new_var_value)
333 ):
334 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000335
Alex Klein1699fab2022-09-08 08:46:06 -0600336 packages.patch_ebuild_vars(
337 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
338 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000339
Alex Klein1699fab2022-09-08 08:46:06 -0600340 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000341
Alex Klein1699fab2022-09-08 08:46:06 -0600342 def test_patch_ebuild_vars_ignore_export(self):
343 """patch_ebuild_vars changes ^export var=value$ and keeps export."""
344 ebuild_contents = (
345 "This line does not change.\n"
346 'export AFDO_PROFILE_VERSION="{var_value}"\n'
347 "# This line is also unchanged."
348 )
349 # Ebuild contains old_var_value.
350 self.mock_input.return_value = io.StringIO(
351 ebuild_contents.format(var_value=self.old_var_value)
352 )
353 expected_calls = []
354 # Expect the line with new_var_value.
355 for line in io.StringIO(
356 ebuild_contents.format(var_value=self.new_var_value)
357 ):
358 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000359
Alex Klein1699fab2022-09-08 08:46:06 -0600360 packages.patch_ebuild_vars(
361 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
362 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000363
Alex Klein1699fab2022-09-08 08:46:06 -0600364 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000365
Alex Klein1699fab2022-09-08 08:46:06 -0600366 def test_patch_ebuild_vars_partial_match(self):
367 """patch_ebuild_vars ignores ^{prefix}var=value$."""
368 ebuild_contents = (
Alex Kleina53bd282022-09-09 12:42:55 -0600369 'This and the line below do not change.\nNEW_AFDO="{var_value}"'
Alex Klein1699fab2022-09-08 08:46:06 -0600370 )
371 # Ebuild contains old_var_value.
372 self.mock_input.return_value = io.StringIO(
373 ebuild_contents.format(var_value=self.old_var_value)
374 )
375 expected_calls = []
376 # Expect the line with UNCHANGED old_var_value.
377 for line in io.StringIO(
378 ebuild_contents.format(var_value=self.old_var_value)
379 ):
380 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000381
Alex Klein1699fab2022-09-08 08:46:06 -0600382 # Note that the var name partially matches the ebuild var and hence it has
383 # to be ignored.
384 packages.patch_ebuild_vars(
385 self.ebuild_path, {"AFDO": self.new_var_value}
386 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000387
Alex Klein1699fab2022-09-08 08:46:06 -0600388 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000389
Alex Klein1699fab2022-09-08 08:46:06 -0600390 def test_patch_ebuild_vars_no_vars(self):
391 """patch_ebuild_vars keeps ebuild intact if there are no vars."""
392 ebuild_contents = (
393 "This line does not change.\n"
394 "The line with AFDO_PROFILE_VERSION is also unchanged."
395 )
396 self.mock_input.return_value = io.StringIO(ebuild_contents)
397 expected_calls = []
398 for line in io.StringIO(ebuild_contents):
399 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000400
Alex Klein1699fab2022-09-08 08:46:06 -0600401 packages.patch_ebuild_vars(
402 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
403 )
404
405 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000406
407
Alex Klein87531182019-08-12 15:23:37 -0600408class UprevsVersionedPackageTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600409 """uprevs_versioned_package decorator test."""
Alex Klein87531182019-08-12 15:23:37 -0600410
Alex Klein1699fab2022-09-08 08:46:06 -0600411 @packages.uprevs_versioned_package("category/package")
412 def uprev_category_package(self, *args, **kwargs):
413 """Registered function for testing."""
Alex Klein87531182019-08-12 15:23:37 -0600414
Alex Klein1699fab2022-09-08 08:46:06 -0600415 def test_calls_function(self):
416 """Test calling a registered function."""
417 self.PatchObject(self, "uprev_category_package")
Alex Klein87531182019-08-12 15:23:37 -0600418
Alex Klein1699fab2022-09-08 08:46:06 -0600419 cpv = package_info.SplitCPV("category/package", strict=False)
420 packages.uprev_versioned_package(cpv, [], [], Chroot())
Alex Klein87531182019-08-12 15:23:37 -0600421
Alex Klein1699fab2022-09-08 08:46:06 -0600422 # TODO(crbug/1065172): Invalid assertion that had previously been mocked.
423 # patch.assert_called()
Alex Klein87531182019-08-12 15:23:37 -0600424
Alex Klein1699fab2022-09-08 08:46:06 -0600425 def test_unregistered_package(self):
426 """Test calling with an unregistered package."""
427 cpv = package_info.SplitCPV("does-not/exist", strict=False)
Alex Klein87531182019-08-12 15:23:37 -0600428
Alex Klein1699fab2022-09-08 08:46:06 -0600429 with self.assertRaises(packages.UnknownPackageError):
430 packages.uprev_versioned_package(cpv, [], [], Chroot())
Alex Klein87531182019-08-12 15:23:37 -0600431
432
Trent Begin6daa8702020-01-29 14:58:12 -0700433class UprevEbuildFromPinTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600434 """Tests uprev_ebuild_from_pin function"""
Trent Begin315d9d92019-12-03 21:55:53 -0700435
Alex Klein1699fab2022-09-08 08:46:06 -0600436 package = "category/package"
437 version = "1.2.3"
438 new_version = "1.2.4"
439 ebuild_template = "package-%s-r1.ebuild"
440 ebuild = ebuild_template % version
441 unstable_ebuild = "package-9999.ebuild"
442 manifest = "Manifest"
Trent Begin315d9d92019-12-03 21:55:53 -0700443
Alex Klein1699fab2022-09-08 08:46:06 -0600444 def test_uprev_ebuild(self):
445 """Tests uprev of ebuild with version path"""
446 file_layout = (
447 D(self.package, [self.ebuild, self.unstable_ebuild, self.manifest]),
448 )
449 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700450
Alex Klein1699fab2022-09-08 08:46:06 -0600451 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700452
Alex Klein1699fab2022-09-08 08:46:06 -0600453 ebuild_path = os.path.join(package_path, self.ebuild)
454 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000455
Alex Klein1699fab2022-09-08 08:46:06 -0600456 result = uprev_lib.uprev_ebuild_from_pin(
457 package_path, self.new_version, chroot=Chroot()
458 )
459 self.assertEqual(
460 len(result.modified),
461 1,
462 "unexpected number of results: %s" % len(result.modified),
463 )
Trent Begin315d9d92019-12-03 21:55:53 -0700464
Alex Klein1699fab2022-09-08 08:46:06 -0600465 mod = result.modified[0]
466 self.assertEqual(
467 mod.new_version,
468 self.new_version + "-r1",
469 "unexpected version number: %s" % mod.new_version,
470 )
Trent Begin315d9d92019-12-03 21:55:53 -0700471
Alex Klein1699fab2022-09-08 08:46:06 -0600472 old_ebuild_path = os.path.join(
473 package_path, self.ebuild_template % self.version
474 )
475 new_ebuild_path = os.path.join(
476 package_path, self.ebuild_template % self.new_version
477 )
478 manifest_path = os.path.join(package_path, "Manifest")
Trent Begin2e5344f2020-03-02 10:46:55 -0700479
Alex Klein1699fab2022-09-08 08:46:06 -0600480 expected_modified_files = [
481 old_ebuild_path,
482 new_ebuild_path,
483 manifest_path,
484 ]
485 self.assertCountEqual(mod.files, expected_modified_files)
Trent Begin4a11a632020-02-28 12:59:58 -0700486
Alex Klein1699fab2022-09-08 08:46:06 -0600487 self.assertCommandContains(["ebuild", "manifest"])
Trent Begin6daa8702020-01-29 14:58:12 -0700488
Alex Klein1699fab2022-09-08 08:46:06 -0600489 def test_uprev_ebuild_same_version(self):
490 """Tests uprev of ebuild with version path when the version has not changed.
Fergus Dall2209d0b2020-08-06 11:51:43 +1000491
Alex Klein1699fab2022-09-08 08:46:06 -0600492 This should result in bumping the revision number.
493 """
494 file_layout = (
495 D(self.package, [self.ebuild, self.unstable_ebuild, self.manifest]),
496 )
497 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000498
Alex Klein1699fab2022-09-08 08:46:06 -0600499 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000500
Alex Klein1699fab2022-09-08 08:46:06 -0600501 ebuild_path = os.path.join(package_path, self.ebuild)
502 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000503
Alex Klein1699fab2022-09-08 08:46:06 -0600504 result = uprev_lib.uprev_ebuild_from_pin(
505 package_path, self.version, chroot=Chroot()
506 )
507 self.assertEqual(
508 len(result.modified),
509 1,
510 "unexpected number of results: %s" % len(result.modified),
511 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000512
Alex Klein1699fab2022-09-08 08:46:06 -0600513 mod = result.modified[0]
514 self.assertEqual(
515 mod.new_version,
516 self.version + "-r2",
517 "unexpected version number: %s" % mod.new_version,
518 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000519
Alex Klein1699fab2022-09-08 08:46:06 -0600520 old_ebuild_path = os.path.join(
521 package_path, self.ebuild_template % self.version
522 )
523 new_ebuild_path = os.path.join(
524 package_path, "package-%s-r2.ebuild" % self.version
525 )
526 manifest_path = os.path.join(package_path, "Manifest")
Fergus Dall2209d0b2020-08-06 11:51:43 +1000527
Alex Klein1699fab2022-09-08 08:46:06 -0600528 expected_modified_files = [
529 old_ebuild_path,
530 new_ebuild_path,
531 manifest_path,
532 ]
533 self.assertCountEqual(mod.files, expected_modified_files)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000534
Alex Klein1699fab2022-09-08 08:46:06 -0600535 self.assertCommandContains(["ebuild", "manifest"])
Fergus Dall2209d0b2020-08-06 11:51:43 +1000536
Alex Klein1699fab2022-09-08 08:46:06 -0600537 def test_no_ebuild(self):
538 """Tests assertion is raised if package has no ebuilds"""
539 file_layout = (D(self.package, [self.manifest]),)
540 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700541
Alex Klein1699fab2022-09-08 08:46:06 -0600542 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700543
Alex Klein1699fab2022-09-08 08:46:06 -0600544 with self.assertRaises(uprev_lib.EbuildUprevError):
545 uprev_lib.uprev_ebuild_from_pin(
546 package_path, self.new_version, chroot=Chroot()
547 )
Trent Begin315d9d92019-12-03 21:55:53 -0700548
Alex Klein1699fab2022-09-08 08:46:06 -0600549 def test_multiple_stable_ebuilds(self):
550 """Tests assertion is raised if multiple stable ebuilds are present"""
551 file_layout = (
552 D(
553 self.package,
554 [self.ebuild, self.ebuild_template % "1.2.1", self.manifest],
555 ),
556 )
557 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000558
Alex Klein1699fab2022-09-08 08:46:06 -0600559 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000560
Alex Klein1699fab2022-09-08 08:46:06 -0600561 ebuild_path = os.path.join(package_path, self.ebuild)
562 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000563
Alex Klein1699fab2022-09-08 08:46:06 -0600564 ebuild_path = os.path.join(package_path, self.ebuild_template % "1.2.1")
565 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000566
Alex Klein1699fab2022-09-08 08:46:06 -0600567 with self.assertRaises(uprev_lib.EbuildUprevError):
568 uprev_lib.uprev_ebuild_from_pin(
569 package_path, self.new_version, chroot=Chroot()
570 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000571
Alex Klein1699fab2022-09-08 08:46:06 -0600572 def test_multiple_unstable_ebuilds(self):
573 """Tests assertion is raised if multiple unstable ebuilds are present"""
574 file_layout = (
575 D(
576 self.package,
577 [self.ebuild, self.ebuild_template % "1.2.1", self.manifest],
578 ),
579 )
580 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700581
Alex Klein1699fab2022-09-08 08:46:06 -0600582 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700583
Alex Klein1699fab2022-09-08 08:46:06 -0600584 with self.assertRaises(uprev_lib.EbuildUprevError):
585 uprev_lib.uprev_ebuild_from_pin(
586 package_path, self.new_version, chroot=Chroot()
587 )
Trent Begin315d9d92019-12-03 21:55:53 -0700588
589
Andrew Lamb9563a152019-12-04 11:42:18 -0700590class ReplicatePrivateConfigTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600591 """replicate_private_config tests."""
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700592
Alex Klein1699fab2022-09-08 08:46:06 -0600593 def setUp(self):
594 # Set up fake public and private chromeos-config overlays.
595 private_package_root = (
596 "src/private-overlays/overlay-coral-private/chromeos-base/"
597 "chromeos-config-bsp"
598 )
599 self.public_package_root = (
600 "src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp"
601 )
602 file_layout = (
603 D(
604 os.path.join(private_package_root, "files"),
605 ["build_config.json"],
606 ),
607 D(private_package_root, ["replication_config.jsonpb"]),
608 D(
609 os.path.join(self.public_package_root, "files"),
610 ["build_config.json"],
611 ),
612 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700613
Alex Klein1699fab2022-09-08 08:46:06 -0600614 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700615
Alex Klein1699fab2022-09-08 08:46:06 -0600616 # Private config contains 'a' and 'b' fields.
617 self.private_config_path = os.path.join(
618 private_package_root, "files", "build_config.json"
619 )
620 self.WriteTempFile(
621 self.private_config_path,
622 json.dumps({"chromeos": {"configs": [{"a": 3, "b": 2}]}}),
623 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700624
Alex Klein1699fab2022-09-08 08:46:06 -0600625 # Public config only contains the 'a' field. Note that the value of 'a' is
626 # 1 in the public config; it will get updated to 3 when the private config
627 # is replicated.
628 self.public_config_path = os.path.join(
629 self.public_package_root, "files", "build_config.json"
630 )
631 self.WriteTempFile(
632 self.public_config_path,
633 json.dumps({"chromeos": {"configs": [{"a": 1}]}}),
634 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700635
Alex Klein1699fab2022-09-08 08:46:06 -0600636 # Put a ReplicationConfig JSONPB in the private package. Note that it
637 # specifies only the 'a' field is replicated.
638 self.replication_config_path = os.path.join(
639 self.tempdir, private_package_root, "replication_config.jsonpb"
640 )
641 replication_config = ReplicationConfig(
642 file_replication_rules=[
643 FileReplicationRule(
644 source_path=self.private_config_path,
645 destination_path=self.public_config_path,
646 file_type=FILE_TYPE_JSON,
647 replication_type=REPLICATION_TYPE_FILTER,
648 destination_fields=FieldMask(paths=["a"]),
649 )
650 ]
651 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700652
Alex Klein1699fab2022-09-08 08:46:06 -0600653 osutils.WriteFile(
654 self.replication_config_path,
655 json_format.MessageToJson(replication_config),
656 )
657 self.PatchObject(constants, "SOURCE_ROOT", new=self.tempdir)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700658
Alex Klein1699fab2022-09-08 08:46:06 -0600659 self.rc.SetDefaultCmdResult(side_effect=self._write_generated_c_files)
Andrew Lamb9563a152019-12-04 11:42:18 -0700660
Alex Klein1699fab2022-09-08 08:46:06 -0600661 def _write_generated_c_files(self, *_args, **_kwargs):
662 """Write fake generated C files to the public output dir.
Andrew Lamb9563a152019-12-04 11:42:18 -0700663
Alex Klein1699fab2022-09-08 08:46:06 -0600664 Note that this function accepts args and kwargs so it can be used as a side
665 effect.
666 """
667 output_dir = os.path.join(self.public_package_root, "files")
668 self.WriteTempFile(os.path.join(output_dir, "config.c"), "")
669 self.WriteTempFile(os.path.join(output_dir, "ec_config.c"), "")
670 self.WriteTempFile(os.path.join(output_dir, "ec_config.h"), "")
Andrew Lamb9563a152019-12-04 11:42:18 -0700671
Alex Klein1699fab2022-09-08 08:46:06 -0600672 def _write_incorrect_generated_c_files(self, *_args, **_kwargs):
673 """Similar to _write_generated_c_files, with an expected file missing.
Andrew Lamb9563a152019-12-04 11:42:18 -0700674
Alex Klein1699fab2022-09-08 08:46:06 -0600675 Note that this function accepts args and kwargs so it can be used as a side
676 effect.
677 """
678 output_dir = os.path.join(self.public_package_root, "files")
679 self.WriteTempFile(os.path.join(output_dir, "config.c"), "")
680 self.WriteTempFile(os.path.join(output_dir, "ec_config.c"), "")
Andrew Lamb9563a152019-12-04 11:42:18 -0700681
Alex Klein1699fab2022-09-08 08:46:06 -0600682 def test_replicate_private_config(self):
683 """Basic replication test."""
684 refs = [
685 GitRef(
686 path="/chromeos/overlays/overlay-coral-private",
687 ref="main",
688 revision="123",
689 )
690 ]
691 chroot = Chroot()
692 result = packages.replicate_private_config(
693 _build_targets=None, refs=refs, chroot=chroot
694 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700695
Alex Klein1699fab2022-09-08 08:46:06 -0600696 self.assertCommandContains(
697 [
698 "cros_config_schema",
699 "-m",
700 os.path.join(
701 constants.CHROOT_SOURCE_ROOT, self.public_config_path
702 ),
703 "-g",
704 os.path.join(
705 constants.CHROOT_SOURCE_ROOT,
706 self.public_package_root,
707 "files",
708 ),
709 "-f",
710 '"TRUE"',
711 ],
712 enter_chroot=True,
713 chroot_args=chroot.get_enter_args(),
714 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700715
Alex Klein1699fab2022-09-08 08:46:06 -0600716 self.assertEqual(len(result.modified), 1)
717 # The public build_config.json and generated C files were modified.
718 expected_modified_files = [
719 os.path.join(self.tempdir, self.public_config_path),
720 os.path.join(
721 self.tempdir, self.public_package_root, "files", "config.c"
722 ),
723 os.path.join(
724 self.tempdir, self.public_package_root, "files", "ec_config.c"
725 ),
726 os.path.join(
727 self.tempdir, self.public_package_root, "files", "ec_config.h"
728 ),
729 ]
730 self.assertEqual(result.modified[0].files, expected_modified_files)
731 self.assertEqual(result.modified[0].new_version, "123")
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700732
Alex Klein1699fab2022-09-08 08:46:06 -0600733 # The update from the private build_config.json was copied to the public.
734 # Note that only the 'a' field is present, as per destination_fields.
735 self.assertEqual(
736 json.loads(self.ReadTempFile(self.public_config_path)),
737 {"chromeos": {"configs": [{"a": 3}]}},
738 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700739
Alex Klein1699fab2022-09-08 08:46:06 -0600740 def test_replicate_private_config_no_build_config(self):
741 """If there is no build config, don't generate C files."""
742 # Modify the replication config to write to "other_config.json" instead of
743 # "build_config.json"
744 modified_destination_path = self.public_config_path.replace(
745 "build_config", "other_config"
746 )
747 replication_config = ReplicationConfig(
748 file_replication_rules=[
749 FileReplicationRule(
750 source_path=self.private_config_path,
751 destination_path=modified_destination_path,
752 file_type=FILE_TYPE_JSON,
753 replication_type=REPLICATION_TYPE_FILTER,
754 destination_fields=FieldMask(paths=["a"]),
755 )
756 ]
757 )
758 osutils.WriteFile(
759 self.replication_config_path,
760 json_format.MessageToJson(replication_config),
761 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700762
Alex Klein1699fab2022-09-08 08:46:06 -0600763 refs = [
764 GitRef(
765 path="/chromeos/overlays/overlay-coral-private",
766 ref="main",
767 revision="123",
768 )
769 ]
770 result = packages.replicate_private_config(
771 _build_targets=None, refs=refs, chroot=Chroot()
772 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700773
Alex Klein1699fab2022-09-08 08:46:06 -0600774 self.assertEqual(len(result.modified), 1)
775 self.assertEqual(
776 result.modified[0].files,
777 [os.path.join(self.tempdir, modified_destination_path)],
778 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700779
Alex Klein1699fab2022-09-08 08:46:06 -0600780 def test_replicate_private_config_multiple_build_configs(self):
781 """An error is thrown if there is more than one build config."""
782 replication_config = ReplicationConfig(
783 file_replication_rules=[
784 FileReplicationRule(
785 source_path=self.private_config_path,
786 destination_path=self.public_config_path,
787 file_type=FILE_TYPE_JSON,
788 replication_type=REPLICATION_TYPE_FILTER,
789 destination_fields=FieldMask(paths=["a"]),
790 ),
791 FileReplicationRule(
792 source_path=self.private_config_path,
793 destination_path=self.public_config_path,
794 file_type=FILE_TYPE_JSON,
795 replication_type=REPLICATION_TYPE_FILTER,
796 destination_fields=FieldMask(paths=["a"]),
797 ),
798 ]
799 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700800
Alex Klein1699fab2022-09-08 08:46:06 -0600801 osutils.WriteFile(
802 self.replication_config_path,
803 json_format.MessageToJson(replication_config),
804 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700805
Alex Klein1699fab2022-09-08 08:46:06 -0600806 refs = [
807 GitRef(
808 path="/chromeos/overlays/overlay-coral-private",
809 ref="main",
810 revision="123",
811 )
812 ]
813 with self.assertRaisesRegex(
814 ValueError,
815 "Expected at most one build_config.json destination path.",
816 ):
817 packages.replicate_private_config(
818 _build_targets=None, refs=refs, chroot=Chroot()
819 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700820
Alex Klein1699fab2022-09-08 08:46:06 -0600821 def test_replicate_private_config_generated_files_incorrect(self):
822 """An error is thrown if generated C files are missing."""
823 self.rc.SetDefaultCmdResult(
824 side_effect=self._write_incorrect_generated_c_files
825 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700826
Alex Klein1699fab2022-09-08 08:46:06 -0600827 refs = [
828 GitRef(
829 path="/chromeos/overlays/overlay-coral-private",
830 ref="main",
831 revision="123",
832 )
833 ]
834 chroot = Chroot()
Andrew Lamb9563a152019-12-04 11:42:18 -0700835
Alex Klein1699fab2022-09-08 08:46:06 -0600836 with self.assertRaisesRegex(
837 packages.GeneratedCrosConfigFilesError,
838 "Expected to find generated C files",
839 ):
840 packages.replicate_private_config(
841 _build_targets=None, refs=refs, chroot=chroot
842 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700843
Alex Klein1699fab2022-09-08 08:46:06 -0600844 def test_replicate_private_config_wrong_number_of_refs(self):
845 """An error is thrown if there is not exactly one ref."""
846 with self.assertRaisesRegex(ValueError, "Expected exactly one ref"):
847 packages.replicate_private_config(
848 _build_targets=None, refs=[], chroot=None
849 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700850
Alex Klein1699fab2022-09-08 08:46:06 -0600851 with self.assertRaisesRegex(ValueError, "Expected exactly one ref"):
852 refs = [
853 GitRef(path="a", ref="main", revision="1"),
854 GitRef(path="a", ref="main", revision="2"),
855 ]
856 packages.replicate_private_config(
857 _build_targets=None, refs=refs, chroot=None
858 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700859
Alex Klein1699fab2022-09-08 08:46:06 -0600860 def test_replicate_private_config_replication_config_missing(self):
861 """An error is thrown if there is not a replication config."""
862 os.remove(self.replication_config_path)
863 with self.assertRaisesRegex(
864 ValueError,
865 "Expected ReplicationConfig missing at %s"
866 % self.replication_config_path,
867 ):
868 refs = [
869 GitRef(
870 path="/chromeos/overlays/overlay-coral-private",
871 ref="main",
872 revision="123",
873 )
874 ]
875 packages.replicate_private_config(
876 _build_targets=None, refs=refs, chroot=None
877 )
Andrew Lambe836f222019-12-09 12:27:38 -0700878
Alex Klein1699fab2022-09-08 08:46:06 -0600879 def test_replicate_private_config_wrong_git_ref_path(self):
880 """An error is thrown if the git ref doesn't point to a private overlay."""
881 with self.assertRaisesRegex(
882 ValueError, "ref.path must match the pattern"
883 ):
884 refs = [GitRef(path="a/b/c", ref="main", revision="123")]
885 packages.replicate_private_config(
886 _build_targets=None, refs=refs, chroot=None
887 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700888
889
Alex Klein5caab872021-09-10 11:44:37 -0600890class GetBestVisibleTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600891 """get_best_visible tests."""
David Burger1e0fe232019-07-01 14:52:07 -0600892
Alex Klein1699fab2022-09-08 08:46:06 -0600893 def test_empty_atom_fails(self):
894 """Test empty atom raises an error."""
895 with self.assertRaises(AssertionError):
896 packages.get_best_visible("")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600897
898
Alex Klein149fd3b2019-12-16 16:01:05 -0700899class HasPrebuiltTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600900 """has_prebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600901
Alex Klein1699fab2022-09-08 08:46:06 -0600902 def test_empty_atom_fails(self):
903 """Test an empty atom results in an error."""
904 with self.assertRaises(AssertionError):
905 packages.has_prebuilt("")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600906
Alex Klein1699fab2022-09-08 08:46:06 -0600907 def test_use_flags(self):
908 """Test use flags get propagated correctly."""
909 # We don't really care about the result, just the env handling.
910 patch = self.PatchObject(portage_util, "HasPrebuilt", return_value=True)
911 # Ignore any flags that may be in the environment.
912 self.PatchObject(os.environ, "get", return_value="")
Alex Klein149fd3b2019-12-16 16:01:05 -0700913
Alex Klein1699fab2022-09-08 08:46:06 -0600914 packages.has_prebuilt("cat/pkg-1.2.3", useflags="useflag")
915 patch.assert_called_with(
916 "cat/pkg-1.2.3", board=None, extra_env={"USE": "useflag"}
917 )
Alex Klein149fd3b2019-12-16 16:01:05 -0700918
Alex Klein1699fab2022-09-08 08:46:06 -0600919 def test_env_use_flags(self):
920 """Test env use flags get propagated correctly with passed useflags."""
921 # We don't really care about the result, just the env handling.
922 patch = self.PatchObject(portage_util, "HasPrebuilt", return_value=True)
923 # Add some flags to the environment.
924 existing_flags = "already set flags"
925 self.PatchObject(os.environ, "get", return_value=existing_flags)
Alex Klein149fd3b2019-12-16 16:01:05 -0700926
Alex Klein1699fab2022-09-08 08:46:06 -0600927 new_flags = "useflag"
928 packages.has_prebuilt("cat/pkg-1.2.3", useflags=new_flags)
929 expected = "%s %s" % (existing_flags, new_flags)
930 patch.assert_called_with(
931 "cat/pkg-1.2.3", board=None, extra_env={"USE": expected}
932 )
Alex Klein149fd3b2019-12-16 16:01:05 -0700933
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600934
935class AndroidVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600936 """Tests getting android versions."""
Michael Mortensen14960d02019-10-18 07:53:59 -0600937
Alex Klein1699fab2022-09-08 08:46:06 -0600938 def setUp(self):
939 package_result = [
940 "chromeos-base/android-container-nyc-4717008-r1",
941 "chromeos-base/update_engine-0.0.3-r3408",
942 ]
943 self.PatchObject(
944 portage_util, "GetPackageDependencies", return_value=package_result
945 )
946 self.board = "board"
947 self.PatchObject(
948 portage_util,
949 "FindEbuildForBoardPackage",
950 return_value="chromeos-base/android-container-nyc",
951 )
952 FakeEnvironment = {
953 "ARM_TARGET": "3-linux-target",
954 }
955 self.PatchObject(
956 osutils, "SourceEnvironment", return_value=FakeEnvironment
957 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600958
Alex Klein1699fab2022-09-08 08:46:06 -0600959 # Clear the LRU cache for the function. We mock the function that provides
960 # the data this function processes to produce its result, so we need to
961 # clear it manually.
962 packages.determine_android_package.cache_clear()
Alex Klein68a28712021-11-08 11:08:30 -0700963
Alex Klein1699fab2022-09-08 08:46:06 -0600964 def test_determine_android_version(self):
965 """Tests that a valid android version is returned."""
966 version = packages.determine_android_version(self.board)
967 self.assertEqual(version, "4717008")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600968
Alex Klein1699fab2022-09-08 08:46:06 -0600969 def test_determine_android_version_when_not_present(self):
970 """Tests that a None is returned for version when android is not present."""
971 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
972 self.PatchObject(
973 portage_util, "GetPackageDependencies", return_value=package_result
974 )
975 version = packages.determine_android_version(self.board)
976 self.assertEqual(version, None)
Michael Mortensenedf76532019-10-16 14:22:37 -0600977
Alex Klein1699fab2022-09-08 08:46:06 -0600978 def test_determine_android_branch(self):
979 """Tests that a valid android branch is returned."""
980 branch = packages.determine_android_branch(self.board)
981 self.assertEqual(branch, "3")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600982
Alex Klein1699fab2022-09-08 08:46:06 -0600983 def test_determine_android_branch_64bit_targets(self):
984 """Tests that a valid android branch is returned with only 64bit targets."""
985 self.PatchObject(
986 osutils,
987 "SourceEnvironment",
988 return_value={"ARM64_TARGET": "3-linux-target"},
989 )
990 branch = packages.determine_android_branch(self.board)
991 self.assertEqual(branch, "3")
Federico 'Morg' Pareschicd9165a2020-05-29 09:45:55 +0900992
Alex Klein1699fab2022-09-08 08:46:06 -0600993 def test_determine_android_branch_when_not_present(self):
994 """Tests that a None is returned for branch when android is not present."""
995 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
996 self.PatchObject(
997 portage_util, "GetPackageDependencies", return_value=package_result
998 )
999 branch = packages.determine_android_branch(self.board)
1000 self.assertEqual(branch, None)
Michael Mortensenedf76532019-10-16 14:22:37 -06001001
Alex Klein1699fab2022-09-08 08:46:06 -06001002 def test_determine_android_target(self):
1003 """Tests that a valid android target is returned."""
1004 target = packages.determine_android_target(self.board)
1005 self.assertEqual(target, "cheets")
Michael Mortensenc2615b72019-10-15 08:12:24 -06001006
Alex Klein1699fab2022-09-08 08:46:06 -06001007 def test_determine_android_target_when_not_present(self):
1008 """Tests that a None is returned for target when android is not present."""
1009 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
1010 self.PatchObject(
1011 portage_util, "GetPackageDependencies", return_value=package_result
1012 )
1013 target = packages.determine_android_target(self.board)
1014 self.assertEqual(target, None)
Michael Mortensenedf76532019-10-16 14:22:37 -06001015
Alex Klein1699fab2022-09-08 08:46:06 -06001016 def test_determine_android_version_handle_exception(self):
1017 """Tests handling RunCommandError inside determine_android_version."""
1018 # Mock what happens when portage returns that bubbles up (via RunCommand)
1019 # inside portage_util.GetPackageDependencies.
1020 self.PatchObject(
1021 portage_util,
1022 "GetPackageDependencies",
1023 side_effect=cros_build_lib.RunCommandError("error"),
1024 )
1025 target = packages.determine_android_version(self.board)
1026 self.assertEqual(target, None)
Michael Mortensene0f4b542019-10-24 15:30:23 -06001027
Alex Klein1699fab2022-09-08 08:46:06 -06001028 def test_determine_android_package_handle_exception(self):
1029 """Tests handling RunCommandError inside determine_android_package."""
1030 # Mock what happens when portage returns that bubbles up (via RunCommand)
1031 # inside portage_util.GetPackageDependencies.
1032 self.PatchObject(
1033 portage_util,
1034 "GetPackageDependencies",
1035 side_effect=cros_build_lib.RunCommandError("error"),
1036 )
1037 target = packages.determine_android_package(self.board)
1038 self.assertEqual(target, None)
Michael Mortensene0f4b542019-10-24 15:30:23 -06001039
Alex Klein1699fab2022-09-08 08:46:06 -06001040 def test_determine_android_package_callers_handle_exception(self):
1041 """Tests handling RunCommandError by determine_android_package callers."""
1042 # Mock what happens when portage returns that bubbles up (via RunCommand)
1043 # inside portage_util.GetPackageDependencies.
1044 self.PatchObject(
1045 portage_util,
1046 "GetPackageDependencies",
1047 side_effect=cros_build_lib.RunCommandError("error"),
1048 )
1049 # Verify that target is None, as expected.
1050 target = packages.determine_android_package(self.board)
1051 self.assertEqual(target, None)
1052 # determine_android_branch calls determine_android_package
1053 branch = packages.determine_android_branch(self.board)
1054 self.assertEqual(branch, None)
1055 # determine_android_target calls determine_android_package
1056 target = packages.determine_android_target(self.board)
1057 self.assertEqual(target, None)
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001058
Michael Mortensene0f4b542019-10-24 15:30:23 -06001059
Alex Klein1699fab2022-09-08 08:46:06 -06001060@pytest.mark.usefixtures("testcase_caplog", "testcase_monkeypatch")
Michael Mortensende716a12020-05-15 11:27:00 -06001061class FindFingerprintsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001062 """Tests for find_fingerprints."""
Michael Mortensende716a12020-05-15 11:27:00 -06001063
Alex Klein1699fab2022-09-08 08:46:06 -06001064 def setUp(self):
1065 self.board = "test-board"
1066 # Create cheets-fingerprints.txt based on tempdir/src...
1067 self.fingerprint_contents = (
1068 "google/test-board/test-board_cheets"
1069 ":9/R99-12345.0.9999/123456:user/release-keys"
1070 )
1071 fingerprint_path = os.path.join(
1072 self.tempdir,
1073 "src/build/images/test-board/latest/cheets-fingerprint.txt",
1074 )
1075 self.chroot = Chroot(self.tempdir)
1076 osutils.WriteFile(
1077 fingerprint_path, self.fingerprint_contents, makedirs=True
1078 )
Michael Mortensende716a12020-05-15 11:27:00 -06001079
Alex Klein1699fab2022-09-08 08:46:06 -06001080 def test_find_fingerprints_with_test_path(self):
1081 """Tests get_firmware_versions with mocked output."""
1082 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1083 build_target = build_target_lib.BuildTarget(self.board)
1084 result = packages.find_fingerprints(build_target)
1085 self.assertEqual(result, [self.fingerprint_contents])
1086 self.assertIn("Reading fingerprint file", self.caplog.text)
Michael Mortensende716a12020-05-15 11:27:00 -06001087
Alex Klein1699fab2022-09-08 08:46:06 -06001088 def test_find_fingerprints(self):
1089 """Tests get_firmware_versions with mocked output."""
1090 # Use board name whose path for fingerprint file does not exist.
1091 # Verify that fingerprint file is not found and None is returned.
1092 build_target = build_target_lib.BuildTarget("wrong-boardname")
1093 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1094 result = packages.find_fingerprints(build_target)
1095 self.assertEqual(result, [])
1096 self.assertIn("Fingerprint file not found", self.caplog.text)
Michael Mortensende716a12020-05-15 11:27:00 -06001097
1098
Michael Mortensen59e30872020-05-18 14:12:49 -06001099class GetAllFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001100 """Tests for get_firmware_versions."""
Michael Mortensen59e30872020-05-18 14:12:49 -06001101
Alex Klein1699fab2022-09-08 08:46:06 -06001102 def setUp(self):
1103 self.board = "test-board"
1104 self.rc.SetDefaultCmdResult(
1105 stdout="""
Michael Mortensen59e30872020-05-18 14:12:49 -06001106
1107flashrom(8): 68935ee2fcfcffa47af81b966269cd2b */build/reef/usr/sbin/flashrom
1108 ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e102cc98d45300b50088999d53775acbeff407dc, stripped
1109 0.9.9 : bbb2d6a : Jul 28 2017 15:12:34 UTC
1110
1111Model: reef
1112BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
1113BIOS version: Google_Reef.9042.87.1
1114BIOS (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
1115BIOS (RW) version: Google_Reef.9042.110.0
1116EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
1117EC version: reef_v1.1.5900-ab1ee51
1118EC (RW) version: reef_v1.1.5909-bd1f0c9
1119
1120Model: pyro
1121BIOS image: 9e62447ebf22a724a4a835018ab6234e */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/image.bin
1122BIOS version: Google_Pyro.9042.87.1
1123BIOS (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
1124BIOS (RW) version: Google_Pyro.9042.110.0
1125EC image: 44b93ed591733519e752e05aa0529eb5 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/ec.bin
1126EC version: pyro_v1.1.5900-ab1ee51
1127EC (RW) version: pyro_v1.1.5909-bd1f0c9
1128
1129Model: snappy
1130BIOS image: 3ab63ff080596bd7de4e7619f003bb64 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/image.bin
1131BIOS version: Google_Snappy.9042.110.0
1132EC image: c4db159e84428391d2ee25368c5fe5b6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/ec.bin
1133EC version: snappy_v1.1.5909-bd1f0c9
1134
1135Model: sand
1136BIOS image: 387da034a4f0a3f53e278ebfdcc2a412 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/image.bin
1137BIOS version: Google_Sand.9042.110.0
1138EC image: 411562e0589dacec131f5fdfbe95a561 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/ec.bin
1139EC version: sand_v1.1.5909-bd1f0c9
1140
1141Model: electro
1142BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
1143BIOS version: Google_Reef.9042.87.1
1144BIOS (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
1145BIOS (RW) version: Google_Reef.9042.110.0
1146EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
1147EC version: reef_v1.1.5900-ab1ee51
1148EC (RW) version: reef_v1.1.5909-bd1f0c9
1149
1150Package Content:
1151612e7bb6ed1fb0a05abf2ebdc834c18b *./updater4.sh
11520eafbee07282315829d0f42135ec7c0c *./gbb_utility
11536074e3ca424cb30a67c378c1d9681f9c *./mosys
115468935ee2fcfcffa47af81b966269cd2b *./flashrom
11550eafbee07282315829d0f42135ec7c0c *./dump_fmap
1156490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
115760899148600b8673ddb711faa55aee40 *./common.sh
11583c3a99346d1ca1273cbcd86c104851ff *./shflags
1159de7ce035e1f82a89f8909d888ee402c0 *./crosutil.sh
1160f9334372bdb9036ba09a6fd9bf30e7a2 *./crossystem
116122257a8d5f0adc1f50a1916c3a4a35dd *./models/reef/ec.bin
1162faf12dbb7cdaf21ce153bdffb67841fd *./models/reef/bios.bin
1163c9bbb417b7921b85a7ed999ee42f550e *./models/reef/setvars.sh
116429823d46f1ec1491ecacd7b830fd2686 *./models/pyro/ec.bin
11652320463aba8b22eb5ea836f094d281b3 *./models/pyro/bios.bin
116681614833ad77c9cd093360ba7bea76b8 *./models/pyro/setvars.sh
1167411562e0589dacec131f5fdfbe95a561 *./models/sand/ec.bin
1168387da034a4f0a3f53e278ebfdcc2a412 *./models/sand/bios.bin
1169fcd8cb0ac0e2ed6be220aaae435d43ff *./models/sand/setvars.sh
1170c4db159e84428391d2ee25368c5fe5b6 *./models/snappy/ec.bin
11713ab63ff080596bd7de4e7619f003bb64 *./models/snappy/bios.bin
1172fe5d699f2e9e4a7de031497953313dbd *./models/snappy/setvars.sh
117379aabd7cd8a215a54234c53d7bb2e6fb *./vpd
Alex Klein1699fab2022-09-08 08:46:06 -06001174"""
1175 )
Michael Mortensen59e30872020-05-18 14:12:49 -06001176
Alex Klein1699fab2022-09-08 08:46:06 -06001177 def test_get_firmware_versions(self):
1178 """Tests get_firmware_versions with mocked output."""
1179 build_target = build_target_lib.BuildTarget(self.board)
1180 result = packages.get_all_firmware_versions(build_target)
1181 self.assertEqual(len(result), 5)
1182 self.assertEqual(
1183 result["reef"],
1184 packages.FirmwareVersions(
1185 "reef",
1186 "Google_Reef.9042.87.1",
1187 "Google_Reef.9042.110.0",
1188 "reef_v1.1.5900-ab1ee51",
1189 "reef_v1.1.5909-bd1f0c9",
1190 ),
1191 )
1192 self.assertEqual(
1193 result["pyro"],
1194 packages.FirmwareVersions(
1195 "pyro",
1196 "Google_Pyro.9042.87.1",
1197 "Google_Pyro.9042.110.0",
1198 "pyro_v1.1.5900-ab1ee51",
1199 "pyro_v1.1.5909-bd1f0c9",
1200 ),
1201 )
1202 self.assertEqual(
1203 result["snappy"],
1204 packages.FirmwareVersions(
1205 "snappy",
1206 "Google_Snappy.9042.110.0",
1207 None,
1208 "snappy_v1.1.5909-bd1f0c9",
1209 None,
1210 ),
1211 )
1212 self.assertEqual(
1213 result["sand"],
1214 packages.FirmwareVersions(
1215 "sand",
1216 "Google_Sand.9042.110.0",
1217 None,
1218 "sand_v1.1.5909-bd1f0c9",
1219 None,
1220 ),
1221 )
1222 self.assertEqual(
1223 result["electro"],
1224 packages.FirmwareVersions(
1225 "electro",
1226 "Google_Reef.9042.87.1",
1227 "Google_Reef.9042.110.0",
1228 "reef_v1.1.5900-ab1ee51",
1229 "reef_v1.1.5909-bd1f0c9",
1230 ),
1231 )
Michael Mortensen59e30872020-05-18 14:12:49 -06001232
Alex Klein1699fab2022-09-08 08:46:06 -06001233 def test_get_firmware_versions_error(self):
1234 """Tests get_firmware_versions with no output."""
1235 # Throw an exception when running the command.
1236 self.PatchObject(
1237 cros_build_lib,
1238 "run",
1239 side_effect=cros_build_lib.RunCommandError("error"),
1240 )
1241 build_target = build_target_lib.BuildTarget(self.board)
1242 result = packages.get_all_firmware_versions(build_target)
1243 self.assertEqual(result, {})
Benjamin Shai12c767e2022-01-12 15:17:44 +00001244
Michael Mortensen59e30872020-05-18 14:12:49 -06001245
Michael Mortensen71ef5682020-05-07 14:29:24 -06001246class GetFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001247 """Tests for get_firmware_versions."""
Michael Mortensen71ef5682020-05-07 14:29:24 -06001248
Alex Klein1699fab2022-09-08 08:46:06 -06001249 def setUp(self):
1250 self.board = "test-board"
1251 self.rc.SetDefaultCmdResult(
1252 stdout="""
Michael Mortensen71ef5682020-05-07 14:29:24 -06001253
1254flashrom(8): a8f99c2e61e7dc09c4b25ef5a76ef692 */build/kevin/usr/sbin/flashrom
1255 ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.d
1256 0.9.4 : 860875a : Apr 10 2017 23:54:29 UTC
1257
1258BIOS image: 6b5b855a0b8fd1657546d1402c15b206 *chromeos-firmware-kevin-0.0.1/.dist/kevin_fw_8785.178.0.n
1259BIOS version: Google_Kevin.8785.178.0
1260EC image: 1ebfa9518e6cac0558a80b7ab2f5b489 *chromeos-firmware-kevin-0.0.1/.dist/kevin_ec_8785.178.0.n
1261EC version:kevin_v1.10.184-459421c
1262
1263Package Content:
1264a8f99c2e61e7dc09c4b25ef5a76ef692 *./flashrom
12653c3a99346d1ca1273cbcd86c104851ff *./shflags
1266457a8dc8546764affc9700f8da328d23 *./dump_fmap
1267c392980ddb542639edf44a965a59361a *./updater5.sh
1268490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
12696b5b855a0b8fd1657546d1402c15b206 *./bios.bin
12707b5bef0d2da90c23ff2e157250edf0fa *./crosutil.sh
1271d78722e4f1a0dc2d8c3d6b0bc7010ae3 *./crossystem
1272457a8dc8546764affc9700f8da328d23 *./gbb_utility
12731ebfa9518e6cac0558a80b7ab2f5b489 *./ec.bin
1274c98ca54db130886142ad582a58e90ddc *./common.sh
12755ba978bdec0f696f47f0f0de90936880 *./mosys
1276312e8ee6122057f2a246d7bcf1572f49 *./vpd
Alex Klein1699fab2022-09-08 08:46:06 -06001277"""
1278 )
Michael Mortensen71ef5682020-05-07 14:29:24 -06001279
Alex Klein1699fab2022-09-08 08:46:06 -06001280 def test_get_firmware_versions(self):
1281 """Tests get_firmware_versions with mocked output."""
1282 build_target = build_target_lib.BuildTarget(self.board)
1283 result = packages.get_firmware_versions(build_target)
1284 versions = packages.FirmwareVersions(
1285 None,
1286 "Google_Kevin.8785.178.0",
1287 None,
1288 "kevin_v1.10.184-459421c",
1289 None,
1290 )
1291 self.assertEqual(result, versions)
Michael Mortensen71ef5682020-05-07 14:29:24 -06001292
1293
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001294class DetermineKernelVersionTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001295 """Tests for determine_kernel_version."""
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001296
Alex Klein1699fab2022-09-08 08:46:06 -06001297 def setUp(self):
1298 self.board = "test-board"
1299 self.build_target = build_target_lib.BuildTarget(self.board)
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001300
Alex Klein1699fab2022-09-08 08:46:06 -06001301 def test_determine_kernel_version(self):
1302 """Tests that a valid kernel version is returned."""
Lizzy Presland0b978e62022-09-09 16:55:29 +00001303 kernel_candidates = [
1304 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
Alex Klein1699fab2022-09-08 08:46:06 -06001305 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
Lizzy Presland0b978e62022-09-09 16:55:29 +00001306 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1307 "sys-kernel/upstream-kernel-next-9999",
1308 "sys-kernel/socfpga-kernel-4.20-r34",
Alex Klein1699fab2022-09-08 08:46:06 -06001309 ]
1310 self.PatchObject(
Lizzy Presland0b978e62022-09-09 16:55:29 +00001311 portage_util,
1312 "GetFlattenedDepsForPackage",
1313 return_value=kernel_candidates,
1314 )
1315
1316 installed_pkgs = [
1317 "sys-kernel/linux-firmware-0.0.1-r594",
1318 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1319 "virtual/linux-sources-1-r30",
1320 ]
1321 self.PatchObject(
1322 portage_util,
1323 "GetPackageDependencies",
1324 return_value=installed_pkgs,
Alex Klein1699fab2022-09-08 08:46:06 -06001325 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001326
Alex Klein1699fab2022-09-08 08:46:06 -06001327 result = packages.determine_kernel_version(self.build_target)
1328 self.assertEqual(result, "4.4.223-r2209")
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001329
Lizzy Presland0b978e62022-09-09 16:55:29 +00001330 def test_determine_kernel_version_ignores_exact_duplicates(self):
1331 """Tests that multiple results for candidates is ignored."""
1332 # Depgraph is evaluated for version as well as revision, so graph will
1333 # return all results twice.
1334 kernel_candidates = [
1335 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1336 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1337 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1338 "sys-kernel/upstream-kernel-next-9999",
1339 "sys-kernel/socfpga-kernel-4.20-r34",
1340 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1341 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1342 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1343 "sys-kernel/upstream-kernel-next-9999",
1344 "sys-kernel/socfpga-kernel-4.20-r34",
1345 ]
1346 self.PatchObject(
1347 portage_util,
1348 "GetFlattenedDepsForPackage",
1349 return_value=kernel_candidates,
1350 )
1351
1352 installed_pkgs = [
1353 "sys-kernel/linux-firmware-0.0.1-r594",
1354 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1355 "virtual/linux-sources-1-r30",
1356 ]
Alex Klein1699fab2022-09-08 08:46:06 -06001357 self.PatchObject(
1358 portage_util,
1359 "GetPackageDependencies",
Lizzy Presland0b978e62022-09-09 16:55:29 +00001360 return_value=installed_pkgs,
1361 )
1362
1363 result = packages.determine_kernel_version(self.build_target)
1364 self.assertEqual(result, "4.4.223-r2209")
1365
1366 def test_determine_kernel_version_ignores_virtual_package(self):
1367 """Tests that top-level package is ignored as potential kernel pkg."""
1368 # Depgraph results include the named package at level 0 as well as its
1369 # first-order dependencies, so verify that the virtual package is not
1370 # included as a kernel package.
1371 kernel_candidates = [
1372 "virtual/linux-sources-1",
1373 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1374 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1375 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1376 "sys-kernel/upstream-kernel-next-9999",
1377 "sys-kernel/socfpga-kernel-4.20-r34",
1378 "virtual/linux-sources-1-r30",
1379 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1380 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1381 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1382 "sys-kernel/upstream-kernel-next-9999",
1383 "sys-kernel/socfpga-kernel-4.20-r34",
1384 ]
1385 self.PatchObject(
1386 portage_util,
1387 "GetFlattenedDepsForPackage",
1388 return_value=kernel_candidates,
1389 )
1390
1391 installed_pkgs = [
1392 "sys-kernel/linux-firmware-0.0.1-r594",
1393 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1394 "virtual/linux-sources-1-r30",
1395 ]
1396 self.PatchObject(
1397 portage_util,
1398 "GetPackageDependencies",
1399 return_value=installed_pkgs,
1400 )
1401
1402 result = packages.determine_kernel_version(self.build_target)
1403 self.assertEqual(result, "4.4.223-r2209")
1404
1405 def test_determine_kernel_version_too_many(self):
1406 """Tests that an exception is thrown with too many matching packages."""
1407 package_result = [
1408 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1409 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1410 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1411 "sys-kernel/upstream-kernel-next-9999",
1412 "sys-kernel/socfpga-kernel-4.20-r34",
1413 ]
1414 self.PatchObject(
1415 portage_util,
1416 "GetFlattenedDepsForPackage",
1417 return_value=package_result,
1418 )
1419
1420 installed_pkgs = [
1421 "sys-kernel/linux-firmware-0.0.1-r594",
1422 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1423 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1424 "virtual/linux-sources-1-r30",
1425 ]
1426 self.PatchObject(
1427 portage_util,
1428 "GetPackageDependencies",
1429 return_value=installed_pkgs,
1430 )
1431
1432 with self.assertRaises(packages.KernelVersionError):
1433 packages.determine_kernel_version(self.build_target)
1434
1435 def test_determine_kernel_version_no_kernel_match(self):
1436 """Tests that an exception is thrown with 0-sized intersection."""
1437 package_result = [
1438 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1439 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1440 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1441 "sys-kernel/upstream-kernel-next-9999",
1442 ]
1443 self.PatchObject(
1444 portage_util,
1445 "GetFlattenedDepsForPackage",
1446 return_value=package_result,
1447 )
1448
1449 installed_pkgs = [
1450 "sys-kernel/linux-firmware-0.0.1-r594",
1451 "sys-kernel/socfpga-kernel-4.20-r34",
1452 "virtual/linux-sources-1-r30",
1453 ]
1454 self.PatchObject(
1455 portage_util,
1456 "GetPackageDependencies",
1457 return_value=installed_pkgs,
1458 )
1459
1460 with self.assertRaises(packages.KernelVersionError):
1461 packages.determine_kernel_version(self.build_target)
1462
1463 def test_determine_kernel_version_exception(self):
1464 """Tests that portage_util exceptions result in returning empty str."""
1465 self.PatchObject(
1466 portage_util,
1467 "GetFlattenedDepsForPackage",
Alex Klein1699fab2022-09-08 08:46:06 -06001468 side_effect=cros_build_lib.RunCommandError("error"),
1469 )
1470 result = packages.determine_kernel_version(self.build_target)
Lizzy Presland0b978e62022-09-09 16:55:29 +00001471 self.assertEqual(result, "")
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001472
Alex Klein627e04c2021-11-10 15:56:47 -07001473
Michael Mortensenc2615b72019-10-15 08:12:24 -06001474class ChromeVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001475 """Tests getting chrome version."""
Michael Mortensen14960d02019-10-18 07:53:59 -06001476
Alex Klein1699fab2022-09-08 08:46:06 -06001477 def setUp(self):
1478 self.build_target = build_target_lib.BuildTarget("board")
Michael Mortensenc2615b72019-10-15 08:12:24 -06001479
Alex Klein1699fab2022-09-08 08:46:06 -06001480 def test_determine_chrome_version(self):
1481 """Tests that a valid chrome version is returned."""
1482 # Mock PortageqBestVisible to return a valid chrome version string.
1483 r1_cpf = "chromeos-base/chromeos-chrome-78.0.3900.0_rc-r1"
1484 r1_cpv = package_info.SplitCPV(r1_cpf)
1485 self.PatchObject(
1486 portage_util, "PortageqBestVisible", return_value=r1_cpv
1487 )
Michael Mortensenc2615b72019-10-15 08:12:24 -06001488
Alex Klein1699fab2022-09-08 08:46:06 -06001489 chrome_version = packages.determine_chrome_version(self.build_target)
1490 version_numbers = chrome_version.split(".")
1491 self.assertEqual(len(version_numbers), 4)
1492 self.assertEqual(int(version_numbers[0]), 78)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001493
Alex Klein1699fab2022-09-08 08:46:06 -06001494 def test_determine_chrome_version_handle_exception(self):
1495 # Mock what happens when portage throws an exception that bubbles up (via
1496 # RunCommand)inside portage_util.PortageqBestVisible.
1497 self.PatchObject(
1498 portage_util,
1499 "PortageqBestVisible",
1500 side_effect=cros_build_lib.RunCommandError("error"),
1501 )
1502 target = packages.determine_chrome_version(self.build_target)
1503 self.assertEqual(target, None)
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001504
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001505
1506class PlatformVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001507 """Tests getting platform version."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001508
Alex Klein1699fab2022-09-08 08:46:06 -06001509 def test_determine_platform_version(self):
1510 """Test checking that a valid platform version is returned."""
1511 platform_version = packages.determine_platform_version()
1512 # The returned platform version is something like 12603.0.0.
1513 version_string_list = platform_version.split(".")
1514 self.assertEqual(len(version_string_list), 3)
1515 # We don't want to check an exact version, but the first number should be
1516 # non-zero.
1517 self.assertGreaterEqual(int(version_string_list[0]), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001518
Alex Klein1699fab2022-09-08 08:46:06 -06001519 def test_determine_milestone_version(self):
1520 """Test checking that a valid milestone version is returned."""
1521 milestone_version = packages.determine_milestone_version()
1522 # Milestone version should be non-zero
1523 self.assertGreaterEqual(int(milestone_version), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001524
Alex Klein1699fab2022-09-08 08:46:06 -06001525 def test_determine_full_version(self):
1526 """Test checking that a valid full version is returned."""
1527 full_version = packages.determine_full_version()
1528 pattern = r"^R(\d+)-(\d+.\d+.\d+(-rc\d+)*)"
1529 m = re.match(pattern, full_version)
1530 self.assertTrue(m)
1531 milestone_version = m.group(1)
1532 self.assertGreaterEqual(int(milestone_version), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001533
Alex Klein1699fab2022-09-08 08:46:06 -06001534 def test_versions_based_on_mock(self):
1535 # Create a test version_info object, and than mock VersionInfo.from_repo
1536 # return it.
1537 test_platform_version = "12575.0.0"
1538 test_chrome_branch = "75"
1539 version_info_mock = chromeos_version.VersionInfo(test_platform_version)
1540 version_info_mock.chrome_branch = test_chrome_branch
1541 self.PatchObject(
1542 chromeos_version.VersionInfo,
1543 "from_repo",
1544 return_value=version_info_mock,
1545 )
1546 test_full_version = (
1547 "R" + test_chrome_branch + "-" + test_platform_version
1548 )
1549 platform_version = packages.determine_platform_version()
1550 milestone_version = packages.determine_milestone_version()
1551 full_version = packages.determine_full_version()
1552 self.assertEqual(platform_version, test_platform_version)
1553 self.assertEqual(milestone_version, test_chrome_branch)
1554 self.assertEqual(full_version, test_full_version)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001555
1556
1557# Each of the columns in the following table is a separate dimension along
1558# which Chrome uprev test cases can vary in behavior. The full test space would
1559# be the Cartesian product of the possible values of each column.
1560# 'CHROME_EBUILD' refers to the relationship between the version of the existing
1561# Chrome ebuild vs. the requested uprev version. 'FOLLOWER_EBUILDS' refers to
1562# the same relationship but for the packages defined in OTHER_CHROME_PACKAGES.
1563# 'EBUILDS MODIFIED' refers to whether any of the existing 9999 ebuilds have
1564# modified contents relative to their corresponding stable ebuilds.
1565#
1566# CHROME_EBUILD FOLLOWER_EBUILDS EBUILDS_MODIFIED
1567#
1568# HIGHER HIGHER YES
1569# SAME SAME NO
1570# LOWER LOWER
1571# DOESN'T EXIST YET
1572
1573# These test cases cover both CHROME & FOLLOWER ebuilds being identically
1574# higher, lower, or the same versions, with no modified ebuilds.
1575UPREV_VERSION_CASES = (
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001576 # Uprev.
Chris McDonaldea0312c2020-05-04 23:33:15 -06001577 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001578 "80.0.8080.0",
1579 "81.0.8181.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001580 # One added and one deleted for chrome and each "other" package.
1581 2 * (1 + len(constants.OTHER_CHROME_PACKAGES)),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001582 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001583 id="newer_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001584 ),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001585 # Revbump.
1586 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001587 "80.0.8080.0",
1588 "80.0.8080.0",
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001589 2,
1590 True,
Alex Klein1699fab2022-09-08 08:46:06 -06001591 id="chrome_revbump",
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001592 ),
Chris McDonaldea0312c2020-05-04 23:33:15 -06001593 # No files should be changed in these cases.
1594 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001595 "80.0.8080.0",
1596 "80.0.8080.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001597 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001598 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001599 id="same_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001600 ),
1601 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001602 "80.0.8080.0",
1603 "79.0.7979.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001604 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001605 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001606 id="older_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001607 ),
1608)
1609
1610
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001611@pytest.mark.parametrize(
Alex Klein1699fab2022-09-08 08:46:06 -06001612 "old_version, new_version, expected_count, modify_unstable",
1613 UPREV_VERSION_CASES,
1614)
1615def test_uprev_chrome_all_files_already_exist(
1616 old_version,
1617 new_version,
1618 expected_count,
1619 modify_unstable,
1620 monkeypatch,
1621 overlay_stack,
1622):
1623 """Test Chrome uprevs work as expected when all packages already exist."""
1624 (overlay,) = overlay_stack(1)
1625 monkeypatch.setattr(uprev_lib, "_CHROME_OVERLAY_PATH", overlay.path)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001626
Alex Klein1699fab2022-09-08 08:46:06 -06001627 unstable_chrome = cr.test.Package(
1628 "chromeos-base", "chromeos-chrome", version="9999", keywords="~*"
1629 )
1630 if modify_unstable:
1631 # Add some field not set in stable.
1632 unstable_chrome.depend = "foo/bar"
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001633
Alex Klein1699fab2022-09-08 08:46:06 -06001634 stable_chrome = cr.test.Package(
1635 "chromeos-base", "chromeos-chrome", version=f"{old_version}_rc-r1"
1636 )
Chris McDonaldea0312c2020-05-04 23:33:15 -06001637
Alex Klein1699fab2022-09-08 08:46:06 -06001638 overlay.add_package(unstable_chrome)
1639 overlay.add_package(stable_chrome)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001640
Alex Klein1699fab2022-09-08 08:46:06 -06001641 for pkg_str in constants.OTHER_CHROME_PACKAGES:
1642 category, pkg_name = pkg_str.split("/")
1643 unstable_pkg = cr.test.Package(
1644 category, pkg_name, version="9999", keywords="~*"
1645 )
1646 stable_pkg = cr.test.Package(
1647 category, pkg_name, version=f"{old_version}_rc-r1"
1648 )
Chris McDonaldea0312c2020-05-04 23:33:15 -06001649
Alex Klein1699fab2022-09-08 08:46:06 -06001650 overlay.add_package(unstable_pkg)
1651 overlay.add_package(stable_pkg)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001652
Alex Klein1699fab2022-09-08 08:46:06 -06001653 git_refs = [
1654 GitRef(
1655 path="/foo", ref=f"refs/tags/{new_version}", revision="stubcommit"
1656 )
1657 ]
1658 res = packages.uprev_chrome_from_ref(None, git_refs, None)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001659
Alex Klein1699fab2022-09-08 08:46:06 -06001660 modified_file_count = sum(len(m.files) for m in res.modified)
1661 assert modified_file_count == expected_count
Michael Mortensen125bb012020-05-21 14:02:10 -06001662
1663
Alex Klein1699fab2022-09-08 08:46:06 -06001664@pytest.mark.usefixtures("testcase_monkeypatch")
Michael Mortensen125bb012020-05-21 14:02:10 -06001665class GetModelsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001666 """Tests for get_models."""
Michael Mortensen125bb012020-05-21 14:02:10 -06001667
Alex Klein1699fab2022-09-08 08:46:06 -06001668 def setUp(self):
1669 self.board = "test-board"
1670 self.rc.SetDefaultCmdResult(stdout="pyro\nreef\nsnappy\n")
1671 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1672 build_bin = os.path.join(
1673 self.tempdir, constants.DEFAULT_CHROOT_DIR, "usr", "bin"
1674 )
1675 osutils.Touch(
1676 os.path.join(build_bin, "cros_config_host"), makedirs=True
1677 )
Michael Mortensen125bb012020-05-21 14:02:10 -06001678
Alex Klein1699fab2022-09-08 08:46:06 -06001679 def testGetModels(self):
1680 """Test get_models."""
1681 build_target = build_target_lib.BuildTarget(self.board)
1682 result = packages.get_models(build_target)
1683 self.assertEqual(result, ["pyro", "reef", "snappy"])
Michael Mortensen359c1f32020-05-28 19:35:42 -06001684
1685
1686class GetKeyIdTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001687 """Tests for get_key_id."""
Michael Mortensen359c1f32020-05-28 19:35:42 -06001688
Alex Klein1699fab2022-09-08 08:46:06 -06001689 def setUp(self):
1690 self.board = "test-board"
1691 self.build_target = build_target_lib.BuildTarget(self.board)
Michael Mortensen359c1f32020-05-28 19:35:42 -06001692
Alex Klein1699fab2022-09-08 08:46:06 -06001693 def testGetKeyId(self):
1694 """Test get_key_id when _run_cros_config_host returns a key."""
1695 self.PatchObject(
1696 packages, "_run_cros_config_host", return_value=["key"]
1697 )
1698 result = packages.get_key_id(self.build_target, "model")
1699 self.assertEqual(result, "key")
Michael Mortensen359c1f32020-05-28 19:35:42 -06001700
Alex Klein1699fab2022-09-08 08:46:06 -06001701 def testGetKeyIdNoKey(self):
1702 """Test get_key_id when None should be returned."""
1703 self.PatchObject(
1704 packages, "_run_cros_config_host", return_value=["key1", "key2"]
1705 )
1706 result = packages.get_key_id(self.build_target, "model")
1707 self.assertEqual(result, None)
Ben Reiche779cf42020-12-15 03:21:31 +00001708
1709
Harvey Yang3eee06c2021-03-18 15:47:56 +08001710class GetLatestVersionTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001711 """Tests for get_latest_version_from_refs."""
Ben Reiche779cf42020-12-15 03:21:31 +00001712
Alex Klein1699fab2022-09-08 08:46:06 -06001713 def setUp(self):
1714 self.prefix = "refs/tags/drivefs_"
1715 # The tag ref template.
1716 ref_tpl = self.prefix + "%s"
Ben Reiche779cf42020-12-15 03:21:31 +00001717
Alex Klein1699fab2022-09-08 08:46:06 -06001718 self.latest = "44.0.20"
1719 self.versions = ["42.0.1", self.latest, "44.0.19", "39.0.15"]
1720 self.latest_ref = uprev_lib.GitRef(
1721 "/path", ref_tpl % self.latest, "abc123"
1722 )
1723 self.refs = [
1724 uprev_lib.GitRef("/path", ref_tpl % v, "abc123")
1725 for v in self.versions
1726 ]
Ben Reiche779cf42020-12-15 03:21:31 +00001727
Alex Klein1699fab2022-09-08 08:46:06 -06001728 def test_single_ref(self):
1729 """Test a single ref is supplied."""
1730 # pylint: disable=protected-access
1731 self.assertEqual(
1732 self.latest,
1733 packages._get_latest_version_from_refs(
1734 self.prefix, [self.latest_ref]
1735 ),
1736 )
Ben Reiche779cf42020-12-15 03:21:31 +00001737
Alex Klein1699fab2022-09-08 08:46:06 -06001738 def test_multiple_ref_versions(self):
1739 """Test multiple refs supplied."""
1740 # pylint: disable=protected-access
1741 self.assertEqual(
1742 self.latest,
1743 packages._get_latest_version_from_refs(self.prefix, self.refs),
1744 )
Ben Reiche779cf42020-12-15 03:21:31 +00001745
Alex Klein1699fab2022-09-08 08:46:06 -06001746 def test_no_refs_returns_none(self):
1747 """Test no refs supplied."""
1748 # pylint: disable=protected-access
1749 self.assertEqual(
1750 packages._get_latest_version_from_refs(self.prefix, []), None
1751 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001752
Chinglin Yu84818732022-10-03 12:03:43 +08001753 def test_ref_prefix(self):
1754 """Test refs with a different prefix isn't used"""
1755 # pylint: disable=protected-access
1756 # Add refs/tags/foo_100.0.0 to the refs, which should be ignored in
1757 # _get_latest_version_from_refs because the prefix doesn't match, even
1758 # if its version number is larger.
1759 refs = self.refs + [
1760 uprev_lib.GitRef("/path", "refs/tags/foo_100.0.0", "abc123")
1761 ]
1762 self.assertEqual(
1763 self.latest,
1764 packages._get_latest_version_from_refs(self.prefix, refs),
1765 )
1766
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001767
Alex Klein6becabc2020-09-11 14:03:05 -06001768class NeedsChromeSourceTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001769 """Tests for needs_chrome_source."""
Alex Klein6becabc2020-09-11 14:03:05 -06001770
Alex Klein1699fab2022-09-08 08:46:06 -06001771 def _build_graph(self, with_chrome: bool, with_followers: bool):
1772 root = "/build/build_target"
1773 foo_bar = package_info.parse("foo/bar-1")
1774 chrome = package_info.parse(f"{constants.CHROME_CP}-1.2.3.4")
1775 followers = [
1776 package_info.parse(f"{pkg}-1.2.3.4")
1777 for pkg in constants.OTHER_CHROME_PACKAGES
1778 ]
1779 nodes = [dependency_graph.PackageNode(foo_bar, root)]
1780 root_pkgs = ["foo/bar-1"]
1781 if with_chrome:
1782 nodes.append(dependency_graph.PackageNode(chrome, root))
1783 root_pkgs.append(chrome.cpvr)
1784 if with_followers:
1785 nodes.extend(
1786 [dependency_graph.PackageNode(f, root) for f in followers]
1787 )
1788 root_pkgs.extend([f.cpvr for f in followers])
Alex Klein6becabc2020-09-11 14:03:05 -06001789
Alex Klein1699fab2022-09-08 08:46:06 -06001790 return dependency_graph.DependencyGraph(nodes, root, root_pkgs)
Alex Klein6becabc2020-09-11 14:03:05 -06001791
Alex Klein1699fab2022-09-08 08:46:06 -06001792 def test_needs_all(self):
1793 """Verify we need source when we have no prebuilts."""
1794 graph = self._build_graph(with_chrome=True, with_followers=True)
1795 self.PatchObject(
1796 depgraph, "get_sysroot_dependency_graph", return_value=graph
1797 )
1798 self.PatchObject(packages, "has_prebuilt", return_value=False)
1799 self.PatchObject(
1800 packages,
1801 "uprev_chrome",
1802 return_value=uprev_lib.UprevVersionedPackageResult(),
1803 )
Alex Klein6becabc2020-09-11 14:03:05 -06001804
Alex Klein1699fab2022-09-08 08:46:06 -06001805 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001806
Alex Klein1699fab2022-09-08 08:46:06 -06001807 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001808
Alex Klein1699fab2022-09-08 08:46:06 -06001809 self.assertTrue(result.needs_chrome_source)
1810 self.assertTrue(result.builds_chrome)
1811 self.assertTrue(result.packages)
1812 self.assertEqual(
1813 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1814 )
1815 self.assertTrue(result.missing_chrome_prebuilt)
1816 self.assertTrue(result.missing_follower_prebuilt)
1817 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001818
Alex Klein1699fab2022-09-08 08:46:06 -06001819 def test_needs_none(self):
1820 """Verify not building any of the chrome packages prevents needing it."""
1821 graph = self._build_graph(with_chrome=False, with_followers=False)
1822 self.PatchObject(
1823 depgraph, "get_sysroot_dependency_graph", return_value=graph
1824 )
1825 self.PatchObject(packages, "has_prebuilt", return_value=False)
1826 self.PatchObject(
1827 packages,
1828 "uprev_chrome",
1829 return_value=uprev_lib.UprevVersionedPackageResult(),
1830 )
Alex Klein6becabc2020-09-11 14:03:05 -06001831
Alex Klein1699fab2022-09-08 08:46:06 -06001832 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001833
Alex Klein1699fab2022-09-08 08:46:06 -06001834 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001835
Alex Klein1699fab2022-09-08 08:46:06 -06001836 self.assertFalse(result.needs_chrome_source)
1837 self.assertFalse(result.builds_chrome)
1838 self.assertFalse(result.packages)
1839 self.assertFalse(result.missing_chrome_prebuilt)
1840 self.assertFalse(result.missing_follower_prebuilt)
1841 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001842
Alex Klein1699fab2022-09-08 08:46:06 -06001843 def test_needs_chrome_only(self):
1844 """Verify only chrome triggers needs chrome source."""
1845 graph = self._build_graph(with_chrome=True, with_followers=False)
1846 self.PatchObject(
1847 depgraph, "get_sysroot_dependency_graph", return_value=graph
1848 )
1849 self.PatchObject(packages, "has_prebuilt", return_value=False)
1850 self.PatchObject(
1851 packages,
1852 "uprev_chrome",
1853 return_value=uprev_lib.UprevVersionedPackageResult(),
1854 )
Alex Klein6becabc2020-09-11 14:03:05 -06001855
Alex Klein1699fab2022-09-08 08:46:06 -06001856 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001857
Alex Klein1699fab2022-09-08 08:46:06 -06001858 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001859
Alex Klein1699fab2022-09-08 08:46:06 -06001860 self.assertTrue(result.needs_chrome_source)
1861 self.assertTrue(result.builds_chrome)
1862 self.assertTrue(result.packages)
1863 self.assertEqual(
1864 set([p.atom for p in result.packages]), {constants.CHROME_CP}
1865 )
1866 self.assertTrue(result.missing_chrome_prebuilt)
1867 self.assertFalse(result.missing_follower_prebuilt)
1868 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001869
Alex Klein1699fab2022-09-08 08:46:06 -06001870 def test_needs_followers_only(self):
1871 """Verify only chrome followers triggers needs chrome source."""
1872 graph = self._build_graph(with_chrome=False, with_followers=True)
1873 self.PatchObject(
1874 depgraph, "get_sysroot_dependency_graph", return_value=graph
1875 )
1876 self.PatchObject(packages, "has_prebuilt", return_value=False)
1877 self.PatchObject(
1878 packages,
1879 "uprev_chrome",
1880 return_value=uprev_lib.UprevVersionedPackageResult(),
1881 )
Alex Klein6becabc2020-09-11 14:03:05 -06001882
Alex Klein1699fab2022-09-08 08:46:06 -06001883 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001884
Alex Klein1699fab2022-09-08 08:46:06 -06001885 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001886
Alex Klein1699fab2022-09-08 08:46:06 -06001887 self.assertTrue(result.needs_chrome_source)
1888 self.assertFalse(result.builds_chrome)
1889 self.assertTrue(result.packages)
1890 self.assertEqual(
1891 set([p.atom for p in result.packages]),
1892 set(constants.OTHER_CHROME_PACKAGES),
1893 )
1894 self.assertFalse(result.missing_chrome_prebuilt)
1895 self.assertTrue(result.missing_follower_prebuilt)
1896 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001897
Alex Klein1699fab2022-09-08 08:46:06 -06001898 def test_has_prebuilts(self):
1899 """Test prebuilts prevent us from needing chrome source."""
1900 graph = self._build_graph(with_chrome=True, with_followers=True)
1901 self.PatchObject(
1902 depgraph, "get_sysroot_dependency_graph", return_value=graph
1903 )
1904 self.PatchObject(packages, "has_prebuilt", return_value=True)
1905 self.PatchObject(
1906 packages,
1907 "uprev_chrome",
1908 return_value=uprev_lib.UprevVersionedPackageResult(),
1909 )
Alex Klein6becabc2020-09-11 14:03:05 -06001910
Alex Klein1699fab2022-09-08 08:46:06 -06001911 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001912
Alex Klein1699fab2022-09-08 08:46:06 -06001913 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001914
Alex Klein1699fab2022-09-08 08:46:06 -06001915 self.assertFalse(result.needs_chrome_source)
1916 self.assertTrue(result.builds_chrome)
1917 self.assertFalse(result.packages)
1918 self.assertFalse(result.missing_chrome_prebuilt)
1919 self.assertFalse(result.missing_follower_prebuilt)
1920 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001921
Alex Klein1699fab2022-09-08 08:46:06 -06001922 def test_compile_source(self):
1923 """Test compile source ignores prebuilts."""
1924 graph = self._build_graph(with_chrome=True, with_followers=True)
1925 self.PatchObject(
1926 depgraph, "get_sysroot_dependency_graph", return_value=graph
1927 )
1928 self.PatchObject(packages, "has_prebuilt", return_value=True)
1929 self.PatchObject(
1930 packages,
1931 "uprev_chrome",
1932 return_value=uprev_lib.UprevVersionedPackageResult(),
1933 )
Alex Klein6becabc2020-09-11 14:03:05 -06001934
Alex Klein1699fab2022-09-08 08:46:06 -06001935 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001936
Alex Klein1699fab2022-09-08 08:46:06 -06001937 result = packages.needs_chrome_source(build_target, compile_source=True)
Alex Klein6becabc2020-09-11 14:03:05 -06001938
Alex Klein1699fab2022-09-08 08:46:06 -06001939 self.assertTrue(result.needs_chrome_source)
1940 self.assertTrue(result.builds_chrome)
1941 self.assertTrue(result.packages)
1942 self.assertEqual(
1943 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1944 )
1945 self.assertTrue(result.missing_chrome_prebuilt)
1946 self.assertTrue(result.missing_follower_prebuilt)
1947 self.assertFalse(result.local_uprev)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001948
Alex Klein1699fab2022-09-08 08:46:06 -06001949 def test_local_uprev(self):
1950 """Test compile source ignores prebuilts."""
1951 graph = self._build_graph(with_chrome=True, with_followers=True)
1952 self.PatchObject(
1953 depgraph, "get_sysroot_dependency_graph", return_value=graph
1954 )
1955 self.PatchObject(packages, "has_prebuilt", return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001956
Alex Klein1699fab2022-09-08 08:46:06 -06001957 uprev_result = uprev_lib.UprevVersionedPackageResult()
1958 uprev_result.add_result("1.2.3.4", ["/tmp/foo"])
1959 self.PatchObject(packages, "uprev_chrome", return_value=uprev_result)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001960
Alex Klein1699fab2022-09-08 08:46:06 -06001961 build_target = build_target_lib.BuildTarget("build_target")
Alex Kleinde7b76d2021-07-12 12:28:44 -06001962
Alex Klein1699fab2022-09-08 08:46:06 -06001963 result = packages.needs_chrome_source(build_target, compile_source=True)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001964
Alex Klein1699fab2022-09-08 08:46:06 -06001965 self.assertTrue(result.needs_chrome_source)
1966 self.assertTrue(result.builds_chrome)
1967 self.assertTrue(result.packages)
1968 self.assertEqual(
1969 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1970 )
1971 self.assertTrue(result.missing_chrome_prebuilt)
1972 self.assertTrue(result.missing_follower_prebuilt)
1973 self.assertTrue(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001974
1975
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001976class UprevDrivefsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001977 """Tests for uprev_drivefs."""
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001978
Alex Klein1699fab2022-09-08 08:46:06 -06001979 def setUp(self):
1980 self.refs = [
1981 GitRef(
1982 path="/chromeos/platform/drivefs-google3/",
1983 ref="refs/tags/drivefs_45.0.2",
1984 revision="123",
1985 )
1986 ]
1987 self.MOCK_DRIVEFS_EBUILD_PATH = "drivefs.45.0.2-r1.ebuild"
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001988
Alex Klein1699fab2022-09-08 08:46:06 -06001989 def revisionBumpOutcome(self, ebuild_path):
1990 return uprev_lib.UprevResult(
1991 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
1992 )
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001993
Alex Klein1699fab2022-09-08 08:46:06 -06001994 def majorBumpOutcome(self, ebuild_path):
1995 return uprev_lib.UprevResult(
1996 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
1997 )
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001998
Alex Klein1699fab2022-09-08 08:46:06 -06001999 def sameVersionOutcome(self):
2000 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002001
Alex Klein1699fab2022-09-08 08:46:06 -06002002 def test_latest_version_returns_none(self):
2003 """Test no refs were supplied"""
2004 output = packages.uprev_drivefs(None, [], None)
2005 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002006
Alex Klein1699fab2022-09-08 08:46:06 -06002007 def test_drivefs_uprev_fails(self):
2008 """Test a single ref is supplied."""
2009 self.PatchObject(
2010 uprev_lib,
2011 "uprev_workon_ebuild_to_version",
2012 side_effect=[None, None],
2013 )
2014 output = packages.uprev_drivefs(None, self.refs, None)
2015 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002016
Alex Klein1699fab2022-09-08 08:46:06 -06002017 def test_same_version_exists(self):
2018 """Test the same version exists uprev should not happen."""
2019 drivefs_outcome = self.sameVersionOutcome()
2020 self.PatchObject(
2021 uprev_lib,
2022 "uprev_workon_ebuild_to_version",
2023 side_effect=[drivefs_outcome],
2024 )
2025 output = packages.uprev_drivefs(None, self.refs, None)
2026 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002027
Alex Klein1699fab2022-09-08 08:46:06 -06002028 def test_revision_bump_both_packages(self):
2029 """Test both packages uprev, should succeed."""
2030 drivefs_outcome = self.revisionBumpOutcome(
2031 self.MOCK_DRIVEFS_EBUILD_PATH
2032 )
2033 self.PatchObject(
2034 uprev_lib,
2035 "uprev_workon_ebuild_to_version",
2036 side_effect=[drivefs_outcome],
2037 )
2038 output = packages.uprev_drivefs(None, self.refs, None)
2039 self.assertTrue(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002040
Alex Klein1699fab2022-09-08 08:46:06 -06002041 def test_major_bump_both_packages(self):
2042 """Test both packages uprev, should succeed."""
2043 drivefs_outcome = self.majorBumpOutcome(self.MOCK_DRIVEFS_EBUILD_PATH)
2044 self.PatchObject(
2045 uprev_lib,
2046 "uprev_workon_ebuild_to_version",
2047 side_effect=[drivefs_outcome],
2048 )
2049 output = packages.uprev_drivefs(None, self.refs, None)
2050 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002051
2052
Denis Nikitin63613e32022-09-09 22:26:50 -07002053class UprevKernelAfdo(cros_test_lib.RunCommandTempDirTestCase):
2054 """Tests for uprev_kernel_afdo."""
2055
2056 def setUp(self):
2057 # patch_ebuild_vars is tested separately.
2058 self.mock_patch = self.PatchObject(packages, "patch_ebuild_vars")
Denis Nikitin88ad5132022-09-28 12:10:01 -07002059 self.PatchObject(constants, "SOURCE_ROOT", new=self.tempdir)
Denis Nikitin63613e32022-09-09 22:26:50 -07002060 self.metadata_dir = os.path.join(
Denis Nikitin63613e32022-09-09 22:26:50 -07002061 "src",
2062 "third_party",
2063 "toolchain-utils",
2064 "afdo_metadata",
2065 )
Denis Nikitin88ad5132022-09-28 12:10:01 -07002066 osutils.SafeMakedirs(os.path.join(self.tempdir, self.metadata_dir))
Denis Nikitin63613e32022-09-09 22:26:50 -07002067
2068 def test_uprev_kernel_afdo_version(self):
2069 """Test kernel afdo version uprev."""
2070 json_files = {
2071 "kernel_afdo.json": (
2072 "{\n"
2073 ' "chromeos-kernel-5_4": {\n'
2074 ' "name": "R106-12345.0-0123456789"\n'
2075 " }\n"
2076 "}"
2077 ),
2078 "kernel_arm_afdo.json": (
2079 "{\n"
2080 ' "chromeos-kernel-5_15": {\n'
2081 ' "name": "R107-67890.0-0123456789"\n'
2082 " }\n"
2083 "}"
2084 ),
2085 }
2086 for f, contents in json_files.items():
2087 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2088
2089 returned_output = packages.uprev_kernel_afdo()
2090
Denis Nikitin88ad5132022-09-28 12:10:01 -07002091 package_root = os.path.join(
2092 constants.SOURCE_ROOT,
2093 constants.CHROMIUMOS_OVERLAY_DIR,
2094 "sys-kernel",
Denis Nikitin63613e32022-09-09 22:26:50 -07002095 )
2096 expect_result = [
2097 uprev_lib.UprevVersionedPackageModifications(
2098 new_version="R106-12345.0-0123456789",
2099 files=[
2100 os.path.join(
2101 package_root,
2102 "chromeos-kernel-5_4",
2103 "chromeos-kernel-5_4-9999.ebuild",
2104 ),
2105 os.path.join(
2106 package_root, "chromeos-kernel-5_4", "Manifest"
2107 ),
2108 ],
2109 ),
2110 uprev_lib.UprevVersionedPackageModifications(
2111 new_version="R107-67890.0-0123456789",
2112 files=[
2113 os.path.join(
2114 package_root,
2115 "chromeos-kernel-5_15",
2116 "chromeos-kernel-5_15-9999.ebuild",
2117 ),
2118 os.path.join(
2119 package_root, "chromeos-kernel-5_15", "Manifest"
2120 ),
2121 ],
2122 ),
2123 ]
2124 self.assertTrue(returned_output.uprevved)
2125 self.assertEqual(returned_output.modified, expect_result)
2126
2127 def test_uprev_kernel_afdo_empty_json(self):
2128 """Test kernel afdo version unchanged."""
2129 json_files = {
2130 "kernel_afdo.json": "{}",
2131 "kernel_arm_afdo.json": "{}",
2132 }
2133 for f, contents in json_files.items():
2134 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2135
2136 returned_output = packages.uprev_kernel_afdo()
2137 self.assertFalse(returned_output.uprevved)
2138
2139 def test_uprev_kernel_afdo_empty_file(self):
2140 """Test malformed json raises."""
2141 json_files = {
2142 "kernel_afdo.json": "",
2143 "kernel_arm_afdo.json": "",
2144 }
2145 for f, contents in json_files.items():
2146 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2147
2148 with self.assertRaisesRegex(
2149 json.decoder.JSONDecodeError, "Expecting value"
2150 ):
2151 packages.uprev_kernel_afdo()
2152
2153 def test_uprev_kernel_afdo_manifest_raises(self):
2154 """Test manifest update raises."""
2155 json_files = {
2156 "kernel_afdo.json": (
2157 "{\n"
2158 ' "chromeos-kernel-5_4": {\n'
2159 ' "name": "R106-12345.0-0123456789"\n'
2160 " }\n"
2161 "}"
2162 ),
2163 }
2164 for f, contents in json_files.items():
2165 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2166 # run() raises exception.
2167 self.rc.SetDefaultCmdResult(
2168 side_effect=cros_build_lib.RunCommandError("error")
2169 )
2170
2171 with self.assertRaises(uprev_lib.EbuildManifestError):
2172 packages.uprev_kernel_afdo()
2173
2174
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002175# TODO(chenghaoyang): Shouldn't use uprev_workon_ebuild_to_version.
2176class UprevPerfettoTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002177 """Tests for uprev_perfetto."""
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002178
Alex Klein1699fab2022-09-08 08:46:06 -06002179 def setUp(self):
2180 self.refs = [GitRef(path="/foo", ref="refs/tags/v12.0", revision="123")]
2181 self.MOCK_PERFETTO_EBUILD_PATH = "perfetto-12.0-r1.ebuild"
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002182
Alex Klein1699fab2022-09-08 08:46:06 -06002183 def revisionBumpOutcome(self, ebuild_path):
2184 return uprev_lib.UprevResult(
2185 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2186 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002187
Alex Klein1699fab2022-09-08 08:46:06 -06002188 def majorBumpOutcome(self, ebuild_path):
2189 return uprev_lib.UprevResult(
2190 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2191 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002192
Alex Klein1699fab2022-09-08 08:46:06 -06002193 def newerVersionOutcome(self):
2194 return uprev_lib.UprevResult(uprev_lib.Outcome.NEWER_VERSION_EXISTS)
Harvey Yang3eee06c2021-03-18 15:47:56 +08002195
Alex Klein1699fab2022-09-08 08:46:06 -06002196 def sameVersionOutcome(self):
2197 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002198
Alex Klein1699fab2022-09-08 08:46:06 -06002199 def test_latest_version_returns_none(self):
2200 """Test no refs were supplied"""
2201 output = packages.uprev_perfetto(None, [], None)
2202 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002203
Alex Klein1699fab2022-09-08 08:46:06 -06002204 def test_perfetto_uprev_fails(self):
2205 """Test a single ref is supplied."""
2206 self.PatchObject(
2207 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2208 )
2209 output = packages.uprev_perfetto(None, self.refs, None)
2210 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002211
Alex Klein1699fab2022-09-08 08:46:06 -06002212 def test_newer_version_exists(self):
2213 """Test the newer version exists uprev should not happen."""
2214 perfetto_outcome = self.newerVersionOutcome()
2215 self.PatchObject(
2216 uprev_lib,
2217 "uprev_workon_ebuild_to_version",
2218 side_effect=[perfetto_outcome],
2219 )
2220 output = packages.uprev_perfetto(None, self.refs, None)
2221 self.assertFalse(output.uprevved)
Harvey Yang3eee06c2021-03-18 15:47:56 +08002222
Alex Klein1699fab2022-09-08 08:46:06 -06002223 def test_same_version_exists(self):
2224 """Test the same version exists uprev should not happen."""
2225 perfetto_outcome = self.sameVersionOutcome()
2226 self.PatchObject(
2227 uprev_lib,
2228 "uprev_workon_ebuild_to_version",
2229 side_effect=[perfetto_outcome],
2230 )
2231 output = packages.uprev_perfetto(None, self.refs, None)
2232 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002233
Alex Klein1699fab2022-09-08 08:46:06 -06002234 def test_revision_bump_perfetto_package(self):
2235 """Test perfetto package uprev."""
2236 perfetto_outcome = self.revisionBumpOutcome(
2237 self.MOCK_PERFETTO_EBUILD_PATH
2238 )
2239 self.PatchObject(
2240 uprev_lib,
2241 "uprev_workon_ebuild_to_version",
2242 side_effect=[perfetto_outcome],
2243 )
2244 output = packages.uprev_perfetto(None, self.refs, None)
2245 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002246
Alex Klein1699fab2022-09-08 08:46:06 -06002247 def test_major_bump_perfetto_package(self):
2248 """Test perfetto package uprev."""
2249 perfetto_outcome = self.majorBumpOutcome(self.MOCK_PERFETTO_EBUILD_PATH)
2250 self.PatchObject(
2251 uprev_lib,
2252 "uprev_workon_ebuild_to_version",
2253 side_effect=[perfetto_outcome],
2254 )
2255 output = packages.uprev_perfetto(None, self.refs, None)
2256 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002257
Chinglin Yuad12a512022-10-07 17:26:12 +08002258 def test_revision_bump_trunk(self):
2259 """Test revision bump on receiving non-versioned trunk refs."""
Chinglin Yu5de28a42022-11-11 19:52:21 +08002260 refs = [
2261 GitRef(
2262 path="/foo", ref="refs/heads/main", revision="0123456789abcdef"
2263 )
2264 ]
Chinglin Yuad12a512022-10-07 17:26:12 +08002265 perfetto_outcome = self.revisionBumpOutcome(
2266 self.MOCK_PERFETTO_EBUILD_PATH
2267 )
2268 self.PatchObject(
2269 uprev_lib, "get_stable_ebuild_version", return_value="12.0"
2270 )
2271 self.PatchObject(
2272 uprev_lib,
2273 "uprev_workon_ebuild_to_version",
2274 side_effect=[perfetto_outcome],
2275 )
2276 output = packages.uprev_perfetto(None, refs, None)
2277 self.assertTrue(output.uprevved)
Chinglin Yu5de28a42022-11-11 19:52:21 +08002278 self.assertEqual(output.modified[0].new_version, "12.0-012345678")
Chinglin Yuad12a512022-10-07 17:26:12 +08002279
Alex Klein627e04c2021-11-10 15:56:47 -07002280
Julio Hurtadof1befec2021-05-05 21:34:26 +00002281class UprevLacrosTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002282 """Tests for uprev_lacros"""
Julio Hurtadof1befec2021-05-05 21:34:26 +00002283
Alex Klein1699fab2022-09-08 08:46:06 -06002284 def setUp(self):
2285 self.refs = [
2286 GitRef(
2287 path="/lacros", ref="refs/heads/main", revision="123.456.789.0"
2288 )
2289 ]
2290 self.MOCK_LACROS_EBUILD_PATH = "chromeos-lacros-123.456.789.0-r1.ebuild"
Julio Hurtadof1befec2021-05-05 21:34:26 +00002291
Alex Klein1699fab2022-09-08 08:46:06 -06002292 def revisionBumpOutcome(self, ebuild_path):
2293 return uprev_lib.UprevResult(
2294 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2295 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002296
Alex Klein1699fab2022-09-08 08:46:06 -06002297 def majorBumpOutcome(self, ebuild_path):
2298 return uprev_lib.UprevResult(
2299 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2300 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002301
Alex Klein1699fab2022-09-08 08:46:06 -06002302 def newerVersionOutcome(self, ebuild_path):
2303 return uprev_lib.UprevResult(
2304 uprev_lib.Outcome.NEWER_VERSION_EXISTS, [ebuild_path]
2305 )
Julio Hurtadoa994e002021-07-07 17:57:45 +00002306
Alex Klein1699fab2022-09-08 08:46:06 -06002307 def sameVersionOutcome(self, ebuild_path):
2308 return uprev_lib.UprevResult(
2309 uprev_lib.Outcome.SAME_VERSION_EXISTS, [ebuild_path]
2310 )
Julio Hurtadoa994e002021-07-07 17:57:45 +00002311
Alex Klein1699fab2022-09-08 08:46:06 -06002312 def newEbuildCreatedOutcome(self, ebuild_path):
2313 return uprev_lib.UprevResult(
2314 uprev_lib.Outcome.NEW_EBUILD_CREATED, [ebuild_path]
2315 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002316
Alex Klein1699fab2022-09-08 08:46:06 -06002317 def test_lacros_uprev_fails(self):
2318 """Test a lacros package uprev with no triggers"""
2319 self.PatchObject(
2320 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2321 )
2322 with self.assertRaises(IndexError):
2323 packages.uprev_lacros(None, [], None)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002324
Alex Klein1699fab2022-09-08 08:46:06 -06002325 def test_lacros_uprev_revision_bump(self):
2326 """Test lacros package uprev."""
2327 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2328 self.PatchObject(
2329 uprev_lib,
2330 "uprev_workon_ebuild_to_version",
2331 side_effect=[lacros_outcome],
2332 )
2333 output = packages.uprev_lacros(None, self.refs, None)
2334 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002335
Alex Klein1699fab2022-09-08 08:46:06 -06002336 def test_lacros_uprev_version_bump(self):
2337 """Test lacros package uprev."""
2338 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2339 self.PatchObject(
2340 uprev_lib,
2341 "uprev_workon_ebuild_to_version",
2342 side_effect=[lacros_outcome],
2343 )
2344 output = packages.uprev_lacros(None, self.refs, None)
2345 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002346
Alex Klein1699fab2022-09-08 08:46:06 -06002347 def test_lacros_uprev_new_ebuild_created(self):
2348 """Test lacros package uprev."""
2349 lacros_outcome = self.newEbuildCreatedOutcome(
2350 self.MOCK_LACROS_EBUILD_PATH
2351 )
2352 self.PatchObject(
2353 uprev_lib,
2354 "uprev_workon_ebuild_to_version",
2355 side_effect=[lacros_outcome],
2356 )
2357 output = packages.uprev_lacros(None, self.refs, None)
2358 self.assertTrue(output.uprevved)
Julio Hurtadoa994e002021-07-07 17:57:45 +00002359
Alex Klein1699fab2022-09-08 08:46:06 -06002360 def test_lacros_uprev_newer_version_exist(self):
2361 """Test the newer version exists uprev should not happen."""
2362 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2363 self.PatchObject(
2364 uprev_lib,
2365 "uprev_workon_ebuild_to_version",
2366 side_effect=[lacros_outcome],
2367 )
2368 output = packages.uprev_lacros(None, self.refs, None)
2369 self.assertFalse(output.uprevved)
Julio Hurtadoa994e002021-07-07 17:57:45 +00002370
Alex Klein1699fab2022-09-08 08:46:06 -06002371 def test_lacros_uprev_same_version_exist(self):
2372 """Test the same version exists uprev should not happen."""
2373 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2374 self.PatchObject(
2375 uprev_lib,
2376 "uprev_workon_ebuild_to_version",
2377 side_effect=[lacros_outcome],
2378 )
2379 output = packages.uprev_lacros(None, self.refs, None)
2380 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002381
2382
2383class UprevLacrosInParallelTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002384 """Tests for uprev_lacros"""
Julio Hurtado870ed322021-12-03 18:22:40 +00002385
Alex Klein1699fab2022-09-08 08:46:06 -06002386 def setUp(self):
2387 self.refs = [
2388 GitRef(
2389 path="/lacros", revision="abc123", ref="refs/tags/123.456.789.0"
2390 )
2391 ]
2392 self.MOCK_LACROS_EBUILD_PATH = "chromeos-lacros-123.456.789.0-r1.ebuild"
Julio Hurtado870ed322021-12-03 18:22:40 +00002393
Alex Klein1699fab2022-09-08 08:46:06 -06002394 def revisionBumpOutcome(self, ebuild_path):
2395 return uprev_lib.UprevResult(
2396 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2397 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002398
Alex Klein1699fab2022-09-08 08:46:06 -06002399 def majorBumpOutcome(self, ebuild_path):
2400 return uprev_lib.UprevResult(
2401 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2402 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002403
Alex Klein1699fab2022-09-08 08:46:06 -06002404 def newerVersionOutcome(self, ebuild_path):
2405 return uprev_lib.UprevResult(
2406 uprev_lib.Outcome.NEWER_VERSION_EXISTS, [ebuild_path]
2407 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002408
Alex Klein1699fab2022-09-08 08:46:06 -06002409 def sameVersionOutcome(self, ebuild_path):
2410 return uprev_lib.UprevResult(
2411 uprev_lib.Outcome.SAME_VERSION_EXISTS, [ebuild_path]
2412 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002413
Alex Klein1699fab2022-09-08 08:46:06 -06002414 def newEbuildCreatedOutcome(self, ebuild_path):
2415 return uprev_lib.UprevResult(
2416 uprev_lib.Outcome.NEW_EBUILD_CREATED, [ebuild_path]
2417 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002418
Alex Klein1699fab2022-09-08 08:46:06 -06002419 def test_lacros_uprev_fails(self):
2420 """Test a lacros package uprev with no triggers"""
2421 self.PatchObject(
2422 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2423 )
Alex Klein314fb5d2022-10-24 14:56:31 -06002424 with self.assertRaises(uprev_lib.NoRefsError):
Alex Klein1699fab2022-09-08 08:46:06 -06002425 packages.uprev_lacros_in_parallel(None, [], None)
Julio Hurtado870ed322021-12-03 18:22:40 +00002426
Alex Klein1699fab2022-09-08 08:46:06 -06002427 def test_lacros_uprev_revision_bump(self):
2428 """Test lacros package uprev."""
2429 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2430 self.PatchObject(
2431 uprev_lib,
2432 "uprev_workon_ebuild_to_version",
2433 side_effect=[lacros_outcome],
2434 )
2435 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2436 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002437
Alex Klein1699fab2022-09-08 08:46:06 -06002438 def test_lacros_uprev_version_bump(self):
2439 """Test lacros package uprev."""
2440 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2441 self.PatchObject(
2442 uprev_lib,
2443 "uprev_workon_ebuild_to_version",
2444 side_effect=[lacros_outcome],
2445 )
2446 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2447 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002448
Alex Klein1699fab2022-09-08 08:46:06 -06002449 def test_lacros_uprev_new_ebuild_created(self):
2450 """Test lacros package uprev."""
2451 lacros_outcome = self.newEbuildCreatedOutcome(
2452 self.MOCK_LACROS_EBUILD_PATH
2453 )
2454 self.PatchObject(
2455 uprev_lib,
2456 "uprev_workon_ebuild_to_version",
2457 side_effect=[lacros_outcome],
2458 )
2459 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2460 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002461
Alex Klein1699fab2022-09-08 08:46:06 -06002462 def test_lacros_uprev_newer_version_exist(self):
2463 """Test the newer version exists uprev should not happen."""
2464 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2465 self.PatchObject(
2466 uprev_lib,
2467 "uprev_workon_ebuild_to_version",
2468 side_effect=[lacros_outcome],
2469 )
2470 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2471 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002472
Alex Klein1699fab2022-09-08 08:46:06 -06002473 def test_lacros_uprev_same_version_exist(self):
2474 """Test the same version exists uprev should not happen."""
2475 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2476 self.PatchObject(
2477 uprev_lib,
2478 "uprev_workon_ebuild_to_version",
2479 side_effect=[lacros_outcome],
2480 )
2481 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2482 self.assertFalse(output.uprevved)