blob: 30a5f5096b7a45f41177a784fded31f78bc23113 [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 controller unit tests."""
6
Mike Frysinger166fea02021-02-12 05:30:33 -05007from unittest import mock
8
Alex Kleinda39c6d2019-09-16 14:36:36 -06009from chromite.api.api_config import ApiConfigMixin
David Burger0f9dd4e2019-10-08 12:33:42 -060010from chromite.api.controller import controller_util
Alex Kleineb77ffa2019-05-28 14:47:44 -060011from chromite.api.controller import packages as packages_controller
12from chromite.api.gen.chromite.api import binhost_pb2
13from chromite.api.gen.chromite.api import packages_pb2
Mike Frysinger1cc8f1f2022-04-28 22:40:40 -040014from chromite.api.gen.chromiumos import common_pb2
Chris McDonald38409112020-09-24 11:24:51 -060015from chromite.lib import build_target_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060016from chromite.lib import constants
17from chromite.lib import cros_build_lib
18from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060019from chromite.lib import portage_util
Chris McDonald38409112020-09-24 11:24:51 -060020from chromite.lib import uprev_lib
Alex Klein75df1792020-06-11 14:42:49 -060021from chromite.lib.parser import package_info
Alex Kleineb77ffa2019-05-28 14:47:44 -060022from chromite.service import packages as packages_service
23
24
Alex Kleinda39c6d2019-09-16 14:36:36 -060025class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -060026 """Uprev tests."""
Alex Kleineb77ffa2019-05-28 14:47:44 -060027
Alex Klein1699fab2022-09-08 08:46:06 -060028 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
29 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
30 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
31 _NONE = binhost_pb2.OVERLAYTYPE_NONE
Alex Kleineb77ffa2019-05-28 14:47:44 -060032
Alex Klein1699fab2022-09-08 08:46:06 -060033 def setUp(self):
34 self.uprev_patch = self.PatchObject(
35 packages_service, "uprev_build_targets"
36 )
37 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060038
Alex Klein1699fab2022-09-08 08:46:06 -060039 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
40 return packages_pb2.UprevPackagesRequest(
41 build_targets=[{"name": name} for name in targets or []],
42 overlay_type=overlay_type,
43 output_dir=output_dir,
44 )
Alex Kleineb77ffa2019-05-28 14:47:44 -060045
Alex Klein1699fab2022-09-08 08:46:06 -060046 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -070047 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -060048 patch = self.PatchObject(packages_service, "uprev_build_targets")
Alex Klein231d2da2019-07-22 16:44:45 -060049
Alex Klein1699fab2022-09-08 08:46:06 -060050 targets = ["foo", "bar"]
51 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
52 packages_controller.Uprev(
53 request, self.response, self.validate_only_config
54 )
55 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060056
Alex Klein1699fab2022-09-08 08:46:06 -060057 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -070058 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -060059 patch = self.PatchObject(packages_service, "uprev_build_targets")
60 targets = ["foo", "bar"]
61 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
62 packages_controller.Uprev(request, self.response, self.mock_call_config)
63 patch.assert_not_called()
64 self.assertTrue(self.response.modified_ebuilds)
Michael Mortensen2677bf62019-10-29 08:31:25 -060065
Alex Klein1699fab2022-09-08 08:46:06 -060066 def testNoOverlayTypeFails(self):
67 """No overlay type provided should fail."""
68 request = self._GetRequest(targets=["foo"])
Alex Kleineb77ffa2019-05-28 14:47:44 -060069
Alex Klein1699fab2022-09-08 08:46:06 -060070 with self.assertRaises(cros_build_lib.DieSystemExit):
71 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060072
Alex Klein1699fab2022-09-08 08:46:06 -060073 def testOverlayTypeNoneFails(self):
74 """Overlay type none means nothing here and should fail."""
75 request = self._GetRequest(targets=["foo"], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060076
Alex Klein1699fab2022-09-08 08:46:06 -060077 with self.assertRaises(cros_build_lib.DieSystemExit):
78 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060079
Alex Klein1699fab2022-09-08 08:46:06 -060080 def testSuccess(self):
81 """Test overall successful argument handling."""
82 targets = ["foo", "bar"]
83 output_dir = "/tmp/uprev_output_dir"
84 changed = ["/ebuild-1.0-r1.ebuild", "/ebuild-1.0-r2.ebuild"]
85 revved_packages = ["cat1/pkg1-1.11", "cat2/pkg2-1.12"]
86 expected_type = constants.BOTH_OVERLAYS
87 request = self._GetRequest(
88 targets=targets, overlay_type=self._BOTH, output_dir=output_dir
89 )
90 uprev_patch = self.PatchObject(
91 packages_service,
92 "uprev_build_targets",
93 return_value=(changed, revved_packages),
94 )
Alex Kleineb77ffa2019-05-28 14:47:44 -060095
Alex Klein1699fab2022-09-08 08:46:06 -060096 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060097
Alex Klein1699fab2022-09-08 08:46:06 -060098 # Make sure the type is right, verify build targets after.
99 uprev_patch.assert_called_once_with(
100 mock.ANY, expected_type, mock.ANY, output_dir
101 )
102 # First argument (build targets) of the first (only) call.
103 call_targets = uprev_patch.call_args[0][0]
104 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -0600105
Alex Klein1699fab2022-09-08 08:46:06 -0600106 for ebuild in self.response.modified_ebuilds:
107 self.assertIn(ebuild.path, changed)
108 changed.remove(ebuild.path)
109 self.assertFalse(changed)
Alex Klein5dd6b1e2019-07-31 15:45:24 -0600110
Alex Klein1699fab2022-09-08 08:46:06 -0600111 for pkg in self.response.packages:
112 self.assertTrue(pkg.category.startswith("cat"))
113 self.assertTrue(pkg.package_name.startswith("pkg"))
114 self.assertTrue(pkg.version.startswith("1.1"))
Dhanya Ganeshd03a4162021-08-25 00:21:50 +0000115
David Burger1e0fe232019-07-01 14:52:07 -0600116
Alex Kleinda39c6d2019-09-16 14:36:36 -0600117class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600118 """UprevVersionedPackage tests."""
Alex Klein87531182019-08-12 15:23:37 -0600119
Alex Klein1699fab2022-09-08 08:46:06 -0600120 def setUp(self):
121 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600122
Alex Klein1699fab2022-09-08 08:46:06 -0600123 def _addVersion(self, request, version):
124 """Helper method to add a full version message to the request."""
125 ref = request.versions.add()
126 ref.repository = "/some/path"
127 ref.ref = "refs/tags/%s" % version
128 ref.revision = "abc123"
Alex Klein87531182019-08-12 15:23:37 -0600129
Alex Klein1699fab2022-09-08 08:46:06 -0600130 def testValidateOnly(self):
131 """Sanity check validate only calls are working properly."""
132 service = self.PatchObject(packages_service, "uprev_versioned_package")
Alex Klein87531182019-08-12 15:23:37 -0600133
Alex Klein1699fab2022-09-08 08:46:06 -0600134 request = packages_pb2.UprevVersionedPackageRequest()
135 self._addVersion(request, "1.2.3.4")
136 request.package_info.category = "chromeos-base"
137 request.package_info.package_name = "chromeos-chrome"
Alex Klein87531182019-08-12 15:23:37 -0600138
Alex Klein1699fab2022-09-08 08:46:06 -0600139 packages_controller.UprevVersionedPackage(
140 request, self.response, self.validate_only_config
141 )
Alex Klein87531182019-08-12 15:23:37 -0600142
Alex Klein1699fab2022-09-08 08:46:06 -0600143 service.assert_not_called()
Alex Klein87531182019-08-12 15:23:37 -0600144
Alex Klein1699fab2022-09-08 08:46:06 -0600145 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700146 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600147 patch = self.PatchObject(packages_service, "uprev_versioned_package")
148 request = packages_pb2.UprevVersionedPackageRequest()
149 packages_controller.UprevVersionedPackage(
150 request, self.response, self.mock_call_config
151 )
152 patch.assert_not_called()
153 self.assertTrue(self.response.responses)
154 self.assertTrue(self.response.responses[0].modified_ebuilds)
Michael Mortensen2677bf62019-10-29 08:31:25 -0600155
Alex Klein1699fab2022-09-08 08:46:06 -0600156 def testNoVersions(self):
157 """Test no versions provided."""
158 request = packages_pb2.UprevVersionedPackageRequest()
159 request.package_info.category = "chromeos-base"
160 request.package_info.package_name = "chromeos-chrome"
Alex Klein87531182019-08-12 15:23:37 -0600161
Alex Klein1699fab2022-09-08 08:46:06 -0600162 with self.assertRaises(cros_build_lib.DieSystemExit):
163 packages_controller.UprevVersionedPackage(
164 request, self.response, self.api_config
165 )
Alex Klein87531182019-08-12 15:23:37 -0600166
Alex Klein1699fab2022-09-08 08:46:06 -0600167 def testNoPackageName(self):
168 """Test no package name provided."""
169 request = packages_pb2.UprevVersionedPackageRequest()
170 self._addVersion(request, "1.2.3.4")
171 request.package_info.category = "chromeos-base"
Alex Klein87531182019-08-12 15:23:37 -0600172
Alex Klein1699fab2022-09-08 08:46:06 -0600173 with self.assertRaises(cros_build_lib.DieSystemExit):
174 packages_controller.UprevVersionedPackage(
175 request, self.response, self.api_config
176 )
Alex Klein87531182019-08-12 15:23:37 -0600177
Alex Klein1699fab2022-09-08 08:46:06 -0600178 def testNoCategory(self):
179 """Test no package category provided."""
180 request = packages_pb2.UprevVersionedPackageRequest()
181 self._addVersion(request, "1.2.3.4")
182 request.package_info.package_name = "chromeos-chrome"
Alex Klein87531182019-08-12 15:23:37 -0600183
Alex Klein1699fab2022-09-08 08:46:06 -0600184 with self.assertRaises(cros_build_lib.DieSystemExit):
185 packages_controller.UprevVersionedPackage(
186 request, self.response, self.api_config
187 )
Alex Klein87531182019-08-12 15:23:37 -0600188
Alex Klein1699fab2022-09-08 08:46:06 -0600189 def testOutputHandling(self):
190 """Test the modified files are getting correctly added to the output."""
191 version = "1.2.3.4"
192 result = uprev_lib.UprevVersionedPackageResult().add_result(
193 version, ["/file/one", "/file/two"]
194 )
Yaakov Shaul730814a2019-09-10 13:58:25 -0600195
Alex Klein1699fab2022-09-08 08:46:06 -0600196 self.PatchObject(
197 packages_service, "uprev_versioned_package", return_value=result
198 )
Alex Klein87531182019-08-12 15:23:37 -0600199
Alex Klein1699fab2022-09-08 08:46:06 -0600200 request = packages_pb2.UprevVersionedPackageRequest()
201 self._addVersion(request, version)
202 request.package_info.category = "chromeos-base"
203 request.package_info.package_name = "chromeos-chrome"
Alex Klein87531182019-08-12 15:23:37 -0600204
Alex Klein1699fab2022-09-08 08:46:06 -0600205 packages_controller.UprevVersionedPackage(
206 request, self.response, self.api_config
207 )
Alex Klein87531182019-08-12 15:23:37 -0600208
Alex Klein1699fab2022-09-08 08:46:06 -0600209 for idx, uprev_response in enumerate(self.response.responses):
210 self.assertEqual(
211 result.modified[idx].new_version, uprev_response.version
212 )
213 self.assertCountEqual(
214 result.modified[idx].files,
215 [ebuild.path for ebuild in uprev_response.modified_ebuilds],
216 )
Alex Klein87531182019-08-12 15:23:37 -0600217
218
Alex Kleinda39c6d2019-09-16 14:36:36 -0600219class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600220 """GetBestVisible tests."""
David Burger1e0fe232019-07-01 14:52:07 -0600221
Alex Klein1699fab2022-09-08 08:46:06 -0600222 def setUp(self):
223 self.response = packages_pb2.GetBestVisibleResponse()
Alex Klein231d2da2019-07-22 16:44:45 -0600224
Alex Klein1699fab2022-09-08 08:46:06 -0600225 def _GetRequest(self, atom=None):
226 return packages_pb2.GetBestVisibleRequest(
227 atom=atom,
228 )
David Burger1e0fe232019-07-01 14:52:07 -0600229
Alex Klein1699fab2022-09-08 08:46:06 -0600230 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700231 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600232 patch = self.PatchObject(packages_service, "get_best_visible")
Alex Klein231d2da2019-07-22 16:44:45 -0600233
Alex Klein1699fab2022-09-08 08:46:06 -0600234 request = self._GetRequest(atom="chromeos-chrome")
235 packages_controller.GetBestVisible(
236 request, self.response, self.validate_only_config
237 )
238 patch.assert_not_called()
Alex Klein231d2da2019-07-22 16:44:45 -0600239
Alex Klein1699fab2022-09-08 08:46:06 -0600240 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700241 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600242 patch = self.PatchObject(packages_service, "get_best_visible")
243 request = self._GetRequest(atom="chromeos-chrome")
244 packages_controller.GetBestVisible(
245 request, self.response, self.mock_call_config
246 )
247 patch.assert_not_called()
248 self.assertTrue(self.response.package_info)
249 self.assertTrue(self.response.package_info.category)
250 self.assertTrue(self.response.package_info.package_name)
251 self.assertTrue(self.response.package_info.version)
Michael Mortensen2677bf62019-10-29 08:31:25 -0600252
Alex Klein1699fab2022-09-08 08:46:06 -0600253 def testNoAtomFails(self):
254 """No atom provided should fail."""
255 request = self._GetRequest()
256 with self.assertRaises(cros_build_lib.DieSystemExit):
257 packages_controller.GetBestVisible(
258 request, self.response, self.api_config
259 )
David Burger1e0fe232019-07-01 14:52:07 -0600260
Alex Klein1699fab2022-09-08 08:46:06 -0600261 def testSuccess(self):
262 """Test overall success, argument handling, result forwarding."""
263 pkg = package_info.PackageInfo("category", "package", "1.2.3.4", 5)
264 self.PatchObject(packages_service, "get_best_visible", return_value=pkg)
David Burger1e0fe232019-07-01 14:52:07 -0600265
Alex Klein1699fab2022-09-08 08:46:06 -0600266 request = self._GetRequest(atom="category/package")
David Burger1e0fe232019-07-01 14:52:07 -0600267
Alex Klein1699fab2022-09-08 08:46:06 -0600268 packages_controller.GetBestVisible(
269 request, self.response, self.api_config
270 )
David Burger1e0fe232019-07-01 14:52:07 -0600271
Alex Klein1699fab2022-09-08 08:46:06 -0600272 package_info_msg = self.response.package_info
273 self.assertEqual(package_info_msg.category, pkg.category)
274 self.assertEqual(package_info_msg.package_name, pkg.package)
275 self.assertEqual(package_info_msg.version, pkg.vr)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600276
277
Michael Mortensen68abdb72019-10-28 09:43:52 -0600278class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600279 """GetChromeVersion tests."""
Michael Mortensen68abdb72019-10-28 09:43:52 -0600280
Alex Klein1699fab2022-09-08 08:46:06 -0600281 def setUp(self):
282 self.response = packages_pb2.GetChromeVersionResponse()
Michael Mortensen68abdb72019-10-28 09:43:52 -0600283
Alex Klein1699fab2022-09-08 08:46:06 -0600284 def _GetRequest(self, board=None):
285 """Helper to build out a request."""
286 request = packages_pb2.GetChromeVersionRequest()
Michael Mortensen68abdb72019-10-28 09:43:52 -0600287
Alex Klein1699fab2022-09-08 08:46:06 -0600288 if board:
289 request.build_target.name = board
Michael Mortensen68abdb72019-10-28 09:43:52 -0600290
Alex Klein1699fab2022-09-08 08:46:06 -0600291 return request
Michael Mortensen68abdb72019-10-28 09:43:52 -0600292
Alex Klein1699fab2022-09-08 08:46:06 -0600293 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700294 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600295 chrome_version = self.PatchObject(
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000296 packages_service, "determine_package_version"
Alex Klein1699fab2022-09-08 08:46:06 -0600297 )
298 request = self._GetRequest(board="betty")
299 packages_controller.GetChromeVersion(
300 request, self.response, self.validate_only_config
301 )
302 chrome_version.assert_not_called()
Michael Mortensen68abdb72019-10-28 09:43:52 -0600303
Alex Klein1699fab2022-09-08 08:46:06 -0600304 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700305 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600306 chrome_version = self.PatchObject(
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000307 packages_service, "determine_package_version"
Alex Klein1699fab2022-09-08 08:46:06 -0600308 )
309 request = self._GetRequest(board="betty")
310 packages_controller.GetChromeVersion(
311 request, self.response, self.mock_call_config
312 )
313 chrome_version.assert_not_called()
314 self.assertTrue(self.response.version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600315
Alex Klein1699fab2022-09-08 08:46:06 -0600316 def testGetChromeVersion(self):
317 """Verify basic return values."""
318 chrome_version = "76.0.1.2"
319 chrome_version_mock = self.PatchObject(
320 packages_service,
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000321 "determine_package_version",
Alex Klein1699fab2022-09-08 08:46:06 -0600322 return_value=chrome_version,
323 )
324 request = self._GetRequest(board="betty")
325 packages_controller.GetChromeVersion(
326 request, self.response, self.api_config
327 )
328 self.assertEqual(self.response.version, chrome_version)
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000329 # Verify call to determine_package_version passes a build_target object.
Alex Klein1699fab2022-09-08 08:46:06 -0600330 build_target = build_target_lib.BuildTarget("betty")
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000331 chrome_version_mock.assert_called_with(
332 constants.CHROME_CP, build_target
333 )
Michael Mortensen68abdb72019-10-28 09:43:52 -0600334
Alex Klein1699fab2022-09-08 08:46:06 -0600335 def testGetChromeVersionHandleNone(self):
336 """Verify basic return values."""
337 self.PatchObject(
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000338 packages_service, "determine_package_version", return_value=None
Alex Klein1699fab2022-09-08 08:46:06 -0600339 )
340 request = self._GetRequest(board="betty")
341 packages_controller.GetChromeVersion(
342 request, self.response, self.api_config
343 )
344 self.assertFalse(self.response.version)
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600345
Michael Mortensen68abdb72019-10-28 09:43:52 -0600346
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600347class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600348 """GetTargetVersions tests."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600349
Alex Klein1699fab2022-09-08 08:46:06 -0600350 def setUp(self):
351 self.response = packages_pb2.GetTargetVersionsResponse()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600352
Alex Klein1699fab2022-09-08 08:46:06 -0600353 def _GetRequest(self, board=None):
354 """Helper to build out a request."""
355 request = packages_pb2.GetTargetVersionsRequest()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600356
Alex Klein1699fab2022-09-08 08:46:06 -0600357 if board:
358 request.build_target.name = board
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600359
Alex Klein1699fab2022-09-08 08:46:06 -0600360 return request
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600361
Alex Klein1699fab2022-09-08 08:46:06 -0600362 def testValidateOnly(self):
363 """Quick check that a validate only call does not execute any logic."""
364 patch_version = self.PatchObject(
365 packages_service, "get_target_versions"
366 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600367
Alex Klein1699fab2022-09-08 08:46:06 -0600368 request = self._GetRequest(board="betty")
369 packages_controller.GetTargetVersions(
370 request, self.response, self.validate_only_config
371 )
372 patch_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600373
Alex Klein1699fab2022-09-08 08:46:06 -0600374 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700375 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600376 patch_version = self.PatchObject(
377 packages_service, "get_target_versions"
378 )
Michael Mortensen2677bf62019-10-29 08:31:25 -0600379
Alex Klein1699fab2022-09-08 08:46:06 -0600380 request = self._GetRequest(board="betty")
381 packages_controller.GetTargetVersions(
382 request, self.response, self.mock_call_config
383 )
Michael Mortensen2677bf62019-10-29 08:31:25 -0600384
Alex Klein1699fab2022-09-08 08:46:06 -0600385 patch_version.assert_not_called()
Michael Mortensen2677bf62019-10-29 08:31:25 -0600386
Alex Klein1699fab2022-09-08 08:46:06 -0600387 self.assertTrue(self.response.android_version)
388 self.assertTrue(self.response.android_branch_version)
389 self.assertTrue(self.response.android_target_version)
390 self.assertTrue(self.response.chrome_version)
391 self.assertTrue(self.response.platform_version)
392 self.assertTrue(self.response.milestone_version)
393 self.assertTrue(self.response.full_version)
Michael Mortensen2677bf62019-10-29 08:31:25 -0600394
Alex Klein1699fab2022-09-08 08:46:06 -0600395 def testNoBuildTargetFails(self):
396 """No build target argument should fail."""
397 request = self._GetRequest()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600398
Alex Klein1699fab2022-09-08 08:46:06 -0600399 with self.assertRaises(cros_build_lib.DieSystemExit):
400 packages_controller.GetTargetVersions(
401 request, self.response, self.api_config
402 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600403
Alex Klein1699fab2022-09-08 08:46:06 -0600404 def testGetTargetVersions(self):
405 """Verify basic return values."""
406 # Mock that chrome is built and set the chrome_version.
407 self.PatchObject(packages_service, "builds", return_value=True)
408 chrome_version = "76.0.1.2"
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000409 lacros_version = "100.0.0.1"
410 package_version_mock = self.PatchObject(
Alex Klein1699fab2022-09-08 08:46:06 -0600411 packages_service,
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000412 "determine_package_version",
413 side_effect=[chrome_version, lacros_version],
Alex Klein1699fab2022-09-08 08:46:06 -0600414 )
415 android_package = "chromeos-base/android-container-pi-10.3"
416 self.PatchObject(
417 packages_service,
418 "determine_android_package",
419 return_value=android_package,
420 )
421 android_branch = "android_test_branch"
422 android_branch_mock = self.PatchObject(
423 packages_service,
424 "determine_android_branch",
425 return_value=android_branch,
426 )
427 platform_version = "12345.1.2"
428 self.PatchObject(
429 packages_service,
430 "determine_platform_version",
431 return_value=platform_version,
432 )
433 milestone_version = "79"
434 self.PatchObject(
435 packages_service,
436 "determine_milestone_version",
437 return_value=milestone_version,
438 )
439 full_version = "R79-12345.1.2"
440 self.PatchObject(
441 packages_service,
442 "determine_full_version",
443 return_value=full_version,
444 )
445 request = self._GetRequest(board="betty")
446 packages_controller.GetTargetVersions(
447 request, self.response, self.api_config
448 )
449 self.assertEqual(self.response.android_version, "10.3")
450 self.assertEqual(self.response.android_branch_version, android_branch)
451 self.assertEqual(self.response.android_target_version, "cheets")
452 self.assertEqual(self.response.chrome_version, chrome_version)
453 self.assertEqual(self.response.platform_version, platform_version)
454 self.assertEqual(self.response.milestone_version, milestone_version)
455 self.assertEqual(self.response.full_version, full_version)
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000456 self.assertEqual(self.response.lacros_version, lacros_version)
Alex Klein1699fab2022-09-08 08:46:06 -0600457 # Verify call to determine_chrome_version passes a build_target object.
458 build_target = build_target_lib.BuildTarget("betty")
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000459 package_version_mock.assert_has_calls(
460 calls=[
461 mock.call(constants.CHROME_CP, build_target),
462 mock.call(constants.LACROS_CP, build_target),
463 ]
464 )
Alex Klein1699fab2022-09-08 08:46:06 -0600465 # Verify call to determine_android_branch passes a board name.
466 android_branch_mock.assert_called_with("betty")
Michael Mortensenc2615b72019-10-15 08:12:24 -0600467
Alex Klein1699fab2022-09-08 08:46:06 -0600468 def testGetTargetVersionsWithPackagesSet(self):
469 """Verify packages pass through and basic return values."""
470 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
471 # rather than mocking the boundary to portage calls such as
472 # packages_service.builds).
473 builds_mock = self.PatchObject(
474 packages_service, "builds", return_value=True
475 )
476 # Mock that chrome is built and set the chrome_version.
477 chrome_version = "76.0.1.2"
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000478 lacros_version = "100.0.0.1"
Alex Klein1699fab2022-09-08 08:46:06 -0600479 self.PatchObject(
480 packages_service,
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000481 "determine_package_version",
482 side_effect=[chrome_version, lacros_version],
Alex Klein1699fab2022-09-08 08:46:06 -0600483 )
484 android_package = "chromeos-base/android-container-pi-10.3"
485 self.PatchObject(
486 packages_service,
487 "determine_android_package",
488 return_value=android_package,
489 )
490 android_branch = "android_test_branch"
491 self.PatchObject(
492 packages_service,
493 "determine_android_branch",
494 return_value=android_branch,
495 )
496 platform_version = "12345.1.2"
497 self.PatchObject(
498 packages_service,
499 "determine_platform_version",
500 return_value=platform_version,
501 )
502 milestone_version = "79"
503 self.PatchObject(
504 packages_service,
505 "determine_milestone_version",
506 return_value=milestone_version,
507 )
508 full_version = "R79-12345.1.2"
509 self.PatchObject(
510 packages_service,
511 "determine_full_version",
512 return_value=full_version,
513 )
514 request = self._GetRequest(board="betty")
515 # Add optional packages to the request.
516 cpv_package_list = []
517 package = request.packages.add()
518 package.package_name = "test"
519 package.category = "chromeos-base"
520 package.version = "0.0.1-r1"
521 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
522 package = request.packages.add()
523 package.package_name = "target-fuzzers"
524 package.category = "virtual"
525 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
Michael Mortensen42c330e32020-09-02 09:59:16 -0600526
Alex Klein1699fab2022-09-08 08:46:06 -0600527 packages_controller.GetTargetVersions(
528 request, self.response, self.api_config
529 )
530 self.assertEqual(self.response.android_version, "10.3")
531 self.assertEqual(self.response.android_branch_version, android_branch)
532 self.assertEqual(self.response.android_target_version, "cheets")
533 self.assertEqual(self.response.chrome_version, chrome_version)
534 self.assertEqual(self.response.platform_version, platform_version)
535 self.assertEqual(self.response.milestone_version, milestone_version)
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000536 self.assertEqual(self.response.lacros_version, lacros_version)
Alex Klein1699fab2022-09-08 08:46:06 -0600537 # Verify call to packages.builds passes the package list.
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000538 builds_mock.assert_has_calls(
539 calls=[
540 mock.call(
541 constants.CHROME_CP, mock.ANY, packages=cpv_package_list
542 ),
543 mock.call(
544 constants.LACROS_CP, mock.ANY, packages=cpv_package_list
545 ),
546 ]
Alex Klein1699fab2022-09-08 08:46:06 -0600547 )
Michael Mortensen42c330e32020-09-02 09:59:16 -0600548
Alex Klein1699fab2022-09-08 08:46:06 -0600549 def testGetTargetVersionNoAndroidNoChrome(self):
550 """Verify return values on a board that does not have android."""
551 platform_version = "12345.1.2"
552 self.PatchObject(
553 packages_service,
554 "determine_platform_version",
555 return_value=platform_version,
556 )
557 self.PatchObject(packages_service, "builds", return_value=False)
558 self.PatchObject(
559 packages_service, "determine_android_package", return_value=None
560 )
561 request = self._GetRequest(board="betty")
562 packages_controller.GetTargetVersions(
563 request, self.response, self.api_config
564 )
565 self.assertFalse(self.response.chrome_version)
566 self.assertFalse(self.response.android_version)
567 self.assertFalse(self.response.android_branch_version)
568 self.assertFalse(self.response.android_target_version)
569 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600570
Michael Mortensenbfc56392020-04-30 15:23:47 -0600571
572class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600573 """GetBuilderMetadata tests."""
Michael Mortensenbfc56392020-04-30 15:23:47 -0600574
Alex Klein1699fab2022-09-08 08:46:06 -0600575 def setUp(self):
576 self.response = packages_pb2.GetBuilderMetadataResponse()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600577
Alex Klein1699fab2022-09-08 08:46:06 -0600578 def _GetRequest(self, board=None):
579 """Helper to build out a request."""
580 request = packages_pb2.GetBuilderMetadataRequest()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600581
Alex Klein1699fab2022-09-08 08:46:06 -0600582 if board:
583 request.build_target.name = board
Michael Mortensenbfc56392020-04-30 15:23:47 -0600584
Alex Klein1699fab2022-09-08 08:46:06 -0600585 return request
Michael Mortensenbfc56392020-04-30 15:23:47 -0600586
Alex Klein1699fab2022-09-08 08:46:06 -0600587 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700588 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600589 request = self._GetRequest(board="betty")
590 patch_version = self.PatchObject(
591 packages_service, "determine_android_version"
592 )
593 patch_branch_version = self.PatchObject(
594 packages_service, "determine_android_branch"
595 )
596 patch_fw_versions = self.PatchObject(
597 packages_service, "determine_firmware_versions"
598 )
599 patch_fingerprints = self.PatchObject(
600 packages_service, "find_fingerprints"
601 )
602 patch_get_models = self.PatchObject(packages_service, "get_models")
603 packages_controller.GetBuilderMetadata(
604 request, self.response, self.validate_only_config
605 )
606 patch_version.assert_not_called()
607 patch_branch_version.assert_not_called()
608 patch_fw_versions.assert_not_called()
609 patch_fingerprints.assert_not_called()
610 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600611
Alex Klein1699fab2022-09-08 08:46:06 -0600612 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700613 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600614 request = self._GetRequest(board="betty")
615 patch_version = self.PatchObject(
616 packages_service, "determine_android_version"
617 )
618 patch_branch_version = self.PatchObject(
619 packages_service, "determine_android_branch"
620 )
621 patch_fw_versions = self.PatchObject(
622 packages_service, "determine_firmware_versions"
623 )
624 patch_fingerprints = self.PatchObject(
625 packages_service, "find_fingerprints"
626 )
627 patch_get_models = self.PatchObject(packages_service, "get_models")
628 packages_controller.GetBuilderMetadata(
629 request, self.response, self.mock_call_config
630 )
631 patch_version.assert_not_called()
632 patch_branch_version.assert_not_called()
633 patch_fw_versions.assert_not_called()
634 patch_fingerprints.assert_not_called()
635 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600636
Alex Klein1699fab2022-09-08 08:46:06 -0600637 self.assertEqual(len(self.response.build_target_metadata), 1)
638 self.assertEqual(
639 self.response.build_target_metadata[0].build_target,
640 request.build_target.name,
641 )
642 self.assertEqual(len(self.response.model_metadata), 1)
643 self.assertTrue(self.response.model_metadata[0].model_name)
644 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
Michael Mortensenbfc56392020-04-30 15:23:47 -0600645
Alex Klein1699fab2022-09-08 08:46:06 -0600646 def testNoBuildTargetFails(self):
647 """No build target argument should fail."""
648 request = self._GetRequest()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600649
Alex Klein1699fab2022-09-08 08:46:06 -0600650 with self.assertRaises(cros_build_lib.DieSystemExit):
651 packages_controller.GetBuilderMetadata(
652 request, self.response, self.api_config
653 )
Michael Mortensenbfc56392020-04-30 15:23:47 -0600654
Alex Klein1699fab2022-09-08 08:46:06 -0600655 def _patch_all(
656 self,
657 android_version,
658 android_branch,
659 android_target,
660 fw_versions,
661 fingerprints,
662 ):
663 """Patch everything that hasn't been broken out yet."""
664 android_version_mock = self.PatchObject(
665 packages_service,
666 "determine_android_version",
667 return_value=android_version,
668 )
669 android_branch_mock = self.PatchObject(
670 packages_service,
671 "determine_android_branch",
672 return_value=android_branch,
673 )
674 android_target_mock = self.PatchObject(
675 packages_service,
676 "determine_android_target",
677 return_value=android_target,
678 )
679 self.PatchObject(
680 portage_util,
681 "GetBoardUseFlags",
682 return_value=["arc", "arcvm", "big_little", "cheets"],
683 )
Lizzy Presland0b978e62022-09-09 16:55:29 +0000684
685 kernel_candidates = [
686 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
687 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
688 "sys-kernel/sys-kernel/socfpga-kernel-4.20-r34",
689 ]
690 self.PatchObject(
691 portage_util,
692 "GetFlattenedDepsForPackage",
693 return_value=kernel_candidates,
694 )
695 installed_packages = [
Alex Klein1699fab2022-09-08 08:46:06 -0600696 "sys-kernel/linux-headers-4.14-r24",
697 "sys-devel/flex-2.6.4-r1",
698 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
699 ]
700 self.PatchObject(
Lizzy Presland0b978e62022-09-09 16:55:29 +0000701 portage_util,
702 "GetPackageDependencies",
703 return_value=installed_packages,
Alex Klein1699fab2022-09-08 08:46:06 -0600704 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600705
Alex Klein1699fab2022-09-08 08:46:06 -0600706 self.PatchObject(
707 packages_service, "get_firmware_versions", return_value=fw_versions
708 )
709 self.PatchObject(
710 packages_service, "find_fingerprints", return_value=fingerprints
711 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600712
Alex Klein1699fab2022-09-08 08:46:06 -0600713 return android_version_mock, android_branch_mock, android_target_mock
Alex Klein2c3f1682022-08-30 16:52:28 -0600714
Alex Klein1699fab2022-09-08 08:46:06 -0600715 def _patch_get_all_firmware(self, all_fw_versions):
716 """Patch get_all_firmware_versions and related functions."""
717 # Patch packages.get_models, packages.get_all_firmware_versions,
718 # and packages.get_key_id for calls needed by model_metadata.
719 model_list = list(all_fw_versions.keys())
720 self.PatchObject(
721 packages_service,
722 "get_all_firmware_versions",
723 return_value=all_fw_versions,
724 )
725 self.PatchObject(
726 packages_service, "get_models", return_value=model_list
727 )
728 self.PatchObject(packages_service, "get_key_id", return_value="key")
Alex Klein2c3f1682022-08-30 16:52:28 -0600729
Alex Klein1699fab2022-09-08 08:46:06 -0600730 def testNoFirmware(self):
731 """Test no firmware versions handled well."""
732 android_version = "android_test_version"
733 android_branch = "android_test_branch"
734 android_target = "android_test_target"
735 fw_versions = packages_service.FirmwareVersions(
736 None, None, None, None, None
737 )
738 fingerprints = ["fingerprint1", "fingerprint2"]
739 self._patch_all(
740 android_version,
741 android_branch,
742 android_target,
743 fw_versions,
744 fingerprints,
745 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600746
Alex Klein1699fab2022-09-08 08:46:06 -0600747 all_fw_versions = {
748 "pyro": packages_service.FirmwareVersions(
749 "pyro", None, None, None, None
750 ),
751 "reef": packages_service.FirmwareVersions(
752 "reef", None, None, None, None
753 ),
754 }
755 self._patch_get_all_firmware(all_fw_versions)
Alex Klein2c3f1682022-08-30 16:52:28 -0600756
Alex Klein1699fab2022-09-08 08:46:06 -0600757 request = self._GetRequest(board="betty")
758 packages_controller.GetBuilderMetadata(
759 request, self.response, self.api_config
760 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600761
Alex Klein1699fab2022-09-08 08:46:06 -0600762 self.assertFalse(
763 self.response.build_target_metadata[0].main_firmware_version
764 )
765 self.assertFalse(
766 self.response.build_target_metadata[0].ec_firmware_version
767 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600768
Alex Klein1699fab2022-09-08 08:46:06 -0600769 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
770 self.assertFalse(self.response.model_metadata[0].ec_firmware_version)
771 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
772 self.assertFalse(
773 self.response.model_metadata[0].main_readonly_firmware_version
774 )
775 self.assertFalse(
776 self.response.model_metadata[0].main_readwrite_firmware_version
777 )
778 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
779 self.assertFalse(self.response.model_metadata[1].ec_firmware_version)
780 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
781 self.assertFalse(
782 self.response.model_metadata[1].main_readonly_firmware_version
783 )
784 self.assertFalse(
785 self.response.model_metadata[1].main_readwrite_firmware_version
786 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600787
Alex Klein1699fab2022-09-08 08:46:06 -0600788 def testGetBuilderMetadata(self):
789 """Verify basic return values."""
790 android_version = "android_test_version"
791 android_branch = "android_test_branch"
792 android_target = "android_test_target"
793 fw_versions = packages_service.FirmwareVersions(
794 None,
795 "Google_Caroline.7820.263.0",
796 "Google_Caroline.7820.286.0",
797 "caroline_v1.9.357-ac5c7b4",
798 "caroline_v1.9.370-e8b9bd2",
799 )
800 fingerprints = ["fingerprint1", "fingerprint2"]
Alex Klein2c3f1682022-08-30 16:52:28 -0600801
Alex Klein1699fab2022-09-08 08:46:06 -0600802 (
803 android_version_mock,
804 android_branch_mock,
805 android_target_mock,
806 ) = self._patch_all(
807 android_version,
808 android_branch,
809 android_target,
810 fw_versions,
811 fingerprints,
812 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600813
Alex Klein1699fab2022-09-08 08:46:06 -0600814 all_fw_versions = {
815 "pyro": packages_service.FirmwareVersions(
816 "pyro",
817 "Google_Pyro.9042.87.1",
818 "Google_Pyro.9042.110.0",
819 "pyro_v1.1.5900-ab1ee51",
820 "pyro_v1.1.5909-bd1f0c9",
821 ),
822 "reef": packages_service.FirmwareVersions(
823 "reef",
824 "Google_Reef.9042.87.1",
825 "Google_Reef.9042.110.0",
826 "reef_v1.1.5900-ab1ee51",
827 "reef_v1.1.5909-bd1f0c9",
828 ),
829 }
830 self._patch_get_all_firmware(all_fw_versions)
Michael Mortensen770bc122020-05-27 17:53:30 -0600831
Alex Klein1699fab2022-09-08 08:46:06 -0600832 request = self._GetRequest(board="betty")
833 packages_controller.GetBuilderMetadata(
834 request, self.response, self.api_config
835 )
836 self.assertEqual(
837 self.response.build_target_metadata[0].build_target, "betty"
838 )
839 self.assertEqual(
840 self.response.build_target_metadata[0].android_container_version,
841 android_version,
842 )
843 self.assertEqual(
844 self.response.build_target_metadata[0].android_container_branch,
845 android_branch,
846 )
847 self.assertEqual(
848 self.response.build_target_metadata[0].android_container_target,
849 android_target,
850 )
851 self.assertEqual(
852 self.response.build_target_metadata[0].arc_use_set, True
853 )
Alex Kleinab87ceb2023-01-24 12:00:51 -0700854 # Verify call to determine_android_version passes board name.
Alex Klein1699fab2022-09-08 08:46:06 -0600855 android_version_mock.assert_called_with("betty")
856 # Verify call to determine_android_branch passes board name.
857 android_branch_mock.assert_called_with("betty")
858 # Verify call to determine_android_target passes board name.
859 android_target_mock.assert_called_with("betty")
860 self.assertEqual(
861 self.response.build_target_metadata[0].main_firmware_version,
862 "Google_Caroline.7820.286.0",
863 )
864 self.assertEqual(
865 self.response.build_target_metadata[0].ec_firmware_version,
866 "caroline_v1.9.370-e8b9bd2",
867 )
868 self.assertEqual(
869 self.response.build_target_metadata[0].kernel_version,
870 "4.4.223-r2209",
871 )
872 self.assertEqual(
873 len(self.response.build_target_metadata[0].fingerprints), 2
874 )
875 self.assertEqual(
876 self.response.build_target_metadata[0].fingerprints, fingerprints
877 )
878 self.assertEqual(len(self.response.model_metadata), 2)
879 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
880 self.assertEqual(
881 self.response.model_metadata[0].ec_firmware_version,
882 "pyro_v1.1.5909-bd1f0c9",
883 )
884 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
885 self.assertEqual(
886 self.response.model_metadata[0].main_readonly_firmware_version,
887 "Google_Pyro.9042.87.1",
888 )
889 self.assertEqual(
890 self.response.model_metadata[0].main_readwrite_firmware_version,
891 "Google_Pyro.9042.110.0",
892 )
893 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
894 self.assertEqual(
895 self.response.model_metadata[1].ec_firmware_version,
896 "reef_v1.1.5909-bd1f0c9",
897 )
898 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
899 self.assertEqual(
900 self.response.model_metadata[1].main_readonly_firmware_version,
901 "Google_Reef.9042.87.1",
902 )
903 self.assertEqual(
904 self.response.model_metadata[1].main_readwrite_firmware_version,
905 "Google_Reef.9042.110.0",
906 )
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600907
Alex Klein1699fab2022-09-08 08:46:06 -0600908 # Test corner case where find_fingerprints returns None.
909 # Re-patch find_fingerprints to now return None and re-execute
910 # GetBuilderMetadata to verify behavior.
911 response = packages_pb2.GetBuilderMetadataResponse()
912 self.PatchObject(packages_service, "find_fingerprints", return_value=[])
913 request = self._GetRequest(board="betty")
914 packages_controller.GetBuilderMetadata(
915 request, response, self.api_config
916 )
917 # Verify a non-fingerprint build_target_metdata field was still set.
918 self.assertEqual(
919 response.build_target_metadata[0].kernel_version, "4.4.223-r2209"
920 )
921 # And then verify that fingerprints was empty.
922 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
Michael Mortensend81d81e2020-06-09 14:20:59 -0600923
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600924
Alex Kleinda39c6d2019-09-16 14:36:36 -0600925class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600926 """HasChromePrebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600927
Alex Klein1699fab2022-09-08 08:46:06 -0600928 def setUp(self):
929 self.response = packages_pb2.HasChromePrebuiltResponse()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600930
Alex Klein1699fab2022-09-08 08:46:06 -0600931 def _GetRequest(self, board=None):
932 """Helper to build out a request."""
933 request = packages_pb2.HasChromePrebuiltRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600934
Alex Klein1699fab2022-09-08 08:46:06 -0600935 if board:
936 request.build_target.name = board
Alex Kleinda39c6d2019-09-16 14:36:36 -0600937
Alex Klein1699fab2022-09-08 08:46:06 -0600938 return request
Alex Kleinda39c6d2019-09-16 14:36:36 -0600939
Alex Klein1699fab2022-09-08 08:46:06 -0600940 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700941 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600942 patch = self.PatchObject(packages_service, "has_prebuilt")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600943
Alex Klein1699fab2022-09-08 08:46:06 -0600944 request = self._GetRequest(board="betty")
945 packages_controller.HasChromePrebuilt(
946 request, self.response, self.validate_only_config
947 )
948 patch.assert_not_called()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600949
Alex Klein1699fab2022-09-08 08:46:06 -0600950 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700951 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600952 patch = self.PatchObject(packages_service, "has_prebuilt")
Michael Mortensen3232ab32020-01-05 19:14:36 -0700953
Alex Klein1699fab2022-09-08 08:46:06 -0600954 request = self._GetRequest(board="betty")
955 packages_controller.HasChromePrebuilt(
956 request, self.response, self.mock_call_config
957 )
958 patch.assert_not_called()
959 self.assertTrue(self.response.has_prebuilt)
Michael Mortensen3232ab32020-01-05 19:14:36 -0700960
Alex Klein1699fab2022-09-08 08:46:06 -0600961 def testNoBuildTargetFails(self):
962 """No build target argument should fail."""
963 request = self._GetRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600964
Alex Klein1699fab2022-09-08 08:46:06 -0600965 with self.assertRaises(cros_build_lib.DieSystemExit):
966 packages_controller.HasChromePrebuilt(
967 request, self.response, self.api_config
968 )
Alex Klein73fb6572019-09-30 16:55:23 -0600969
970
971class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600972 """BuildsChrome tests."""
Alex Klein73fb6572019-09-30 16:55:23 -0600973
Alex Klein1699fab2022-09-08 08:46:06 -0600974 def setUp(self):
975 self.response = packages_pb2.BuildsChromeResponse()
Alex Klein73fb6572019-09-30 16:55:23 -0600976
Alex Klein1699fab2022-09-08 08:46:06 -0600977 def _GetRequest(self, board=None, packages=None):
978 """Helper to build out a request."""
979 request = packages_pb2.BuildsChromeRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600980
Alex Klein1699fab2022-09-08 08:46:06 -0600981 if board:
982 request.build_target.name = board
Alex Klein73fb6572019-09-30 16:55:23 -0600983
Alex Klein1699fab2022-09-08 08:46:06 -0600984 if packages:
985 request.packages.extend(packages)
David Burger0f9dd4e2019-10-08 12:33:42 -0600986
Alex Klein1699fab2022-09-08 08:46:06 -0600987 return request
Alex Klein73fb6572019-09-30 16:55:23 -0600988
Alex Klein1699fab2022-09-08 08:46:06 -0600989 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700990 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600991 patch = self.PatchObject(packages_service, "builds")
Alex Klein73fb6572019-09-30 16:55:23 -0600992
Alex Klein1699fab2022-09-08 08:46:06 -0600993 request = self._GetRequest(board="betty")
994 packages_controller.BuildsChrome(
995 request, self.response, self.validate_only_config
996 )
997 patch.assert_not_called()
Alex Klein73fb6572019-09-30 16:55:23 -0600998
Alex Klein1699fab2022-09-08 08:46:06 -0600999 def testNoBuildTargetFails(self):
1000 """No build target argument should fail."""
1001 request = self._GetRequest()
Alex Klein73fb6572019-09-30 16:55:23 -06001002
Alex Klein1699fab2022-09-08 08:46:06 -06001003 with self.assertRaises(cros_build_lib.DieSystemExit):
1004 packages_controller.BuildsChrome(
1005 request, self.response, self.api_config
1006 )
Alex Kleine65131f2019-10-03 10:34:01 -06001007
Alex Klein1699fab2022-09-08 08:46:06 -06001008 def testBuilds(self):
1009 """Test successful call handling."""
1010 patch = self.PatchObject(packages_service, "builds", return_value=True)
Alex Kleine65131f2019-10-03 10:34:01 -06001011
Alex Klein1699fab2022-09-08 08:46:06 -06001012 request = self._GetRequest(board="foo")
1013 packages_controller.BuildsChrome(
1014 request, self.response, self.api_config
1015 )
1016 self.assertTrue(self.response.builds_chrome)
1017 patch.assert_called_once_with(
1018 constants.CHROME_CP, build_target_lib.BuildTarget("foo"), []
1019 )
David Burger0f9dd4e2019-10-08 12:33:42 -06001020
Alex Klein1699fab2022-09-08 08:46:06 -06001021 def testBuildsChromeWithPackages(self):
1022 """Test successful call with packages handling."""
1023 patch = self.PatchObject(packages_service, "builds", return_value=True)
David Burger0f9dd4e2019-10-08 12:33:42 -06001024
Alex Klein1699fab2022-09-08 08:46:06 -06001025 package = common_pb2.PackageInfo(
1026 category="category",
1027 package_name="name",
1028 version="1.01",
1029 )
1030 request = self._GetRequest(board="foo", packages=[package])
1031 packages_controller.BuildsChrome(
1032 request, self.response, self.api_config
1033 )
1034 self.assertTrue(self.response.builds_chrome)
1035 patch.assert_called_once_with(
1036 constants.CHROME_CP,
1037 build_target_lib.BuildTarget("foo"),
1038 [controller_util.PackageInfoToCPV(package)],
1039 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001040
1041
Alex Klein9ce3f682021-06-23 15:06:44 -06001042class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001043 """NeedsChromeSource tests."""
Alex Klein9ce3f682021-06-23 15:06:44 -06001044
Alex Klein1699fab2022-09-08 08:46:06 -06001045 def setUp(self):
1046 self.response = packages_pb2.NeedsChromeSourceResponse()
Alex Klein9ce3f682021-06-23 15:06:44 -06001047
Alex Klein1699fab2022-09-08 08:46:06 -06001048 self.board = "board"
1049 self.sysroot = self.tempdir
Alex Klein9ce3f682021-06-23 15:06:44 -06001050
Alex Klein1699fab2022-09-08 08:46:06 -06001051 def _GetRequest(self, compile_source=False):
1052 """Helper to build a request."""
1053 request = packages_pb2.NeedsChromeSourceRequest()
Alex Klein9ce3f682021-06-23 15:06:44 -06001054
Alex Klein1699fab2022-09-08 08:46:06 -06001055 request.install_request.sysroot.path = str(self.sysroot)
1056 request.install_request.sysroot.build_target.name = self.board
1057 request.install_request.flags.compile_source = compile_source
Alex Klein9ce3f682021-06-23 15:06:44 -06001058
Alex Klein1699fab2022-09-08 08:46:06 -06001059 return request
Alex Klein9ce3f682021-06-23 15:06:44 -06001060
Alex Klein1699fab2022-09-08 08:46:06 -06001061 def testAll(self):
1062 """Reason translation test."""
1063 result = packages_service.NeedsChromeSourceResult(
1064 needs_chrome_source=True,
1065 builds_chrome=True,
1066 packages=[package_info.parse("cat/pkg")],
1067 missing_chrome_prebuilt=True,
1068 missing_follower_prebuilt=True,
1069 local_uprev=True,
1070 )
1071 self.PatchObject(
1072 packages_service, "needs_chrome_source", return_value=result
1073 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001074
Alex Klein1699fab2022-09-08 08:46:06 -06001075 packages_controller.NeedsChromeSource(
1076 self._GetRequest(compile_source=True),
1077 self.response,
1078 self.api_config,
1079 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001080
Alex Klein1699fab2022-09-08 08:46:06 -06001081 self.assertIn(
1082 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1083 self.response.reasons,
1084 )
1085 self.assertIn(
1086 packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
1087 self.response.reasons,
1088 )
1089 self.assertIn(
1090 packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
1091 self.response.reasons,
1092 )
1093 self.assertIn(
1094 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
1095 self.response.reasons,
1096 )
1097 self.assertIn(
1098 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1099 self.response.reasons,
1100 )
1101 self.assertIn(
1102 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1103 self.response.reasons,
1104 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001105
Alex Klein1699fab2022-09-08 08:46:06 -06001106 self.assertEqual(1, len(self.response.packages))
1107 self.assertEqual(
1108 ("cat", "pkg"),
1109 (
1110 self.response.packages[0].category,
1111 self.response.packages[0].package_name,
1112 ),
1113 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001114
1115
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001116class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001117 """GetAndroidMetadata tests."""
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001118
Alex Klein1699fab2022-09-08 08:46:06 -06001119 def setUp(self):
1120 self.response = packages_pb2.GetAndroidMetadataResponse()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001121
Alex Klein1699fab2022-09-08 08:46:06 -06001122 def _GetRequest(self, board=None):
1123 """Helper to build out a request."""
1124 request = packages_pb2.GetAndroidMetadataRequest()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001125
Alex Klein1699fab2022-09-08 08:46:06 -06001126 if board:
1127 request.build_target.name = board
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001128
Alex Klein1699fab2022-09-08 08:46:06 -06001129 return request
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001130
Alex Klein1699fab2022-09-08 08:46:06 -06001131 def testValidateOnly(self):
1132 """Check that a validate only call does not execute any logic."""
1133 package_mock = self.PatchObject(
1134 packages_service, "determine_android_package"
1135 )
1136 branch_mock = self.PatchObject(
1137 packages_service, "determine_android_branch"
1138 )
1139 version_mock = self.PatchObject(
1140 packages_service, "determine_android_version"
1141 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001142
Alex Klein1699fab2022-09-08 08:46:06 -06001143 request = self._GetRequest(board="betty")
1144 packages_controller.GetAndroidMetadata(
1145 request, self.response, self.validate_only_config
1146 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001147
Alex Klein1699fab2022-09-08 08:46:06 -06001148 package_mock.assert_not_called()
1149 branch_mock.assert_not_called()
1150 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001151
Alex Klein1699fab2022-09-08 08:46:06 -06001152 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -07001153 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -06001154 package_mock = self.PatchObject(
1155 packages_service, "determine_android_package"
1156 )
1157 branch_mock = self.PatchObject(
1158 packages_service, "determine_android_branch"
1159 )
1160 version_mock = self.PatchObject(
1161 packages_service, "determine_android_version"
1162 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001163
Alex Klein1699fab2022-09-08 08:46:06 -06001164 request = self._GetRequest(board="betty")
1165 packages_controller.GetAndroidMetadata(
1166 request, self.response, self.mock_call_config
1167 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001168
Alex Klein1699fab2022-09-08 08:46:06 -06001169 package_mock.assert_not_called()
1170 branch_mock.assert_not_called()
1171 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001172
Alex Klein1699fab2022-09-08 08:46:06 -06001173 self.assertTrue(self.response.android_package)
1174 self.assertTrue(self.response.android_branch)
1175 self.assertTrue(self.response.android_version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001176
Alex Klein1699fab2022-09-08 08:46:06 -06001177 def testNoBuildTargetFails(self):
1178 """No build target argument should fail."""
1179 request = self._GetRequest()
1180 with self.assertRaises(cros_build_lib.DieSystemExit):
1181 packages_controller.GetAndroidMetadata(
1182 request, self.response, self.api_config
1183 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001184
Alex Klein1699fab2022-09-08 08:46:06 -06001185 def testSuccess(self):
1186 """Test a successful call."""
1187 board = "betty"
1188 package = "android-package"
1189 branch = "android-branch"
1190 version = "7123456"
1191 full_package = f"chromeos-base/{package}-{version}-r1"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001192
Alex Klein1699fab2022-09-08 08:46:06 -06001193 package_mock = self.PatchObject(
1194 packages_service,
1195 "determine_android_package",
1196 return_value=full_package,
1197 )
1198 branch_mock = self.PatchObject(
1199 packages_service, "determine_android_branch", return_value=branch
1200 )
1201 version_mock = self.PatchObject(
1202 packages_service, "determine_android_version", return_value=version
1203 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001204
Alex Klein1699fab2022-09-08 08:46:06 -06001205 request = self._GetRequest(board=board)
1206 packages_controller.GetAndroidMetadata(
1207 request, self.response, self.api_config
1208 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001209
Alex Klein1699fab2022-09-08 08:46:06 -06001210 package_mock.assert_called_once_with(board)
1211 branch_mock.assert_called_once_with(board, package=full_package)
1212 version_mock.assert_called_once_with(board, package=full_package)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001213
Alex Klein1699fab2022-09-08 08:46:06 -06001214 self.assertEqual(self.response.android_package, package)
1215 self.assertEqual(self.response.android_branch, branch)
1216 self.assertEqual(self.response.android_version, version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001217
Alex Klein1699fab2022-09-08 08:46:06 -06001218 def testNoAndroid(self):
1219 """Test returns an empty response if given board has no Android."""
1220 board = "betty"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001221
Alex Klein1699fab2022-09-08 08:46:06 -06001222 package_mock = self.PatchObject(
1223 packages_service, "determine_android_package", return_value=None
1224 )
1225 branch_mock = self.PatchObject(
1226 packages_service, "determine_android_branch"
1227 )
1228 version_mock = self.PatchObject(
1229 packages_service, "determine_android_version"
1230 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001231
Alex Klein1699fab2022-09-08 08:46:06 -06001232 request = self._GetRequest(board=board)
1233 packages_controller.GetAndroidMetadata(
1234 request, self.response, self.api_config
1235 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001236
Alex Klein1699fab2022-09-08 08:46:06 -06001237 package_mock.assert_called_once_with(board)
1238 branch_mock.assert_not_called()
1239 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001240
Alex Klein1699fab2022-09-08 08:46:06 -06001241 self.assertFalse(self.response.android_package)
1242 self.assertFalse(self.response.android_branch)
1243 self.assertFalse(self.response.android_version)