blob: 9d2249a031424391e4b1c75e6a44c3bb1708faeb [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")
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900183 self.PatchObject(
184 android, "ReadLKGB", return_value=dict(build_id="android-lkgb")
185 )
Alex Klein1699fab2022-09-08 08:46:06 -0600186 self.PatchObject(
187 packages,
188 "uprev_android",
189 return_value=packages.UprevAndroidResult(
190 revved=True,
191 android_atom="android-atom",
192 modified_files=["file1", "file2"],
193 ),
194 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900195
Alex Klein1699fab2022-09-08 08:46:06 -0600196 result = packages.uprev_android_lkgb("android-package", [], Chroot())
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900197
Alex Klein1699fab2022-09-08 08:46:06 -0600198 self.assertListEqual(
199 result.modified,
200 [
201 uprev_lib.UprevVersionedPackageModifications(
202 "android-lkgb",
203 [
204 os.path.join("overlay-dir", "file1"),
205 os.path.join("overlay-dir", "file2"),
206 ],
207 )
208 ],
209 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900210
Alex Klein1699fab2022-09-08 08:46:06 -0600211 def test_no_rev(self):
212 """Test when nothing revved."""
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900213 self.PatchObject(
214 android, "ReadLKGB", return_value=dict(build_id="android-lkgb")
215 )
Alex Klein1699fab2022-09-08 08:46:06 -0600216 self.PatchObject(
217 packages,
218 "uprev_android",
219 return_value=packages.UprevAndroidResult(revved=False),
220 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900221
Alex Klein1699fab2022-09-08 08:46:06 -0600222 result = packages.uprev_android_lkgb("android-package", [], Chroot())
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900223
Alex Klein1699fab2022-09-08 08:46:06 -0600224 self.assertListEqual(result.modified, [])
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900225
226
Jeremy Bettisaf96afb2023-01-11 16:09:58 -0700227class UprevECUtilsTest(cros_test_lib.MockTestCase):
228 """Tests for upreving ecutils."""
229
230 def test_success(self):
231 """Test a successful uprev."""
232
233 def fakeRunTasks(func, inputs):
234 results = []
235 for args in inputs:
236 results.append(func(*args))
237 return results
238
239 self.PatchObject(
240 packages.uprev_lib.parallel,
241 "RunTasksInProcessPool",
242 side_effect=fakeRunTasks,
243 )
244 mock_devutils = mock.MagicMock(name="dev-utils")
245 mock_ecutils = mock.MagicMock(name="ec-utils")
246 mock_ecutilstest = mock.MagicMock(name="ec-utils-test")
247 self.PatchObject(
248 packages.uprev_lib.portage_util,
249 "GetOverlayEBuilds",
250 return_value=[
251 mock_devutils,
252 mock_ecutils,
253 mock_ecutilstest,
254 ],
255 )
256 mock_overlay_mgr = mock.MagicMock(name="overlay-manager")
257 mock_overlay_mgr.modified_ebuilds = ["file1", "file2"]
258 self.PatchObject(
259 packages.uprev_lib,
260 "UprevOverlayManager",
261 return_value=mock_overlay_mgr,
262 )
263 cpv = package_info.SplitCPV("chromeos-base/ec-utils", strict=False)
264 assert cpv is not None
265 build_targets = [build_target_lib.BuildTarget("foo")]
266 refs = [
267 GitRef(
268 path="/platform/ec",
269 ref="main",
270 revision="123",
271 )
272 ]
273 chroot = Chroot()
274
275 result = packages.uprev_versioned_package(
276 cpv, build_targets, refs, chroot
277 )
278
279 self.assertEqual(1, len(result.modified))
280 self.assertEqual("123", result.modified[0].new_version)
281 self.assertListEqual(result.modified[0].files, ["file1", "file2"])
282
283 mock_overlay_mgr.uprev.assert_called_once_with(
284 package_list=[
285 "chromeos-base/ec-devutils",
286 "chromeos-base/ec-utils",
287 "chromeos-base/ec-utils-test",
288 ],
289 force=True,
290 )
291
292
Alex Kleineb77ffa2019-05-28 14:47:44 -0600293class UprevBuildTargetsTest(cros_test_lib.RunCommandTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600294 """uprev_build_targets tests."""
Alex Kleineb77ffa2019-05-28 14:47:44 -0600295
Alex Klein1699fab2022-09-08 08:46:06 -0600296 def test_invalid_type_fails(self):
297 """Test invalid type fails."""
298 with self.assertRaises(AssertionError):
299 packages.uprev_build_targets(
300 [build_target_lib.BuildTarget("foo")], "invalid"
301 )
Alex Kleineb77ffa2019-05-28 14:47:44 -0600302
Alex Klein1699fab2022-09-08 08:46:06 -0600303 def test_none_type_fails(self):
304 """Test None type fails."""
305 with self.assertRaises(AssertionError):
306 packages.uprev_build_targets(
307 [build_target_lib.BuildTarget("foo")], None
308 )
Alex Kleineb77ffa2019-05-28 14:47:44 -0600309
310
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000311class PatchEbuildVarsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600312 """patch_ebuild_vars test."""
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000313
Alex Klein1699fab2022-09-08 08:46:06 -0600314 def setUp(self):
315 self.mock_input = self.PatchObject(packages.fileinput, "input")
316 self.mock_stdout_write = self.PatchObject(packages.sys.stdout, "write")
317 self.ebuild_path = "/path/to/ebuild"
318 self.old_var_value = "R100-5678.0.123456789"
319 self.new_var_value = "R102-5678.0.234566789"
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000320
Alex Klein1699fab2022-09-08 08:46:06 -0600321 def test_patch_ebuild_vars_var_only(self):
322 """patch_ebuild_vars changes ^var=value$."""
323 ebuild_contents = (
324 "This line does not change.\n"
325 'AFDO_PROFILE_VERSION="{var_value}"\n'
326 "\n"
327 "# The line with AFDO_PROFILE_VERSION is also unchanged."
328 )
329 # Ebuild contains old_var_value.
330 self.mock_input.return_value = io.StringIO(
331 ebuild_contents.format(var_value=self.old_var_value)
332 )
333 expected_calls = []
334 # Expect the line with new_var_value.
335 for line in io.StringIO(
336 ebuild_contents.format(var_value=self.new_var_value)
337 ):
338 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000339
Alex Klein1699fab2022-09-08 08:46:06 -0600340 packages.patch_ebuild_vars(
341 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
342 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000343
Alex Klein1699fab2022-09-08 08:46:06 -0600344 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000345
Alex Klein1699fab2022-09-08 08:46:06 -0600346 def test_patch_ebuild_vars_ignore_export(self):
347 """patch_ebuild_vars changes ^export var=value$ and keeps export."""
348 ebuild_contents = (
349 "This line does not change.\n"
350 'export AFDO_PROFILE_VERSION="{var_value}"\n'
351 "# This line is also unchanged."
352 )
353 # Ebuild contains old_var_value.
354 self.mock_input.return_value = io.StringIO(
355 ebuild_contents.format(var_value=self.old_var_value)
356 )
357 expected_calls = []
358 # Expect the line with new_var_value.
359 for line in io.StringIO(
360 ebuild_contents.format(var_value=self.new_var_value)
361 ):
362 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000363
Alex Klein1699fab2022-09-08 08:46:06 -0600364 packages.patch_ebuild_vars(
365 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
366 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000367
Alex Klein1699fab2022-09-08 08:46:06 -0600368 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000369
Alex Klein1699fab2022-09-08 08:46:06 -0600370 def test_patch_ebuild_vars_partial_match(self):
371 """patch_ebuild_vars ignores ^{prefix}var=value$."""
372 ebuild_contents = (
Alex Kleina53bd282022-09-09 12:42:55 -0600373 'This and the line below do not change.\nNEW_AFDO="{var_value}"'
Alex Klein1699fab2022-09-08 08:46:06 -0600374 )
375 # Ebuild contains old_var_value.
376 self.mock_input.return_value = io.StringIO(
377 ebuild_contents.format(var_value=self.old_var_value)
378 )
379 expected_calls = []
380 # Expect the line with UNCHANGED old_var_value.
381 for line in io.StringIO(
382 ebuild_contents.format(var_value=self.old_var_value)
383 ):
384 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000385
Alex Klein1699fab2022-09-08 08:46:06 -0600386 # Note that the var name partially matches the ebuild var and hence it has
387 # to be ignored.
388 packages.patch_ebuild_vars(
389 self.ebuild_path, {"AFDO": self.new_var_value}
390 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000391
Alex Klein1699fab2022-09-08 08:46:06 -0600392 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000393
Alex Klein1699fab2022-09-08 08:46:06 -0600394 def test_patch_ebuild_vars_no_vars(self):
395 """patch_ebuild_vars keeps ebuild intact if there are no vars."""
396 ebuild_contents = (
397 "This line does not change.\n"
398 "The line with AFDO_PROFILE_VERSION is also unchanged."
399 )
400 self.mock_input.return_value = io.StringIO(ebuild_contents)
401 expected_calls = []
402 for line in io.StringIO(ebuild_contents):
403 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000404
Alex Klein1699fab2022-09-08 08:46:06 -0600405 packages.patch_ebuild_vars(
406 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
407 )
408
409 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000410
411
Alex Klein87531182019-08-12 15:23:37 -0600412class UprevsVersionedPackageTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600413 """uprevs_versioned_package decorator test."""
Alex Klein87531182019-08-12 15:23:37 -0600414
Alex Klein1699fab2022-09-08 08:46:06 -0600415 @packages.uprevs_versioned_package("category/package")
416 def uprev_category_package(self, *args, **kwargs):
417 """Registered function for testing."""
Alex Klein87531182019-08-12 15:23:37 -0600418
Alex Klein1699fab2022-09-08 08:46:06 -0600419 def test_calls_function(self):
420 """Test calling a registered function."""
421 self.PatchObject(self, "uprev_category_package")
Alex Klein87531182019-08-12 15:23:37 -0600422
Alex Klein1699fab2022-09-08 08:46:06 -0600423 cpv = package_info.SplitCPV("category/package", strict=False)
424 packages.uprev_versioned_package(cpv, [], [], Chroot())
Alex Klein87531182019-08-12 15:23:37 -0600425
Alex Klein1699fab2022-09-08 08:46:06 -0600426 # TODO(crbug/1065172): Invalid assertion that had previously been mocked.
427 # patch.assert_called()
Alex Klein87531182019-08-12 15:23:37 -0600428
Alex Klein1699fab2022-09-08 08:46:06 -0600429 def test_unregistered_package(self):
430 """Test calling with an unregistered package."""
431 cpv = package_info.SplitCPV("does-not/exist", strict=False)
Alex Klein87531182019-08-12 15:23:37 -0600432
Alex Klein1699fab2022-09-08 08:46:06 -0600433 with self.assertRaises(packages.UnknownPackageError):
434 packages.uprev_versioned_package(cpv, [], [], Chroot())
Alex Klein87531182019-08-12 15:23:37 -0600435
436
Trent Begin6daa8702020-01-29 14:58:12 -0700437class UprevEbuildFromPinTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600438 """Tests uprev_ebuild_from_pin function"""
Trent Begin315d9d92019-12-03 21:55:53 -0700439
Alex Klein1699fab2022-09-08 08:46:06 -0600440 package = "category/package"
441 version = "1.2.3"
442 new_version = "1.2.4"
443 ebuild_template = "package-%s-r1.ebuild"
444 ebuild = ebuild_template % version
445 unstable_ebuild = "package-9999.ebuild"
446 manifest = "Manifest"
Trent Begin315d9d92019-12-03 21:55:53 -0700447
Alex Klein1699fab2022-09-08 08:46:06 -0600448 def test_uprev_ebuild(self):
449 """Tests uprev of ebuild with version path"""
450 file_layout = (
451 D(self.package, [self.ebuild, self.unstable_ebuild, self.manifest]),
452 )
453 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700454
Alex Klein1699fab2022-09-08 08:46:06 -0600455 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700456
Alex Klein1699fab2022-09-08 08:46:06 -0600457 ebuild_path = os.path.join(package_path, self.ebuild)
458 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000459
Alex Klein1699fab2022-09-08 08:46:06 -0600460 result = uprev_lib.uprev_ebuild_from_pin(
461 package_path, self.new_version, chroot=Chroot()
462 )
463 self.assertEqual(
464 len(result.modified),
465 1,
466 "unexpected number of results: %s" % len(result.modified),
467 )
Trent Begin315d9d92019-12-03 21:55:53 -0700468
Alex Klein1699fab2022-09-08 08:46:06 -0600469 mod = result.modified[0]
470 self.assertEqual(
471 mod.new_version,
472 self.new_version + "-r1",
473 "unexpected version number: %s" % mod.new_version,
474 )
Trent Begin315d9d92019-12-03 21:55:53 -0700475
Alex Klein1699fab2022-09-08 08:46:06 -0600476 old_ebuild_path = os.path.join(
477 package_path, self.ebuild_template % self.version
478 )
479 new_ebuild_path = os.path.join(
480 package_path, self.ebuild_template % self.new_version
481 )
482 manifest_path = os.path.join(package_path, "Manifest")
Trent Begin2e5344f2020-03-02 10:46:55 -0700483
Alex Klein1699fab2022-09-08 08:46:06 -0600484 expected_modified_files = [
485 old_ebuild_path,
486 new_ebuild_path,
487 manifest_path,
488 ]
489 self.assertCountEqual(mod.files, expected_modified_files)
Trent Begin4a11a632020-02-28 12:59:58 -0700490
Alex Klein1699fab2022-09-08 08:46:06 -0600491 self.assertCommandContains(["ebuild", "manifest"])
Trent Begin6daa8702020-01-29 14:58:12 -0700492
Alex Klein1699fab2022-09-08 08:46:06 -0600493 def test_uprev_ebuild_same_version(self):
494 """Tests uprev of ebuild with version path when the version has not changed.
Fergus Dall2209d0b2020-08-06 11:51:43 +1000495
Alex Klein1699fab2022-09-08 08:46:06 -0600496 This should result in bumping the revision number.
497 """
498 file_layout = (
499 D(self.package, [self.ebuild, self.unstable_ebuild, self.manifest]),
500 )
501 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000502
Alex Klein1699fab2022-09-08 08:46:06 -0600503 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000504
Alex Klein1699fab2022-09-08 08:46:06 -0600505 ebuild_path = os.path.join(package_path, self.ebuild)
506 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000507
Alex Klein1699fab2022-09-08 08:46:06 -0600508 result = uprev_lib.uprev_ebuild_from_pin(
509 package_path, self.version, chroot=Chroot()
510 )
511 self.assertEqual(
512 len(result.modified),
513 1,
514 "unexpected number of results: %s" % len(result.modified),
515 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000516
Alex Klein1699fab2022-09-08 08:46:06 -0600517 mod = result.modified[0]
518 self.assertEqual(
519 mod.new_version,
520 self.version + "-r2",
521 "unexpected version number: %s" % mod.new_version,
522 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000523
Alex Klein1699fab2022-09-08 08:46:06 -0600524 old_ebuild_path = os.path.join(
525 package_path, self.ebuild_template % self.version
526 )
527 new_ebuild_path = os.path.join(
528 package_path, "package-%s-r2.ebuild" % self.version
529 )
530 manifest_path = os.path.join(package_path, "Manifest")
Fergus Dall2209d0b2020-08-06 11:51:43 +1000531
Alex Klein1699fab2022-09-08 08:46:06 -0600532 expected_modified_files = [
533 old_ebuild_path,
534 new_ebuild_path,
535 manifest_path,
536 ]
537 self.assertCountEqual(mod.files, expected_modified_files)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000538
Alex Klein1699fab2022-09-08 08:46:06 -0600539 self.assertCommandContains(["ebuild", "manifest"])
Fergus Dall2209d0b2020-08-06 11:51:43 +1000540
Alex Klein1699fab2022-09-08 08:46:06 -0600541 def test_no_ebuild(self):
542 """Tests assertion is raised if package has no ebuilds"""
543 file_layout = (D(self.package, [self.manifest]),)
544 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700545
Alex Klein1699fab2022-09-08 08:46:06 -0600546 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700547
Alex Klein1699fab2022-09-08 08:46:06 -0600548 with self.assertRaises(uprev_lib.EbuildUprevError):
549 uprev_lib.uprev_ebuild_from_pin(
550 package_path, self.new_version, chroot=Chroot()
551 )
Trent Begin315d9d92019-12-03 21:55:53 -0700552
Alex Klein1699fab2022-09-08 08:46:06 -0600553 def test_multiple_stable_ebuilds(self):
554 """Tests assertion is raised if multiple stable ebuilds are present"""
555 file_layout = (
556 D(
557 self.package,
558 [self.ebuild, self.ebuild_template % "1.2.1", self.manifest],
559 ),
560 )
561 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000562
Alex Klein1699fab2022-09-08 08:46:06 -0600563 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000564
Alex Klein1699fab2022-09-08 08:46:06 -0600565 ebuild_path = os.path.join(package_path, self.ebuild)
566 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000567
Alex Klein1699fab2022-09-08 08:46:06 -0600568 ebuild_path = os.path.join(package_path, self.ebuild_template % "1.2.1")
569 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000570
Alex Klein1699fab2022-09-08 08:46:06 -0600571 with self.assertRaises(uprev_lib.EbuildUprevError):
572 uprev_lib.uprev_ebuild_from_pin(
573 package_path, self.new_version, chroot=Chroot()
574 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000575
Alex Klein1699fab2022-09-08 08:46:06 -0600576 def test_multiple_unstable_ebuilds(self):
577 """Tests assertion is raised if multiple unstable ebuilds are present"""
578 file_layout = (
579 D(
580 self.package,
581 [self.ebuild, self.ebuild_template % "1.2.1", self.manifest],
582 ),
583 )
584 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700585
Alex Klein1699fab2022-09-08 08:46:06 -0600586 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700587
Alex Klein1699fab2022-09-08 08:46:06 -0600588 with self.assertRaises(uprev_lib.EbuildUprevError):
589 uprev_lib.uprev_ebuild_from_pin(
590 package_path, self.new_version, chroot=Chroot()
591 )
Trent Begin315d9d92019-12-03 21:55:53 -0700592
593
Andrew Lamb9563a152019-12-04 11:42:18 -0700594class ReplicatePrivateConfigTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600595 """replicate_private_config tests."""
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700596
Alex Klein1699fab2022-09-08 08:46:06 -0600597 def setUp(self):
598 # Set up fake public and private chromeos-config overlays.
599 private_package_root = (
600 "src/private-overlays/overlay-coral-private/chromeos-base/"
601 "chromeos-config-bsp"
602 )
603 self.public_package_root = (
604 "src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp"
605 )
606 file_layout = (
607 D(
608 os.path.join(private_package_root, "files"),
609 ["build_config.json"],
610 ),
611 D(private_package_root, ["replication_config.jsonpb"]),
612 D(
613 os.path.join(self.public_package_root, "files"),
614 ["build_config.json"],
615 ),
616 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700617
Alex Klein1699fab2022-09-08 08:46:06 -0600618 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700619
Alex Klein1699fab2022-09-08 08:46:06 -0600620 # Private config contains 'a' and 'b' fields.
621 self.private_config_path = os.path.join(
622 private_package_root, "files", "build_config.json"
623 )
624 self.WriteTempFile(
625 self.private_config_path,
626 json.dumps({"chromeos": {"configs": [{"a": 3, "b": 2}]}}),
627 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700628
Alex Klein1699fab2022-09-08 08:46:06 -0600629 # Public config only contains the 'a' field. Note that the value of 'a' is
630 # 1 in the public config; it will get updated to 3 when the private config
631 # is replicated.
632 self.public_config_path = os.path.join(
633 self.public_package_root, "files", "build_config.json"
634 )
635 self.WriteTempFile(
636 self.public_config_path,
637 json.dumps({"chromeos": {"configs": [{"a": 1}]}}),
638 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700639
Alex Klein1699fab2022-09-08 08:46:06 -0600640 # Put a ReplicationConfig JSONPB in the private package. Note that it
641 # specifies only the 'a' field is replicated.
642 self.replication_config_path = os.path.join(
643 self.tempdir, private_package_root, "replication_config.jsonpb"
644 )
645 replication_config = ReplicationConfig(
646 file_replication_rules=[
647 FileReplicationRule(
648 source_path=self.private_config_path,
649 destination_path=self.public_config_path,
650 file_type=FILE_TYPE_JSON,
651 replication_type=REPLICATION_TYPE_FILTER,
652 destination_fields=FieldMask(paths=["a"]),
653 )
654 ]
655 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700656
Alex Klein1699fab2022-09-08 08:46:06 -0600657 osutils.WriteFile(
658 self.replication_config_path,
659 json_format.MessageToJson(replication_config),
660 )
661 self.PatchObject(constants, "SOURCE_ROOT", new=self.tempdir)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700662
Alex Klein1699fab2022-09-08 08:46:06 -0600663 self.rc.SetDefaultCmdResult(side_effect=self._write_generated_c_files)
Andrew Lamb9563a152019-12-04 11:42:18 -0700664
Alex Klein1699fab2022-09-08 08:46:06 -0600665 def _write_generated_c_files(self, *_args, **_kwargs):
666 """Write fake generated C files to the public output dir.
Andrew Lamb9563a152019-12-04 11:42:18 -0700667
Alex Klein1699fab2022-09-08 08:46:06 -0600668 Note that this function accepts args and kwargs so it can be used as a side
669 effect.
670 """
671 output_dir = os.path.join(self.public_package_root, "files")
672 self.WriteTempFile(os.path.join(output_dir, "config.c"), "")
673 self.WriteTempFile(os.path.join(output_dir, "ec_config.c"), "")
674 self.WriteTempFile(os.path.join(output_dir, "ec_config.h"), "")
Andrew Lamb9563a152019-12-04 11:42:18 -0700675
Alex Klein1699fab2022-09-08 08:46:06 -0600676 def _write_incorrect_generated_c_files(self, *_args, **_kwargs):
677 """Similar to _write_generated_c_files, with an expected file missing.
Andrew Lamb9563a152019-12-04 11:42:18 -0700678
Alex Klein1699fab2022-09-08 08:46:06 -0600679 Note that this function accepts args and kwargs so it can be used as a side
680 effect.
681 """
682 output_dir = os.path.join(self.public_package_root, "files")
683 self.WriteTempFile(os.path.join(output_dir, "config.c"), "")
684 self.WriteTempFile(os.path.join(output_dir, "ec_config.c"), "")
Andrew Lamb9563a152019-12-04 11:42:18 -0700685
Alex Klein1699fab2022-09-08 08:46:06 -0600686 def test_replicate_private_config(self):
687 """Basic replication test."""
688 refs = [
689 GitRef(
690 path="/chromeos/overlays/overlay-coral-private",
691 ref="main",
692 revision="123",
693 )
694 ]
695 chroot = Chroot()
696 result = packages.replicate_private_config(
697 _build_targets=None, refs=refs, chroot=chroot
698 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700699
Alex Klein1699fab2022-09-08 08:46:06 -0600700 self.assertCommandContains(
701 [
702 "cros_config_schema",
703 "-m",
704 os.path.join(
705 constants.CHROOT_SOURCE_ROOT, self.public_config_path
706 ),
707 "-g",
708 os.path.join(
709 constants.CHROOT_SOURCE_ROOT,
710 self.public_package_root,
711 "files",
712 ),
713 "-f",
714 '"TRUE"',
715 ],
716 enter_chroot=True,
717 chroot_args=chroot.get_enter_args(),
718 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700719
Alex Klein1699fab2022-09-08 08:46:06 -0600720 self.assertEqual(len(result.modified), 1)
721 # The public build_config.json and generated C files were modified.
722 expected_modified_files = [
723 os.path.join(self.tempdir, self.public_config_path),
724 os.path.join(
725 self.tempdir, self.public_package_root, "files", "config.c"
726 ),
727 os.path.join(
728 self.tempdir, self.public_package_root, "files", "ec_config.c"
729 ),
730 os.path.join(
731 self.tempdir, self.public_package_root, "files", "ec_config.h"
732 ),
733 ]
734 self.assertEqual(result.modified[0].files, expected_modified_files)
735 self.assertEqual(result.modified[0].new_version, "123")
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700736
Alex Klein1699fab2022-09-08 08:46:06 -0600737 # The update from the private build_config.json was copied to the public.
738 # Note that only the 'a' field is present, as per destination_fields.
739 self.assertEqual(
740 json.loads(self.ReadTempFile(self.public_config_path)),
741 {"chromeos": {"configs": [{"a": 3}]}},
742 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700743
Alex Klein1699fab2022-09-08 08:46:06 -0600744 def test_replicate_private_config_no_build_config(self):
745 """If there is no build config, don't generate C files."""
746 # Modify the replication config to write to "other_config.json" instead of
747 # "build_config.json"
748 modified_destination_path = self.public_config_path.replace(
749 "build_config", "other_config"
750 )
751 replication_config = ReplicationConfig(
752 file_replication_rules=[
753 FileReplicationRule(
754 source_path=self.private_config_path,
755 destination_path=modified_destination_path,
756 file_type=FILE_TYPE_JSON,
757 replication_type=REPLICATION_TYPE_FILTER,
758 destination_fields=FieldMask(paths=["a"]),
759 )
760 ]
761 )
762 osutils.WriteFile(
763 self.replication_config_path,
764 json_format.MessageToJson(replication_config),
765 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700766
Alex Klein1699fab2022-09-08 08:46:06 -0600767 refs = [
768 GitRef(
769 path="/chromeos/overlays/overlay-coral-private",
770 ref="main",
771 revision="123",
772 )
773 ]
774 result = packages.replicate_private_config(
775 _build_targets=None, refs=refs, chroot=Chroot()
776 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700777
Alex Klein1699fab2022-09-08 08:46:06 -0600778 self.assertEqual(len(result.modified), 1)
779 self.assertEqual(
780 result.modified[0].files,
781 [os.path.join(self.tempdir, modified_destination_path)],
782 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700783
Alex Klein1699fab2022-09-08 08:46:06 -0600784 def test_replicate_private_config_multiple_build_configs(self):
785 """An error is thrown if there is more than one build config."""
786 replication_config = ReplicationConfig(
787 file_replication_rules=[
788 FileReplicationRule(
789 source_path=self.private_config_path,
790 destination_path=self.public_config_path,
791 file_type=FILE_TYPE_JSON,
792 replication_type=REPLICATION_TYPE_FILTER,
793 destination_fields=FieldMask(paths=["a"]),
794 ),
795 FileReplicationRule(
796 source_path=self.private_config_path,
797 destination_path=self.public_config_path,
798 file_type=FILE_TYPE_JSON,
799 replication_type=REPLICATION_TYPE_FILTER,
800 destination_fields=FieldMask(paths=["a"]),
801 ),
802 ]
803 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700804
Alex Klein1699fab2022-09-08 08:46:06 -0600805 osutils.WriteFile(
806 self.replication_config_path,
807 json_format.MessageToJson(replication_config),
808 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700809
Alex Klein1699fab2022-09-08 08:46:06 -0600810 refs = [
811 GitRef(
812 path="/chromeos/overlays/overlay-coral-private",
813 ref="main",
814 revision="123",
815 )
816 ]
817 with self.assertRaisesRegex(
818 ValueError,
819 "Expected at most one build_config.json destination path.",
820 ):
821 packages.replicate_private_config(
822 _build_targets=None, refs=refs, chroot=Chroot()
823 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700824
Alex Klein1699fab2022-09-08 08:46:06 -0600825 def test_replicate_private_config_generated_files_incorrect(self):
826 """An error is thrown if generated C files are missing."""
827 self.rc.SetDefaultCmdResult(
828 side_effect=self._write_incorrect_generated_c_files
829 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700830
Alex Klein1699fab2022-09-08 08:46:06 -0600831 refs = [
832 GitRef(
833 path="/chromeos/overlays/overlay-coral-private",
834 ref="main",
835 revision="123",
836 )
837 ]
838 chroot = Chroot()
Andrew Lamb9563a152019-12-04 11:42:18 -0700839
Alex Klein1699fab2022-09-08 08:46:06 -0600840 with self.assertRaisesRegex(
841 packages.GeneratedCrosConfigFilesError,
842 "Expected to find generated C files",
843 ):
844 packages.replicate_private_config(
845 _build_targets=None, refs=refs, chroot=chroot
846 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700847
Alex Klein1699fab2022-09-08 08:46:06 -0600848 def test_replicate_private_config_wrong_number_of_refs(self):
849 """An error is thrown if there is not exactly one ref."""
850 with self.assertRaisesRegex(ValueError, "Expected exactly one ref"):
851 packages.replicate_private_config(
852 _build_targets=None, refs=[], chroot=None
853 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700854
Alex Klein1699fab2022-09-08 08:46:06 -0600855 with self.assertRaisesRegex(ValueError, "Expected exactly one ref"):
856 refs = [
857 GitRef(path="a", ref="main", revision="1"),
858 GitRef(path="a", ref="main", revision="2"),
859 ]
860 packages.replicate_private_config(
861 _build_targets=None, refs=refs, chroot=None
862 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700863
Alex Klein1699fab2022-09-08 08:46:06 -0600864 def test_replicate_private_config_replication_config_missing(self):
865 """An error is thrown if there is not a replication config."""
866 os.remove(self.replication_config_path)
867 with self.assertRaisesRegex(
868 ValueError,
869 "Expected ReplicationConfig missing at %s"
870 % self.replication_config_path,
871 ):
872 refs = [
873 GitRef(
874 path="/chromeos/overlays/overlay-coral-private",
875 ref="main",
876 revision="123",
877 )
878 ]
879 packages.replicate_private_config(
880 _build_targets=None, refs=refs, chroot=None
881 )
Andrew Lambe836f222019-12-09 12:27:38 -0700882
Alex Klein1699fab2022-09-08 08:46:06 -0600883 def test_replicate_private_config_wrong_git_ref_path(self):
884 """An error is thrown if the git ref doesn't point to a private overlay."""
885 with self.assertRaisesRegex(
886 ValueError, "ref.path must match the pattern"
887 ):
888 refs = [GitRef(path="a/b/c", ref="main", revision="123")]
889 packages.replicate_private_config(
890 _build_targets=None, refs=refs, chroot=None
891 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700892
893
Alex Klein5caab872021-09-10 11:44:37 -0600894class GetBestVisibleTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600895 """get_best_visible tests."""
David Burger1e0fe232019-07-01 14:52:07 -0600896
Alex Klein1699fab2022-09-08 08:46:06 -0600897 def test_empty_atom_fails(self):
898 """Test empty atom raises an error."""
899 with self.assertRaises(AssertionError):
900 packages.get_best_visible("")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600901
902
Alex Klein149fd3b2019-12-16 16:01:05 -0700903class HasPrebuiltTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600904 """has_prebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600905
Alex Klein1699fab2022-09-08 08:46:06 -0600906 def test_empty_atom_fails(self):
907 """Test an empty atom results in an error."""
908 with self.assertRaises(AssertionError):
909 packages.has_prebuilt("")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600910
Alex Klein1699fab2022-09-08 08:46:06 -0600911 def test_use_flags(self):
912 """Test use flags get propagated correctly."""
913 # We don't really care about the result, just the env handling.
914 patch = self.PatchObject(portage_util, "HasPrebuilt", return_value=True)
915 # Ignore any flags that may be in the environment.
916 self.PatchObject(os.environ, "get", return_value="")
Alex Klein149fd3b2019-12-16 16:01:05 -0700917
Alex Klein1699fab2022-09-08 08:46:06 -0600918 packages.has_prebuilt("cat/pkg-1.2.3", useflags="useflag")
919 patch.assert_called_with(
920 "cat/pkg-1.2.3", board=None, extra_env={"USE": "useflag"}
921 )
Alex Klein149fd3b2019-12-16 16:01:05 -0700922
Alex Klein1699fab2022-09-08 08:46:06 -0600923 def test_env_use_flags(self):
924 """Test env use flags get propagated correctly with passed useflags."""
925 # We don't really care about the result, just the env handling.
926 patch = self.PatchObject(portage_util, "HasPrebuilt", return_value=True)
927 # Add some flags to the environment.
928 existing_flags = "already set flags"
929 self.PatchObject(os.environ, "get", return_value=existing_flags)
Alex Klein149fd3b2019-12-16 16:01:05 -0700930
Alex Klein1699fab2022-09-08 08:46:06 -0600931 new_flags = "useflag"
932 packages.has_prebuilt("cat/pkg-1.2.3", useflags=new_flags)
933 expected = "%s %s" % (existing_flags, new_flags)
934 patch.assert_called_with(
935 "cat/pkg-1.2.3", board=None, extra_env={"USE": expected}
936 )
Alex Klein149fd3b2019-12-16 16:01:05 -0700937
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600938
939class AndroidVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600940 """Tests getting android versions."""
Michael Mortensen14960d02019-10-18 07:53:59 -0600941
Alex Klein1699fab2022-09-08 08:46:06 -0600942 def setUp(self):
943 package_result = [
944 "chromeos-base/android-container-nyc-4717008-r1",
945 "chromeos-base/update_engine-0.0.3-r3408",
946 ]
947 self.PatchObject(
948 portage_util, "GetPackageDependencies", return_value=package_result
949 )
950 self.board = "board"
951 self.PatchObject(
952 portage_util,
953 "FindEbuildForBoardPackage",
954 return_value="chromeos-base/android-container-nyc",
955 )
956 FakeEnvironment = {
957 "ARM_TARGET": "3-linux-target",
958 }
959 self.PatchObject(
960 osutils, "SourceEnvironment", return_value=FakeEnvironment
961 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600962
Alex Klein1699fab2022-09-08 08:46:06 -0600963 # Clear the LRU cache for the function. We mock the function that provides
964 # the data this function processes to produce its result, so we need to
965 # clear it manually.
966 packages.determine_android_package.cache_clear()
Alex Klein68a28712021-11-08 11:08:30 -0700967
Alex Klein1699fab2022-09-08 08:46:06 -0600968 def test_determine_android_version(self):
969 """Tests that a valid android version is returned."""
970 version = packages.determine_android_version(self.board)
971 self.assertEqual(version, "4717008")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600972
Alex Klein1699fab2022-09-08 08:46:06 -0600973 def test_determine_android_version_when_not_present(self):
974 """Tests that a None is returned for version when android is not present."""
975 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
976 self.PatchObject(
977 portage_util, "GetPackageDependencies", return_value=package_result
978 )
979 version = packages.determine_android_version(self.board)
980 self.assertEqual(version, None)
Michael Mortensenedf76532019-10-16 14:22:37 -0600981
Alex Klein1699fab2022-09-08 08:46:06 -0600982 def test_determine_android_branch(self):
983 """Tests that a valid android branch is returned."""
984 branch = packages.determine_android_branch(self.board)
985 self.assertEqual(branch, "3")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600986
Alex Klein1699fab2022-09-08 08:46:06 -0600987 def test_determine_android_branch_64bit_targets(self):
988 """Tests that a valid android branch is returned with only 64bit targets."""
989 self.PatchObject(
990 osutils,
991 "SourceEnvironment",
992 return_value={"ARM64_TARGET": "3-linux-target"},
993 )
994 branch = packages.determine_android_branch(self.board)
995 self.assertEqual(branch, "3")
Federico 'Morg' Pareschicd9165a2020-05-29 09:45:55 +0900996
Alex Klein1699fab2022-09-08 08:46:06 -0600997 def test_determine_android_branch_when_not_present(self):
998 """Tests that a None is returned for branch when android is not present."""
999 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
1000 self.PatchObject(
1001 portage_util, "GetPackageDependencies", return_value=package_result
1002 )
1003 branch = packages.determine_android_branch(self.board)
1004 self.assertEqual(branch, None)
Michael Mortensenedf76532019-10-16 14:22:37 -06001005
Alex Klein1699fab2022-09-08 08:46:06 -06001006 def test_determine_android_target(self):
1007 """Tests that a valid android target is returned."""
1008 target = packages.determine_android_target(self.board)
1009 self.assertEqual(target, "cheets")
Michael Mortensenc2615b72019-10-15 08:12:24 -06001010
Alex Klein1699fab2022-09-08 08:46:06 -06001011 def test_determine_android_target_when_not_present(self):
1012 """Tests that a None is returned for target when android is not present."""
1013 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
1014 self.PatchObject(
1015 portage_util, "GetPackageDependencies", return_value=package_result
1016 )
1017 target = packages.determine_android_target(self.board)
1018 self.assertEqual(target, None)
Michael Mortensenedf76532019-10-16 14:22:37 -06001019
Alex Klein1699fab2022-09-08 08:46:06 -06001020 def test_determine_android_version_handle_exception(self):
1021 """Tests handling RunCommandError inside determine_android_version."""
1022 # Mock what happens when portage returns that bubbles up (via RunCommand)
1023 # inside portage_util.GetPackageDependencies.
1024 self.PatchObject(
1025 portage_util,
1026 "GetPackageDependencies",
1027 side_effect=cros_build_lib.RunCommandError("error"),
1028 )
1029 target = packages.determine_android_version(self.board)
1030 self.assertEqual(target, None)
Michael Mortensene0f4b542019-10-24 15:30:23 -06001031
Alex Klein1699fab2022-09-08 08:46:06 -06001032 def test_determine_android_package_handle_exception(self):
1033 """Tests handling RunCommandError inside determine_android_package."""
1034 # Mock what happens when portage returns that bubbles up (via RunCommand)
1035 # inside portage_util.GetPackageDependencies.
1036 self.PatchObject(
1037 portage_util,
1038 "GetPackageDependencies",
1039 side_effect=cros_build_lib.RunCommandError("error"),
1040 )
1041 target = packages.determine_android_package(self.board)
1042 self.assertEqual(target, None)
Michael Mortensene0f4b542019-10-24 15:30:23 -06001043
Alex Klein1699fab2022-09-08 08:46:06 -06001044 def test_determine_android_package_callers_handle_exception(self):
1045 """Tests handling RunCommandError by determine_android_package callers."""
1046 # Mock what happens when portage returns that bubbles up (via RunCommand)
1047 # inside portage_util.GetPackageDependencies.
1048 self.PatchObject(
1049 portage_util,
1050 "GetPackageDependencies",
1051 side_effect=cros_build_lib.RunCommandError("error"),
1052 )
1053 # Verify that target is None, as expected.
1054 target = packages.determine_android_package(self.board)
1055 self.assertEqual(target, None)
1056 # determine_android_branch calls determine_android_package
1057 branch = packages.determine_android_branch(self.board)
1058 self.assertEqual(branch, None)
1059 # determine_android_target calls determine_android_package
1060 target = packages.determine_android_target(self.board)
1061 self.assertEqual(target, None)
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001062
Michael Mortensene0f4b542019-10-24 15:30:23 -06001063
Alex Klein1699fab2022-09-08 08:46:06 -06001064@pytest.mark.usefixtures("testcase_caplog", "testcase_monkeypatch")
Michael Mortensende716a12020-05-15 11:27:00 -06001065class FindFingerprintsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001066 """Tests for find_fingerprints."""
Michael Mortensende716a12020-05-15 11:27:00 -06001067
Alex Klein1699fab2022-09-08 08:46:06 -06001068 def setUp(self):
1069 self.board = "test-board"
1070 # Create cheets-fingerprints.txt based on tempdir/src...
1071 self.fingerprint_contents = (
1072 "google/test-board/test-board_cheets"
1073 ":9/R99-12345.0.9999/123456:user/release-keys"
1074 )
1075 fingerprint_path = os.path.join(
1076 self.tempdir,
1077 "src/build/images/test-board/latest/cheets-fingerprint.txt",
1078 )
1079 self.chroot = Chroot(self.tempdir)
1080 osutils.WriteFile(
1081 fingerprint_path, self.fingerprint_contents, makedirs=True
1082 )
Michael Mortensende716a12020-05-15 11:27:00 -06001083
Alex Klein1699fab2022-09-08 08:46:06 -06001084 def test_find_fingerprints_with_test_path(self):
1085 """Tests get_firmware_versions with mocked output."""
1086 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1087 build_target = build_target_lib.BuildTarget(self.board)
1088 result = packages.find_fingerprints(build_target)
1089 self.assertEqual(result, [self.fingerprint_contents])
1090 self.assertIn("Reading fingerprint file", self.caplog.text)
Michael Mortensende716a12020-05-15 11:27:00 -06001091
Alex Klein1699fab2022-09-08 08:46:06 -06001092 def test_find_fingerprints(self):
1093 """Tests get_firmware_versions with mocked output."""
1094 # Use board name whose path for fingerprint file does not exist.
1095 # Verify that fingerprint file is not found and None is returned.
1096 build_target = build_target_lib.BuildTarget("wrong-boardname")
1097 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1098 result = packages.find_fingerprints(build_target)
1099 self.assertEqual(result, [])
1100 self.assertIn("Fingerprint file not found", self.caplog.text)
Michael Mortensende716a12020-05-15 11:27:00 -06001101
1102
Michael Mortensen59e30872020-05-18 14:12:49 -06001103class GetAllFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001104 """Tests for get_firmware_versions."""
Michael Mortensen59e30872020-05-18 14:12:49 -06001105
Alex Klein1699fab2022-09-08 08:46:06 -06001106 def setUp(self):
1107 self.board = "test-board"
1108 self.rc.SetDefaultCmdResult(
1109 stdout="""
Michael Mortensen59e30872020-05-18 14:12:49 -06001110
1111flashrom(8): 68935ee2fcfcffa47af81b966269cd2b */build/reef/usr/sbin/flashrom
1112 ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e102cc98d45300b50088999d53775acbeff407dc, stripped
1113 0.9.9 : bbb2d6a : Jul 28 2017 15:12:34 UTC
1114
1115Model: reef
1116BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
1117BIOS version: Google_Reef.9042.87.1
1118BIOS (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
1119BIOS (RW) version: Google_Reef.9042.110.0
1120EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
1121EC version: reef_v1.1.5900-ab1ee51
1122EC (RW) version: reef_v1.1.5909-bd1f0c9
1123
1124Model: pyro
1125BIOS image: 9e62447ebf22a724a4a835018ab6234e */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/image.bin
1126BIOS version: Google_Pyro.9042.87.1
1127BIOS (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
1128BIOS (RW) version: Google_Pyro.9042.110.0
1129EC image: 44b93ed591733519e752e05aa0529eb5 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/ec.bin
1130EC version: pyro_v1.1.5900-ab1ee51
1131EC (RW) version: pyro_v1.1.5909-bd1f0c9
1132
1133Model: snappy
1134BIOS image: 3ab63ff080596bd7de4e7619f003bb64 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/image.bin
1135BIOS version: Google_Snappy.9042.110.0
1136EC image: c4db159e84428391d2ee25368c5fe5b6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/ec.bin
1137EC version: snappy_v1.1.5909-bd1f0c9
1138
1139Model: sand
1140BIOS image: 387da034a4f0a3f53e278ebfdcc2a412 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/image.bin
1141BIOS version: Google_Sand.9042.110.0
1142EC image: 411562e0589dacec131f5fdfbe95a561 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/ec.bin
1143EC version: sand_v1.1.5909-bd1f0c9
1144
1145Model: electro
1146BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
1147BIOS version: Google_Reef.9042.87.1
1148BIOS (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
1149BIOS (RW) version: Google_Reef.9042.110.0
1150EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
1151EC version: reef_v1.1.5900-ab1ee51
1152EC (RW) version: reef_v1.1.5909-bd1f0c9
1153
1154Package Content:
1155612e7bb6ed1fb0a05abf2ebdc834c18b *./updater4.sh
11560eafbee07282315829d0f42135ec7c0c *./gbb_utility
11576074e3ca424cb30a67c378c1d9681f9c *./mosys
115868935ee2fcfcffa47af81b966269cd2b *./flashrom
11590eafbee07282315829d0f42135ec7c0c *./dump_fmap
1160490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
116160899148600b8673ddb711faa55aee40 *./common.sh
11623c3a99346d1ca1273cbcd86c104851ff *./shflags
1163de7ce035e1f82a89f8909d888ee402c0 *./crosutil.sh
1164f9334372bdb9036ba09a6fd9bf30e7a2 *./crossystem
116522257a8d5f0adc1f50a1916c3a4a35dd *./models/reef/ec.bin
1166faf12dbb7cdaf21ce153bdffb67841fd *./models/reef/bios.bin
1167c9bbb417b7921b85a7ed999ee42f550e *./models/reef/setvars.sh
116829823d46f1ec1491ecacd7b830fd2686 *./models/pyro/ec.bin
11692320463aba8b22eb5ea836f094d281b3 *./models/pyro/bios.bin
117081614833ad77c9cd093360ba7bea76b8 *./models/pyro/setvars.sh
1171411562e0589dacec131f5fdfbe95a561 *./models/sand/ec.bin
1172387da034a4f0a3f53e278ebfdcc2a412 *./models/sand/bios.bin
1173fcd8cb0ac0e2ed6be220aaae435d43ff *./models/sand/setvars.sh
1174c4db159e84428391d2ee25368c5fe5b6 *./models/snappy/ec.bin
11753ab63ff080596bd7de4e7619f003bb64 *./models/snappy/bios.bin
1176fe5d699f2e9e4a7de031497953313dbd *./models/snappy/setvars.sh
117779aabd7cd8a215a54234c53d7bb2e6fb *./vpd
Alex Klein1699fab2022-09-08 08:46:06 -06001178"""
1179 )
Michael Mortensen59e30872020-05-18 14:12:49 -06001180
Alex Klein1699fab2022-09-08 08:46:06 -06001181 def test_get_firmware_versions(self):
1182 """Tests get_firmware_versions with mocked output."""
1183 build_target = build_target_lib.BuildTarget(self.board)
1184 result = packages.get_all_firmware_versions(build_target)
1185 self.assertEqual(len(result), 5)
1186 self.assertEqual(
1187 result["reef"],
1188 packages.FirmwareVersions(
1189 "reef",
1190 "Google_Reef.9042.87.1",
1191 "Google_Reef.9042.110.0",
1192 "reef_v1.1.5900-ab1ee51",
1193 "reef_v1.1.5909-bd1f0c9",
1194 ),
1195 )
1196 self.assertEqual(
1197 result["pyro"],
1198 packages.FirmwareVersions(
1199 "pyro",
1200 "Google_Pyro.9042.87.1",
1201 "Google_Pyro.9042.110.0",
1202 "pyro_v1.1.5900-ab1ee51",
1203 "pyro_v1.1.5909-bd1f0c9",
1204 ),
1205 )
1206 self.assertEqual(
1207 result["snappy"],
1208 packages.FirmwareVersions(
1209 "snappy",
1210 "Google_Snappy.9042.110.0",
1211 None,
1212 "snappy_v1.1.5909-bd1f0c9",
1213 None,
1214 ),
1215 )
1216 self.assertEqual(
1217 result["sand"],
1218 packages.FirmwareVersions(
1219 "sand",
1220 "Google_Sand.9042.110.0",
1221 None,
1222 "sand_v1.1.5909-bd1f0c9",
1223 None,
1224 ),
1225 )
1226 self.assertEqual(
1227 result["electro"],
1228 packages.FirmwareVersions(
1229 "electro",
1230 "Google_Reef.9042.87.1",
1231 "Google_Reef.9042.110.0",
1232 "reef_v1.1.5900-ab1ee51",
1233 "reef_v1.1.5909-bd1f0c9",
1234 ),
1235 )
Michael Mortensen59e30872020-05-18 14:12:49 -06001236
Alex Klein1699fab2022-09-08 08:46:06 -06001237 def test_get_firmware_versions_error(self):
1238 """Tests get_firmware_versions with no output."""
1239 # Throw an exception when running the command.
1240 self.PatchObject(
1241 cros_build_lib,
1242 "run",
1243 side_effect=cros_build_lib.RunCommandError("error"),
1244 )
1245 build_target = build_target_lib.BuildTarget(self.board)
1246 result = packages.get_all_firmware_versions(build_target)
1247 self.assertEqual(result, {})
Benjamin Shai12c767e2022-01-12 15:17:44 +00001248
Michael Mortensen59e30872020-05-18 14:12:49 -06001249
Michael Mortensen71ef5682020-05-07 14:29:24 -06001250class GetFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001251 """Tests for get_firmware_versions."""
Michael Mortensen71ef5682020-05-07 14:29:24 -06001252
Alex Klein1699fab2022-09-08 08:46:06 -06001253 def setUp(self):
1254 self.board = "test-board"
1255 self.rc.SetDefaultCmdResult(
1256 stdout="""
Michael Mortensen71ef5682020-05-07 14:29:24 -06001257
1258flashrom(8): a8f99c2e61e7dc09c4b25ef5a76ef692 */build/kevin/usr/sbin/flashrom
1259 ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.d
1260 0.9.4 : 860875a : Apr 10 2017 23:54:29 UTC
1261
1262BIOS image: 6b5b855a0b8fd1657546d1402c15b206 *chromeos-firmware-kevin-0.0.1/.dist/kevin_fw_8785.178.0.n
1263BIOS version: Google_Kevin.8785.178.0
1264EC image: 1ebfa9518e6cac0558a80b7ab2f5b489 *chromeos-firmware-kevin-0.0.1/.dist/kevin_ec_8785.178.0.n
1265EC version:kevin_v1.10.184-459421c
1266
1267Package Content:
1268a8f99c2e61e7dc09c4b25ef5a76ef692 *./flashrom
12693c3a99346d1ca1273cbcd86c104851ff *./shflags
1270457a8dc8546764affc9700f8da328d23 *./dump_fmap
1271c392980ddb542639edf44a965a59361a *./updater5.sh
1272490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
12736b5b855a0b8fd1657546d1402c15b206 *./bios.bin
12747b5bef0d2da90c23ff2e157250edf0fa *./crosutil.sh
1275d78722e4f1a0dc2d8c3d6b0bc7010ae3 *./crossystem
1276457a8dc8546764affc9700f8da328d23 *./gbb_utility
12771ebfa9518e6cac0558a80b7ab2f5b489 *./ec.bin
1278c98ca54db130886142ad582a58e90ddc *./common.sh
12795ba978bdec0f696f47f0f0de90936880 *./mosys
1280312e8ee6122057f2a246d7bcf1572f49 *./vpd
Alex Klein1699fab2022-09-08 08:46:06 -06001281"""
1282 )
Michael Mortensen71ef5682020-05-07 14:29:24 -06001283
Alex Klein1699fab2022-09-08 08:46:06 -06001284 def test_get_firmware_versions(self):
1285 """Tests get_firmware_versions with mocked output."""
1286 build_target = build_target_lib.BuildTarget(self.board)
1287 result = packages.get_firmware_versions(build_target)
1288 versions = packages.FirmwareVersions(
1289 None,
1290 "Google_Kevin.8785.178.0",
1291 None,
1292 "kevin_v1.10.184-459421c",
1293 None,
1294 )
1295 self.assertEqual(result, versions)
Michael Mortensen71ef5682020-05-07 14:29:24 -06001296
1297
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001298class DetermineKernelVersionTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001299 """Tests for determine_kernel_version."""
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001300
Alex Klein1699fab2022-09-08 08:46:06 -06001301 def setUp(self):
1302 self.board = "test-board"
1303 self.build_target = build_target_lib.BuildTarget(self.board)
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001304
Alex Klein1699fab2022-09-08 08:46:06 -06001305 def test_determine_kernel_version(self):
1306 """Tests that a valid kernel version is returned."""
Lizzy Presland0b978e62022-09-09 16:55:29 +00001307 kernel_candidates = [
1308 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
Alex Klein1699fab2022-09-08 08:46:06 -06001309 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
Lizzy Presland0b978e62022-09-09 16:55:29 +00001310 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1311 "sys-kernel/upstream-kernel-next-9999",
1312 "sys-kernel/socfpga-kernel-4.20-r34",
Alex Klein1699fab2022-09-08 08:46:06 -06001313 ]
1314 self.PatchObject(
Lizzy Presland0b978e62022-09-09 16:55:29 +00001315 portage_util,
1316 "GetFlattenedDepsForPackage",
1317 return_value=kernel_candidates,
1318 )
1319
1320 installed_pkgs = [
1321 "sys-kernel/linux-firmware-0.0.1-r594",
1322 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1323 "virtual/linux-sources-1-r30",
1324 ]
1325 self.PatchObject(
1326 portage_util,
1327 "GetPackageDependencies",
1328 return_value=installed_pkgs,
Alex Klein1699fab2022-09-08 08:46:06 -06001329 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001330
Alex Klein1699fab2022-09-08 08:46:06 -06001331 result = packages.determine_kernel_version(self.build_target)
1332 self.assertEqual(result, "4.4.223-r2209")
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001333
Lizzy Presland0b978e62022-09-09 16:55:29 +00001334 def test_determine_kernel_version_ignores_exact_duplicates(self):
1335 """Tests that multiple results for candidates is ignored."""
1336 # Depgraph is evaluated for version as well as revision, so graph will
1337 # return all results twice.
1338 kernel_candidates = [
1339 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1340 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1341 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1342 "sys-kernel/upstream-kernel-next-9999",
1343 "sys-kernel/socfpga-kernel-4.20-r34",
1344 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1345 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1346 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1347 "sys-kernel/upstream-kernel-next-9999",
1348 "sys-kernel/socfpga-kernel-4.20-r34",
1349 ]
1350 self.PatchObject(
1351 portage_util,
1352 "GetFlattenedDepsForPackage",
1353 return_value=kernel_candidates,
1354 )
1355
1356 installed_pkgs = [
1357 "sys-kernel/linux-firmware-0.0.1-r594",
1358 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1359 "virtual/linux-sources-1-r30",
1360 ]
Alex Klein1699fab2022-09-08 08:46:06 -06001361 self.PatchObject(
1362 portage_util,
1363 "GetPackageDependencies",
Lizzy Presland0b978e62022-09-09 16:55:29 +00001364 return_value=installed_pkgs,
1365 )
1366
1367 result = packages.determine_kernel_version(self.build_target)
1368 self.assertEqual(result, "4.4.223-r2209")
1369
1370 def test_determine_kernel_version_ignores_virtual_package(self):
1371 """Tests that top-level package is ignored as potential kernel pkg."""
1372 # Depgraph results include the named package at level 0 as well as its
1373 # first-order dependencies, so verify that the virtual package is not
1374 # included as a kernel package.
1375 kernel_candidates = [
1376 "virtual/linux-sources-1",
1377 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1378 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1379 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1380 "sys-kernel/upstream-kernel-next-9999",
1381 "sys-kernel/socfpga-kernel-4.20-r34",
1382 "virtual/linux-sources-1-r30",
1383 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1384 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1385 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1386 "sys-kernel/upstream-kernel-next-9999",
1387 "sys-kernel/socfpga-kernel-4.20-r34",
1388 ]
1389 self.PatchObject(
1390 portage_util,
1391 "GetFlattenedDepsForPackage",
1392 return_value=kernel_candidates,
1393 )
1394
1395 installed_pkgs = [
1396 "sys-kernel/linux-firmware-0.0.1-r594",
1397 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1398 "virtual/linux-sources-1-r30",
1399 ]
1400 self.PatchObject(
1401 portage_util,
1402 "GetPackageDependencies",
1403 return_value=installed_pkgs,
1404 )
1405
1406 result = packages.determine_kernel_version(self.build_target)
1407 self.assertEqual(result, "4.4.223-r2209")
1408
1409 def test_determine_kernel_version_too_many(self):
1410 """Tests that an exception is thrown with too many matching packages."""
1411 package_result = [
1412 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1413 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1414 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1415 "sys-kernel/upstream-kernel-next-9999",
1416 "sys-kernel/socfpga-kernel-4.20-r34",
1417 ]
1418 self.PatchObject(
1419 portage_util,
1420 "GetFlattenedDepsForPackage",
1421 return_value=package_result,
1422 )
1423
1424 installed_pkgs = [
1425 "sys-kernel/linux-firmware-0.0.1-r594",
1426 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1427 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1428 "virtual/linux-sources-1-r30",
1429 ]
1430 self.PatchObject(
1431 portage_util,
1432 "GetPackageDependencies",
1433 return_value=installed_pkgs,
1434 )
1435
1436 with self.assertRaises(packages.KernelVersionError):
1437 packages.determine_kernel_version(self.build_target)
1438
1439 def test_determine_kernel_version_no_kernel_match(self):
1440 """Tests that an exception is thrown with 0-sized intersection."""
1441 package_result = [
1442 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1443 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1444 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1445 "sys-kernel/upstream-kernel-next-9999",
1446 ]
1447 self.PatchObject(
1448 portage_util,
1449 "GetFlattenedDepsForPackage",
1450 return_value=package_result,
1451 )
1452
1453 installed_pkgs = [
1454 "sys-kernel/linux-firmware-0.0.1-r594",
1455 "sys-kernel/socfpga-kernel-4.20-r34",
1456 "virtual/linux-sources-1-r30",
1457 ]
1458 self.PatchObject(
1459 portage_util,
1460 "GetPackageDependencies",
1461 return_value=installed_pkgs,
1462 )
1463
1464 with self.assertRaises(packages.KernelVersionError):
1465 packages.determine_kernel_version(self.build_target)
1466
1467 def test_determine_kernel_version_exception(self):
1468 """Tests that portage_util exceptions result in returning empty str."""
1469 self.PatchObject(
1470 portage_util,
1471 "GetFlattenedDepsForPackage",
Alex Klein1699fab2022-09-08 08:46:06 -06001472 side_effect=cros_build_lib.RunCommandError("error"),
1473 )
1474 result = packages.determine_kernel_version(self.build_target)
Lizzy Presland0b978e62022-09-09 16:55:29 +00001475 self.assertEqual(result, "")
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001476
Alex Klein627e04c2021-11-10 15:56:47 -07001477
Michael Mortensenc2615b72019-10-15 08:12:24 -06001478class ChromeVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001479 """Tests getting chrome version."""
Michael Mortensen14960d02019-10-18 07:53:59 -06001480
Alex Klein1699fab2022-09-08 08:46:06 -06001481 def setUp(self):
1482 self.build_target = build_target_lib.BuildTarget("board")
Michael Mortensenc2615b72019-10-15 08:12:24 -06001483
Alex Klein1699fab2022-09-08 08:46:06 -06001484 def test_determine_chrome_version(self):
1485 """Tests that a valid chrome version is returned."""
1486 # Mock PortageqBestVisible to return a valid chrome version string.
1487 r1_cpf = "chromeos-base/chromeos-chrome-78.0.3900.0_rc-r1"
1488 r1_cpv = package_info.SplitCPV(r1_cpf)
1489 self.PatchObject(
1490 portage_util, "PortageqBestVisible", return_value=r1_cpv
1491 )
Michael Mortensenc2615b72019-10-15 08:12:24 -06001492
Alex Klein1699fab2022-09-08 08:46:06 -06001493 chrome_version = packages.determine_chrome_version(self.build_target)
1494 version_numbers = chrome_version.split(".")
1495 self.assertEqual(len(version_numbers), 4)
1496 self.assertEqual(int(version_numbers[0]), 78)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001497
Alex Klein1699fab2022-09-08 08:46:06 -06001498 def test_determine_chrome_version_handle_exception(self):
1499 # Mock what happens when portage throws an exception that bubbles up (via
1500 # RunCommand)inside portage_util.PortageqBestVisible.
1501 self.PatchObject(
1502 portage_util,
1503 "PortageqBestVisible",
1504 side_effect=cros_build_lib.RunCommandError("error"),
1505 )
1506 target = packages.determine_chrome_version(self.build_target)
1507 self.assertEqual(target, None)
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001508
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001509
1510class PlatformVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001511 """Tests getting platform version."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001512
Alex Klein1699fab2022-09-08 08:46:06 -06001513 def test_determine_platform_version(self):
1514 """Test checking that a valid platform version is returned."""
1515 platform_version = packages.determine_platform_version()
1516 # The returned platform version is something like 12603.0.0.
1517 version_string_list = platform_version.split(".")
1518 self.assertEqual(len(version_string_list), 3)
1519 # We don't want to check an exact version, but the first number should be
1520 # non-zero.
1521 self.assertGreaterEqual(int(version_string_list[0]), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001522
Alex Klein1699fab2022-09-08 08:46:06 -06001523 def test_determine_milestone_version(self):
1524 """Test checking that a valid milestone version is returned."""
1525 milestone_version = packages.determine_milestone_version()
1526 # Milestone version should be non-zero
1527 self.assertGreaterEqual(int(milestone_version), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001528
Alex Klein1699fab2022-09-08 08:46:06 -06001529 def test_determine_full_version(self):
1530 """Test checking that a valid full version is returned."""
1531 full_version = packages.determine_full_version()
1532 pattern = r"^R(\d+)-(\d+.\d+.\d+(-rc\d+)*)"
1533 m = re.match(pattern, full_version)
1534 self.assertTrue(m)
1535 milestone_version = m.group(1)
1536 self.assertGreaterEqual(int(milestone_version), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001537
Alex Klein1699fab2022-09-08 08:46:06 -06001538 def test_versions_based_on_mock(self):
1539 # Create a test version_info object, and than mock VersionInfo.from_repo
1540 # return it.
1541 test_platform_version = "12575.0.0"
1542 test_chrome_branch = "75"
1543 version_info_mock = chromeos_version.VersionInfo(test_platform_version)
1544 version_info_mock.chrome_branch = test_chrome_branch
1545 self.PatchObject(
1546 chromeos_version.VersionInfo,
1547 "from_repo",
1548 return_value=version_info_mock,
1549 )
1550 test_full_version = (
1551 "R" + test_chrome_branch + "-" + test_platform_version
1552 )
1553 platform_version = packages.determine_platform_version()
1554 milestone_version = packages.determine_milestone_version()
1555 full_version = packages.determine_full_version()
1556 self.assertEqual(platform_version, test_platform_version)
1557 self.assertEqual(milestone_version, test_chrome_branch)
1558 self.assertEqual(full_version, test_full_version)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001559
1560
1561# Each of the columns in the following table is a separate dimension along
1562# which Chrome uprev test cases can vary in behavior. The full test space would
1563# be the Cartesian product of the possible values of each column.
1564# 'CHROME_EBUILD' refers to the relationship between the version of the existing
1565# Chrome ebuild vs. the requested uprev version. 'FOLLOWER_EBUILDS' refers to
1566# the same relationship but for the packages defined in OTHER_CHROME_PACKAGES.
1567# 'EBUILDS MODIFIED' refers to whether any of the existing 9999 ebuilds have
1568# modified contents relative to their corresponding stable ebuilds.
1569#
1570# CHROME_EBUILD FOLLOWER_EBUILDS EBUILDS_MODIFIED
1571#
1572# HIGHER HIGHER YES
1573# SAME SAME NO
1574# LOWER LOWER
1575# DOESN'T EXIST YET
1576
1577# These test cases cover both CHROME & FOLLOWER ebuilds being identically
1578# higher, lower, or the same versions, with no modified ebuilds.
1579UPREV_VERSION_CASES = (
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001580 # Uprev.
Chris McDonaldea0312c2020-05-04 23:33:15 -06001581 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001582 "80.0.8080.0",
1583 "81.0.8181.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001584 # One added and one deleted for chrome and each "other" package.
1585 2 * (1 + len(constants.OTHER_CHROME_PACKAGES)),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001586 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001587 id="newer_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001588 ),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001589 # Revbump.
1590 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001591 "80.0.8080.0",
1592 "80.0.8080.0",
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001593 2,
1594 True,
Alex Klein1699fab2022-09-08 08:46:06 -06001595 id="chrome_revbump",
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001596 ),
Chris McDonaldea0312c2020-05-04 23:33:15 -06001597 # No files should be changed in these cases.
1598 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001599 "80.0.8080.0",
1600 "80.0.8080.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001601 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001602 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001603 id="same_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001604 ),
1605 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001606 "80.0.8080.0",
1607 "79.0.7979.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001608 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001609 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001610 id="older_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001611 ),
1612)
1613
1614
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001615@pytest.mark.parametrize(
Alex Klein1699fab2022-09-08 08:46:06 -06001616 "old_version, new_version, expected_count, modify_unstable",
1617 UPREV_VERSION_CASES,
1618)
1619def test_uprev_chrome_all_files_already_exist(
1620 old_version,
1621 new_version,
1622 expected_count,
1623 modify_unstable,
1624 monkeypatch,
1625 overlay_stack,
1626):
1627 """Test Chrome uprevs work as expected when all packages already exist."""
1628 (overlay,) = overlay_stack(1)
1629 monkeypatch.setattr(uprev_lib, "_CHROME_OVERLAY_PATH", overlay.path)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001630
Alex Klein1699fab2022-09-08 08:46:06 -06001631 unstable_chrome = cr.test.Package(
1632 "chromeos-base", "chromeos-chrome", version="9999", keywords="~*"
1633 )
1634 if modify_unstable:
1635 # Add some field not set in stable.
1636 unstable_chrome.depend = "foo/bar"
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001637
Alex Klein1699fab2022-09-08 08:46:06 -06001638 stable_chrome = cr.test.Package(
1639 "chromeos-base", "chromeos-chrome", version=f"{old_version}_rc-r1"
1640 )
Chris McDonaldea0312c2020-05-04 23:33:15 -06001641
Alex Klein1699fab2022-09-08 08:46:06 -06001642 overlay.add_package(unstable_chrome)
1643 overlay.add_package(stable_chrome)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001644
Alex Klein1699fab2022-09-08 08:46:06 -06001645 for pkg_str in constants.OTHER_CHROME_PACKAGES:
1646 category, pkg_name = pkg_str.split("/")
1647 unstable_pkg = cr.test.Package(
1648 category, pkg_name, version="9999", keywords="~*"
1649 )
1650 stable_pkg = cr.test.Package(
1651 category, pkg_name, version=f"{old_version}_rc-r1"
1652 )
Chris McDonaldea0312c2020-05-04 23:33:15 -06001653
Alex Klein1699fab2022-09-08 08:46:06 -06001654 overlay.add_package(unstable_pkg)
1655 overlay.add_package(stable_pkg)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001656
Alex Klein1699fab2022-09-08 08:46:06 -06001657 git_refs = [
1658 GitRef(
1659 path="/foo", ref=f"refs/tags/{new_version}", revision="stubcommit"
1660 )
1661 ]
1662 res = packages.uprev_chrome_from_ref(None, git_refs, None)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001663
Alex Klein1699fab2022-09-08 08:46:06 -06001664 modified_file_count = sum(len(m.files) for m in res.modified)
1665 assert modified_file_count == expected_count
Michael Mortensen125bb012020-05-21 14:02:10 -06001666
1667
Alex Klein1699fab2022-09-08 08:46:06 -06001668@pytest.mark.usefixtures("testcase_monkeypatch")
Michael Mortensen125bb012020-05-21 14:02:10 -06001669class GetModelsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001670 """Tests for get_models."""
Michael Mortensen125bb012020-05-21 14:02:10 -06001671
Alex Klein1699fab2022-09-08 08:46:06 -06001672 def setUp(self):
1673 self.board = "test-board"
1674 self.rc.SetDefaultCmdResult(stdout="pyro\nreef\nsnappy\n")
1675 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1676 build_bin = os.path.join(
1677 self.tempdir, constants.DEFAULT_CHROOT_DIR, "usr", "bin"
1678 )
1679 osutils.Touch(
1680 os.path.join(build_bin, "cros_config_host"), makedirs=True
1681 )
Michael Mortensen125bb012020-05-21 14:02:10 -06001682
Alex Klein1699fab2022-09-08 08:46:06 -06001683 def testGetModels(self):
1684 """Test get_models."""
1685 build_target = build_target_lib.BuildTarget(self.board)
1686 result = packages.get_models(build_target)
1687 self.assertEqual(result, ["pyro", "reef", "snappy"])
Michael Mortensen359c1f32020-05-28 19:35:42 -06001688
1689
1690class GetKeyIdTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001691 """Tests for get_key_id."""
Michael Mortensen359c1f32020-05-28 19:35:42 -06001692
Alex Klein1699fab2022-09-08 08:46:06 -06001693 def setUp(self):
1694 self.board = "test-board"
1695 self.build_target = build_target_lib.BuildTarget(self.board)
Michael Mortensen359c1f32020-05-28 19:35:42 -06001696
Alex Klein1699fab2022-09-08 08:46:06 -06001697 def testGetKeyId(self):
1698 """Test get_key_id when _run_cros_config_host returns a key."""
1699 self.PatchObject(
1700 packages, "_run_cros_config_host", return_value=["key"]
1701 )
1702 result = packages.get_key_id(self.build_target, "model")
1703 self.assertEqual(result, "key")
Michael Mortensen359c1f32020-05-28 19:35:42 -06001704
Alex Klein1699fab2022-09-08 08:46:06 -06001705 def testGetKeyIdNoKey(self):
1706 """Test get_key_id when None should be returned."""
1707 self.PatchObject(
1708 packages, "_run_cros_config_host", return_value=["key1", "key2"]
1709 )
1710 result = packages.get_key_id(self.build_target, "model")
1711 self.assertEqual(result, None)
Ben Reiche779cf42020-12-15 03:21:31 +00001712
1713
Harvey Yang3eee06c2021-03-18 15:47:56 +08001714class GetLatestVersionTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001715 """Tests for get_latest_version_from_refs."""
Ben Reiche779cf42020-12-15 03:21:31 +00001716
Alex Klein1699fab2022-09-08 08:46:06 -06001717 def setUp(self):
1718 self.prefix = "refs/tags/drivefs_"
1719 # The tag ref template.
1720 ref_tpl = self.prefix + "%s"
Ben Reiche779cf42020-12-15 03:21:31 +00001721
Alex Klein1699fab2022-09-08 08:46:06 -06001722 self.latest = "44.0.20"
1723 self.versions = ["42.0.1", self.latest, "44.0.19", "39.0.15"]
1724 self.latest_ref = uprev_lib.GitRef(
1725 "/path", ref_tpl % self.latest, "abc123"
1726 )
1727 self.refs = [
1728 uprev_lib.GitRef("/path", ref_tpl % v, "abc123")
1729 for v in self.versions
1730 ]
Ben Reiche779cf42020-12-15 03:21:31 +00001731
Alex Klein1699fab2022-09-08 08:46:06 -06001732 def test_single_ref(self):
1733 """Test a single ref is supplied."""
1734 # pylint: disable=protected-access
1735 self.assertEqual(
1736 self.latest,
1737 packages._get_latest_version_from_refs(
1738 self.prefix, [self.latest_ref]
1739 ),
1740 )
Ben Reiche779cf42020-12-15 03:21:31 +00001741
Alex Klein1699fab2022-09-08 08:46:06 -06001742 def test_multiple_ref_versions(self):
1743 """Test multiple refs supplied."""
1744 # pylint: disable=protected-access
1745 self.assertEqual(
1746 self.latest,
1747 packages._get_latest_version_from_refs(self.prefix, self.refs),
1748 )
Ben Reiche779cf42020-12-15 03:21:31 +00001749
Alex Klein1699fab2022-09-08 08:46:06 -06001750 def test_no_refs_returns_none(self):
1751 """Test no refs supplied."""
1752 # pylint: disable=protected-access
1753 self.assertEqual(
1754 packages._get_latest_version_from_refs(self.prefix, []), None
1755 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001756
Chinglin Yu84818732022-10-03 12:03:43 +08001757 def test_ref_prefix(self):
1758 """Test refs with a different prefix isn't used"""
1759 # pylint: disable=protected-access
1760 # Add refs/tags/foo_100.0.0 to the refs, which should be ignored in
1761 # _get_latest_version_from_refs because the prefix doesn't match, even
1762 # if its version number is larger.
1763 refs = self.refs + [
1764 uprev_lib.GitRef("/path", "refs/tags/foo_100.0.0", "abc123")
1765 ]
1766 self.assertEqual(
1767 self.latest,
1768 packages._get_latest_version_from_refs(self.prefix, refs),
1769 )
1770
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001771
Alex Klein6becabc2020-09-11 14:03:05 -06001772class NeedsChromeSourceTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001773 """Tests for needs_chrome_source."""
Alex Klein6becabc2020-09-11 14:03:05 -06001774
Alex Klein1699fab2022-09-08 08:46:06 -06001775 def _build_graph(self, with_chrome: bool, with_followers: bool):
1776 root = "/build/build_target"
1777 foo_bar = package_info.parse("foo/bar-1")
1778 chrome = package_info.parse(f"{constants.CHROME_CP}-1.2.3.4")
1779 followers = [
1780 package_info.parse(f"{pkg}-1.2.3.4")
1781 for pkg in constants.OTHER_CHROME_PACKAGES
1782 ]
1783 nodes = [dependency_graph.PackageNode(foo_bar, root)]
1784 root_pkgs = ["foo/bar-1"]
1785 if with_chrome:
1786 nodes.append(dependency_graph.PackageNode(chrome, root))
1787 root_pkgs.append(chrome.cpvr)
1788 if with_followers:
1789 nodes.extend(
1790 [dependency_graph.PackageNode(f, root) for f in followers]
1791 )
1792 root_pkgs.extend([f.cpvr for f in followers])
Alex Klein6becabc2020-09-11 14:03:05 -06001793
Alex Klein1699fab2022-09-08 08:46:06 -06001794 return dependency_graph.DependencyGraph(nodes, root, root_pkgs)
Alex Klein6becabc2020-09-11 14:03:05 -06001795
Alex Klein1699fab2022-09-08 08:46:06 -06001796 def test_needs_all(self):
1797 """Verify we need source when we have no prebuilts."""
1798 graph = self._build_graph(with_chrome=True, with_followers=True)
1799 self.PatchObject(
1800 depgraph, "get_sysroot_dependency_graph", return_value=graph
1801 )
1802 self.PatchObject(packages, "has_prebuilt", return_value=False)
1803 self.PatchObject(
1804 packages,
1805 "uprev_chrome",
1806 return_value=uprev_lib.UprevVersionedPackageResult(),
1807 )
Alex Klein6becabc2020-09-11 14:03:05 -06001808
Alex Klein1699fab2022-09-08 08:46:06 -06001809 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001810
Alex Klein1699fab2022-09-08 08:46:06 -06001811 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001812
Alex Klein1699fab2022-09-08 08:46:06 -06001813 self.assertTrue(result.needs_chrome_source)
1814 self.assertTrue(result.builds_chrome)
1815 self.assertTrue(result.packages)
1816 self.assertEqual(
1817 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1818 )
1819 self.assertTrue(result.missing_chrome_prebuilt)
1820 self.assertTrue(result.missing_follower_prebuilt)
1821 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001822
Alex Klein1699fab2022-09-08 08:46:06 -06001823 def test_needs_none(self):
1824 """Verify not building any of the chrome packages prevents needing it."""
1825 graph = self._build_graph(with_chrome=False, with_followers=False)
1826 self.PatchObject(
1827 depgraph, "get_sysroot_dependency_graph", return_value=graph
1828 )
1829 self.PatchObject(packages, "has_prebuilt", return_value=False)
1830 self.PatchObject(
1831 packages,
1832 "uprev_chrome",
1833 return_value=uprev_lib.UprevVersionedPackageResult(),
1834 )
Alex Klein6becabc2020-09-11 14:03:05 -06001835
Alex Klein1699fab2022-09-08 08:46:06 -06001836 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001837
Alex Klein1699fab2022-09-08 08:46:06 -06001838 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001839
Alex Klein1699fab2022-09-08 08:46:06 -06001840 self.assertFalse(result.needs_chrome_source)
1841 self.assertFalse(result.builds_chrome)
1842 self.assertFalse(result.packages)
1843 self.assertFalse(result.missing_chrome_prebuilt)
1844 self.assertFalse(result.missing_follower_prebuilt)
1845 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001846
Alex Klein1699fab2022-09-08 08:46:06 -06001847 def test_needs_chrome_only(self):
1848 """Verify only chrome triggers needs chrome source."""
1849 graph = self._build_graph(with_chrome=True, with_followers=False)
1850 self.PatchObject(
1851 depgraph, "get_sysroot_dependency_graph", return_value=graph
1852 )
1853 self.PatchObject(packages, "has_prebuilt", return_value=False)
1854 self.PatchObject(
1855 packages,
1856 "uprev_chrome",
1857 return_value=uprev_lib.UprevVersionedPackageResult(),
1858 )
Alex Klein6becabc2020-09-11 14:03:05 -06001859
Alex Klein1699fab2022-09-08 08:46:06 -06001860 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001861
Alex Klein1699fab2022-09-08 08:46:06 -06001862 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001863
Alex Klein1699fab2022-09-08 08:46:06 -06001864 self.assertTrue(result.needs_chrome_source)
1865 self.assertTrue(result.builds_chrome)
1866 self.assertTrue(result.packages)
1867 self.assertEqual(
1868 set([p.atom for p in result.packages]), {constants.CHROME_CP}
1869 )
1870 self.assertTrue(result.missing_chrome_prebuilt)
1871 self.assertFalse(result.missing_follower_prebuilt)
1872 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001873
Alex Klein1699fab2022-09-08 08:46:06 -06001874 def test_needs_followers_only(self):
1875 """Verify only chrome followers triggers needs chrome source."""
1876 graph = self._build_graph(with_chrome=False, with_followers=True)
1877 self.PatchObject(
1878 depgraph, "get_sysroot_dependency_graph", return_value=graph
1879 )
1880 self.PatchObject(packages, "has_prebuilt", return_value=False)
1881 self.PatchObject(
1882 packages,
1883 "uprev_chrome",
1884 return_value=uprev_lib.UprevVersionedPackageResult(),
1885 )
Alex Klein6becabc2020-09-11 14:03:05 -06001886
Alex Klein1699fab2022-09-08 08:46:06 -06001887 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001888
Alex Klein1699fab2022-09-08 08:46:06 -06001889 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001890
Alex Klein1699fab2022-09-08 08:46:06 -06001891 self.assertTrue(result.needs_chrome_source)
1892 self.assertFalse(result.builds_chrome)
1893 self.assertTrue(result.packages)
1894 self.assertEqual(
1895 set([p.atom for p in result.packages]),
1896 set(constants.OTHER_CHROME_PACKAGES),
1897 )
1898 self.assertFalse(result.missing_chrome_prebuilt)
1899 self.assertTrue(result.missing_follower_prebuilt)
1900 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001901
Alex Klein1699fab2022-09-08 08:46:06 -06001902 def test_has_prebuilts(self):
1903 """Test prebuilts prevent us from needing chrome source."""
1904 graph = self._build_graph(with_chrome=True, with_followers=True)
1905 self.PatchObject(
1906 depgraph, "get_sysroot_dependency_graph", return_value=graph
1907 )
1908 self.PatchObject(packages, "has_prebuilt", return_value=True)
1909 self.PatchObject(
1910 packages,
1911 "uprev_chrome",
1912 return_value=uprev_lib.UprevVersionedPackageResult(),
1913 )
Alex Klein6becabc2020-09-11 14:03:05 -06001914
Alex Klein1699fab2022-09-08 08:46:06 -06001915 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001916
Alex Klein1699fab2022-09-08 08:46:06 -06001917 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001918
Alex Klein1699fab2022-09-08 08:46:06 -06001919 self.assertFalse(result.needs_chrome_source)
1920 self.assertTrue(result.builds_chrome)
1921 self.assertFalse(result.packages)
1922 self.assertFalse(result.missing_chrome_prebuilt)
1923 self.assertFalse(result.missing_follower_prebuilt)
1924 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001925
Alex Klein1699fab2022-09-08 08:46:06 -06001926 def test_compile_source(self):
1927 """Test compile source ignores prebuilts."""
1928 graph = self._build_graph(with_chrome=True, with_followers=True)
1929 self.PatchObject(
1930 depgraph, "get_sysroot_dependency_graph", return_value=graph
1931 )
1932 self.PatchObject(packages, "has_prebuilt", return_value=True)
1933 self.PatchObject(
1934 packages,
1935 "uprev_chrome",
1936 return_value=uprev_lib.UprevVersionedPackageResult(),
1937 )
Alex Klein6becabc2020-09-11 14:03:05 -06001938
Alex Klein1699fab2022-09-08 08:46:06 -06001939 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001940
Alex Klein1699fab2022-09-08 08:46:06 -06001941 result = packages.needs_chrome_source(build_target, compile_source=True)
Alex Klein6becabc2020-09-11 14:03:05 -06001942
Alex Klein1699fab2022-09-08 08:46:06 -06001943 self.assertTrue(result.needs_chrome_source)
1944 self.assertTrue(result.builds_chrome)
1945 self.assertTrue(result.packages)
1946 self.assertEqual(
1947 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1948 )
1949 self.assertTrue(result.missing_chrome_prebuilt)
1950 self.assertTrue(result.missing_follower_prebuilt)
1951 self.assertFalse(result.local_uprev)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001952
Alex Klein1699fab2022-09-08 08:46:06 -06001953 def test_local_uprev(self):
1954 """Test compile source ignores prebuilts."""
1955 graph = self._build_graph(with_chrome=True, with_followers=True)
1956 self.PatchObject(
1957 depgraph, "get_sysroot_dependency_graph", return_value=graph
1958 )
1959 self.PatchObject(packages, "has_prebuilt", return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001960
Alex Klein1699fab2022-09-08 08:46:06 -06001961 uprev_result = uprev_lib.UprevVersionedPackageResult()
1962 uprev_result.add_result("1.2.3.4", ["/tmp/foo"])
1963 self.PatchObject(packages, "uprev_chrome", return_value=uprev_result)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001964
Alex Klein1699fab2022-09-08 08:46:06 -06001965 build_target = build_target_lib.BuildTarget("build_target")
Alex Kleinde7b76d2021-07-12 12:28:44 -06001966
Alex Klein1699fab2022-09-08 08:46:06 -06001967 result = packages.needs_chrome_source(build_target, compile_source=True)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001968
Alex Klein1699fab2022-09-08 08:46:06 -06001969 self.assertTrue(result.needs_chrome_source)
1970 self.assertTrue(result.builds_chrome)
1971 self.assertTrue(result.packages)
1972 self.assertEqual(
1973 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1974 )
1975 self.assertTrue(result.missing_chrome_prebuilt)
1976 self.assertTrue(result.missing_follower_prebuilt)
1977 self.assertTrue(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001978
1979
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001980class UprevDrivefsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001981 """Tests for uprev_drivefs."""
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001982
Alex Klein1699fab2022-09-08 08:46:06 -06001983 def setUp(self):
1984 self.refs = [
1985 GitRef(
1986 path="/chromeos/platform/drivefs-google3/",
1987 ref="refs/tags/drivefs_45.0.2",
1988 revision="123",
1989 )
1990 ]
1991 self.MOCK_DRIVEFS_EBUILD_PATH = "drivefs.45.0.2-r1.ebuild"
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001992
Alex Klein1699fab2022-09-08 08:46:06 -06001993 def revisionBumpOutcome(self, ebuild_path):
1994 return uprev_lib.UprevResult(
1995 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
1996 )
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001997
Alex Klein1699fab2022-09-08 08:46:06 -06001998 def majorBumpOutcome(self, ebuild_path):
1999 return uprev_lib.UprevResult(
2000 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2001 )
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002002
Alex Klein1699fab2022-09-08 08:46:06 -06002003 def sameVersionOutcome(self):
2004 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002005
Alex Klein1699fab2022-09-08 08:46:06 -06002006 def test_latest_version_returns_none(self):
2007 """Test no refs were supplied"""
2008 output = packages.uprev_drivefs(None, [], None)
2009 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002010
Alex Klein1699fab2022-09-08 08:46:06 -06002011 def test_drivefs_uprev_fails(self):
2012 """Test a single ref is supplied."""
2013 self.PatchObject(
2014 uprev_lib,
2015 "uprev_workon_ebuild_to_version",
2016 side_effect=[None, None],
2017 )
2018 output = packages.uprev_drivefs(None, self.refs, None)
2019 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002020
Alex Klein1699fab2022-09-08 08:46:06 -06002021 def test_same_version_exists(self):
2022 """Test the same version exists uprev should not happen."""
2023 drivefs_outcome = self.sameVersionOutcome()
2024 self.PatchObject(
2025 uprev_lib,
2026 "uprev_workon_ebuild_to_version",
2027 side_effect=[drivefs_outcome],
2028 )
2029 output = packages.uprev_drivefs(None, self.refs, None)
2030 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002031
Alex Klein1699fab2022-09-08 08:46:06 -06002032 def test_revision_bump_both_packages(self):
2033 """Test both packages uprev, should succeed."""
2034 drivefs_outcome = self.revisionBumpOutcome(
2035 self.MOCK_DRIVEFS_EBUILD_PATH
2036 )
2037 self.PatchObject(
2038 uprev_lib,
2039 "uprev_workon_ebuild_to_version",
2040 side_effect=[drivefs_outcome],
2041 )
2042 output = packages.uprev_drivefs(None, self.refs, None)
2043 self.assertTrue(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00002044
Alex Klein1699fab2022-09-08 08:46:06 -06002045 def test_major_bump_both_packages(self):
2046 """Test both packages uprev, should succeed."""
2047 drivefs_outcome = self.majorBumpOutcome(self.MOCK_DRIVEFS_EBUILD_PATH)
2048 self.PatchObject(
2049 uprev_lib,
2050 "uprev_workon_ebuild_to_version",
2051 side_effect=[drivefs_outcome],
2052 )
2053 output = packages.uprev_drivefs(None, self.refs, None)
2054 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002055
2056
Denis Nikitin63613e32022-09-09 22:26:50 -07002057class UprevKernelAfdo(cros_test_lib.RunCommandTempDirTestCase):
2058 """Tests for uprev_kernel_afdo."""
2059
2060 def setUp(self):
2061 # patch_ebuild_vars is tested separately.
2062 self.mock_patch = self.PatchObject(packages, "patch_ebuild_vars")
Denis Nikitin88ad5132022-09-28 12:10:01 -07002063 self.PatchObject(constants, "SOURCE_ROOT", new=self.tempdir)
Denis Nikitin63613e32022-09-09 22:26:50 -07002064 self.metadata_dir = os.path.join(
Denis Nikitin63613e32022-09-09 22:26:50 -07002065 "src",
2066 "third_party",
2067 "toolchain-utils",
2068 "afdo_metadata",
2069 )
Denis Nikitin88ad5132022-09-28 12:10:01 -07002070 osutils.SafeMakedirs(os.path.join(self.tempdir, self.metadata_dir))
Denis Nikitin63613e32022-09-09 22:26:50 -07002071
2072 def test_uprev_kernel_afdo_version(self):
2073 """Test kernel afdo version uprev."""
2074 json_files = {
2075 "kernel_afdo.json": (
2076 "{\n"
2077 ' "chromeos-kernel-5_4": {\n'
2078 ' "name": "R106-12345.0-0123456789"\n'
2079 " }\n"
2080 "}"
2081 ),
2082 "kernel_arm_afdo.json": (
2083 "{\n"
2084 ' "chromeos-kernel-5_15": {\n'
2085 ' "name": "R107-67890.0-0123456789"\n'
2086 " }\n"
2087 "}"
2088 ),
2089 }
2090 for f, contents in json_files.items():
2091 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2092
2093 returned_output = packages.uprev_kernel_afdo()
2094
Denis Nikitin88ad5132022-09-28 12:10:01 -07002095 package_root = os.path.join(
2096 constants.SOURCE_ROOT,
2097 constants.CHROMIUMOS_OVERLAY_DIR,
2098 "sys-kernel",
Denis Nikitin63613e32022-09-09 22:26:50 -07002099 )
2100 expect_result = [
2101 uprev_lib.UprevVersionedPackageModifications(
2102 new_version="R106-12345.0-0123456789",
2103 files=[
2104 os.path.join(
2105 package_root,
2106 "chromeos-kernel-5_4",
2107 "chromeos-kernel-5_4-9999.ebuild",
2108 ),
2109 os.path.join(
2110 package_root, "chromeos-kernel-5_4", "Manifest"
2111 ),
2112 ],
2113 ),
2114 uprev_lib.UprevVersionedPackageModifications(
2115 new_version="R107-67890.0-0123456789",
2116 files=[
2117 os.path.join(
2118 package_root,
2119 "chromeos-kernel-5_15",
2120 "chromeos-kernel-5_15-9999.ebuild",
2121 ),
2122 os.path.join(
2123 package_root, "chromeos-kernel-5_15", "Manifest"
2124 ),
2125 ],
2126 ),
2127 ]
2128 self.assertTrue(returned_output.uprevved)
2129 self.assertEqual(returned_output.modified, expect_result)
2130
2131 def test_uprev_kernel_afdo_empty_json(self):
2132 """Test kernel afdo version unchanged."""
2133 json_files = {
2134 "kernel_afdo.json": "{}",
2135 "kernel_arm_afdo.json": "{}",
2136 }
2137 for f, contents in json_files.items():
2138 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2139
2140 returned_output = packages.uprev_kernel_afdo()
2141 self.assertFalse(returned_output.uprevved)
2142
2143 def test_uprev_kernel_afdo_empty_file(self):
2144 """Test malformed json raises."""
2145 json_files = {
2146 "kernel_afdo.json": "",
2147 "kernel_arm_afdo.json": "",
2148 }
2149 for f, contents in json_files.items():
2150 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2151
2152 with self.assertRaisesRegex(
2153 json.decoder.JSONDecodeError, "Expecting value"
2154 ):
2155 packages.uprev_kernel_afdo()
2156
2157 def test_uprev_kernel_afdo_manifest_raises(self):
2158 """Test manifest update raises."""
2159 json_files = {
2160 "kernel_afdo.json": (
2161 "{\n"
2162 ' "chromeos-kernel-5_4": {\n'
2163 ' "name": "R106-12345.0-0123456789"\n'
2164 " }\n"
2165 "}"
2166 ),
2167 }
2168 for f, contents in json_files.items():
2169 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2170 # run() raises exception.
2171 self.rc.SetDefaultCmdResult(
2172 side_effect=cros_build_lib.RunCommandError("error")
2173 )
2174
2175 with self.assertRaises(uprev_lib.EbuildManifestError):
2176 packages.uprev_kernel_afdo()
2177
2178
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002179# TODO(chenghaoyang): Shouldn't use uprev_workon_ebuild_to_version.
2180class UprevPerfettoTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002181 """Tests for uprev_perfetto."""
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002182
Alex Klein1699fab2022-09-08 08:46:06 -06002183 def setUp(self):
2184 self.refs = [GitRef(path="/foo", ref="refs/tags/v12.0", revision="123")]
2185 self.MOCK_PERFETTO_EBUILD_PATH = "perfetto-12.0-r1.ebuild"
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002186
Alex Klein1699fab2022-09-08 08:46:06 -06002187 def revisionBumpOutcome(self, ebuild_path):
2188 return uprev_lib.UprevResult(
2189 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2190 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002191
Alex Klein1699fab2022-09-08 08:46:06 -06002192 def majorBumpOutcome(self, ebuild_path):
2193 return uprev_lib.UprevResult(
2194 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2195 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002196
Alex Klein1699fab2022-09-08 08:46:06 -06002197 def newerVersionOutcome(self):
2198 return uprev_lib.UprevResult(uprev_lib.Outcome.NEWER_VERSION_EXISTS)
Harvey Yang3eee06c2021-03-18 15:47:56 +08002199
Alex Klein1699fab2022-09-08 08:46:06 -06002200 def sameVersionOutcome(self):
2201 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002202
Alex Klein1699fab2022-09-08 08:46:06 -06002203 def test_latest_version_returns_none(self):
2204 """Test no refs were supplied"""
2205 output = packages.uprev_perfetto(None, [], None)
2206 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002207
Alex Klein1699fab2022-09-08 08:46:06 -06002208 def test_perfetto_uprev_fails(self):
2209 """Test a single ref is supplied."""
2210 self.PatchObject(
2211 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2212 )
2213 output = packages.uprev_perfetto(None, self.refs, None)
2214 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002215
Alex Klein1699fab2022-09-08 08:46:06 -06002216 def test_newer_version_exists(self):
2217 """Test the newer version exists uprev should not happen."""
2218 perfetto_outcome = self.newerVersionOutcome()
2219 self.PatchObject(
2220 uprev_lib,
2221 "uprev_workon_ebuild_to_version",
2222 side_effect=[perfetto_outcome],
2223 )
2224 output = packages.uprev_perfetto(None, self.refs, None)
2225 self.assertFalse(output.uprevved)
Harvey Yang3eee06c2021-03-18 15:47:56 +08002226
Alex Klein1699fab2022-09-08 08:46:06 -06002227 def test_same_version_exists(self):
2228 """Test the same version exists uprev should not happen."""
2229 perfetto_outcome = self.sameVersionOutcome()
2230 self.PatchObject(
2231 uprev_lib,
2232 "uprev_workon_ebuild_to_version",
2233 side_effect=[perfetto_outcome],
2234 )
2235 output = packages.uprev_perfetto(None, self.refs, None)
2236 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002237
Alex Klein1699fab2022-09-08 08:46:06 -06002238 def test_revision_bump_perfetto_package(self):
2239 """Test perfetto package uprev."""
2240 perfetto_outcome = self.revisionBumpOutcome(
2241 self.MOCK_PERFETTO_EBUILD_PATH
2242 )
2243 self.PatchObject(
2244 uprev_lib,
2245 "uprev_workon_ebuild_to_version",
2246 side_effect=[perfetto_outcome],
2247 )
2248 output = packages.uprev_perfetto(None, self.refs, None)
2249 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002250
Alex Klein1699fab2022-09-08 08:46:06 -06002251 def test_major_bump_perfetto_package(self):
2252 """Test perfetto package uprev."""
2253 perfetto_outcome = self.majorBumpOutcome(self.MOCK_PERFETTO_EBUILD_PATH)
2254 self.PatchObject(
2255 uprev_lib,
2256 "uprev_workon_ebuild_to_version",
2257 side_effect=[perfetto_outcome],
2258 )
2259 output = packages.uprev_perfetto(None, self.refs, None)
2260 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002261
Chinglin Yuad12a512022-10-07 17:26:12 +08002262 def test_revision_bump_trunk(self):
2263 """Test revision bump on receiving non-versioned trunk refs."""
Chinglin Yu5de28a42022-11-11 19:52:21 +08002264 refs = [
2265 GitRef(
2266 path="/foo", ref="refs/heads/main", revision="0123456789abcdef"
2267 )
2268 ]
Chinglin Yuad12a512022-10-07 17:26:12 +08002269 perfetto_outcome = self.revisionBumpOutcome(
2270 self.MOCK_PERFETTO_EBUILD_PATH
2271 )
2272 self.PatchObject(
2273 uprev_lib, "get_stable_ebuild_version", return_value="12.0"
2274 )
2275 self.PatchObject(
2276 uprev_lib,
2277 "uprev_workon_ebuild_to_version",
2278 side_effect=[perfetto_outcome],
2279 )
2280 output = packages.uprev_perfetto(None, refs, None)
2281 self.assertTrue(output.uprevved)
Chinglin Yu5de28a42022-11-11 19:52:21 +08002282 self.assertEqual(output.modified[0].new_version, "12.0-012345678")
Chinglin Yuad12a512022-10-07 17:26:12 +08002283
Alex Klein627e04c2021-11-10 15:56:47 -07002284
Julio Hurtadof1befec2021-05-05 21:34:26 +00002285class UprevLacrosTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002286 """Tests for uprev_lacros"""
Julio Hurtadof1befec2021-05-05 21:34:26 +00002287
Alex Klein1699fab2022-09-08 08:46:06 -06002288 def setUp(self):
2289 self.refs = [
2290 GitRef(
2291 path="/lacros", ref="refs/heads/main", revision="123.456.789.0"
2292 )
2293 ]
2294 self.MOCK_LACROS_EBUILD_PATH = "chromeos-lacros-123.456.789.0-r1.ebuild"
Julio Hurtadof1befec2021-05-05 21:34:26 +00002295
Alex Klein1699fab2022-09-08 08:46:06 -06002296 def revisionBumpOutcome(self, ebuild_path):
2297 return uprev_lib.UprevResult(
2298 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2299 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002300
Alex Klein1699fab2022-09-08 08:46:06 -06002301 def majorBumpOutcome(self, ebuild_path):
2302 return uprev_lib.UprevResult(
2303 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2304 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002305
Alex Klein1699fab2022-09-08 08:46:06 -06002306 def newerVersionOutcome(self, ebuild_path):
2307 return uprev_lib.UprevResult(
2308 uprev_lib.Outcome.NEWER_VERSION_EXISTS, [ebuild_path]
2309 )
Julio Hurtadoa994e002021-07-07 17:57:45 +00002310
Alex Klein1699fab2022-09-08 08:46:06 -06002311 def sameVersionOutcome(self, ebuild_path):
2312 return uprev_lib.UprevResult(
2313 uprev_lib.Outcome.SAME_VERSION_EXISTS, [ebuild_path]
2314 )
Julio Hurtadoa994e002021-07-07 17:57:45 +00002315
Alex Klein1699fab2022-09-08 08:46:06 -06002316 def newEbuildCreatedOutcome(self, ebuild_path):
2317 return uprev_lib.UprevResult(
2318 uprev_lib.Outcome.NEW_EBUILD_CREATED, [ebuild_path]
2319 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002320
Alex Klein1699fab2022-09-08 08:46:06 -06002321 def test_lacros_uprev_fails(self):
2322 """Test a lacros package uprev with no triggers"""
2323 self.PatchObject(
2324 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2325 )
2326 with self.assertRaises(IndexError):
2327 packages.uprev_lacros(None, [], None)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002328
Alex Klein1699fab2022-09-08 08:46:06 -06002329 def test_lacros_uprev_revision_bump(self):
2330 """Test lacros package uprev."""
2331 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2332 self.PatchObject(
2333 uprev_lib,
2334 "uprev_workon_ebuild_to_version",
2335 side_effect=[lacros_outcome],
2336 )
2337 output = packages.uprev_lacros(None, self.refs, None)
2338 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002339
Alex Klein1699fab2022-09-08 08:46:06 -06002340 def test_lacros_uprev_version_bump(self):
2341 """Test lacros package uprev."""
2342 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2343 self.PatchObject(
2344 uprev_lib,
2345 "uprev_workon_ebuild_to_version",
2346 side_effect=[lacros_outcome],
2347 )
2348 output = packages.uprev_lacros(None, self.refs, None)
2349 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002350
Alex Klein1699fab2022-09-08 08:46:06 -06002351 def test_lacros_uprev_new_ebuild_created(self):
2352 """Test lacros package uprev."""
2353 lacros_outcome = self.newEbuildCreatedOutcome(
2354 self.MOCK_LACROS_EBUILD_PATH
2355 )
2356 self.PatchObject(
2357 uprev_lib,
2358 "uprev_workon_ebuild_to_version",
2359 side_effect=[lacros_outcome],
2360 )
2361 output = packages.uprev_lacros(None, self.refs, None)
2362 self.assertTrue(output.uprevved)
Julio Hurtadoa994e002021-07-07 17:57:45 +00002363
Alex Klein1699fab2022-09-08 08:46:06 -06002364 def test_lacros_uprev_newer_version_exist(self):
2365 """Test the newer version exists uprev should not happen."""
2366 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2367 self.PatchObject(
2368 uprev_lib,
2369 "uprev_workon_ebuild_to_version",
2370 side_effect=[lacros_outcome],
2371 )
2372 output = packages.uprev_lacros(None, self.refs, None)
2373 self.assertFalse(output.uprevved)
Julio Hurtadoa994e002021-07-07 17:57:45 +00002374
Alex Klein1699fab2022-09-08 08:46:06 -06002375 def test_lacros_uprev_same_version_exist(self):
2376 """Test the same version exists uprev should not happen."""
2377 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2378 self.PatchObject(
2379 uprev_lib,
2380 "uprev_workon_ebuild_to_version",
2381 side_effect=[lacros_outcome],
2382 )
2383 output = packages.uprev_lacros(None, self.refs, None)
2384 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002385
2386
2387class UprevLacrosInParallelTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002388 """Tests for uprev_lacros"""
Julio Hurtado870ed322021-12-03 18:22:40 +00002389
Alex Klein1699fab2022-09-08 08:46:06 -06002390 def setUp(self):
2391 self.refs = [
2392 GitRef(
2393 path="/lacros", revision="abc123", ref="refs/tags/123.456.789.0"
2394 )
2395 ]
2396 self.MOCK_LACROS_EBUILD_PATH = "chromeos-lacros-123.456.789.0-r1.ebuild"
Julio Hurtado870ed322021-12-03 18:22:40 +00002397
Alex Klein1699fab2022-09-08 08:46:06 -06002398 def revisionBumpOutcome(self, ebuild_path):
2399 return uprev_lib.UprevResult(
2400 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2401 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002402
Alex Klein1699fab2022-09-08 08:46:06 -06002403 def majorBumpOutcome(self, ebuild_path):
2404 return uprev_lib.UprevResult(
2405 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2406 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002407
Alex Klein1699fab2022-09-08 08:46:06 -06002408 def newerVersionOutcome(self, ebuild_path):
2409 return uprev_lib.UprevResult(
2410 uprev_lib.Outcome.NEWER_VERSION_EXISTS, [ebuild_path]
2411 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002412
Alex Klein1699fab2022-09-08 08:46:06 -06002413 def sameVersionOutcome(self, ebuild_path):
2414 return uprev_lib.UprevResult(
2415 uprev_lib.Outcome.SAME_VERSION_EXISTS, [ebuild_path]
2416 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002417
Alex Klein1699fab2022-09-08 08:46:06 -06002418 def newEbuildCreatedOutcome(self, ebuild_path):
2419 return uprev_lib.UprevResult(
2420 uprev_lib.Outcome.NEW_EBUILD_CREATED, [ebuild_path]
2421 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002422
Alex Klein1699fab2022-09-08 08:46:06 -06002423 def test_lacros_uprev_fails(self):
2424 """Test a lacros package uprev with no triggers"""
2425 self.PatchObject(
2426 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2427 )
Alex Klein314fb5d2022-10-24 14:56:31 -06002428 with self.assertRaises(uprev_lib.NoRefsError):
Alex Klein1699fab2022-09-08 08:46:06 -06002429 packages.uprev_lacros_in_parallel(None, [], None)
Julio Hurtado870ed322021-12-03 18:22:40 +00002430
Alex Klein1699fab2022-09-08 08:46:06 -06002431 def test_lacros_uprev_revision_bump(self):
2432 """Test lacros package uprev."""
2433 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2434 self.PatchObject(
2435 uprev_lib,
2436 "uprev_workon_ebuild_to_version",
2437 side_effect=[lacros_outcome],
2438 )
2439 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2440 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002441
Alex Klein1699fab2022-09-08 08:46:06 -06002442 def test_lacros_uprev_version_bump(self):
2443 """Test lacros package uprev."""
2444 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2445 self.PatchObject(
2446 uprev_lib,
2447 "uprev_workon_ebuild_to_version",
2448 side_effect=[lacros_outcome],
2449 )
2450 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2451 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002452
Alex Klein1699fab2022-09-08 08:46:06 -06002453 def test_lacros_uprev_new_ebuild_created(self):
2454 """Test lacros package uprev."""
2455 lacros_outcome = self.newEbuildCreatedOutcome(
2456 self.MOCK_LACROS_EBUILD_PATH
2457 )
2458 self.PatchObject(
2459 uprev_lib,
2460 "uprev_workon_ebuild_to_version",
2461 side_effect=[lacros_outcome],
2462 )
2463 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2464 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002465
Alex Klein1699fab2022-09-08 08:46:06 -06002466 def test_lacros_uprev_newer_version_exist(self):
2467 """Test the newer version exists uprev should not happen."""
2468 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2469 self.PatchObject(
2470 uprev_lib,
2471 "uprev_workon_ebuild_to_version",
2472 side_effect=[lacros_outcome],
2473 )
2474 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2475 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002476
Alex Klein1699fab2022-09-08 08:46:06 -06002477 def test_lacros_uprev_same_version_exist(self):
2478 """Test the same version exists uprev should not happen."""
2479 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2480 self.PatchObject(
2481 uprev_lib,
2482 "uprev_workon_ebuild_to_version",
2483 side_effect=[lacros_outcome],
2484 )
2485 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2486 self.assertFalse(output.uprevved)