blob: a4a99db2787e33cbe58c5fb60e63e1098212522c [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.
Alex Kleind3b84042023-05-19 14:43:59 -0600516 package_list = []
Alex Klein1699fab2022-09-08 08:46:06 -0600517 package = request.packages.add()
518 package.package_name = "test"
519 package.category = "chromeos-base"
520 package.version = "0.0.1-r1"
Alex Kleind3b84042023-05-19 14:43:59 -0600521 package_list.append(controller_util.deserialize_package_info(package))
Alex Klein1699fab2022-09-08 08:46:06 -0600522 package = request.packages.add()
523 package.package_name = "target-fuzzers"
524 package.category = "virtual"
Alex Kleind3b84042023-05-19 14:43:59 -0600525 package_list.append(controller_util.deserialize_package_info(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=[
Alex Kleind3b84042023-05-19 14:43:59 -0600540 mock.call(constants.CHROME_CP, mock.ANY, packages=package_list),
541 mock.call(constants.LACROS_CP, mock.ANY, packages=package_list),
Gilberto Contreras4f2d1452023-01-30 23:22:58 +0000542 ]
Alex Klein1699fab2022-09-08 08:46:06 -0600543 )
Michael Mortensen42c330e32020-09-02 09:59:16 -0600544
Alex Klein1699fab2022-09-08 08:46:06 -0600545 def testGetTargetVersionNoAndroidNoChrome(self):
546 """Verify return values on a board that does not have android."""
547 platform_version = "12345.1.2"
548 self.PatchObject(
549 packages_service,
550 "determine_platform_version",
551 return_value=platform_version,
552 )
553 self.PatchObject(packages_service, "builds", return_value=False)
554 self.PatchObject(
555 packages_service, "determine_android_package", return_value=None
556 )
557 request = self._GetRequest(board="betty")
558 packages_controller.GetTargetVersions(
559 request, self.response, self.api_config
560 )
561 self.assertFalse(self.response.chrome_version)
562 self.assertFalse(self.response.android_version)
563 self.assertFalse(self.response.android_branch_version)
564 self.assertFalse(self.response.android_target_version)
565 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600566
Michael Mortensenbfc56392020-04-30 15:23:47 -0600567
568class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600569 """GetBuilderMetadata tests."""
Michael Mortensenbfc56392020-04-30 15:23:47 -0600570
Alex Klein1699fab2022-09-08 08:46:06 -0600571 def setUp(self):
572 self.response = packages_pb2.GetBuilderMetadataResponse()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600573
Alex Klein1699fab2022-09-08 08:46:06 -0600574 def _GetRequest(self, board=None):
575 """Helper to build out a request."""
576 request = packages_pb2.GetBuilderMetadataRequest()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600577
Alex Klein1699fab2022-09-08 08:46:06 -0600578 if board:
579 request.build_target.name = board
Michael Mortensenbfc56392020-04-30 15:23:47 -0600580
Alex Klein1699fab2022-09-08 08:46:06 -0600581 return request
Michael Mortensenbfc56392020-04-30 15:23:47 -0600582
Alex Klein1699fab2022-09-08 08:46:06 -0600583 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700584 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600585 request = self._GetRequest(board="betty")
586 patch_version = self.PatchObject(
587 packages_service, "determine_android_version"
588 )
589 patch_branch_version = self.PatchObject(
590 packages_service, "determine_android_branch"
591 )
592 patch_fw_versions = self.PatchObject(
593 packages_service, "determine_firmware_versions"
594 )
595 patch_fingerprints = self.PatchObject(
596 packages_service, "find_fingerprints"
597 )
598 patch_get_models = self.PatchObject(packages_service, "get_models")
599 packages_controller.GetBuilderMetadata(
600 request, self.response, self.validate_only_config
601 )
602 patch_version.assert_not_called()
603 patch_branch_version.assert_not_called()
604 patch_fw_versions.assert_not_called()
605 patch_fingerprints.assert_not_called()
606 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600607
Alex Klein1699fab2022-09-08 08:46:06 -0600608 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700609 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600610 request = self._GetRequest(board="betty")
611 patch_version = self.PatchObject(
612 packages_service, "determine_android_version"
613 )
614 patch_branch_version = self.PatchObject(
615 packages_service, "determine_android_branch"
616 )
617 patch_fw_versions = self.PatchObject(
618 packages_service, "determine_firmware_versions"
619 )
620 patch_fingerprints = self.PatchObject(
621 packages_service, "find_fingerprints"
622 )
623 patch_get_models = self.PatchObject(packages_service, "get_models")
624 packages_controller.GetBuilderMetadata(
625 request, self.response, self.mock_call_config
626 )
627 patch_version.assert_not_called()
628 patch_branch_version.assert_not_called()
629 patch_fw_versions.assert_not_called()
630 patch_fingerprints.assert_not_called()
631 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600632
Alex Klein1699fab2022-09-08 08:46:06 -0600633 self.assertEqual(len(self.response.build_target_metadata), 1)
634 self.assertEqual(
635 self.response.build_target_metadata[0].build_target,
636 request.build_target.name,
637 )
638 self.assertEqual(len(self.response.model_metadata), 1)
639 self.assertTrue(self.response.model_metadata[0].model_name)
640 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
Michael Mortensenbfc56392020-04-30 15:23:47 -0600641
Alex Klein1699fab2022-09-08 08:46:06 -0600642 def testNoBuildTargetFails(self):
643 """No build target argument should fail."""
644 request = self._GetRequest()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600645
Alex Klein1699fab2022-09-08 08:46:06 -0600646 with self.assertRaises(cros_build_lib.DieSystemExit):
647 packages_controller.GetBuilderMetadata(
648 request, self.response, self.api_config
649 )
Michael Mortensenbfc56392020-04-30 15:23:47 -0600650
Alex Klein1699fab2022-09-08 08:46:06 -0600651 def _patch_all(
652 self,
653 android_version,
654 android_branch,
655 android_target,
656 fw_versions,
657 fingerprints,
658 ):
659 """Patch everything that hasn't been broken out yet."""
660 android_version_mock = self.PatchObject(
661 packages_service,
662 "determine_android_version",
663 return_value=android_version,
664 )
665 android_branch_mock = self.PatchObject(
666 packages_service,
667 "determine_android_branch",
668 return_value=android_branch,
669 )
670 android_target_mock = self.PatchObject(
671 packages_service,
672 "determine_android_target",
673 return_value=android_target,
674 )
675 self.PatchObject(
676 portage_util,
677 "GetBoardUseFlags",
678 return_value=["arc", "arcvm", "big_little", "cheets"],
679 )
Lizzy Presland0b978e62022-09-09 16:55:29 +0000680
681 kernel_candidates = [
682 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
683 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
684 "sys-kernel/sys-kernel/socfpga-kernel-4.20-r34",
685 ]
686 self.PatchObject(
687 portage_util,
688 "GetFlattenedDepsForPackage",
689 return_value=kernel_candidates,
690 )
691 installed_packages = [
Alex Klein1699fab2022-09-08 08:46:06 -0600692 "sys-kernel/linux-headers-4.14-r24",
693 "sys-devel/flex-2.6.4-r1",
694 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
695 ]
696 self.PatchObject(
Lizzy Presland0b978e62022-09-09 16:55:29 +0000697 portage_util,
698 "GetPackageDependencies",
699 return_value=installed_packages,
Alex Klein1699fab2022-09-08 08:46:06 -0600700 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600701
Alex Klein1699fab2022-09-08 08:46:06 -0600702 self.PatchObject(
703 packages_service, "get_firmware_versions", return_value=fw_versions
704 )
705 self.PatchObject(
706 packages_service, "find_fingerprints", return_value=fingerprints
707 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600708
Alex Klein1699fab2022-09-08 08:46:06 -0600709 return android_version_mock, android_branch_mock, android_target_mock
Alex Klein2c3f1682022-08-30 16:52:28 -0600710
Alex Klein1699fab2022-09-08 08:46:06 -0600711 def _patch_get_all_firmware(self, all_fw_versions):
712 """Patch get_all_firmware_versions and related functions."""
713 # Patch packages.get_models, packages.get_all_firmware_versions,
714 # and packages.get_key_id for calls needed by model_metadata.
715 model_list = list(all_fw_versions.keys())
716 self.PatchObject(
717 packages_service,
718 "get_all_firmware_versions",
719 return_value=all_fw_versions,
720 )
721 self.PatchObject(
722 packages_service, "get_models", return_value=model_list
723 )
724 self.PatchObject(packages_service, "get_key_id", return_value="key")
Alex Klein2c3f1682022-08-30 16:52:28 -0600725
Alex Klein1699fab2022-09-08 08:46:06 -0600726 def testNoFirmware(self):
727 """Test no firmware versions handled well."""
728 android_version = "android_test_version"
729 android_branch = "android_test_branch"
730 android_target = "android_test_target"
731 fw_versions = packages_service.FirmwareVersions(
732 None, None, None, None, None
733 )
734 fingerprints = ["fingerprint1", "fingerprint2"]
735 self._patch_all(
736 android_version,
737 android_branch,
738 android_target,
739 fw_versions,
740 fingerprints,
741 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600742
Alex Klein1699fab2022-09-08 08:46:06 -0600743 all_fw_versions = {
744 "pyro": packages_service.FirmwareVersions(
745 "pyro", None, None, None, None
746 ),
747 "reef": packages_service.FirmwareVersions(
748 "reef", None, None, None, None
749 ),
750 }
751 self._patch_get_all_firmware(all_fw_versions)
Alex Klein2c3f1682022-08-30 16:52:28 -0600752
Alex Klein1699fab2022-09-08 08:46:06 -0600753 request = self._GetRequest(board="betty")
754 packages_controller.GetBuilderMetadata(
755 request, self.response, self.api_config
756 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600757
Alex Klein1699fab2022-09-08 08:46:06 -0600758 self.assertFalse(
759 self.response.build_target_metadata[0].main_firmware_version
760 )
761 self.assertFalse(
762 self.response.build_target_metadata[0].ec_firmware_version
763 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600764
Alex Klein1699fab2022-09-08 08:46:06 -0600765 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
766 self.assertFalse(self.response.model_metadata[0].ec_firmware_version)
767 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
768 self.assertFalse(
769 self.response.model_metadata[0].main_readonly_firmware_version
770 )
771 self.assertFalse(
772 self.response.model_metadata[0].main_readwrite_firmware_version
773 )
774 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
775 self.assertFalse(self.response.model_metadata[1].ec_firmware_version)
776 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
777 self.assertFalse(
778 self.response.model_metadata[1].main_readonly_firmware_version
779 )
780 self.assertFalse(
781 self.response.model_metadata[1].main_readwrite_firmware_version
782 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600783
Alex Klein1699fab2022-09-08 08:46:06 -0600784 def testGetBuilderMetadata(self):
785 """Verify basic return values."""
786 android_version = "android_test_version"
787 android_branch = "android_test_branch"
788 android_target = "android_test_target"
789 fw_versions = packages_service.FirmwareVersions(
790 None,
791 "Google_Caroline.7820.263.0",
792 "Google_Caroline.7820.286.0",
793 "caroline_v1.9.357-ac5c7b4",
794 "caroline_v1.9.370-e8b9bd2",
795 )
796 fingerprints = ["fingerprint1", "fingerprint2"]
Alex Klein2c3f1682022-08-30 16:52:28 -0600797
Alex Klein1699fab2022-09-08 08:46:06 -0600798 (
799 android_version_mock,
800 android_branch_mock,
801 android_target_mock,
802 ) = self._patch_all(
803 android_version,
804 android_branch,
805 android_target,
806 fw_versions,
807 fingerprints,
808 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600809
Alex Klein1699fab2022-09-08 08:46:06 -0600810 all_fw_versions = {
811 "pyro": packages_service.FirmwareVersions(
812 "pyro",
813 "Google_Pyro.9042.87.1",
814 "Google_Pyro.9042.110.0",
815 "pyro_v1.1.5900-ab1ee51",
816 "pyro_v1.1.5909-bd1f0c9",
817 ),
818 "reef": packages_service.FirmwareVersions(
819 "reef",
820 "Google_Reef.9042.87.1",
821 "Google_Reef.9042.110.0",
822 "reef_v1.1.5900-ab1ee51",
823 "reef_v1.1.5909-bd1f0c9",
824 ),
825 }
826 self._patch_get_all_firmware(all_fw_versions)
Michael Mortensen770bc122020-05-27 17:53:30 -0600827
Alex Klein1699fab2022-09-08 08:46:06 -0600828 request = self._GetRequest(board="betty")
829 packages_controller.GetBuilderMetadata(
830 request, self.response, self.api_config
831 )
832 self.assertEqual(
833 self.response.build_target_metadata[0].build_target, "betty"
834 )
835 self.assertEqual(
836 self.response.build_target_metadata[0].android_container_version,
837 android_version,
838 )
839 self.assertEqual(
840 self.response.build_target_metadata[0].android_container_branch,
841 android_branch,
842 )
843 self.assertEqual(
844 self.response.build_target_metadata[0].android_container_target,
845 android_target,
846 )
847 self.assertEqual(
848 self.response.build_target_metadata[0].arc_use_set, True
849 )
Alex Kleinab87ceb2023-01-24 12:00:51 -0700850 # Verify call to determine_android_version passes board name.
Alex Klein1699fab2022-09-08 08:46:06 -0600851 android_version_mock.assert_called_with("betty")
852 # Verify call to determine_android_branch passes board name.
853 android_branch_mock.assert_called_with("betty")
854 # Verify call to determine_android_target passes board name.
855 android_target_mock.assert_called_with("betty")
856 self.assertEqual(
857 self.response.build_target_metadata[0].main_firmware_version,
858 "Google_Caroline.7820.286.0",
859 )
860 self.assertEqual(
861 self.response.build_target_metadata[0].ec_firmware_version,
862 "caroline_v1.9.370-e8b9bd2",
863 )
864 self.assertEqual(
865 self.response.build_target_metadata[0].kernel_version,
866 "4.4.223-r2209",
867 )
868 self.assertEqual(
869 len(self.response.build_target_metadata[0].fingerprints), 2
870 )
871 self.assertEqual(
872 self.response.build_target_metadata[0].fingerprints, fingerprints
873 )
874 self.assertEqual(len(self.response.model_metadata), 2)
875 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
876 self.assertEqual(
877 self.response.model_metadata[0].ec_firmware_version,
878 "pyro_v1.1.5909-bd1f0c9",
879 )
880 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
881 self.assertEqual(
882 self.response.model_metadata[0].main_readonly_firmware_version,
883 "Google_Pyro.9042.87.1",
884 )
885 self.assertEqual(
886 self.response.model_metadata[0].main_readwrite_firmware_version,
887 "Google_Pyro.9042.110.0",
888 )
889 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
890 self.assertEqual(
891 self.response.model_metadata[1].ec_firmware_version,
892 "reef_v1.1.5909-bd1f0c9",
893 )
894 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
895 self.assertEqual(
896 self.response.model_metadata[1].main_readonly_firmware_version,
897 "Google_Reef.9042.87.1",
898 )
899 self.assertEqual(
900 self.response.model_metadata[1].main_readwrite_firmware_version,
901 "Google_Reef.9042.110.0",
902 )
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600903
Alex Klein1699fab2022-09-08 08:46:06 -0600904 # Test corner case where find_fingerprints returns None.
905 # Re-patch find_fingerprints to now return None and re-execute
906 # GetBuilderMetadata to verify behavior.
907 response = packages_pb2.GetBuilderMetadataResponse()
908 self.PatchObject(packages_service, "find_fingerprints", return_value=[])
909 request = self._GetRequest(board="betty")
910 packages_controller.GetBuilderMetadata(
911 request, response, self.api_config
912 )
913 # Verify a non-fingerprint build_target_metdata field was still set.
914 self.assertEqual(
915 response.build_target_metadata[0].kernel_version, "4.4.223-r2209"
916 )
917 # And then verify that fingerprints was empty.
918 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
Michael Mortensend81d81e2020-06-09 14:20:59 -0600919
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600920
Alex Kleinda39c6d2019-09-16 14:36:36 -0600921class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600922 """HasChromePrebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600923
Alex Klein1699fab2022-09-08 08:46:06 -0600924 def setUp(self):
925 self.response = packages_pb2.HasChromePrebuiltResponse()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600926
Alex Klein1699fab2022-09-08 08:46:06 -0600927 def _GetRequest(self, board=None):
928 """Helper to build out a request."""
929 request = packages_pb2.HasChromePrebuiltRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600930
Alex Klein1699fab2022-09-08 08:46:06 -0600931 if board:
932 request.build_target.name = board
Alex Kleinda39c6d2019-09-16 14:36:36 -0600933
Alex Klein1699fab2022-09-08 08:46:06 -0600934 return request
Alex Kleinda39c6d2019-09-16 14:36:36 -0600935
Alex Klein1699fab2022-09-08 08:46:06 -0600936 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700937 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600938 patch = self.PatchObject(packages_service, "has_prebuilt")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600939
Alex Klein1699fab2022-09-08 08:46:06 -0600940 request = self._GetRequest(board="betty")
941 packages_controller.HasChromePrebuilt(
942 request, self.response, self.validate_only_config
943 )
944 patch.assert_not_called()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600945
Alex Klein1699fab2022-09-08 08:46:06 -0600946 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700947 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600948 patch = self.PatchObject(packages_service, "has_prebuilt")
Michael Mortensen3232ab32020-01-05 19:14:36 -0700949
Alex Klein1699fab2022-09-08 08:46:06 -0600950 request = self._GetRequest(board="betty")
951 packages_controller.HasChromePrebuilt(
952 request, self.response, self.mock_call_config
953 )
954 patch.assert_not_called()
955 self.assertTrue(self.response.has_prebuilt)
Michael Mortensen3232ab32020-01-05 19:14:36 -0700956
Alex Klein1699fab2022-09-08 08:46:06 -0600957 def testNoBuildTargetFails(self):
958 """No build target argument should fail."""
959 request = self._GetRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600960
Alex Klein1699fab2022-09-08 08:46:06 -0600961 with self.assertRaises(cros_build_lib.DieSystemExit):
962 packages_controller.HasChromePrebuilt(
963 request, self.response, self.api_config
964 )
Alex Klein73fb6572019-09-30 16:55:23 -0600965
966
967class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600968 """BuildsChrome tests."""
Alex Klein73fb6572019-09-30 16:55:23 -0600969
Alex Klein1699fab2022-09-08 08:46:06 -0600970 def setUp(self):
971 self.response = packages_pb2.BuildsChromeResponse()
Alex Klein73fb6572019-09-30 16:55:23 -0600972
Alex Klein1699fab2022-09-08 08:46:06 -0600973 def _GetRequest(self, board=None, packages=None):
974 """Helper to build out a request."""
975 request = packages_pb2.BuildsChromeRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600976
Alex Klein1699fab2022-09-08 08:46:06 -0600977 if board:
978 request.build_target.name = board
Alex Klein73fb6572019-09-30 16:55:23 -0600979
Alex Klein1699fab2022-09-08 08:46:06 -0600980 if packages:
981 request.packages.extend(packages)
David Burger0f9dd4e2019-10-08 12:33:42 -0600982
Alex Klein1699fab2022-09-08 08:46:06 -0600983 return request
Alex Klein73fb6572019-09-30 16:55:23 -0600984
Alex Klein1699fab2022-09-08 08:46:06 -0600985 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700986 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600987 patch = self.PatchObject(packages_service, "builds")
Alex Klein73fb6572019-09-30 16:55:23 -0600988
Alex Klein1699fab2022-09-08 08:46:06 -0600989 request = self._GetRequest(board="betty")
990 packages_controller.BuildsChrome(
991 request, self.response, self.validate_only_config
992 )
993 patch.assert_not_called()
Alex Klein73fb6572019-09-30 16:55:23 -0600994
Alex Klein1699fab2022-09-08 08:46:06 -0600995 def testNoBuildTargetFails(self):
996 """No build target argument should fail."""
997 request = self._GetRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600998
Alex Klein1699fab2022-09-08 08:46:06 -0600999 with self.assertRaises(cros_build_lib.DieSystemExit):
1000 packages_controller.BuildsChrome(
1001 request, self.response, self.api_config
1002 )
Alex Kleine65131f2019-10-03 10:34:01 -06001003
Alex Klein1699fab2022-09-08 08:46:06 -06001004 def testBuilds(self):
1005 """Test successful call handling."""
1006 patch = self.PatchObject(packages_service, "builds", return_value=True)
Alex Kleine65131f2019-10-03 10:34:01 -06001007
Alex Klein1699fab2022-09-08 08:46:06 -06001008 request = self._GetRequest(board="foo")
1009 packages_controller.BuildsChrome(
1010 request, self.response, self.api_config
1011 )
1012 self.assertTrue(self.response.builds_chrome)
1013 patch.assert_called_once_with(
1014 constants.CHROME_CP, build_target_lib.BuildTarget("foo"), []
1015 )
David Burger0f9dd4e2019-10-08 12:33:42 -06001016
Alex Klein1699fab2022-09-08 08:46:06 -06001017 def testBuildsChromeWithPackages(self):
1018 """Test successful call with packages handling."""
1019 patch = self.PatchObject(packages_service, "builds", return_value=True)
David Burger0f9dd4e2019-10-08 12:33:42 -06001020
Alex Klein1699fab2022-09-08 08:46:06 -06001021 package = common_pb2.PackageInfo(
1022 category="category",
1023 package_name="name",
1024 version="1.01",
1025 )
1026 request = self._GetRequest(board="foo", packages=[package])
1027 packages_controller.BuildsChrome(
1028 request, self.response, self.api_config
1029 )
1030 self.assertTrue(self.response.builds_chrome)
1031 patch.assert_called_once_with(
1032 constants.CHROME_CP,
1033 build_target_lib.BuildTarget("foo"),
Alex Kleind3b84042023-05-19 14:43:59 -06001034 [controller_util.deserialize_package_info(package)],
Alex Klein1699fab2022-09-08 08:46:06 -06001035 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001036
1037
Alex Klein9ce3f682021-06-23 15:06:44 -06001038class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001039 """NeedsChromeSource tests."""
Alex Klein9ce3f682021-06-23 15:06:44 -06001040
Alex Klein1699fab2022-09-08 08:46:06 -06001041 def setUp(self):
1042 self.response = packages_pb2.NeedsChromeSourceResponse()
Alex Klein9ce3f682021-06-23 15:06:44 -06001043
Alex Klein1699fab2022-09-08 08:46:06 -06001044 self.board = "board"
1045 self.sysroot = self.tempdir
Alex Klein9ce3f682021-06-23 15:06:44 -06001046
Alex Klein1699fab2022-09-08 08:46:06 -06001047 def _GetRequest(self, compile_source=False):
1048 """Helper to build a request."""
1049 request = packages_pb2.NeedsChromeSourceRequest()
Alex Klein9ce3f682021-06-23 15:06:44 -06001050
Alex Klein1699fab2022-09-08 08:46:06 -06001051 request.install_request.sysroot.path = str(self.sysroot)
1052 request.install_request.sysroot.build_target.name = self.board
1053 request.install_request.flags.compile_source = compile_source
Alex Klein9ce3f682021-06-23 15:06:44 -06001054
Alex Klein1699fab2022-09-08 08:46:06 -06001055 return request
Alex Klein9ce3f682021-06-23 15:06:44 -06001056
Alex Klein1699fab2022-09-08 08:46:06 -06001057 def testAll(self):
1058 """Reason translation test."""
1059 result = packages_service.NeedsChromeSourceResult(
1060 needs_chrome_source=True,
1061 builds_chrome=True,
1062 packages=[package_info.parse("cat/pkg")],
1063 missing_chrome_prebuilt=True,
1064 missing_follower_prebuilt=True,
1065 local_uprev=True,
1066 )
1067 self.PatchObject(
1068 packages_service, "needs_chrome_source", return_value=result
1069 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001070
Alex Klein1699fab2022-09-08 08:46:06 -06001071 packages_controller.NeedsChromeSource(
1072 self._GetRequest(compile_source=True),
1073 self.response,
1074 self.api_config,
1075 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001076
Alex Klein1699fab2022-09-08 08:46:06 -06001077 self.assertIn(
1078 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1079 self.response.reasons,
1080 )
1081 self.assertIn(
1082 packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
1083 self.response.reasons,
1084 )
1085 self.assertIn(
1086 packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
1087 self.response.reasons,
1088 )
1089 self.assertIn(
1090 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
1091 self.response.reasons,
1092 )
1093 self.assertIn(
1094 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1095 self.response.reasons,
1096 )
1097 self.assertIn(
1098 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1099 self.response.reasons,
1100 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001101
Alex Klein1699fab2022-09-08 08:46:06 -06001102 self.assertEqual(1, len(self.response.packages))
1103 self.assertEqual(
1104 ("cat", "pkg"),
1105 (
1106 self.response.packages[0].category,
1107 self.response.packages[0].package_name,
1108 ),
1109 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001110
1111
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001112class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001113 """GetAndroidMetadata tests."""
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001114
Alex Klein1699fab2022-09-08 08:46:06 -06001115 def setUp(self):
1116 self.response = packages_pb2.GetAndroidMetadataResponse()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001117
Alex Klein1699fab2022-09-08 08:46:06 -06001118 def _GetRequest(self, board=None):
1119 """Helper to build out a request."""
1120 request = packages_pb2.GetAndroidMetadataRequest()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001121
Alex Klein1699fab2022-09-08 08:46:06 -06001122 if board:
1123 request.build_target.name = board
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001124
Alex Klein1699fab2022-09-08 08:46:06 -06001125 return request
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001126
Alex Klein1699fab2022-09-08 08:46:06 -06001127 def testValidateOnly(self):
1128 """Check that a validate only call does not execute any logic."""
1129 package_mock = self.PatchObject(
1130 packages_service, "determine_android_package"
1131 )
1132 branch_mock = self.PatchObject(
1133 packages_service, "determine_android_branch"
1134 )
1135 version_mock = self.PatchObject(
1136 packages_service, "determine_android_version"
1137 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001138
Alex Klein1699fab2022-09-08 08:46:06 -06001139 request = self._GetRequest(board="betty")
1140 packages_controller.GetAndroidMetadata(
1141 request, self.response, self.validate_only_config
1142 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001143
Alex Klein1699fab2022-09-08 08:46:06 -06001144 package_mock.assert_not_called()
1145 branch_mock.assert_not_called()
1146 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001147
Alex Klein1699fab2022-09-08 08:46:06 -06001148 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -07001149 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -06001150 package_mock = self.PatchObject(
1151 packages_service, "determine_android_package"
1152 )
1153 branch_mock = self.PatchObject(
1154 packages_service, "determine_android_branch"
1155 )
1156 version_mock = self.PatchObject(
1157 packages_service, "determine_android_version"
1158 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001159
Alex Klein1699fab2022-09-08 08:46:06 -06001160 request = self._GetRequest(board="betty")
1161 packages_controller.GetAndroidMetadata(
1162 request, self.response, self.mock_call_config
1163 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001164
Alex Klein1699fab2022-09-08 08:46:06 -06001165 package_mock.assert_not_called()
1166 branch_mock.assert_not_called()
1167 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001168
Alex Klein1699fab2022-09-08 08:46:06 -06001169 self.assertTrue(self.response.android_package)
1170 self.assertTrue(self.response.android_branch)
1171 self.assertTrue(self.response.android_version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001172
Alex Klein1699fab2022-09-08 08:46:06 -06001173 def testNoBuildTargetFails(self):
1174 """No build target argument should fail."""
1175 request = self._GetRequest()
1176 with self.assertRaises(cros_build_lib.DieSystemExit):
1177 packages_controller.GetAndroidMetadata(
1178 request, self.response, self.api_config
1179 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001180
Alex Klein1699fab2022-09-08 08:46:06 -06001181 def testSuccess(self):
1182 """Test a successful call."""
1183 board = "betty"
1184 package = "android-package"
1185 branch = "android-branch"
1186 version = "7123456"
1187 full_package = f"chromeos-base/{package}-{version}-r1"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001188
Alex Klein1699fab2022-09-08 08:46:06 -06001189 package_mock = self.PatchObject(
1190 packages_service,
1191 "determine_android_package",
1192 return_value=full_package,
1193 )
1194 branch_mock = self.PatchObject(
1195 packages_service, "determine_android_branch", return_value=branch
1196 )
1197 version_mock = self.PatchObject(
1198 packages_service, "determine_android_version", return_value=version
1199 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001200
Alex Klein1699fab2022-09-08 08:46:06 -06001201 request = self._GetRequest(board=board)
1202 packages_controller.GetAndroidMetadata(
1203 request, self.response, self.api_config
1204 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001205
Alex Klein1699fab2022-09-08 08:46:06 -06001206 package_mock.assert_called_once_with(board)
1207 branch_mock.assert_called_once_with(board, package=full_package)
1208 version_mock.assert_called_once_with(board, package=full_package)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001209
Alex Klein1699fab2022-09-08 08:46:06 -06001210 self.assertEqual(self.response.android_package, package)
1211 self.assertEqual(self.response.android_branch, branch)
1212 self.assertEqual(self.response.android_version, version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001213
Alex Klein1699fab2022-09-08 08:46:06 -06001214 def testNoAndroid(self):
1215 """Test returns an empty response if given board has no Android."""
1216 board = "betty"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001217
Alex Klein1699fab2022-09-08 08:46:06 -06001218 package_mock = self.PatchObject(
1219 packages_service, "determine_android_package", return_value=None
1220 )
1221 branch_mock = self.PatchObject(
1222 packages_service, "determine_android_branch"
1223 )
1224 version_mock = self.PatchObject(
1225 packages_service, "determine_android_version"
1226 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001227
Alex Klein1699fab2022-09-08 08:46:06 -06001228 request = self._GetRequest(board=board)
1229 packages_controller.GetAndroidMetadata(
1230 request, self.response, self.api_config
1231 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001232
Alex Klein1699fab2022-09-08 08:46:06 -06001233 package_mock.assert_called_once_with(board)
1234 branch_mock.assert_not_called()
1235 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001236
Alex Klein1699fab2022-09-08 08:46:06 -06001237 self.assertFalse(self.response.android_package)
1238 self.assertFalse(self.response.android_branch)
1239 self.assertFalse(self.response.android_version)