blob: 8ac20fff7f02d65481e14fcdac594b900a993564 [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 Leeb6374f42022-10-28 13:34:58 +0900166 for android_package in android.GetAllAndroidPackages():
Alex Klein1699fab2022-09-08 08:46:06 -0600167 cpv = package_info.SplitCPV(
168 "chromeos-base/" + android_package, strict=False
169 )
170 build_targets = [build_target_lib.BuildTarget("foo")]
171 chroot = Chroot()
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900172
Alex Klein1699fab2022-09-08 08:46:06 -0600173 packages.uprev_versioned_package(cpv, build_targets, [], chroot)
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900174
Alex Klein1699fab2022-09-08 08:46:06 -0600175 mock_handler.assert_called_once_with(
176 android_package, build_targets, chroot
177 )
178 mock_handler.reset_mock()
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900179
Alex Klein1699fab2022-09-08 08:46:06 -0600180 def test_success(self):
181 """Test a successful uprev."""
182 self.PatchObject(android, "OVERLAY_DIR", new="overlay-dir")
183 self.PatchObject(android, "ReadLKGB", return_value="android-lkgb")
184 self.PatchObject(
185 packages,
186 "uprev_android",
187 return_value=packages.UprevAndroidResult(
188 revved=True,
189 android_atom="android-atom",
190 modified_files=["file1", "file2"],
191 ),
192 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900193
Alex Klein1699fab2022-09-08 08:46:06 -0600194 result = packages.uprev_android_lkgb("android-package", [], Chroot())
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900195
Alex Klein1699fab2022-09-08 08:46:06 -0600196 self.assertListEqual(
197 result.modified,
198 [
199 uprev_lib.UprevVersionedPackageModifications(
200 "android-lkgb",
201 [
202 os.path.join("overlay-dir", "file1"),
203 os.path.join("overlay-dir", "file2"),
204 ],
205 )
206 ],
207 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900208
Alex Klein1699fab2022-09-08 08:46:06 -0600209 def test_no_rev(self):
210 """Test when nothing revved."""
211 self.PatchObject(android, "ReadLKGB", return_value="android-lkgb")
212 self.PatchObject(
213 packages,
214 "uprev_android",
215 return_value=packages.UprevAndroidResult(revved=False),
216 )
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900217
Alex Klein1699fab2022-09-08 08:46:06 -0600218 result = packages.uprev_android_lkgb("android-package", [], Chroot())
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900219
Alex Klein1699fab2022-09-08 08:46:06 -0600220 self.assertListEqual(result.modified, [])
Shao-Chuan Lee05e51142021-11-24 12:27:37 +0900221
222
Alex Kleineb77ffa2019-05-28 14:47:44 -0600223class UprevBuildTargetsTest(cros_test_lib.RunCommandTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600224 """uprev_build_targets tests."""
Alex Kleineb77ffa2019-05-28 14:47:44 -0600225
Alex Klein1699fab2022-09-08 08:46:06 -0600226 def test_invalid_type_fails(self):
227 """Test invalid type fails."""
228 with self.assertRaises(AssertionError):
229 packages.uprev_build_targets(
230 [build_target_lib.BuildTarget("foo")], "invalid"
231 )
Alex Kleineb77ffa2019-05-28 14:47:44 -0600232
Alex Klein1699fab2022-09-08 08:46:06 -0600233 def test_none_type_fails(self):
234 """Test None type fails."""
235 with self.assertRaises(AssertionError):
236 packages.uprev_build_targets(
237 [build_target_lib.BuildTarget("foo")], None
238 )
Alex Kleineb77ffa2019-05-28 14:47:44 -0600239
240
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000241class PatchEbuildVarsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600242 """patch_ebuild_vars test."""
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000243
Alex Klein1699fab2022-09-08 08:46:06 -0600244 def setUp(self):
245 self.mock_input = self.PatchObject(packages.fileinput, "input")
246 self.mock_stdout_write = self.PatchObject(packages.sys.stdout, "write")
247 self.ebuild_path = "/path/to/ebuild"
248 self.old_var_value = "R100-5678.0.123456789"
249 self.new_var_value = "R102-5678.0.234566789"
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000250
Alex Klein1699fab2022-09-08 08:46:06 -0600251 def test_patch_ebuild_vars_var_only(self):
252 """patch_ebuild_vars changes ^var=value$."""
253 ebuild_contents = (
254 "This line does not change.\n"
255 'AFDO_PROFILE_VERSION="{var_value}"\n'
256 "\n"
257 "# The line with AFDO_PROFILE_VERSION is also unchanged."
258 )
259 # Ebuild contains old_var_value.
260 self.mock_input.return_value = io.StringIO(
261 ebuild_contents.format(var_value=self.old_var_value)
262 )
263 expected_calls = []
264 # Expect the line with new_var_value.
265 for line in io.StringIO(
266 ebuild_contents.format(var_value=self.new_var_value)
267 ):
268 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000269
Alex Klein1699fab2022-09-08 08:46:06 -0600270 packages.patch_ebuild_vars(
271 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
272 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000273
Alex Klein1699fab2022-09-08 08:46:06 -0600274 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000275
Alex Klein1699fab2022-09-08 08:46:06 -0600276 def test_patch_ebuild_vars_ignore_export(self):
277 """patch_ebuild_vars changes ^export var=value$ and keeps export."""
278 ebuild_contents = (
279 "This line does not change.\n"
280 'export AFDO_PROFILE_VERSION="{var_value}"\n'
281 "# This line is also unchanged."
282 )
283 # Ebuild contains old_var_value.
284 self.mock_input.return_value = io.StringIO(
285 ebuild_contents.format(var_value=self.old_var_value)
286 )
287 expected_calls = []
288 # Expect the line with new_var_value.
289 for line in io.StringIO(
290 ebuild_contents.format(var_value=self.new_var_value)
291 ):
292 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000293
Alex Klein1699fab2022-09-08 08:46:06 -0600294 packages.patch_ebuild_vars(
295 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
296 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000297
Alex Klein1699fab2022-09-08 08:46:06 -0600298 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000299
Alex Klein1699fab2022-09-08 08:46:06 -0600300 def test_patch_ebuild_vars_partial_match(self):
301 """patch_ebuild_vars ignores ^{prefix}var=value$."""
302 ebuild_contents = (
Alex Kleina53bd282022-09-09 12:42:55 -0600303 'This and the line below do not change.\nNEW_AFDO="{var_value}"'
Alex Klein1699fab2022-09-08 08:46:06 -0600304 )
305 # Ebuild contains old_var_value.
306 self.mock_input.return_value = io.StringIO(
307 ebuild_contents.format(var_value=self.old_var_value)
308 )
309 expected_calls = []
310 # Expect the line with UNCHANGED old_var_value.
311 for line in io.StringIO(
312 ebuild_contents.format(var_value=self.old_var_value)
313 ):
314 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000315
Alex Klein1699fab2022-09-08 08:46:06 -0600316 # Note that the var name partially matches the ebuild var and hence it has
317 # to be ignored.
318 packages.patch_ebuild_vars(
319 self.ebuild_path, {"AFDO": self.new_var_value}
320 )
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000321
Alex Klein1699fab2022-09-08 08:46:06 -0600322 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000323
Alex Klein1699fab2022-09-08 08:46:06 -0600324 def test_patch_ebuild_vars_no_vars(self):
325 """patch_ebuild_vars keeps ebuild intact if there are no vars."""
326 ebuild_contents = (
327 "This line does not change.\n"
328 "The line with AFDO_PROFILE_VERSION is also unchanged."
329 )
330 self.mock_input.return_value = io.StringIO(ebuild_contents)
331 expected_calls = []
332 for line in io.StringIO(ebuild_contents):
333 expected_calls.append(mock.call(line))
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000334
Alex Klein1699fab2022-09-08 08:46:06 -0600335 packages.patch_ebuild_vars(
336 self.ebuild_path, {"AFDO_PROFILE_VERSION": self.new_var_value}
337 )
338
339 self.mock_stdout_write.assert_has_calls(expected_calls)
Madeleine Hardt8ae7f102022-03-24 20:26:11 +0000340
341
Alex Klein87531182019-08-12 15:23:37 -0600342class UprevsVersionedPackageTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600343 """uprevs_versioned_package decorator test."""
Alex Klein87531182019-08-12 15:23:37 -0600344
Alex Klein1699fab2022-09-08 08:46:06 -0600345 @packages.uprevs_versioned_package("category/package")
346 def uprev_category_package(self, *args, **kwargs):
347 """Registered function for testing."""
Alex Klein87531182019-08-12 15:23:37 -0600348
Alex Klein1699fab2022-09-08 08:46:06 -0600349 def test_calls_function(self):
350 """Test calling a registered function."""
351 self.PatchObject(self, "uprev_category_package")
Alex Klein87531182019-08-12 15:23:37 -0600352
Alex Klein1699fab2022-09-08 08:46:06 -0600353 cpv = package_info.SplitCPV("category/package", strict=False)
354 packages.uprev_versioned_package(cpv, [], [], Chroot())
Alex Klein87531182019-08-12 15:23:37 -0600355
Alex Klein1699fab2022-09-08 08:46:06 -0600356 # TODO(crbug/1065172): Invalid assertion that had previously been mocked.
357 # patch.assert_called()
Alex Klein87531182019-08-12 15:23:37 -0600358
Alex Klein1699fab2022-09-08 08:46:06 -0600359 def test_unregistered_package(self):
360 """Test calling with an unregistered package."""
361 cpv = package_info.SplitCPV("does-not/exist", strict=False)
Alex Klein87531182019-08-12 15:23:37 -0600362
Alex Klein1699fab2022-09-08 08:46:06 -0600363 with self.assertRaises(packages.UnknownPackageError):
364 packages.uprev_versioned_package(cpv, [], [], Chroot())
Alex Klein87531182019-08-12 15:23:37 -0600365
366
Trent Begin6daa8702020-01-29 14:58:12 -0700367class UprevEbuildFromPinTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600368 """Tests uprev_ebuild_from_pin function"""
Trent Begin315d9d92019-12-03 21:55:53 -0700369
Alex Klein1699fab2022-09-08 08:46:06 -0600370 package = "category/package"
371 version = "1.2.3"
372 new_version = "1.2.4"
373 ebuild_template = "package-%s-r1.ebuild"
374 ebuild = ebuild_template % version
375 unstable_ebuild = "package-9999.ebuild"
376 manifest = "Manifest"
Trent Begin315d9d92019-12-03 21:55:53 -0700377
Alex Klein1699fab2022-09-08 08:46:06 -0600378 def test_uprev_ebuild(self):
379 """Tests uprev of ebuild with version path"""
380 file_layout = (
381 D(self.package, [self.ebuild, self.unstable_ebuild, self.manifest]),
382 )
383 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700384
Alex Klein1699fab2022-09-08 08:46:06 -0600385 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700386
Alex Klein1699fab2022-09-08 08:46:06 -0600387 ebuild_path = os.path.join(package_path, self.ebuild)
388 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000389
Alex Klein1699fab2022-09-08 08:46:06 -0600390 result = uprev_lib.uprev_ebuild_from_pin(
391 package_path, self.new_version, chroot=Chroot()
392 )
393 self.assertEqual(
394 len(result.modified),
395 1,
396 "unexpected number of results: %s" % len(result.modified),
397 )
Trent Begin315d9d92019-12-03 21:55:53 -0700398
Alex Klein1699fab2022-09-08 08:46:06 -0600399 mod = result.modified[0]
400 self.assertEqual(
401 mod.new_version,
402 self.new_version + "-r1",
403 "unexpected version number: %s" % mod.new_version,
404 )
Trent Begin315d9d92019-12-03 21:55:53 -0700405
Alex Klein1699fab2022-09-08 08:46:06 -0600406 old_ebuild_path = os.path.join(
407 package_path, self.ebuild_template % self.version
408 )
409 new_ebuild_path = os.path.join(
410 package_path, self.ebuild_template % self.new_version
411 )
412 manifest_path = os.path.join(package_path, "Manifest")
Trent Begin2e5344f2020-03-02 10:46:55 -0700413
Alex Klein1699fab2022-09-08 08:46:06 -0600414 expected_modified_files = [
415 old_ebuild_path,
416 new_ebuild_path,
417 manifest_path,
418 ]
419 self.assertCountEqual(mod.files, expected_modified_files)
Trent Begin4a11a632020-02-28 12:59:58 -0700420
Alex Klein1699fab2022-09-08 08:46:06 -0600421 self.assertCommandContains(["ebuild", "manifest"])
Trent Begin6daa8702020-01-29 14:58:12 -0700422
Alex Klein1699fab2022-09-08 08:46:06 -0600423 def test_uprev_ebuild_same_version(self):
424 """Tests uprev of ebuild with version path when the version has not changed.
Fergus Dall2209d0b2020-08-06 11:51:43 +1000425
Alex Klein1699fab2022-09-08 08:46:06 -0600426 This should result in bumping the revision number.
427 """
428 file_layout = (
429 D(self.package, [self.ebuild, self.unstable_ebuild, self.manifest]),
430 )
431 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000432
Alex Klein1699fab2022-09-08 08:46:06 -0600433 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000434
Alex Klein1699fab2022-09-08 08:46:06 -0600435 ebuild_path = os.path.join(package_path, self.ebuild)
436 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000437
Alex Klein1699fab2022-09-08 08:46:06 -0600438 result = uprev_lib.uprev_ebuild_from_pin(
439 package_path, self.version, chroot=Chroot()
440 )
441 self.assertEqual(
442 len(result.modified),
443 1,
444 "unexpected number of results: %s" % len(result.modified),
445 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000446
Alex Klein1699fab2022-09-08 08:46:06 -0600447 mod = result.modified[0]
448 self.assertEqual(
449 mod.new_version,
450 self.version + "-r2",
451 "unexpected version number: %s" % mod.new_version,
452 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000453
Alex Klein1699fab2022-09-08 08:46:06 -0600454 old_ebuild_path = os.path.join(
455 package_path, self.ebuild_template % self.version
456 )
457 new_ebuild_path = os.path.join(
458 package_path, "package-%s-r2.ebuild" % self.version
459 )
460 manifest_path = os.path.join(package_path, "Manifest")
Fergus Dall2209d0b2020-08-06 11:51:43 +1000461
Alex Klein1699fab2022-09-08 08:46:06 -0600462 expected_modified_files = [
463 old_ebuild_path,
464 new_ebuild_path,
465 manifest_path,
466 ]
467 self.assertCountEqual(mod.files, expected_modified_files)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000468
Alex Klein1699fab2022-09-08 08:46:06 -0600469 self.assertCommandContains(["ebuild", "manifest"])
Fergus Dall2209d0b2020-08-06 11:51:43 +1000470
Alex Klein1699fab2022-09-08 08:46:06 -0600471 def test_no_ebuild(self):
472 """Tests assertion is raised if package has no ebuilds"""
473 file_layout = (D(self.package, [self.manifest]),)
474 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700475
Alex Klein1699fab2022-09-08 08:46:06 -0600476 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700477
Alex Klein1699fab2022-09-08 08:46:06 -0600478 with self.assertRaises(uprev_lib.EbuildUprevError):
479 uprev_lib.uprev_ebuild_from_pin(
480 package_path, self.new_version, chroot=Chroot()
481 )
Trent Begin315d9d92019-12-03 21:55:53 -0700482
Alex Klein1699fab2022-09-08 08:46:06 -0600483 def test_multiple_stable_ebuilds(self):
484 """Tests assertion is raised if multiple stable ebuilds are present"""
485 file_layout = (
486 D(
487 self.package,
488 [self.ebuild, self.ebuild_template % "1.2.1", self.manifest],
489 ),
490 )
491 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000492
Alex Klein1699fab2022-09-08 08:46:06 -0600493 package_path = os.path.join(self.tempdir, self.package)
Fergus Dall2209d0b2020-08-06 11:51:43 +1000494
Alex Klein1699fab2022-09-08 08:46:06 -0600495 ebuild_path = os.path.join(package_path, self.ebuild)
496 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000497
Alex Klein1699fab2022-09-08 08:46:06 -0600498 ebuild_path = os.path.join(package_path, self.ebuild_template % "1.2.1")
499 self.WriteTempFile(ebuild_path, 'KEYWORDS="*"\n')
Fergus Dall2209d0b2020-08-06 11:51:43 +1000500
Alex Klein1699fab2022-09-08 08:46:06 -0600501 with self.assertRaises(uprev_lib.EbuildUprevError):
502 uprev_lib.uprev_ebuild_from_pin(
503 package_path, self.new_version, chroot=Chroot()
504 )
Fergus Dall2209d0b2020-08-06 11:51:43 +1000505
Alex Klein1699fab2022-09-08 08:46:06 -0600506 def test_multiple_unstable_ebuilds(self):
507 """Tests assertion is raised if multiple unstable ebuilds are present"""
508 file_layout = (
509 D(
510 self.package,
511 [self.ebuild, self.ebuild_template % "1.2.1", self.manifest],
512 ),
513 )
514 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Trent Begin315d9d92019-12-03 21:55:53 -0700515
Alex Klein1699fab2022-09-08 08:46:06 -0600516 package_path = os.path.join(self.tempdir, self.package)
Trent Begin315d9d92019-12-03 21:55:53 -0700517
Alex Klein1699fab2022-09-08 08:46:06 -0600518 with self.assertRaises(uprev_lib.EbuildUprevError):
519 uprev_lib.uprev_ebuild_from_pin(
520 package_path, self.new_version, chroot=Chroot()
521 )
Trent Begin315d9d92019-12-03 21:55:53 -0700522
523
Andrew Lamb9563a152019-12-04 11:42:18 -0700524class ReplicatePrivateConfigTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600525 """replicate_private_config tests."""
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700526
Alex Klein1699fab2022-09-08 08:46:06 -0600527 def setUp(self):
528 # Set up fake public and private chromeos-config overlays.
529 private_package_root = (
530 "src/private-overlays/overlay-coral-private/chromeos-base/"
531 "chromeos-config-bsp"
532 )
533 self.public_package_root = (
534 "src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp"
535 )
536 file_layout = (
537 D(
538 os.path.join(private_package_root, "files"),
539 ["build_config.json"],
540 ),
541 D(private_package_root, ["replication_config.jsonpb"]),
542 D(
543 os.path.join(self.public_package_root, "files"),
544 ["build_config.json"],
545 ),
546 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700547
Alex Klein1699fab2022-09-08 08:46:06 -0600548 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700549
Alex Klein1699fab2022-09-08 08:46:06 -0600550 # Private config contains 'a' and 'b' fields.
551 self.private_config_path = os.path.join(
552 private_package_root, "files", "build_config.json"
553 )
554 self.WriteTempFile(
555 self.private_config_path,
556 json.dumps({"chromeos": {"configs": [{"a": 3, "b": 2}]}}),
557 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700558
Alex Klein1699fab2022-09-08 08:46:06 -0600559 # Public config only contains the 'a' field. Note that the value of 'a' is
560 # 1 in the public config; it will get updated to 3 when the private config
561 # is replicated.
562 self.public_config_path = os.path.join(
563 self.public_package_root, "files", "build_config.json"
564 )
565 self.WriteTempFile(
566 self.public_config_path,
567 json.dumps({"chromeos": {"configs": [{"a": 1}]}}),
568 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700569
Alex Klein1699fab2022-09-08 08:46:06 -0600570 # Put a ReplicationConfig JSONPB in the private package. Note that it
571 # specifies only the 'a' field is replicated.
572 self.replication_config_path = os.path.join(
573 self.tempdir, private_package_root, "replication_config.jsonpb"
574 )
575 replication_config = ReplicationConfig(
576 file_replication_rules=[
577 FileReplicationRule(
578 source_path=self.private_config_path,
579 destination_path=self.public_config_path,
580 file_type=FILE_TYPE_JSON,
581 replication_type=REPLICATION_TYPE_FILTER,
582 destination_fields=FieldMask(paths=["a"]),
583 )
584 ]
585 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700586
Alex Klein1699fab2022-09-08 08:46:06 -0600587 osutils.WriteFile(
588 self.replication_config_path,
589 json_format.MessageToJson(replication_config),
590 )
591 self.PatchObject(constants, "SOURCE_ROOT", new=self.tempdir)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700592
Alex Klein1699fab2022-09-08 08:46:06 -0600593 self.rc.SetDefaultCmdResult(side_effect=self._write_generated_c_files)
Andrew Lamb9563a152019-12-04 11:42:18 -0700594
Alex Klein1699fab2022-09-08 08:46:06 -0600595 def _write_generated_c_files(self, *_args, **_kwargs):
596 """Write fake generated C files to the public output dir.
Andrew Lamb9563a152019-12-04 11:42:18 -0700597
Alex Klein1699fab2022-09-08 08:46:06 -0600598 Note that this function accepts args and kwargs so it can be used as a side
599 effect.
600 """
601 output_dir = os.path.join(self.public_package_root, "files")
602 self.WriteTempFile(os.path.join(output_dir, "config.c"), "")
603 self.WriteTempFile(os.path.join(output_dir, "ec_config.c"), "")
604 self.WriteTempFile(os.path.join(output_dir, "ec_config.h"), "")
Andrew Lamb9563a152019-12-04 11:42:18 -0700605
Alex Klein1699fab2022-09-08 08:46:06 -0600606 def _write_incorrect_generated_c_files(self, *_args, **_kwargs):
607 """Similar to _write_generated_c_files, with an expected file missing.
Andrew Lamb9563a152019-12-04 11:42:18 -0700608
Alex Klein1699fab2022-09-08 08:46:06 -0600609 Note that this function accepts args and kwargs so it can be used as a side
610 effect.
611 """
612 output_dir = os.path.join(self.public_package_root, "files")
613 self.WriteTempFile(os.path.join(output_dir, "config.c"), "")
614 self.WriteTempFile(os.path.join(output_dir, "ec_config.c"), "")
Andrew Lamb9563a152019-12-04 11:42:18 -0700615
Alex Klein1699fab2022-09-08 08:46:06 -0600616 def test_replicate_private_config(self):
617 """Basic replication test."""
618 refs = [
619 GitRef(
620 path="/chromeos/overlays/overlay-coral-private",
621 ref="main",
622 revision="123",
623 )
624 ]
625 chroot = Chroot()
626 result = packages.replicate_private_config(
627 _build_targets=None, refs=refs, chroot=chroot
628 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700629
Alex Klein1699fab2022-09-08 08:46:06 -0600630 self.assertCommandContains(
631 [
632 "cros_config_schema",
633 "-m",
634 os.path.join(
635 constants.CHROOT_SOURCE_ROOT, self.public_config_path
636 ),
637 "-g",
638 os.path.join(
639 constants.CHROOT_SOURCE_ROOT,
640 self.public_package_root,
641 "files",
642 ),
643 "-f",
644 '"TRUE"',
645 ],
646 enter_chroot=True,
647 chroot_args=chroot.get_enter_args(),
648 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700649
Alex Klein1699fab2022-09-08 08:46:06 -0600650 self.assertEqual(len(result.modified), 1)
651 # The public build_config.json and generated C files were modified.
652 expected_modified_files = [
653 os.path.join(self.tempdir, self.public_config_path),
654 os.path.join(
655 self.tempdir, self.public_package_root, "files", "config.c"
656 ),
657 os.path.join(
658 self.tempdir, self.public_package_root, "files", "ec_config.c"
659 ),
660 os.path.join(
661 self.tempdir, self.public_package_root, "files", "ec_config.h"
662 ),
663 ]
664 self.assertEqual(result.modified[0].files, expected_modified_files)
665 self.assertEqual(result.modified[0].new_version, "123")
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700666
Alex Klein1699fab2022-09-08 08:46:06 -0600667 # The update from the private build_config.json was copied to the public.
668 # Note that only the 'a' field is present, as per destination_fields.
669 self.assertEqual(
670 json.loads(self.ReadTempFile(self.public_config_path)),
671 {"chromeos": {"configs": [{"a": 3}]}},
672 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700673
Alex Klein1699fab2022-09-08 08:46:06 -0600674 def test_replicate_private_config_no_build_config(self):
675 """If there is no build config, don't generate C files."""
676 # Modify the replication config to write to "other_config.json" instead of
677 # "build_config.json"
678 modified_destination_path = self.public_config_path.replace(
679 "build_config", "other_config"
680 )
681 replication_config = ReplicationConfig(
682 file_replication_rules=[
683 FileReplicationRule(
684 source_path=self.private_config_path,
685 destination_path=modified_destination_path,
686 file_type=FILE_TYPE_JSON,
687 replication_type=REPLICATION_TYPE_FILTER,
688 destination_fields=FieldMask(paths=["a"]),
689 )
690 ]
691 )
692 osutils.WriteFile(
693 self.replication_config_path,
694 json_format.MessageToJson(replication_config),
695 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700696
Alex Klein1699fab2022-09-08 08:46:06 -0600697 refs = [
698 GitRef(
699 path="/chromeos/overlays/overlay-coral-private",
700 ref="main",
701 revision="123",
702 )
703 ]
704 result = packages.replicate_private_config(
705 _build_targets=None, refs=refs, chroot=Chroot()
706 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700707
Alex Klein1699fab2022-09-08 08:46:06 -0600708 self.assertEqual(len(result.modified), 1)
709 self.assertEqual(
710 result.modified[0].files,
711 [os.path.join(self.tempdir, modified_destination_path)],
712 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700713
Alex Klein1699fab2022-09-08 08:46:06 -0600714 def test_replicate_private_config_multiple_build_configs(self):
715 """An error is thrown if there is more than one build config."""
716 replication_config = ReplicationConfig(
717 file_replication_rules=[
718 FileReplicationRule(
719 source_path=self.private_config_path,
720 destination_path=self.public_config_path,
721 file_type=FILE_TYPE_JSON,
722 replication_type=REPLICATION_TYPE_FILTER,
723 destination_fields=FieldMask(paths=["a"]),
724 ),
725 FileReplicationRule(
726 source_path=self.private_config_path,
727 destination_path=self.public_config_path,
728 file_type=FILE_TYPE_JSON,
729 replication_type=REPLICATION_TYPE_FILTER,
730 destination_fields=FieldMask(paths=["a"]),
731 ),
732 ]
733 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700734
Alex Klein1699fab2022-09-08 08:46:06 -0600735 osutils.WriteFile(
736 self.replication_config_path,
737 json_format.MessageToJson(replication_config),
738 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700739
Alex Klein1699fab2022-09-08 08:46:06 -0600740 refs = [
741 GitRef(
742 path="/chromeos/overlays/overlay-coral-private",
743 ref="main",
744 revision="123",
745 )
746 ]
747 with self.assertRaisesRegex(
748 ValueError,
749 "Expected at most one build_config.json destination path.",
750 ):
751 packages.replicate_private_config(
752 _build_targets=None, refs=refs, chroot=Chroot()
753 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700754
Alex Klein1699fab2022-09-08 08:46:06 -0600755 def test_replicate_private_config_generated_files_incorrect(self):
756 """An error is thrown if generated C files are missing."""
757 self.rc.SetDefaultCmdResult(
758 side_effect=self._write_incorrect_generated_c_files
759 )
Andrew Lamb9563a152019-12-04 11:42:18 -0700760
Alex Klein1699fab2022-09-08 08:46:06 -0600761 refs = [
762 GitRef(
763 path="/chromeos/overlays/overlay-coral-private",
764 ref="main",
765 revision="123",
766 )
767 ]
768 chroot = Chroot()
Andrew Lamb9563a152019-12-04 11:42:18 -0700769
Alex Klein1699fab2022-09-08 08:46:06 -0600770 with self.assertRaisesRegex(
771 packages.GeneratedCrosConfigFilesError,
772 "Expected to find generated C files",
773 ):
774 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 def test_replicate_private_config_wrong_number_of_refs(self):
779 """An error is thrown if there is not exactly one ref."""
780 with self.assertRaisesRegex(ValueError, "Expected exactly one ref"):
781 packages.replicate_private_config(
782 _build_targets=None, refs=[], chroot=None
783 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700784
Alex Klein1699fab2022-09-08 08:46:06 -0600785 with self.assertRaisesRegex(ValueError, "Expected exactly one ref"):
786 refs = [
787 GitRef(path="a", ref="main", revision="1"),
788 GitRef(path="a", ref="main", revision="2"),
789 ]
790 packages.replicate_private_config(
791 _build_targets=None, refs=refs, chroot=None
792 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700793
Alex Klein1699fab2022-09-08 08:46:06 -0600794 def test_replicate_private_config_replication_config_missing(self):
795 """An error is thrown if there is not a replication config."""
796 os.remove(self.replication_config_path)
797 with self.assertRaisesRegex(
798 ValueError,
799 "Expected ReplicationConfig missing at %s"
800 % self.replication_config_path,
801 ):
802 refs = [
803 GitRef(
804 path="/chromeos/overlays/overlay-coral-private",
805 ref="main",
806 revision="123",
807 )
808 ]
809 packages.replicate_private_config(
810 _build_targets=None, refs=refs, chroot=None
811 )
Andrew Lambe836f222019-12-09 12:27:38 -0700812
Alex Klein1699fab2022-09-08 08:46:06 -0600813 def test_replicate_private_config_wrong_git_ref_path(self):
814 """An error is thrown if the git ref doesn't point to a private overlay."""
815 with self.assertRaisesRegex(
816 ValueError, "ref.path must match the pattern"
817 ):
818 refs = [GitRef(path="a/b/c", ref="main", revision="123")]
819 packages.replicate_private_config(
820 _build_targets=None, refs=refs, chroot=None
821 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700822
823
Alex Klein5caab872021-09-10 11:44:37 -0600824class GetBestVisibleTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600825 """get_best_visible tests."""
David Burger1e0fe232019-07-01 14:52:07 -0600826
Alex Klein1699fab2022-09-08 08:46:06 -0600827 def test_empty_atom_fails(self):
828 """Test empty atom raises an error."""
829 with self.assertRaises(AssertionError):
830 packages.get_best_visible("")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600831
832
Alex Klein149fd3b2019-12-16 16:01:05 -0700833class HasPrebuiltTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600834 """has_prebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600835
Alex Klein1699fab2022-09-08 08:46:06 -0600836 def test_empty_atom_fails(self):
837 """Test an empty atom results in an error."""
838 with self.assertRaises(AssertionError):
839 packages.has_prebuilt("")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600840
Alex Klein1699fab2022-09-08 08:46:06 -0600841 def test_use_flags(self):
842 """Test use flags get propagated correctly."""
843 # We don't really care about the result, just the env handling.
844 patch = self.PatchObject(portage_util, "HasPrebuilt", return_value=True)
845 # Ignore any flags that may be in the environment.
846 self.PatchObject(os.environ, "get", return_value="")
Alex Klein149fd3b2019-12-16 16:01:05 -0700847
Alex Klein1699fab2022-09-08 08:46:06 -0600848 packages.has_prebuilt("cat/pkg-1.2.3", useflags="useflag")
849 patch.assert_called_with(
850 "cat/pkg-1.2.3", board=None, extra_env={"USE": "useflag"}
851 )
Alex Klein149fd3b2019-12-16 16:01:05 -0700852
Alex Klein1699fab2022-09-08 08:46:06 -0600853 def test_env_use_flags(self):
854 """Test env use flags get propagated correctly with passed useflags."""
855 # We don't really care about the result, just the env handling.
856 patch = self.PatchObject(portage_util, "HasPrebuilt", return_value=True)
857 # Add some flags to the environment.
858 existing_flags = "already set flags"
859 self.PatchObject(os.environ, "get", return_value=existing_flags)
Alex Klein149fd3b2019-12-16 16:01:05 -0700860
Alex Klein1699fab2022-09-08 08:46:06 -0600861 new_flags = "useflag"
862 packages.has_prebuilt("cat/pkg-1.2.3", useflags=new_flags)
863 expected = "%s %s" % (existing_flags, new_flags)
864 patch.assert_called_with(
865 "cat/pkg-1.2.3", board=None, extra_env={"USE": expected}
866 )
Alex Klein149fd3b2019-12-16 16:01:05 -0700867
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600868
869class AndroidVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600870 """Tests getting android versions."""
Michael Mortensen14960d02019-10-18 07:53:59 -0600871
Alex Klein1699fab2022-09-08 08:46:06 -0600872 def setUp(self):
873 package_result = [
874 "chromeos-base/android-container-nyc-4717008-r1",
875 "chromeos-base/update_engine-0.0.3-r3408",
876 ]
877 self.PatchObject(
878 portage_util, "GetPackageDependencies", return_value=package_result
879 )
880 self.board = "board"
881 self.PatchObject(
882 portage_util,
883 "FindEbuildForBoardPackage",
884 return_value="chromeos-base/android-container-nyc",
885 )
886 FakeEnvironment = {
887 "ARM_TARGET": "3-linux-target",
888 }
889 self.PatchObject(
890 osutils, "SourceEnvironment", return_value=FakeEnvironment
891 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600892
Alex Klein1699fab2022-09-08 08:46:06 -0600893 # Clear the LRU cache for the function. We mock the function that provides
894 # the data this function processes to produce its result, so we need to
895 # clear it manually.
896 packages.determine_android_package.cache_clear()
Alex Klein68a28712021-11-08 11:08:30 -0700897
Alex Klein1699fab2022-09-08 08:46:06 -0600898 def test_determine_android_version(self):
899 """Tests that a valid android version is returned."""
900 version = packages.determine_android_version(self.board)
901 self.assertEqual(version, "4717008")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600902
Alex Klein1699fab2022-09-08 08:46:06 -0600903 def test_determine_android_version_when_not_present(self):
904 """Tests that a None is returned for version when android is not present."""
905 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
906 self.PatchObject(
907 portage_util, "GetPackageDependencies", return_value=package_result
908 )
909 version = packages.determine_android_version(self.board)
910 self.assertEqual(version, None)
Michael Mortensenedf76532019-10-16 14:22:37 -0600911
Alex Klein1699fab2022-09-08 08:46:06 -0600912 def test_determine_android_branch(self):
913 """Tests that a valid android branch is returned."""
914 branch = packages.determine_android_branch(self.board)
915 self.assertEqual(branch, "3")
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600916
Alex Klein1699fab2022-09-08 08:46:06 -0600917 def test_determine_android_branch_64bit_targets(self):
918 """Tests that a valid android branch is returned with only 64bit targets."""
919 self.PatchObject(
920 osutils,
921 "SourceEnvironment",
922 return_value={"ARM64_TARGET": "3-linux-target"},
923 )
924 branch = packages.determine_android_branch(self.board)
925 self.assertEqual(branch, "3")
Federico 'Morg' Pareschicd9165a2020-05-29 09:45:55 +0900926
Alex Klein1699fab2022-09-08 08:46:06 -0600927 def test_determine_android_branch_when_not_present(self):
928 """Tests that a None is returned for branch when android is not present."""
929 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
930 self.PatchObject(
931 portage_util, "GetPackageDependencies", return_value=package_result
932 )
933 branch = packages.determine_android_branch(self.board)
934 self.assertEqual(branch, None)
Michael Mortensenedf76532019-10-16 14:22:37 -0600935
Alex Klein1699fab2022-09-08 08:46:06 -0600936 def test_determine_android_target(self):
937 """Tests that a valid android target is returned."""
938 target = packages.determine_android_target(self.board)
939 self.assertEqual(target, "cheets")
Michael Mortensenc2615b72019-10-15 08:12:24 -0600940
Alex Klein1699fab2022-09-08 08:46:06 -0600941 def test_determine_android_target_when_not_present(self):
942 """Tests that a None is returned for target when android is not present."""
943 package_result = ["chromeos-base/update_engine-0.0.3-r3408"]
944 self.PatchObject(
945 portage_util, "GetPackageDependencies", return_value=package_result
946 )
947 target = packages.determine_android_target(self.board)
948 self.assertEqual(target, None)
Michael Mortensenedf76532019-10-16 14:22:37 -0600949
Alex Klein1699fab2022-09-08 08:46:06 -0600950 def test_determine_android_version_handle_exception(self):
951 """Tests handling RunCommandError inside determine_android_version."""
952 # Mock what happens when portage returns that bubbles up (via RunCommand)
953 # inside portage_util.GetPackageDependencies.
954 self.PatchObject(
955 portage_util,
956 "GetPackageDependencies",
957 side_effect=cros_build_lib.RunCommandError("error"),
958 )
959 target = packages.determine_android_version(self.board)
960 self.assertEqual(target, None)
Michael Mortensene0f4b542019-10-24 15:30:23 -0600961
Alex Klein1699fab2022-09-08 08:46:06 -0600962 def test_determine_android_package_handle_exception(self):
963 """Tests handling RunCommandError inside determine_android_package."""
964 # Mock what happens when portage returns that bubbles up (via RunCommand)
965 # inside portage_util.GetPackageDependencies.
966 self.PatchObject(
967 portage_util,
968 "GetPackageDependencies",
969 side_effect=cros_build_lib.RunCommandError("error"),
970 )
971 target = packages.determine_android_package(self.board)
972 self.assertEqual(target, None)
Michael Mortensene0f4b542019-10-24 15:30:23 -0600973
Alex Klein1699fab2022-09-08 08:46:06 -0600974 def test_determine_android_package_callers_handle_exception(self):
975 """Tests handling RunCommandError by determine_android_package callers."""
976 # Mock what happens when portage returns that bubbles up (via RunCommand)
977 # inside portage_util.GetPackageDependencies.
978 self.PatchObject(
979 portage_util,
980 "GetPackageDependencies",
981 side_effect=cros_build_lib.RunCommandError("error"),
982 )
983 # Verify that target is None, as expected.
984 target = packages.determine_android_package(self.board)
985 self.assertEqual(target, None)
986 # determine_android_branch calls determine_android_package
987 branch = packages.determine_android_branch(self.board)
988 self.assertEqual(branch, None)
989 # determine_android_target calls determine_android_package
990 target = packages.determine_android_target(self.board)
991 self.assertEqual(target, None)
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600992
Michael Mortensene0f4b542019-10-24 15:30:23 -0600993
Alex Klein1699fab2022-09-08 08:46:06 -0600994@pytest.mark.usefixtures("testcase_caplog", "testcase_monkeypatch")
Michael Mortensende716a12020-05-15 11:27:00 -0600995class FindFingerprintsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -0600996 """Tests for find_fingerprints."""
Michael Mortensende716a12020-05-15 11:27:00 -0600997
Alex Klein1699fab2022-09-08 08:46:06 -0600998 def setUp(self):
999 self.board = "test-board"
1000 # Create cheets-fingerprints.txt based on tempdir/src...
1001 self.fingerprint_contents = (
1002 "google/test-board/test-board_cheets"
1003 ":9/R99-12345.0.9999/123456:user/release-keys"
1004 )
1005 fingerprint_path = os.path.join(
1006 self.tempdir,
1007 "src/build/images/test-board/latest/cheets-fingerprint.txt",
1008 )
1009 self.chroot = Chroot(self.tempdir)
1010 osutils.WriteFile(
1011 fingerprint_path, self.fingerprint_contents, makedirs=True
1012 )
Michael Mortensende716a12020-05-15 11:27:00 -06001013
Alex Klein1699fab2022-09-08 08:46:06 -06001014 def test_find_fingerprints_with_test_path(self):
1015 """Tests get_firmware_versions with mocked output."""
1016 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1017 build_target = build_target_lib.BuildTarget(self.board)
1018 result = packages.find_fingerprints(build_target)
1019 self.assertEqual(result, [self.fingerprint_contents])
1020 self.assertIn("Reading fingerprint file", self.caplog.text)
Michael Mortensende716a12020-05-15 11:27:00 -06001021
Alex Klein1699fab2022-09-08 08:46:06 -06001022 def test_find_fingerprints(self):
1023 """Tests get_firmware_versions with mocked output."""
1024 # Use board name whose path for fingerprint file does not exist.
1025 # Verify that fingerprint file is not found and None is returned.
1026 build_target = build_target_lib.BuildTarget("wrong-boardname")
1027 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1028 result = packages.find_fingerprints(build_target)
1029 self.assertEqual(result, [])
1030 self.assertIn("Fingerprint file not found", self.caplog.text)
Michael Mortensende716a12020-05-15 11:27:00 -06001031
1032
Michael Mortensen59e30872020-05-18 14:12:49 -06001033class GetAllFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001034 """Tests for get_firmware_versions."""
Michael Mortensen59e30872020-05-18 14:12:49 -06001035
Alex Klein1699fab2022-09-08 08:46:06 -06001036 def setUp(self):
1037 self.board = "test-board"
1038 self.rc.SetDefaultCmdResult(
1039 stdout="""
Michael Mortensen59e30872020-05-18 14:12:49 -06001040
1041flashrom(8): 68935ee2fcfcffa47af81b966269cd2b */build/reef/usr/sbin/flashrom
1042 ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=e102cc98d45300b50088999d53775acbeff407dc, stripped
1043 0.9.9 : bbb2d6a : Jul 28 2017 15:12:34 UTC
1044
1045Model: reef
1046BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
1047BIOS version: Google_Reef.9042.87.1
1048BIOS (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
1049BIOS (RW) version: Google_Reef.9042.110.0
1050EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
1051EC version: reef_v1.1.5900-ab1ee51
1052EC (RW) version: reef_v1.1.5909-bd1f0c9
1053
1054Model: pyro
1055BIOS image: 9e62447ebf22a724a4a835018ab6234e */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/image.bin
1056BIOS version: Google_Pyro.9042.87.1
1057BIOS (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
1058BIOS (RW) version: Google_Pyro.9042.110.0
1059EC image: 44b93ed591733519e752e05aa0529eb5 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/pyro/ec.bin
1060EC version: pyro_v1.1.5900-ab1ee51
1061EC (RW) version: pyro_v1.1.5909-bd1f0c9
1062
1063Model: snappy
1064BIOS image: 3ab63ff080596bd7de4e7619f003bb64 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/image.bin
1065BIOS version: Google_Snappy.9042.110.0
1066EC image: c4db159e84428391d2ee25368c5fe5b6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/snappy/ec.bin
1067EC version: snappy_v1.1.5909-bd1f0c9
1068
1069Model: sand
1070BIOS image: 387da034a4f0a3f53e278ebfdcc2a412 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/image.bin
1071BIOS version: Google_Sand.9042.110.0
1072EC image: 411562e0589dacec131f5fdfbe95a561 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/sand/ec.bin
1073EC version: sand_v1.1.5909-bd1f0c9
1074
1075Model: electro
1076BIOS image: 1b535280fe688ac284d95276492b06f6 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/image.bin
1077BIOS version: Google_Reef.9042.87.1
1078BIOS (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
1079BIOS (RW) version: Google_Reef.9042.110.0
1080EC image: 2e8b4b5fa73cc5dbca4496de97a917a9 */build/reef/tmp/portage/chromeos-base/chromeos-firmware-reef-0.0.1-r79/temp/tmp7rHApL.pack_firmware-99001/models/reef/ec.bin
1081EC version: reef_v1.1.5900-ab1ee51
1082EC (RW) version: reef_v1.1.5909-bd1f0c9
1083
1084Package Content:
1085612e7bb6ed1fb0a05abf2ebdc834c18b *./updater4.sh
10860eafbee07282315829d0f42135ec7c0c *./gbb_utility
10876074e3ca424cb30a67c378c1d9681f9c *./mosys
108868935ee2fcfcffa47af81b966269cd2b *./flashrom
10890eafbee07282315829d0f42135ec7c0c *./dump_fmap
1090490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
109160899148600b8673ddb711faa55aee40 *./common.sh
10923c3a99346d1ca1273cbcd86c104851ff *./shflags
1093de7ce035e1f82a89f8909d888ee402c0 *./crosutil.sh
1094f9334372bdb9036ba09a6fd9bf30e7a2 *./crossystem
109522257a8d5f0adc1f50a1916c3a4a35dd *./models/reef/ec.bin
1096faf12dbb7cdaf21ce153bdffb67841fd *./models/reef/bios.bin
1097c9bbb417b7921b85a7ed999ee42f550e *./models/reef/setvars.sh
109829823d46f1ec1491ecacd7b830fd2686 *./models/pyro/ec.bin
10992320463aba8b22eb5ea836f094d281b3 *./models/pyro/bios.bin
110081614833ad77c9cd093360ba7bea76b8 *./models/pyro/setvars.sh
1101411562e0589dacec131f5fdfbe95a561 *./models/sand/ec.bin
1102387da034a4f0a3f53e278ebfdcc2a412 *./models/sand/bios.bin
1103fcd8cb0ac0e2ed6be220aaae435d43ff *./models/sand/setvars.sh
1104c4db159e84428391d2ee25368c5fe5b6 *./models/snappy/ec.bin
11053ab63ff080596bd7de4e7619f003bb64 *./models/snappy/bios.bin
1106fe5d699f2e9e4a7de031497953313dbd *./models/snappy/setvars.sh
110779aabd7cd8a215a54234c53d7bb2e6fb *./vpd
Alex Klein1699fab2022-09-08 08:46:06 -06001108"""
1109 )
Michael Mortensen59e30872020-05-18 14:12:49 -06001110
Alex Klein1699fab2022-09-08 08:46:06 -06001111 def test_get_firmware_versions(self):
1112 """Tests get_firmware_versions with mocked output."""
1113 build_target = build_target_lib.BuildTarget(self.board)
1114 result = packages.get_all_firmware_versions(build_target)
1115 self.assertEqual(len(result), 5)
1116 self.assertEqual(
1117 result["reef"],
1118 packages.FirmwareVersions(
1119 "reef",
1120 "Google_Reef.9042.87.1",
1121 "Google_Reef.9042.110.0",
1122 "reef_v1.1.5900-ab1ee51",
1123 "reef_v1.1.5909-bd1f0c9",
1124 ),
1125 )
1126 self.assertEqual(
1127 result["pyro"],
1128 packages.FirmwareVersions(
1129 "pyro",
1130 "Google_Pyro.9042.87.1",
1131 "Google_Pyro.9042.110.0",
1132 "pyro_v1.1.5900-ab1ee51",
1133 "pyro_v1.1.5909-bd1f0c9",
1134 ),
1135 )
1136 self.assertEqual(
1137 result["snappy"],
1138 packages.FirmwareVersions(
1139 "snappy",
1140 "Google_Snappy.9042.110.0",
1141 None,
1142 "snappy_v1.1.5909-bd1f0c9",
1143 None,
1144 ),
1145 )
1146 self.assertEqual(
1147 result["sand"],
1148 packages.FirmwareVersions(
1149 "sand",
1150 "Google_Sand.9042.110.0",
1151 None,
1152 "sand_v1.1.5909-bd1f0c9",
1153 None,
1154 ),
1155 )
1156 self.assertEqual(
1157 result["electro"],
1158 packages.FirmwareVersions(
1159 "electro",
1160 "Google_Reef.9042.87.1",
1161 "Google_Reef.9042.110.0",
1162 "reef_v1.1.5900-ab1ee51",
1163 "reef_v1.1.5909-bd1f0c9",
1164 ),
1165 )
Michael Mortensen59e30872020-05-18 14:12:49 -06001166
Alex Klein1699fab2022-09-08 08:46:06 -06001167 def test_get_firmware_versions_error(self):
1168 """Tests get_firmware_versions with no output."""
1169 # Throw an exception when running the command.
1170 self.PatchObject(
1171 cros_build_lib,
1172 "run",
1173 side_effect=cros_build_lib.RunCommandError("error"),
1174 )
1175 build_target = build_target_lib.BuildTarget(self.board)
1176 result = packages.get_all_firmware_versions(build_target)
1177 self.assertEqual(result, {})
Benjamin Shai12c767e2022-01-12 15:17:44 +00001178
Michael Mortensen59e30872020-05-18 14:12:49 -06001179
Michael Mortensen71ef5682020-05-07 14:29:24 -06001180class GetFirmwareVersionsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001181 """Tests for get_firmware_versions."""
Michael Mortensen71ef5682020-05-07 14:29:24 -06001182
Alex Klein1699fab2022-09-08 08:46:06 -06001183 def setUp(self):
1184 self.board = "test-board"
1185 self.rc.SetDefaultCmdResult(
1186 stdout="""
Michael Mortensen71ef5682020-05-07 14:29:24 -06001187
1188flashrom(8): a8f99c2e61e7dc09c4b25ef5a76ef692 */build/kevin/usr/sbin/flashrom
1189 ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.d
1190 0.9.4 : 860875a : Apr 10 2017 23:54:29 UTC
1191
1192BIOS image: 6b5b855a0b8fd1657546d1402c15b206 *chromeos-firmware-kevin-0.0.1/.dist/kevin_fw_8785.178.0.n
1193BIOS version: Google_Kevin.8785.178.0
1194EC image: 1ebfa9518e6cac0558a80b7ab2f5b489 *chromeos-firmware-kevin-0.0.1/.dist/kevin_ec_8785.178.0.n
1195EC version:kevin_v1.10.184-459421c
1196
1197Package Content:
1198a8f99c2e61e7dc09c4b25ef5a76ef692 *./flashrom
11993c3a99346d1ca1273cbcd86c104851ff *./shflags
1200457a8dc8546764affc9700f8da328d23 *./dump_fmap
1201c392980ddb542639edf44a965a59361a *./updater5.sh
1202490c95d6123c208d20d84d7c16857c7c *./crosfw.sh
12036b5b855a0b8fd1657546d1402c15b206 *./bios.bin
12047b5bef0d2da90c23ff2e157250edf0fa *./crosutil.sh
1205d78722e4f1a0dc2d8c3d6b0bc7010ae3 *./crossystem
1206457a8dc8546764affc9700f8da328d23 *./gbb_utility
12071ebfa9518e6cac0558a80b7ab2f5b489 *./ec.bin
1208c98ca54db130886142ad582a58e90ddc *./common.sh
12095ba978bdec0f696f47f0f0de90936880 *./mosys
1210312e8ee6122057f2a246d7bcf1572f49 *./vpd
Alex Klein1699fab2022-09-08 08:46:06 -06001211"""
1212 )
Michael Mortensen71ef5682020-05-07 14:29:24 -06001213
Alex Klein1699fab2022-09-08 08:46:06 -06001214 def test_get_firmware_versions(self):
1215 """Tests get_firmware_versions with mocked output."""
1216 build_target = build_target_lib.BuildTarget(self.board)
1217 result = packages.get_firmware_versions(build_target)
1218 versions = packages.FirmwareVersions(
1219 None,
1220 "Google_Kevin.8785.178.0",
1221 None,
1222 "kevin_v1.10.184-459421c",
1223 None,
1224 )
1225 self.assertEqual(result, versions)
Michael Mortensen71ef5682020-05-07 14:29:24 -06001226
1227
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001228class DetermineKernelVersionTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001229 """Tests for determine_kernel_version."""
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001230
Alex Klein1699fab2022-09-08 08:46:06 -06001231 def setUp(self):
1232 self.board = "test-board"
1233 self.build_target = build_target_lib.BuildTarget(self.board)
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001234
Alex Klein1699fab2022-09-08 08:46:06 -06001235 def test_determine_kernel_version(self):
1236 """Tests that a valid kernel version is returned."""
Lizzy Presland0b978e62022-09-09 16:55:29 +00001237 kernel_candidates = [
1238 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
Alex Klein1699fab2022-09-08 08:46:06 -06001239 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
Lizzy Presland0b978e62022-09-09 16:55:29 +00001240 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1241 "sys-kernel/upstream-kernel-next-9999",
1242 "sys-kernel/socfpga-kernel-4.20-r34",
Alex Klein1699fab2022-09-08 08:46:06 -06001243 ]
1244 self.PatchObject(
Lizzy Presland0b978e62022-09-09 16:55:29 +00001245 portage_util,
1246 "GetFlattenedDepsForPackage",
1247 return_value=kernel_candidates,
1248 )
1249
1250 installed_pkgs = [
1251 "sys-kernel/linux-firmware-0.0.1-r594",
1252 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1253 "virtual/linux-sources-1-r30",
1254 ]
1255 self.PatchObject(
1256 portage_util,
1257 "GetPackageDependencies",
1258 return_value=installed_pkgs,
Alex Klein1699fab2022-09-08 08:46:06 -06001259 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001260
Alex Klein1699fab2022-09-08 08:46:06 -06001261 result = packages.determine_kernel_version(self.build_target)
1262 self.assertEqual(result, "4.4.223-r2209")
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001263
Lizzy Presland0b978e62022-09-09 16:55:29 +00001264 def test_determine_kernel_version_ignores_exact_duplicates(self):
1265 """Tests that multiple results for candidates is ignored."""
1266 # Depgraph is evaluated for version as well as revision, so graph will
1267 # return all results twice.
1268 kernel_candidates = [
1269 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1270 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1271 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1272 "sys-kernel/upstream-kernel-next-9999",
1273 "sys-kernel/socfpga-kernel-4.20-r34",
1274 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1275 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1276 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1277 "sys-kernel/upstream-kernel-next-9999",
1278 "sys-kernel/socfpga-kernel-4.20-r34",
1279 ]
1280 self.PatchObject(
1281 portage_util,
1282 "GetFlattenedDepsForPackage",
1283 return_value=kernel_candidates,
1284 )
1285
1286 installed_pkgs = [
1287 "sys-kernel/linux-firmware-0.0.1-r594",
1288 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1289 "virtual/linux-sources-1-r30",
1290 ]
Alex Klein1699fab2022-09-08 08:46:06 -06001291 self.PatchObject(
1292 portage_util,
1293 "GetPackageDependencies",
Lizzy Presland0b978e62022-09-09 16:55:29 +00001294 return_value=installed_pkgs,
1295 )
1296
1297 result = packages.determine_kernel_version(self.build_target)
1298 self.assertEqual(result, "4.4.223-r2209")
1299
1300 def test_determine_kernel_version_ignores_virtual_package(self):
1301 """Tests that top-level package is ignored as potential kernel pkg."""
1302 # Depgraph results include the named package at level 0 as well as its
1303 # first-order dependencies, so verify that the virtual package is not
1304 # included as a kernel package.
1305 kernel_candidates = [
1306 "virtual/linux-sources-1",
1307 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1308 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1309 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1310 "sys-kernel/upstream-kernel-next-9999",
1311 "sys-kernel/socfpga-kernel-4.20-r34",
1312 "virtual/linux-sources-1-r30",
1313 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1314 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1315 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1316 "sys-kernel/upstream-kernel-next-9999",
1317 "sys-kernel/socfpga-kernel-4.20-r34",
1318 ]
1319 self.PatchObject(
1320 portage_util,
1321 "GetFlattenedDepsForPackage",
1322 return_value=kernel_candidates,
1323 )
1324
1325 installed_pkgs = [
1326 "sys-kernel/linux-firmware-0.0.1-r594",
1327 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1328 "virtual/linux-sources-1-r30",
1329 ]
1330 self.PatchObject(
1331 portage_util,
1332 "GetPackageDependencies",
1333 return_value=installed_pkgs,
1334 )
1335
1336 result = packages.determine_kernel_version(self.build_target)
1337 self.assertEqual(result, "4.4.223-r2209")
1338
1339 def test_determine_kernel_version_too_many(self):
1340 """Tests that an exception is thrown with too many matching packages."""
1341 package_result = [
1342 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1343 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1344 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1345 "sys-kernel/upstream-kernel-next-9999",
1346 "sys-kernel/socfpga-kernel-4.20-r34",
1347 ]
1348 self.PatchObject(
1349 portage_util,
1350 "GetFlattenedDepsForPackage",
1351 return_value=package_result,
1352 )
1353
1354 installed_pkgs = [
1355 "sys-kernel/linux-firmware-0.0.1-r594",
1356 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1357 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1358 "virtual/linux-sources-1-r30",
1359 ]
1360 self.PatchObject(
1361 portage_util,
1362 "GetPackageDependencies",
1363 return_value=installed_pkgs,
1364 )
1365
1366 with self.assertRaises(packages.KernelVersionError):
1367 packages.determine_kernel_version(self.build_target)
1368
1369 def test_determine_kernel_version_no_kernel_match(self):
1370 """Tests that an exception is thrown with 0-sized intersection."""
1371 package_result = [
1372 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
1373 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
1374 "sys-kernel/chromeos-kernel-5_15-5.15.65-r869",
1375 "sys-kernel/upstream-kernel-next-9999",
1376 ]
1377 self.PatchObject(
1378 portage_util,
1379 "GetFlattenedDepsForPackage",
1380 return_value=package_result,
1381 )
1382
1383 installed_pkgs = [
1384 "sys-kernel/linux-firmware-0.0.1-r594",
1385 "sys-kernel/socfpga-kernel-4.20-r34",
1386 "virtual/linux-sources-1-r30",
1387 ]
1388 self.PatchObject(
1389 portage_util,
1390 "GetPackageDependencies",
1391 return_value=installed_pkgs,
1392 )
1393
1394 with self.assertRaises(packages.KernelVersionError):
1395 packages.determine_kernel_version(self.build_target)
1396
1397 def test_determine_kernel_version_exception(self):
1398 """Tests that portage_util exceptions result in returning empty str."""
1399 self.PatchObject(
1400 portage_util,
1401 "GetFlattenedDepsForPackage",
Alex Klein1699fab2022-09-08 08:46:06 -06001402 side_effect=cros_build_lib.RunCommandError("error"),
1403 )
1404 result = packages.determine_kernel_version(self.build_target)
Lizzy Presland0b978e62022-09-09 16:55:29 +00001405 self.assertEqual(result, "")
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -06001406
Alex Klein627e04c2021-11-10 15:56:47 -07001407
Michael Mortensenc2615b72019-10-15 08:12:24 -06001408class ChromeVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001409 """Tests getting chrome version."""
Michael Mortensen14960d02019-10-18 07:53:59 -06001410
Alex Klein1699fab2022-09-08 08:46:06 -06001411 def setUp(self):
1412 self.build_target = build_target_lib.BuildTarget("board")
Michael Mortensenc2615b72019-10-15 08:12:24 -06001413
Alex Klein1699fab2022-09-08 08:46:06 -06001414 def test_determine_chrome_version(self):
1415 """Tests that a valid chrome version is returned."""
1416 # Mock PortageqBestVisible to return a valid chrome version string.
1417 r1_cpf = "chromeos-base/chromeos-chrome-78.0.3900.0_rc-r1"
1418 r1_cpv = package_info.SplitCPV(r1_cpf)
1419 self.PatchObject(
1420 portage_util, "PortageqBestVisible", return_value=r1_cpv
1421 )
Michael Mortensenc2615b72019-10-15 08:12:24 -06001422
Alex Klein1699fab2022-09-08 08:46:06 -06001423 chrome_version = packages.determine_chrome_version(self.build_target)
1424 version_numbers = chrome_version.split(".")
1425 self.assertEqual(len(version_numbers), 4)
1426 self.assertEqual(int(version_numbers[0]), 78)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001427
Alex Klein1699fab2022-09-08 08:46:06 -06001428 def test_determine_chrome_version_handle_exception(self):
1429 # Mock what happens when portage throws an exception that bubbles up (via
1430 # RunCommand)inside portage_util.PortageqBestVisible.
1431 self.PatchObject(
1432 portage_util,
1433 "PortageqBestVisible",
1434 side_effect=cros_build_lib.RunCommandError("error"),
1435 )
1436 target = packages.determine_chrome_version(self.build_target)
1437 self.assertEqual(target, None)
Michael Mortensen9fe740c2019-10-29 14:42:48 -06001438
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001439
1440class PlatformVersionsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001441 """Tests getting platform version."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -06001442
Alex Klein1699fab2022-09-08 08:46:06 -06001443 def test_determine_platform_version(self):
1444 """Test checking that a valid platform version is returned."""
1445 platform_version = packages.determine_platform_version()
1446 # The returned platform version is something like 12603.0.0.
1447 version_string_list = platform_version.split(".")
1448 self.assertEqual(len(version_string_list), 3)
1449 # We don't want to check an exact version, but the first number should be
1450 # non-zero.
1451 self.assertGreaterEqual(int(version_string_list[0]), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001452
Alex Klein1699fab2022-09-08 08:46:06 -06001453 def test_determine_milestone_version(self):
1454 """Test checking that a valid milestone version is returned."""
1455 milestone_version = packages.determine_milestone_version()
1456 # Milestone version should be non-zero
1457 self.assertGreaterEqual(int(milestone_version), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001458
Alex Klein1699fab2022-09-08 08:46:06 -06001459 def test_determine_full_version(self):
1460 """Test checking that a valid full version is returned."""
1461 full_version = packages.determine_full_version()
1462 pattern = r"^R(\d+)-(\d+.\d+.\d+(-rc\d+)*)"
1463 m = re.match(pattern, full_version)
1464 self.assertTrue(m)
1465 milestone_version = m.group(1)
1466 self.assertGreaterEqual(int(milestone_version), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -06001467
Alex Klein1699fab2022-09-08 08:46:06 -06001468 def test_versions_based_on_mock(self):
1469 # Create a test version_info object, and than mock VersionInfo.from_repo
1470 # return it.
1471 test_platform_version = "12575.0.0"
1472 test_chrome_branch = "75"
1473 version_info_mock = chromeos_version.VersionInfo(test_platform_version)
1474 version_info_mock.chrome_branch = test_chrome_branch
1475 self.PatchObject(
1476 chromeos_version.VersionInfo,
1477 "from_repo",
1478 return_value=version_info_mock,
1479 )
1480 test_full_version = (
1481 "R" + test_chrome_branch + "-" + test_platform_version
1482 )
1483 platform_version = packages.determine_platform_version()
1484 milestone_version = packages.determine_milestone_version()
1485 full_version = packages.determine_full_version()
1486 self.assertEqual(platform_version, test_platform_version)
1487 self.assertEqual(milestone_version, test_chrome_branch)
1488 self.assertEqual(full_version, test_full_version)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001489
1490
1491# Each of the columns in the following table is a separate dimension along
1492# which Chrome uprev test cases can vary in behavior. The full test space would
1493# be the Cartesian product of the possible values of each column.
1494# 'CHROME_EBUILD' refers to the relationship between the version of the existing
1495# Chrome ebuild vs. the requested uprev version. 'FOLLOWER_EBUILDS' refers to
1496# the same relationship but for the packages defined in OTHER_CHROME_PACKAGES.
1497# 'EBUILDS MODIFIED' refers to whether any of the existing 9999 ebuilds have
1498# modified contents relative to their corresponding stable ebuilds.
1499#
1500# CHROME_EBUILD FOLLOWER_EBUILDS EBUILDS_MODIFIED
1501#
1502# HIGHER HIGHER YES
1503# SAME SAME NO
1504# LOWER LOWER
1505# DOESN'T EXIST YET
1506
1507# These test cases cover both CHROME & FOLLOWER ebuilds being identically
1508# higher, lower, or the same versions, with no modified ebuilds.
1509UPREV_VERSION_CASES = (
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001510 # Uprev.
Chris McDonaldea0312c2020-05-04 23:33:15 -06001511 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001512 "80.0.8080.0",
1513 "81.0.8181.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001514 # One added and one deleted for chrome and each "other" package.
1515 2 * (1 + len(constants.OTHER_CHROME_PACKAGES)),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001516 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001517 id="newer_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001518 ),
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001519 # Revbump.
1520 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001521 "80.0.8080.0",
1522 "80.0.8080.0",
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001523 2,
1524 True,
Alex Klein1699fab2022-09-08 08:46:06 -06001525 id="chrome_revbump",
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001526 ),
Chris McDonaldea0312c2020-05-04 23:33:15 -06001527 # No files should be changed in these cases.
1528 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001529 "80.0.8080.0",
1530 "80.0.8080.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001531 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001532 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001533 id="same_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001534 ),
1535 pytest.param(
Alex Klein1699fab2022-09-08 08:46:06 -06001536 "80.0.8080.0",
1537 "79.0.7979.0",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001538 0,
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001539 False,
Alex Klein1699fab2022-09-08 08:46:06 -06001540 id="older_chrome_version",
Chris McDonaldea0312c2020-05-04 23:33:15 -06001541 ),
1542)
1543
1544
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001545@pytest.mark.parametrize(
Alex Klein1699fab2022-09-08 08:46:06 -06001546 "old_version, new_version, expected_count, modify_unstable",
1547 UPREV_VERSION_CASES,
1548)
1549def test_uprev_chrome_all_files_already_exist(
1550 old_version,
1551 new_version,
1552 expected_count,
1553 modify_unstable,
1554 monkeypatch,
1555 overlay_stack,
1556):
1557 """Test Chrome uprevs work as expected when all packages already exist."""
1558 (overlay,) = overlay_stack(1)
1559 monkeypatch.setattr(uprev_lib, "_CHROME_OVERLAY_PATH", overlay.path)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001560
Alex Klein1699fab2022-09-08 08:46:06 -06001561 unstable_chrome = cr.test.Package(
1562 "chromeos-base", "chromeos-chrome", version="9999", keywords="~*"
1563 )
1564 if modify_unstable:
1565 # Add some field not set in stable.
1566 unstable_chrome.depend = "foo/bar"
Alex Klein0b2ec2d2021-06-23 15:56:45 -06001567
Alex Klein1699fab2022-09-08 08:46:06 -06001568 stable_chrome = cr.test.Package(
1569 "chromeos-base", "chromeos-chrome", version=f"{old_version}_rc-r1"
1570 )
Chris McDonaldea0312c2020-05-04 23:33:15 -06001571
Alex Klein1699fab2022-09-08 08:46:06 -06001572 overlay.add_package(unstable_chrome)
1573 overlay.add_package(stable_chrome)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001574
Alex Klein1699fab2022-09-08 08:46:06 -06001575 for pkg_str in constants.OTHER_CHROME_PACKAGES:
1576 category, pkg_name = pkg_str.split("/")
1577 unstable_pkg = cr.test.Package(
1578 category, pkg_name, version="9999", keywords="~*"
1579 )
1580 stable_pkg = cr.test.Package(
1581 category, pkg_name, version=f"{old_version}_rc-r1"
1582 )
Chris McDonaldea0312c2020-05-04 23:33:15 -06001583
Alex Klein1699fab2022-09-08 08:46:06 -06001584 overlay.add_package(unstable_pkg)
1585 overlay.add_package(stable_pkg)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001586
Alex Klein1699fab2022-09-08 08:46:06 -06001587 git_refs = [
1588 GitRef(
1589 path="/foo", ref=f"refs/tags/{new_version}", revision="stubcommit"
1590 )
1591 ]
1592 res = packages.uprev_chrome_from_ref(None, git_refs, None)
Chris McDonaldea0312c2020-05-04 23:33:15 -06001593
Alex Klein1699fab2022-09-08 08:46:06 -06001594 modified_file_count = sum(len(m.files) for m in res.modified)
1595 assert modified_file_count == expected_count
Michael Mortensen125bb012020-05-21 14:02:10 -06001596
1597
Alex Klein1699fab2022-09-08 08:46:06 -06001598@pytest.mark.usefixtures("testcase_monkeypatch")
Michael Mortensen125bb012020-05-21 14:02:10 -06001599class GetModelsTest(cros_test_lib.RunCommandTempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001600 """Tests for get_models."""
Michael Mortensen125bb012020-05-21 14:02:10 -06001601
Alex Klein1699fab2022-09-08 08:46:06 -06001602 def setUp(self):
1603 self.board = "test-board"
1604 self.rc.SetDefaultCmdResult(stdout="pyro\nreef\nsnappy\n")
1605 self.monkeypatch.setattr(constants, "SOURCE_ROOT", self.tempdir)
1606 build_bin = os.path.join(
1607 self.tempdir, constants.DEFAULT_CHROOT_DIR, "usr", "bin"
1608 )
1609 osutils.Touch(
1610 os.path.join(build_bin, "cros_config_host"), makedirs=True
1611 )
Michael Mortensen125bb012020-05-21 14:02:10 -06001612
Alex Klein1699fab2022-09-08 08:46:06 -06001613 def testGetModels(self):
1614 """Test get_models."""
1615 build_target = build_target_lib.BuildTarget(self.board)
1616 result = packages.get_models(build_target)
1617 self.assertEqual(result, ["pyro", "reef", "snappy"])
Michael Mortensen359c1f32020-05-28 19:35:42 -06001618
1619
1620class GetKeyIdTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001621 """Tests for get_key_id."""
Michael Mortensen359c1f32020-05-28 19:35:42 -06001622
Alex Klein1699fab2022-09-08 08:46:06 -06001623 def setUp(self):
1624 self.board = "test-board"
1625 self.build_target = build_target_lib.BuildTarget(self.board)
Michael Mortensen359c1f32020-05-28 19:35:42 -06001626
Alex Klein1699fab2022-09-08 08:46:06 -06001627 def testGetKeyId(self):
1628 """Test get_key_id when _run_cros_config_host returns a key."""
1629 self.PatchObject(
1630 packages, "_run_cros_config_host", return_value=["key"]
1631 )
1632 result = packages.get_key_id(self.build_target, "model")
1633 self.assertEqual(result, "key")
Michael Mortensen359c1f32020-05-28 19:35:42 -06001634
Alex Klein1699fab2022-09-08 08:46:06 -06001635 def testGetKeyIdNoKey(self):
1636 """Test get_key_id when None should be returned."""
1637 self.PatchObject(
1638 packages, "_run_cros_config_host", return_value=["key1", "key2"]
1639 )
1640 result = packages.get_key_id(self.build_target, "model")
1641 self.assertEqual(result, None)
Ben Reiche779cf42020-12-15 03:21:31 +00001642
1643
Harvey Yang3eee06c2021-03-18 15:47:56 +08001644class GetLatestVersionTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001645 """Tests for get_latest_version_from_refs."""
Ben Reiche779cf42020-12-15 03:21:31 +00001646
Alex Klein1699fab2022-09-08 08:46:06 -06001647 def setUp(self):
1648 self.prefix = "refs/tags/drivefs_"
1649 # The tag ref template.
1650 ref_tpl = self.prefix + "%s"
Ben Reiche779cf42020-12-15 03:21:31 +00001651
Alex Klein1699fab2022-09-08 08:46:06 -06001652 self.latest = "44.0.20"
1653 self.versions = ["42.0.1", self.latest, "44.0.19", "39.0.15"]
1654 self.latest_ref = uprev_lib.GitRef(
1655 "/path", ref_tpl % self.latest, "abc123"
1656 )
1657 self.refs = [
1658 uprev_lib.GitRef("/path", ref_tpl % v, "abc123")
1659 for v in self.versions
1660 ]
Ben Reiche779cf42020-12-15 03:21:31 +00001661
Alex Klein1699fab2022-09-08 08:46:06 -06001662 def test_single_ref(self):
1663 """Test a single ref is supplied."""
1664 # pylint: disable=protected-access
1665 self.assertEqual(
1666 self.latest,
1667 packages._get_latest_version_from_refs(
1668 self.prefix, [self.latest_ref]
1669 ),
1670 )
Ben Reiche779cf42020-12-15 03:21:31 +00001671
Alex Klein1699fab2022-09-08 08:46:06 -06001672 def test_multiple_ref_versions(self):
1673 """Test multiple refs supplied."""
1674 # pylint: disable=protected-access
1675 self.assertEqual(
1676 self.latest,
1677 packages._get_latest_version_from_refs(self.prefix, self.refs),
1678 )
Ben Reiche779cf42020-12-15 03:21:31 +00001679
Alex Klein1699fab2022-09-08 08:46:06 -06001680 def test_no_refs_returns_none(self):
1681 """Test no refs supplied."""
1682 # pylint: disable=protected-access
1683 self.assertEqual(
1684 packages._get_latest_version_from_refs(self.prefix, []), None
1685 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001686
Chinglin Yu84818732022-10-03 12:03:43 +08001687 def test_ref_prefix(self):
1688 """Test refs with a different prefix isn't used"""
1689 # pylint: disable=protected-access
1690 # Add refs/tags/foo_100.0.0 to the refs, which should be ignored in
1691 # _get_latest_version_from_refs because the prefix doesn't match, even
1692 # if its version number is larger.
1693 refs = self.refs + [
1694 uprev_lib.GitRef("/path", "refs/tags/foo_100.0.0", "abc123")
1695 ]
1696 self.assertEqual(
1697 self.latest,
1698 packages._get_latest_version_from_refs(self.prefix, refs),
1699 )
1700
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001701
Alex Klein6becabc2020-09-11 14:03:05 -06001702class NeedsChromeSourceTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001703 """Tests for needs_chrome_source."""
Alex Klein6becabc2020-09-11 14:03:05 -06001704
Alex Klein1699fab2022-09-08 08:46:06 -06001705 def _build_graph(self, with_chrome: bool, with_followers: bool):
1706 root = "/build/build_target"
1707 foo_bar = package_info.parse("foo/bar-1")
1708 chrome = package_info.parse(f"{constants.CHROME_CP}-1.2.3.4")
1709 followers = [
1710 package_info.parse(f"{pkg}-1.2.3.4")
1711 for pkg in constants.OTHER_CHROME_PACKAGES
1712 ]
1713 nodes = [dependency_graph.PackageNode(foo_bar, root)]
1714 root_pkgs = ["foo/bar-1"]
1715 if with_chrome:
1716 nodes.append(dependency_graph.PackageNode(chrome, root))
1717 root_pkgs.append(chrome.cpvr)
1718 if with_followers:
1719 nodes.extend(
1720 [dependency_graph.PackageNode(f, root) for f in followers]
1721 )
1722 root_pkgs.extend([f.cpvr for f in followers])
Alex Klein6becabc2020-09-11 14:03:05 -06001723
Alex Klein1699fab2022-09-08 08:46:06 -06001724 return dependency_graph.DependencyGraph(nodes, root, root_pkgs)
Alex Klein6becabc2020-09-11 14:03:05 -06001725
Alex Klein1699fab2022-09-08 08:46:06 -06001726 def test_needs_all(self):
1727 """Verify we need source when we have no prebuilts."""
1728 graph = self._build_graph(with_chrome=True, with_followers=True)
1729 self.PatchObject(
1730 depgraph, "get_sysroot_dependency_graph", return_value=graph
1731 )
1732 self.PatchObject(packages, "has_prebuilt", return_value=False)
1733 self.PatchObject(
1734 packages,
1735 "uprev_chrome",
1736 return_value=uprev_lib.UprevVersionedPackageResult(),
1737 )
Alex Klein6becabc2020-09-11 14:03:05 -06001738
Alex Klein1699fab2022-09-08 08:46:06 -06001739 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001740
Alex Klein1699fab2022-09-08 08:46:06 -06001741 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001742
Alex Klein1699fab2022-09-08 08:46:06 -06001743 self.assertTrue(result.needs_chrome_source)
1744 self.assertTrue(result.builds_chrome)
1745 self.assertTrue(result.packages)
1746 self.assertEqual(
1747 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1748 )
1749 self.assertTrue(result.missing_chrome_prebuilt)
1750 self.assertTrue(result.missing_follower_prebuilt)
1751 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001752
Alex Klein1699fab2022-09-08 08:46:06 -06001753 def test_needs_none(self):
1754 """Verify not building any of the chrome packages prevents needing it."""
1755 graph = self._build_graph(with_chrome=False, with_followers=False)
1756 self.PatchObject(
1757 depgraph, "get_sysroot_dependency_graph", return_value=graph
1758 )
1759 self.PatchObject(packages, "has_prebuilt", return_value=False)
1760 self.PatchObject(
1761 packages,
1762 "uprev_chrome",
1763 return_value=uprev_lib.UprevVersionedPackageResult(),
1764 )
Alex Klein6becabc2020-09-11 14:03:05 -06001765
Alex Klein1699fab2022-09-08 08:46:06 -06001766 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001767
Alex Klein1699fab2022-09-08 08:46:06 -06001768 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001769
Alex Klein1699fab2022-09-08 08:46:06 -06001770 self.assertFalse(result.needs_chrome_source)
1771 self.assertFalse(result.builds_chrome)
1772 self.assertFalse(result.packages)
1773 self.assertFalse(result.missing_chrome_prebuilt)
1774 self.assertFalse(result.missing_follower_prebuilt)
1775 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001776
Alex Klein1699fab2022-09-08 08:46:06 -06001777 def test_needs_chrome_only(self):
1778 """Verify only chrome triggers needs chrome source."""
1779 graph = self._build_graph(with_chrome=True, with_followers=False)
1780 self.PatchObject(
1781 depgraph, "get_sysroot_dependency_graph", return_value=graph
1782 )
1783 self.PatchObject(packages, "has_prebuilt", return_value=False)
1784 self.PatchObject(
1785 packages,
1786 "uprev_chrome",
1787 return_value=uprev_lib.UprevVersionedPackageResult(),
1788 )
Alex Klein6becabc2020-09-11 14:03:05 -06001789
Alex Klein1699fab2022-09-08 08:46:06 -06001790 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001791
Alex Klein1699fab2022-09-08 08:46:06 -06001792 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001793
Alex Klein1699fab2022-09-08 08:46:06 -06001794 self.assertTrue(result.needs_chrome_source)
1795 self.assertTrue(result.builds_chrome)
1796 self.assertTrue(result.packages)
1797 self.assertEqual(
1798 set([p.atom for p in result.packages]), {constants.CHROME_CP}
1799 )
1800 self.assertTrue(result.missing_chrome_prebuilt)
1801 self.assertFalse(result.missing_follower_prebuilt)
1802 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001803
Alex Klein1699fab2022-09-08 08:46:06 -06001804 def test_needs_followers_only(self):
1805 """Verify only chrome followers triggers needs chrome source."""
1806 graph = self._build_graph(with_chrome=False, with_followers=True)
1807 self.PatchObject(
1808 depgraph, "get_sysroot_dependency_graph", return_value=graph
1809 )
1810 self.PatchObject(packages, "has_prebuilt", return_value=False)
1811 self.PatchObject(
1812 packages,
1813 "uprev_chrome",
1814 return_value=uprev_lib.UprevVersionedPackageResult(),
1815 )
Alex Klein6becabc2020-09-11 14:03:05 -06001816
Alex Klein1699fab2022-09-08 08:46:06 -06001817 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001818
Alex Klein1699fab2022-09-08 08:46:06 -06001819 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001820
Alex Klein1699fab2022-09-08 08:46:06 -06001821 self.assertTrue(result.needs_chrome_source)
1822 self.assertFalse(result.builds_chrome)
1823 self.assertTrue(result.packages)
1824 self.assertEqual(
1825 set([p.atom for p in result.packages]),
1826 set(constants.OTHER_CHROME_PACKAGES),
1827 )
1828 self.assertFalse(result.missing_chrome_prebuilt)
1829 self.assertTrue(result.missing_follower_prebuilt)
1830 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001831
Alex Klein1699fab2022-09-08 08:46:06 -06001832 def test_has_prebuilts(self):
1833 """Test prebuilts prevent us from needing chrome source."""
1834 graph = self._build_graph(with_chrome=True, with_followers=True)
1835 self.PatchObject(
1836 depgraph, "get_sysroot_dependency_graph", return_value=graph
1837 )
1838 self.PatchObject(packages, "has_prebuilt", return_value=True)
1839 self.PatchObject(
1840 packages,
1841 "uprev_chrome",
1842 return_value=uprev_lib.UprevVersionedPackageResult(),
1843 )
Alex Klein6becabc2020-09-11 14:03:05 -06001844
Alex Klein1699fab2022-09-08 08:46:06 -06001845 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001846
Alex Klein1699fab2022-09-08 08:46:06 -06001847 result = packages.needs_chrome_source(build_target)
Alex Klein6becabc2020-09-11 14:03:05 -06001848
Alex Klein1699fab2022-09-08 08:46:06 -06001849 self.assertFalse(result.needs_chrome_source)
1850 self.assertTrue(result.builds_chrome)
1851 self.assertFalse(result.packages)
1852 self.assertFalse(result.missing_chrome_prebuilt)
1853 self.assertFalse(result.missing_follower_prebuilt)
1854 self.assertFalse(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001855
Alex Klein1699fab2022-09-08 08:46:06 -06001856 def test_compile_source(self):
1857 """Test compile source ignores prebuilts."""
1858 graph = self._build_graph(with_chrome=True, with_followers=True)
1859 self.PatchObject(
1860 depgraph, "get_sysroot_dependency_graph", return_value=graph
1861 )
1862 self.PatchObject(packages, "has_prebuilt", return_value=True)
1863 self.PatchObject(
1864 packages,
1865 "uprev_chrome",
1866 return_value=uprev_lib.UprevVersionedPackageResult(),
1867 )
Alex Klein6becabc2020-09-11 14:03:05 -06001868
Alex Klein1699fab2022-09-08 08:46:06 -06001869 build_target = build_target_lib.BuildTarget("build_target")
Alex Klein6becabc2020-09-11 14:03:05 -06001870
Alex Klein1699fab2022-09-08 08:46:06 -06001871 result = packages.needs_chrome_source(build_target, compile_source=True)
Alex Klein6becabc2020-09-11 14:03:05 -06001872
Alex Klein1699fab2022-09-08 08:46:06 -06001873 self.assertTrue(result.needs_chrome_source)
1874 self.assertTrue(result.builds_chrome)
1875 self.assertTrue(result.packages)
1876 self.assertEqual(
1877 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1878 )
1879 self.assertTrue(result.missing_chrome_prebuilt)
1880 self.assertTrue(result.missing_follower_prebuilt)
1881 self.assertFalse(result.local_uprev)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001882
Alex Klein1699fab2022-09-08 08:46:06 -06001883 def test_local_uprev(self):
1884 """Test compile source ignores prebuilts."""
1885 graph = self._build_graph(with_chrome=True, with_followers=True)
1886 self.PatchObject(
1887 depgraph, "get_sysroot_dependency_graph", return_value=graph
1888 )
1889 self.PatchObject(packages, "has_prebuilt", return_value=False)
Alex Klein75110572021-07-14 10:44:39 -06001890
Alex Klein1699fab2022-09-08 08:46:06 -06001891 uprev_result = uprev_lib.UprevVersionedPackageResult()
1892 uprev_result.add_result("1.2.3.4", ["/tmp/foo"])
1893 self.PatchObject(packages, "uprev_chrome", return_value=uprev_result)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001894
Alex Klein1699fab2022-09-08 08:46:06 -06001895 build_target = build_target_lib.BuildTarget("build_target")
Alex Kleinde7b76d2021-07-12 12:28:44 -06001896
Alex Klein1699fab2022-09-08 08:46:06 -06001897 result = packages.needs_chrome_source(build_target, compile_source=True)
Alex Kleinde7b76d2021-07-12 12:28:44 -06001898
Alex Klein1699fab2022-09-08 08:46:06 -06001899 self.assertTrue(result.needs_chrome_source)
1900 self.assertTrue(result.builds_chrome)
1901 self.assertTrue(result.packages)
1902 self.assertEqual(
1903 len(result.packages), len(constants.OTHER_CHROME_PACKAGES) + 1
1904 )
1905 self.assertTrue(result.missing_chrome_prebuilt)
1906 self.assertTrue(result.missing_follower_prebuilt)
1907 self.assertTrue(result.local_uprev)
Alex Klein6becabc2020-09-11 14:03:05 -06001908
1909
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001910class UprevDrivefsTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06001911 """Tests for uprev_drivefs."""
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001912
Alex Klein1699fab2022-09-08 08:46:06 -06001913 def setUp(self):
1914 self.refs = [
1915 GitRef(
1916 path="/chromeos/platform/drivefs-google3/",
1917 ref="refs/tags/drivefs_45.0.2",
1918 revision="123",
1919 )
1920 ]
1921 self.MOCK_DRIVEFS_EBUILD_PATH = "drivefs.45.0.2-r1.ebuild"
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001922
Alex Klein1699fab2022-09-08 08:46:06 -06001923 def revisionBumpOutcome(self, ebuild_path):
1924 return uprev_lib.UprevResult(
1925 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
1926 )
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001927
Alex Klein1699fab2022-09-08 08:46:06 -06001928 def majorBumpOutcome(self, ebuild_path):
1929 return uprev_lib.UprevResult(
1930 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
1931 )
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001932
Alex Klein1699fab2022-09-08 08:46:06 -06001933 def sameVersionOutcome(self):
1934 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001935
Alex Klein1699fab2022-09-08 08:46:06 -06001936 def test_latest_version_returns_none(self):
1937 """Test no refs were supplied"""
1938 output = packages.uprev_drivefs(None, [], None)
1939 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001940
Alex Klein1699fab2022-09-08 08:46:06 -06001941 def test_drivefs_uprev_fails(self):
1942 """Test a single ref is supplied."""
1943 self.PatchObject(
1944 uprev_lib,
1945 "uprev_workon_ebuild_to_version",
1946 side_effect=[None, None],
1947 )
1948 output = packages.uprev_drivefs(None, self.refs, None)
1949 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001950
Alex Klein1699fab2022-09-08 08:46:06 -06001951 def test_same_version_exists(self):
1952 """Test the same version exists uprev should not happen."""
1953 drivefs_outcome = self.sameVersionOutcome()
1954 self.PatchObject(
1955 uprev_lib,
1956 "uprev_workon_ebuild_to_version",
1957 side_effect=[drivefs_outcome],
1958 )
1959 output = packages.uprev_drivefs(None, self.refs, None)
1960 self.assertFalse(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001961
Alex Klein1699fab2022-09-08 08:46:06 -06001962 def test_revision_bump_both_packages(self):
1963 """Test both packages uprev, should succeed."""
1964 drivefs_outcome = self.revisionBumpOutcome(
1965 self.MOCK_DRIVEFS_EBUILD_PATH
1966 )
1967 self.PatchObject(
1968 uprev_lib,
1969 "uprev_workon_ebuild_to_version",
1970 side_effect=[drivefs_outcome],
1971 )
1972 output = packages.uprev_drivefs(None, self.refs, None)
1973 self.assertTrue(output.uprevved)
Ben Reich4f3fa1b2020-12-19 08:21:26 +00001974
Alex Klein1699fab2022-09-08 08:46:06 -06001975 def test_major_bump_both_packages(self):
1976 """Test both packages uprev, should succeed."""
1977 drivefs_outcome = self.majorBumpOutcome(self.MOCK_DRIVEFS_EBUILD_PATH)
1978 self.PatchObject(
1979 uprev_lib,
1980 "uprev_workon_ebuild_to_version",
1981 side_effect=[drivefs_outcome],
1982 )
1983 output = packages.uprev_drivefs(None, self.refs, None)
1984 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08001985
1986
Denis Nikitin63613e32022-09-09 22:26:50 -07001987class UprevKernelAfdo(cros_test_lib.RunCommandTempDirTestCase):
1988 """Tests for uprev_kernel_afdo."""
1989
1990 def setUp(self):
1991 # patch_ebuild_vars is tested separately.
1992 self.mock_patch = self.PatchObject(packages, "patch_ebuild_vars")
Denis Nikitin88ad5132022-09-28 12:10:01 -07001993 self.PatchObject(constants, "SOURCE_ROOT", new=self.tempdir)
Denis Nikitin63613e32022-09-09 22:26:50 -07001994 self.metadata_dir = os.path.join(
Denis Nikitin63613e32022-09-09 22:26:50 -07001995 "src",
1996 "third_party",
1997 "toolchain-utils",
1998 "afdo_metadata",
1999 )
Denis Nikitin88ad5132022-09-28 12:10:01 -07002000 osutils.SafeMakedirs(os.path.join(self.tempdir, self.metadata_dir))
Denis Nikitin63613e32022-09-09 22:26:50 -07002001
2002 def test_uprev_kernel_afdo_version(self):
2003 """Test kernel afdo version uprev."""
2004 json_files = {
2005 "kernel_afdo.json": (
2006 "{\n"
2007 ' "chromeos-kernel-5_4": {\n'
2008 ' "name": "R106-12345.0-0123456789"\n'
2009 " }\n"
2010 "}"
2011 ),
2012 "kernel_arm_afdo.json": (
2013 "{\n"
2014 ' "chromeos-kernel-5_15": {\n'
2015 ' "name": "R107-67890.0-0123456789"\n'
2016 " }\n"
2017 "}"
2018 ),
2019 }
2020 for f, contents in json_files.items():
2021 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2022
2023 returned_output = packages.uprev_kernel_afdo()
2024
Denis Nikitin88ad5132022-09-28 12:10:01 -07002025 package_root = os.path.join(
2026 constants.SOURCE_ROOT,
2027 constants.CHROMIUMOS_OVERLAY_DIR,
2028 "sys-kernel",
Denis Nikitin63613e32022-09-09 22:26:50 -07002029 )
2030 expect_result = [
2031 uprev_lib.UprevVersionedPackageModifications(
2032 new_version="R106-12345.0-0123456789",
2033 files=[
2034 os.path.join(
2035 package_root,
2036 "chromeos-kernel-5_4",
2037 "chromeos-kernel-5_4-9999.ebuild",
2038 ),
2039 os.path.join(
2040 package_root, "chromeos-kernel-5_4", "Manifest"
2041 ),
2042 ],
2043 ),
2044 uprev_lib.UprevVersionedPackageModifications(
2045 new_version="R107-67890.0-0123456789",
2046 files=[
2047 os.path.join(
2048 package_root,
2049 "chromeos-kernel-5_15",
2050 "chromeos-kernel-5_15-9999.ebuild",
2051 ),
2052 os.path.join(
2053 package_root, "chromeos-kernel-5_15", "Manifest"
2054 ),
2055 ],
2056 ),
2057 ]
2058 self.assertTrue(returned_output.uprevved)
2059 self.assertEqual(returned_output.modified, expect_result)
2060
2061 def test_uprev_kernel_afdo_empty_json(self):
2062 """Test kernel afdo version unchanged."""
2063 json_files = {
2064 "kernel_afdo.json": "{}",
2065 "kernel_arm_afdo.json": "{}",
2066 }
2067 for f, contents in json_files.items():
2068 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2069
2070 returned_output = packages.uprev_kernel_afdo()
2071 self.assertFalse(returned_output.uprevved)
2072
2073 def test_uprev_kernel_afdo_empty_file(self):
2074 """Test malformed json raises."""
2075 json_files = {
2076 "kernel_afdo.json": "",
2077 "kernel_arm_afdo.json": "",
2078 }
2079 for f, contents in json_files.items():
2080 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2081
2082 with self.assertRaisesRegex(
2083 json.decoder.JSONDecodeError, "Expecting value"
2084 ):
2085 packages.uprev_kernel_afdo()
2086
2087 def test_uprev_kernel_afdo_manifest_raises(self):
2088 """Test manifest update raises."""
2089 json_files = {
2090 "kernel_afdo.json": (
2091 "{\n"
2092 ' "chromeos-kernel-5_4": {\n'
2093 ' "name": "R106-12345.0-0123456789"\n'
2094 " }\n"
2095 "}"
2096 ),
2097 }
2098 for f, contents in json_files.items():
2099 self.WriteTempFile(os.path.join(self.metadata_dir, f), contents)
2100 # run() raises exception.
2101 self.rc.SetDefaultCmdResult(
2102 side_effect=cros_build_lib.RunCommandError("error")
2103 )
2104
2105 with self.assertRaises(uprev_lib.EbuildManifestError):
2106 packages.uprev_kernel_afdo()
2107
2108
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002109# TODO(chenghaoyang): Shouldn't use uprev_workon_ebuild_to_version.
2110class UprevPerfettoTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002111 """Tests for uprev_perfetto."""
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002112
Alex Klein1699fab2022-09-08 08:46:06 -06002113 def setUp(self):
2114 self.refs = [GitRef(path="/foo", ref="refs/tags/v12.0", revision="123")]
2115 self.MOCK_PERFETTO_EBUILD_PATH = "perfetto-12.0-r1.ebuild"
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002116
Alex Klein1699fab2022-09-08 08:46:06 -06002117 def revisionBumpOutcome(self, ebuild_path):
2118 return uprev_lib.UprevResult(
2119 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2120 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002121
Alex Klein1699fab2022-09-08 08:46:06 -06002122 def majorBumpOutcome(self, ebuild_path):
2123 return uprev_lib.UprevResult(
2124 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2125 )
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002126
Alex Klein1699fab2022-09-08 08:46:06 -06002127 def newerVersionOutcome(self):
2128 return uprev_lib.UprevResult(uprev_lib.Outcome.NEWER_VERSION_EXISTS)
Harvey Yang3eee06c2021-03-18 15:47:56 +08002129
Alex Klein1699fab2022-09-08 08:46:06 -06002130 def sameVersionOutcome(self):
2131 return uprev_lib.UprevResult(uprev_lib.Outcome.SAME_VERSION_EXISTS)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002132
Alex Klein1699fab2022-09-08 08:46:06 -06002133 def test_latest_version_returns_none(self):
2134 """Test no refs were supplied"""
2135 output = packages.uprev_perfetto(None, [], None)
2136 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002137
Alex Klein1699fab2022-09-08 08:46:06 -06002138 def test_perfetto_uprev_fails(self):
2139 """Test a single ref is supplied."""
2140 self.PatchObject(
2141 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2142 )
2143 output = packages.uprev_perfetto(None, self.refs, None)
2144 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002145
Alex Klein1699fab2022-09-08 08:46:06 -06002146 def test_newer_version_exists(self):
2147 """Test the newer version exists uprev should not happen."""
2148 perfetto_outcome = self.newerVersionOutcome()
2149 self.PatchObject(
2150 uprev_lib,
2151 "uprev_workon_ebuild_to_version",
2152 side_effect=[perfetto_outcome],
2153 )
2154 output = packages.uprev_perfetto(None, self.refs, None)
2155 self.assertFalse(output.uprevved)
Harvey Yang3eee06c2021-03-18 15:47:56 +08002156
Alex Klein1699fab2022-09-08 08:46:06 -06002157 def test_same_version_exists(self):
2158 """Test the same version exists uprev should not happen."""
2159 perfetto_outcome = self.sameVersionOutcome()
2160 self.PatchObject(
2161 uprev_lib,
2162 "uprev_workon_ebuild_to_version",
2163 side_effect=[perfetto_outcome],
2164 )
2165 output = packages.uprev_perfetto(None, self.refs, None)
2166 self.assertFalse(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002167
Alex Klein1699fab2022-09-08 08:46:06 -06002168 def test_revision_bump_perfetto_package(self):
2169 """Test perfetto package uprev."""
2170 perfetto_outcome = self.revisionBumpOutcome(
2171 self.MOCK_PERFETTO_EBUILD_PATH
2172 )
2173 self.PatchObject(
2174 uprev_lib,
2175 "uprev_workon_ebuild_to_version",
2176 side_effect=[perfetto_outcome],
2177 )
2178 output = packages.uprev_perfetto(None, self.refs, None)
2179 self.assertTrue(output.uprevved)
Harvey Yang9c61e9c2021-03-02 16:32:43 +08002180
Alex Klein1699fab2022-09-08 08:46:06 -06002181 def test_major_bump_perfetto_package(self):
2182 """Test perfetto package uprev."""
2183 perfetto_outcome = self.majorBumpOutcome(self.MOCK_PERFETTO_EBUILD_PATH)
2184 self.PatchObject(
2185 uprev_lib,
2186 "uprev_workon_ebuild_to_version",
2187 side_effect=[perfetto_outcome],
2188 )
2189 output = packages.uprev_perfetto(None, self.refs, None)
2190 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002191
Chinglin Yuad12a512022-10-07 17:26:12 +08002192 def test_revision_bump_trunk(self):
2193 """Test revision bump on receiving non-versioned trunk refs."""
2194 refs = [GitRef(path="/foo", ref="refs/heads/main", revision="123")]
2195 perfetto_outcome = self.revisionBumpOutcome(
2196 self.MOCK_PERFETTO_EBUILD_PATH
2197 )
2198 self.PatchObject(
2199 uprev_lib, "get_stable_ebuild_version", return_value="12.0"
2200 )
2201 self.PatchObject(
2202 uprev_lib,
2203 "uprev_workon_ebuild_to_version",
2204 side_effect=[perfetto_outcome],
2205 )
2206 output = packages.uprev_perfetto(None, refs, None)
2207 self.assertTrue(output.uprevved)
2208
Alex Klein627e04c2021-11-10 15:56:47 -07002209
Julio Hurtadof1befec2021-05-05 21:34:26 +00002210class UprevLacrosTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002211 """Tests for uprev_lacros"""
Julio Hurtadof1befec2021-05-05 21:34:26 +00002212
Alex Klein1699fab2022-09-08 08:46:06 -06002213 def setUp(self):
2214 self.refs = [
2215 GitRef(
2216 path="/lacros", ref="refs/heads/main", revision="123.456.789.0"
2217 )
2218 ]
2219 self.MOCK_LACROS_EBUILD_PATH = "chromeos-lacros-123.456.789.0-r1.ebuild"
Julio Hurtadof1befec2021-05-05 21:34:26 +00002220
Alex Klein1699fab2022-09-08 08:46:06 -06002221 def revisionBumpOutcome(self, ebuild_path):
2222 return uprev_lib.UprevResult(
2223 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2224 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002225
Alex Klein1699fab2022-09-08 08:46:06 -06002226 def majorBumpOutcome(self, ebuild_path):
2227 return uprev_lib.UprevResult(
2228 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2229 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002230
Alex Klein1699fab2022-09-08 08:46:06 -06002231 def newerVersionOutcome(self, ebuild_path):
2232 return uprev_lib.UprevResult(
2233 uprev_lib.Outcome.NEWER_VERSION_EXISTS, [ebuild_path]
2234 )
Julio Hurtadoa994e002021-07-07 17:57:45 +00002235
Alex Klein1699fab2022-09-08 08:46:06 -06002236 def sameVersionOutcome(self, ebuild_path):
2237 return uprev_lib.UprevResult(
2238 uprev_lib.Outcome.SAME_VERSION_EXISTS, [ebuild_path]
2239 )
Julio Hurtadoa994e002021-07-07 17:57:45 +00002240
Alex Klein1699fab2022-09-08 08:46:06 -06002241 def newEbuildCreatedOutcome(self, ebuild_path):
2242 return uprev_lib.UprevResult(
2243 uprev_lib.Outcome.NEW_EBUILD_CREATED, [ebuild_path]
2244 )
Julio Hurtadof1befec2021-05-05 21:34:26 +00002245
Alex Klein1699fab2022-09-08 08:46:06 -06002246 def test_lacros_uprev_fails(self):
2247 """Test a lacros package uprev with no triggers"""
2248 self.PatchObject(
2249 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2250 )
2251 with self.assertRaises(IndexError):
2252 packages.uprev_lacros(None, [], None)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002253
Alex Klein1699fab2022-09-08 08:46:06 -06002254 def test_lacros_uprev_revision_bump(self):
2255 """Test lacros package uprev."""
2256 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2257 self.PatchObject(
2258 uprev_lib,
2259 "uprev_workon_ebuild_to_version",
2260 side_effect=[lacros_outcome],
2261 )
2262 output = packages.uprev_lacros(None, self.refs, None)
2263 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002264
Alex Klein1699fab2022-09-08 08:46:06 -06002265 def test_lacros_uprev_version_bump(self):
2266 """Test lacros package uprev."""
2267 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2268 self.PatchObject(
2269 uprev_lib,
2270 "uprev_workon_ebuild_to_version",
2271 side_effect=[lacros_outcome],
2272 )
2273 output = packages.uprev_lacros(None, self.refs, None)
2274 self.assertTrue(output.uprevved)
Julio Hurtadof1befec2021-05-05 21:34:26 +00002275
Alex Klein1699fab2022-09-08 08:46:06 -06002276 def test_lacros_uprev_new_ebuild_created(self):
2277 """Test lacros package uprev."""
2278 lacros_outcome = self.newEbuildCreatedOutcome(
2279 self.MOCK_LACROS_EBUILD_PATH
2280 )
2281 self.PatchObject(
2282 uprev_lib,
2283 "uprev_workon_ebuild_to_version",
2284 side_effect=[lacros_outcome],
2285 )
2286 output = packages.uprev_lacros(None, self.refs, None)
2287 self.assertTrue(output.uprevved)
Julio Hurtadoa994e002021-07-07 17:57:45 +00002288
Alex Klein1699fab2022-09-08 08:46:06 -06002289 def test_lacros_uprev_newer_version_exist(self):
2290 """Test the newer version exists uprev should not happen."""
2291 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2292 self.PatchObject(
2293 uprev_lib,
2294 "uprev_workon_ebuild_to_version",
2295 side_effect=[lacros_outcome],
2296 )
2297 output = packages.uprev_lacros(None, self.refs, None)
2298 self.assertFalse(output.uprevved)
Julio Hurtadoa994e002021-07-07 17:57:45 +00002299
Alex Klein1699fab2022-09-08 08:46:06 -06002300 def test_lacros_uprev_same_version_exist(self):
2301 """Test the same version exists uprev should not happen."""
2302 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2303 self.PatchObject(
2304 uprev_lib,
2305 "uprev_workon_ebuild_to_version",
2306 side_effect=[lacros_outcome],
2307 )
2308 output = packages.uprev_lacros(None, self.refs, None)
2309 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002310
2311
2312class UprevLacrosInParallelTest(cros_test_lib.MockTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -06002313 """Tests for uprev_lacros"""
Julio Hurtado870ed322021-12-03 18:22:40 +00002314
Alex Klein1699fab2022-09-08 08:46:06 -06002315 def setUp(self):
2316 self.refs = [
2317 GitRef(
2318 path="/lacros", revision="abc123", ref="refs/tags/123.456.789.0"
2319 )
2320 ]
2321 self.MOCK_LACROS_EBUILD_PATH = "chromeos-lacros-123.456.789.0-r1.ebuild"
Julio Hurtado870ed322021-12-03 18:22:40 +00002322
Alex Klein1699fab2022-09-08 08:46:06 -06002323 def revisionBumpOutcome(self, ebuild_path):
2324 return uprev_lib.UprevResult(
2325 uprev_lib.Outcome.REVISION_BUMP, [ebuild_path]
2326 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002327
Alex Klein1699fab2022-09-08 08:46:06 -06002328 def majorBumpOutcome(self, ebuild_path):
2329 return uprev_lib.UprevResult(
2330 uprev_lib.Outcome.VERSION_BUMP, [ebuild_path]
2331 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002332
Alex Klein1699fab2022-09-08 08:46:06 -06002333 def newerVersionOutcome(self, ebuild_path):
2334 return uprev_lib.UprevResult(
2335 uprev_lib.Outcome.NEWER_VERSION_EXISTS, [ebuild_path]
2336 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002337
Alex Klein1699fab2022-09-08 08:46:06 -06002338 def sameVersionOutcome(self, ebuild_path):
2339 return uprev_lib.UprevResult(
2340 uprev_lib.Outcome.SAME_VERSION_EXISTS, [ebuild_path]
2341 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002342
Alex Klein1699fab2022-09-08 08:46:06 -06002343 def newEbuildCreatedOutcome(self, ebuild_path):
2344 return uprev_lib.UprevResult(
2345 uprev_lib.Outcome.NEW_EBUILD_CREATED, [ebuild_path]
2346 )
Julio Hurtado870ed322021-12-03 18:22:40 +00002347
Alex Klein1699fab2022-09-08 08:46:06 -06002348 def test_lacros_uprev_fails(self):
2349 """Test a lacros package uprev with no triggers"""
2350 self.PatchObject(
2351 uprev_lib, "uprev_workon_ebuild_to_version", side_effect=[None]
2352 )
Alex Klein314fb5d2022-10-24 14:56:31 -06002353 with self.assertRaises(uprev_lib.NoRefsError):
Alex Klein1699fab2022-09-08 08:46:06 -06002354 packages.uprev_lacros_in_parallel(None, [], None)
Julio Hurtado870ed322021-12-03 18:22:40 +00002355
Alex Klein1699fab2022-09-08 08:46:06 -06002356 def test_lacros_uprev_revision_bump(self):
2357 """Test lacros package uprev."""
2358 lacros_outcome = self.revisionBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2359 self.PatchObject(
2360 uprev_lib,
2361 "uprev_workon_ebuild_to_version",
2362 side_effect=[lacros_outcome],
2363 )
2364 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2365 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002366
Alex Klein1699fab2022-09-08 08:46:06 -06002367 def test_lacros_uprev_version_bump(self):
2368 """Test lacros package uprev."""
2369 lacros_outcome = self.majorBumpOutcome(self.MOCK_LACROS_EBUILD_PATH)
2370 self.PatchObject(
2371 uprev_lib,
2372 "uprev_workon_ebuild_to_version",
2373 side_effect=[lacros_outcome],
2374 )
2375 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2376 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002377
Alex Klein1699fab2022-09-08 08:46:06 -06002378 def test_lacros_uprev_new_ebuild_created(self):
2379 """Test lacros package uprev."""
2380 lacros_outcome = self.newEbuildCreatedOutcome(
2381 self.MOCK_LACROS_EBUILD_PATH
2382 )
2383 self.PatchObject(
2384 uprev_lib,
2385 "uprev_workon_ebuild_to_version",
2386 side_effect=[lacros_outcome],
2387 )
2388 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2389 self.assertTrue(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002390
Alex Klein1699fab2022-09-08 08:46:06 -06002391 def test_lacros_uprev_newer_version_exist(self):
2392 """Test the newer version exists uprev should not happen."""
2393 lacros_outcome = self.newerVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2394 self.PatchObject(
2395 uprev_lib,
2396 "uprev_workon_ebuild_to_version",
2397 side_effect=[lacros_outcome],
2398 )
2399 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2400 self.assertFalse(output.uprevved)
Julio Hurtado870ed322021-12-03 18:22:40 +00002401
Alex Klein1699fab2022-09-08 08:46:06 -06002402 def test_lacros_uprev_same_version_exist(self):
2403 """Test the same version exists uprev should not happen."""
2404 lacros_outcome = self.sameVersionOutcome(self.MOCK_LACROS_EBUILD_PATH)
2405 self.PatchObject(
2406 uprev_lib,
2407 "uprev_workon_ebuild_to_version",
2408 side_effect=[lacros_outcome],
2409 )
2410 output = packages.uprev_lacros_in_parallel(None, self.refs, None)
2411 self.assertFalse(output.uprevved)