blob: f0c7b19921ef73bce5475c62a3fab89978bf5b97 [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(
296 packages_service, "determine_chrome_version"
297 )
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(
307 packages_service, "determine_chrome_version"
308 )
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,
321 "determine_chrome_version",
322 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)
329 # Verify call to determine_chrome_version passes a build_target object.
330 build_target = build_target_lib.BuildTarget("betty")
331 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600332
Alex Klein1699fab2022-09-08 08:46:06 -0600333 def testGetChromeVersionHandleNone(self):
334 """Verify basic return values."""
335 self.PatchObject(
336 packages_service, "determine_chrome_version", return_value=None
337 )
338 request = self._GetRequest(board="betty")
339 packages_controller.GetChromeVersion(
340 request, self.response, self.api_config
341 )
342 self.assertFalse(self.response.version)
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600343
Michael Mortensen68abdb72019-10-28 09:43:52 -0600344
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600345class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600346 """GetTargetVersions tests."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600347
Alex Klein1699fab2022-09-08 08:46:06 -0600348 def setUp(self):
349 self.response = packages_pb2.GetTargetVersionsResponse()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600350
Alex Klein1699fab2022-09-08 08:46:06 -0600351 def _GetRequest(self, board=None):
352 """Helper to build out a request."""
353 request = packages_pb2.GetTargetVersionsRequest()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600354
Alex Klein1699fab2022-09-08 08:46:06 -0600355 if board:
356 request.build_target.name = board
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600357
Alex Klein1699fab2022-09-08 08:46:06 -0600358 return request
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600359
Alex Klein1699fab2022-09-08 08:46:06 -0600360 def testValidateOnly(self):
361 """Quick check that a validate only call does not execute any logic."""
362 patch_version = self.PatchObject(
363 packages_service, "get_target_versions"
364 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600365
Alex Klein1699fab2022-09-08 08:46:06 -0600366 request = self._GetRequest(board="betty")
367 packages_controller.GetTargetVersions(
368 request, self.response, self.validate_only_config
369 )
370 patch_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600371
Alex Klein1699fab2022-09-08 08:46:06 -0600372 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700373 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600374 patch_version = self.PatchObject(
375 packages_service, "get_target_versions"
376 )
Michael Mortensen2677bf62019-10-29 08:31:25 -0600377
Alex Klein1699fab2022-09-08 08:46:06 -0600378 request = self._GetRequest(board="betty")
379 packages_controller.GetTargetVersions(
380 request, self.response, self.mock_call_config
381 )
Michael Mortensen2677bf62019-10-29 08:31:25 -0600382
Alex Klein1699fab2022-09-08 08:46:06 -0600383 patch_version.assert_not_called()
Michael Mortensen2677bf62019-10-29 08:31:25 -0600384
Alex Klein1699fab2022-09-08 08:46:06 -0600385 self.assertTrue(self.response.android_version)
386 self.assertTrue(self.response.android_branch_version)
387 self.assertTrue(self.response.android_target_version)
388 self.assertTrue(self.response.chrome_version)
389 self.assertTrue(self.response.platform_version)
390 self.assertTrue(self.response.milestone_version)
391 self.assertTrue(self.response.full_version)
Michael Mortensen2677bf62019-10-29 08:31:25 -0600392
Alex Klein1699fab2022-09-08 08:46:06 -0600393 def testNoBuildTargetFails(self):
394 """No build target argument should fail."""
395 request = self._GetRequest()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600396
Alex Klein1699fab2022-09-08 08:46:06 -0600397 with self.assertRaises(cros_build_lib.DieSystemExit):
398 packages_controller.GetTargetVersions(
399 request, self.response, self.api_config
400 )
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600401
Alex Klein1699fab2022-09-08 08:46:06 -0600402 def testGetTargetVersions(self):
403 """Verify basic return values."""
404 # Mock that chrome is built and set the chrome_version.
405 self.PatchObject(packages_service, "builds", return_value=True)
406 chrome_version = "76.0.1.2"
407 chrome_version_mock = self.PatchObject(
408 packages_service,
409 "determine_chrome_version",
410 return_value=chrome_version,
411 )
412 android_package = "chromeos-base/android-container-pi-10.3"
413 self.PatchObject(
414 packages_service,
415 "determine_android_package",
416 return_value=android_package,
417 )
418 android_branch = "android_test_branch"
419 android_branch_mock = self.PatchObject(
420 packages_service,
421 "determine_android_branch",
422 return_value=android_branch,
423 )
424 platform_version = "12345.1.2"
425 self.PatchObject(
426 packages_service,
427 "determine_platform_version",
428 return_value=platform_version,
429 )
430 milestone_version = "79"
431 self.PatchObject(
432 packages_service,
433 "determine_milestone_version",
434 return_value=milestone_version,
435 )
436 full_version = "R79-12345.1.2"
437 self.PatchObject(
438 packages_service,
439 "determine_full_version",
440 return_value=full_version,
441 )
442 request = self._GetRequest(board="betty")
443 packages_controller.GetTargetVersions(
444 request, self.response, self.api_config
445 )
446 self.assertEqual(self.response.android_version, "10.3")
447 self.assertEqual(self.response.android_branch_version, android_branch)
448 self.assertEqual(self.response.android_target_version, "cheets")
449 self.assertEqual(self.response.chrome_version, chrome_version)
450 self.assertEqual(self.response.platform_version, platform_version)
451 self.assertEqual(self.response.milestone_version, milestone_version)
452 self.assertEqual(self.response.full_version, full_version)
453 # Verify call to determine_chrome_version passes a build_target object.
454 build_target = build_target_lib.BuildTarget("betty")
455 chrome_version_mock.assert_called_with(build_target)
456 # Verify call to determine_android_branch passes a board name.
457 android_branch_mock.assert_called_with("betty")
Michael Mortensenc2615b72019-10-15 08:12:24 -0600458
Alex Klein1699fab2022-09-08 08:46:06 -0600459 def testGetTargetVersionsWithPackagesSet(self):
460 """Verify packages pass through and basic return values."""
461 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
462 # rather than mocking the boundary to portage calls such as
463 # packages_service.builds).
464 builds_mock = self.PatchObject(
465 packages_service, "builds", return_value=True
466 )
467 # Mock that chrome is built and set the chrome_version.
468 chrome_version = "76.0.1.2"
469 self.PatchObject(
470 packages_service,
471 "determine_chrome_version",
472 return_value=chrome_version,
473 )
474 android_package = "chromeos-base/android-container-pi-10.3"
475 self.PatchObject(
476 packages_service,
477 "determine_android_package",
478 return_value=android_package,
479 )
480 android_branch = "android_test_branch"
481 self.PatchObject(
482 packages_service,
483 "determine_android_branch",
484 return_value=android_branch,
485 )
486 platform_version = "12345.1.2"
487 self.PatchObject(
488 packages_service,
489 "determine_platform_version",
490 return_value=platform_version,
491 )
492 milestone_version = "79"
493 self.PatchObject(
494 packages_service,
495 "determine_milestone_version",
496 return_value=milestone_version,
497 )
498 full_version = "R79-12345.1.2"
499 self.PatchObject(
500 packages_service,
501 "determine_full_version",
502 return_value=full_version,
503 )
504 request = self._GetRequest(board="betty")
505 # Add optional packages to the request.
506 cpv_package_list = []
507 package = request.packages.add()
508 package.package_name = "test"
509 package.category = "chromeos-base"
510 package.version = "0.0.1-r1"
511 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
512 package = request.packages.add()
513 package.package_name = "target-fuzzers"
514 package.category = "virtual"
515 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
Michael Mortensen42c330e32020-09-02 09:59:16 -0600516
Alex Klein1699fab2022-09-08 08:46:06 -0600517 packages_controller.GetTargetVersions(
518 request, self.response, self.api_config
519 )
520 self.assertEqual(self.response.android_version, "10.3")
521 self.assertEqual(self.response.android_branch_version, android_branch)
522 self.assertEqual(self.response.android_target_version, "cheets")
523 self.assertEqual(self.response.chrome_version, chrome_version)
524 self.assertEqual(self.response.platform_version, platform_version)
525 self.assertEqual(self.response.milestone_version, milestone_version)
526 # Verify call to packages.builds passes the package list.
527 builds_mock.assert_called_with(
528 constants.CHROME_CP,
529 mock.ANY, # Match the build target object
530 packages=cpv_package_list,
531 )
Michael Mortensen42c330e32020-09-02 09:59:16 -0600532
Alex Klein1699fab2022-09-08 08:46:06 -0600533 def testGetTargetVersionNoAndroidNoChrome(self):
534 """Verify return values on a board that does not have android."""
535 platform_version = "12345.1.2"
536 self.PatchObject(
537 packages_service,
538 "determine_platform_version",
539 return_value=platform_version,
540 )
541 self.PatchObject(packages_service, "builds", return_value=False)
542 self.PatchObject(
543 packages_service, "determine_android_package", return_value=None
544 )
545 request = self._GetRequest(board="betty")
546 packages_controller.GetTargetVersions(
547 request, self.response, self.api_config
548 )
549 self.assertFalse(self.response.chrome_version)
550 self.assertFalse(self.response.android_version)
551 self.assertFalse(self.response.android_branch_version)
552 self.assertFalse(self.response.android_target_version)
553 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600554
Michael Mortensenbfc56392020-04-30 15:23:47 -0600555
556class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600557 """GetBuilderMetadata tests."""
Michael Mortensenbfc56392020-04-30 15:23:47 -0600558
Alex Klein1699fab2022-09-08 08:46:06 -0600559 def setUp(self):
560 self.response = packages_pb2.GetBuilderMetadataResponse()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600561
Alex Klein1699fab2022-09-08 08:46:06 -0600562 def _GetRequest(self, board=None):
563 """Helper to build out a request."""
564 request = packages_pb2.GetBuilderMetadataRequest()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600565
Alex Klein1699fab2022-09-08 08:46:06 -0600566 if board:
567 request.build_target.name = board
Michael Mortensenbfc56392020-04-30 15:23:47 -0600568
Alex Klein1699fab2022-09-08 08:46:06 -0600569 return request
Michael Mortensenbfc56392020-04-30 15:23:47 -0600570
Alex Klein1699fab2022-09-08 08:46:06 -0600571 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700572 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600573 request = self._GetRequest(board="betty")
574 patch_version = self.PatchObject(
575 packages_service, "determine_android_version"
576 )
577 patch_branch_version = self.PatchObject(
578 packages_service, "determine_android_branch"
579 )
580 patch_fw_versions = self.PatchObject(
581 packages_service, "determine_firmware_versions"
582 )
583 patch_fingerprints = self.PatchObject(
584 packages_service, "find_fingerprints"
585 )
586 patch_get_models = self.PatchObject(packages_service, "get_models")
587 packages_controller.GetBuilderMetadata(
588 request, self.response, self.validate_only_config
589 )
590 patch_version.assert_not_called()
591 patch_branch_version.assert_not_called()
592 patch_fw_versions.assert_not_called()
593 patch_fingerprints.assert_not_called()
594 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600595
Alex Klein1699fab2022-09-08 08:46:06 -0600596 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700597 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600598 request = self._GetRequest(board="betty")
599 patch_version = self.PatchObject(
600 packages_service, "determine_android_version"
601 )
602 patch_branch_version = self.PatchObject(
603 packages_service, "determine_android_branch"
604 )
605 patch_fw_versions = self.PatchObject(
606 packages_service, "determine_firmware_versions"
607 )
608 patch_fingerprints = self.PatchObject(
609 packages_service, "find_fingerprints"
610 )
611 patch_get_models = self.PatchObject(packages_service, "get_models")
612 packages_controller.GetBuilderMetadata(
613 request, self.response, self.mock_call_config
614 )
615 patch_version.assert_not_called()
616 patch_branch_version.assert_not_called()
617 patch_fw_versions.assert_not_called()
618 patch_fingerprints.assert_not_called()
619 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600620
Alex Klein1699fab2022-09-08 08:46:06 -0600621 self.assertEqual(len(self.response.build_target_metadata), 1)
622 self.assertEqual(
623 self.response.build_target_metadata[0].build_target,
624 request.build_target.name,
625 )
626 self.assertEqual(len(self.response.model_metadata), 1)
627 self.assertTrue(self.response.model_metadata[0].model_name)
628 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
Michael Mortensenbfc56392020-04-30 15:23:47 -0600629
Alex Klein1699fab2022-09-08 08:46:06 -0600630 def testNoBuildTargetFails(self):
631 """No build target argument should fail."""
632 request = self._GetRequest()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600633
Alex Klein1699fab2022-09-08 08:46:06 -0600634 with self.assertRaises(cros_build_lib.DieSystemExit):
635 packages_controller.GetBuilderMetadata(
636 request, self.response, self.api_config
637 )
Michael Mortensenbfc56392020-04-30 15:23:47 -0600638
Alex Klein1699fab2022-09-08 08:46:06 -0600639 def _patch_all(
640 self,
641 android_version,
642 android_branch,
643 android_target,
644 fw_versions,
645 fingerprints,
646 ):
647 """Patch everything that hasn't been broken out yet."""
648 android_version_mock = self.PatchObject(
649 packages_service,
650 "determine_android_version",
651 return_value=android_version,
652 )
653 android_branch_mock = self.PatchObject(
654 packages_service,
655 "determine_android_branch",
656 return_value=android_branch,
657 )
658 android_target_mock = self.PatchObject(
659 packages_service,
660 "determine_android_target",
661 return_value=android_target,
662 )
663 self.PatchObject(
664 portage_util,
665 "GetBoardUseFlags",
666 return_value=["arc", "arcvm", "big_little", "cheets"],
667 )
Lizzy Presland0b978e62022-09-09 16:55:29 +0000668
669 kernel_candidates = [
670 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
671 "sys-kernel/chromeos-kernel-experimental-4.18_rc2-r23",
672 "sys-kernel/sys-kernel/socfpga-kernel-4.20-r34",
673 ]
674 self.PatchObject(
675 portage_util,
676 "GetFlattenedDepsForPackage",
677 return_value=kernel_candidates,
678 )
679 installed_packages = [
Alex Klein1699fab2022-09-08 08:46:06 -0600680 "sys-kernel/linux-headers-4.14-r24",
681 "sys-devel/flex-2.6.4-r1",
682 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
683 ]
684 self.PatchObject(
Lizzy Presland0b978e62022-09-09 16:55:29 +0000685 portage_util,
686 "GetPackageDependencies",
687 return_value=installed_packages,
Alex Klein1699fab2022-09-08 08:46:06 -0600688 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600689
Alex Klein1699fab2022-09-08 08:46:06 -0600690 self.PatchObject(
691 packages_service, "get_firmware_versions", return_value=fw_versions
692 )
693 self.PatchObject(
694 packages_service, "find_fingerprints", return_value=fingerprints
695 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600696
Alex Klein1699fab2022-09-08 08:46:06 -0600697 return android_version_mock, android_branch_mock, android_target_mock
Alex Klein2c3f1682022-08-30 16:52:28 -0600698
Alex Klein1699fab2022-09-08 08:46:06 -0600699 def _patch_get_all_firmware(self, all_fw_versions):
700 """Patch get_all_firmware_versions and related functions."""
701 # Patch packages.get_models, packages.get_all_firmware_versions,
702 # and packages.get_key_id for calls needed by model_metadata.
703 model_list = list(all_fw_versions.keys())
704 self.PatchObject(
705 packages_service,
706 "get_all_firmware_versions",
707 return_value=all_fw_versions,
708 )
709 self.PatchObject(
710 packages_service, "get_models", return_value=model_list
711 )
712 self.PatchObject(packages_service, "get_key_id", return_value="key")
Alex Klein2c3f1682022-08-30 16:52:28 -0600713
Alex Klein1699fab2022-09-08 08:46:06 -0600714 def testNoFirmware(self):
715 """Test no firmware versions handled well."""
716 android_version = "android_test_version"
717 android_branch = "android_test_branch"
718 android_target = "android_test_target"
719 fw_versions = packages_service.FirmwareVersions(
720 None, None, None, None, None
721 )
722 fingerprints = ["fingerprint1", "fingerprint2"]
723 self._patch_all(
724 android_version,
725 android_branch,
726 android_target,
727 fw_versions,
728 fingerprints,
729 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600730
Alex Klein1699fab2022-09-08 08:46:06 -0600731 all_fw_versions = {
732 "pyro": packages_service.FirmwareVersions(
733 "pyro", None, None, None, None
734 ),
735 "reef": packages_service.FirmwareVersions(
736 "reef", None, None, None, None
737 ),
738 }
739 self._patch_get_all_firmware(all_fw_versions)
Alex Klein2c3f1682022-08-30 16:52:28 -0600740
Alex Klein1699fab2022-09-08 08:46:06 -0600741 request = self._GetRequest(board="betty")
742 packages_controller.GetBuilderMetadata(
743 request, self.response, self.api_config
744 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600745
Alex Klein1699fab2022-09-08 08:46:06 -0600746 self.assertFalse(
747 self.response.build_target_metadata[0].main_firmware_version
748 )
749 self.assertFalse(
750 self.response.build_target_metadata[0].ec_firmware_version
751 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600752
Alex Klein1699fab2022-09-08 08:46:06 -0600753 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
754 self.assertFalse(self.response.model_metadata[0].ec_firmware_version)
755 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
756 self.assertFalse(
757 self.response.model_metadata[0].main_readonly_firmware_version
758 )
759 self.assertFalse(
760 self.response.model_metadata[0].main_readwrite_firmware_version
761 )
762 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
763 self.assertFalse(self.response.model_metadata[1].ec_firmware_version)
764 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
765 self.assertFalse(
766 self.response.model_metadata[1].main_readonly_firmware_version
767 )
768 self.assertFalse(
769 self.response.model_metadata[1].main_readwrite_firmware_version
770 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600771
Alex Klein1699fab2022-09-08 08:46:06 -0600772 def testGetBuilderMetadata(self):
773 """Verify basic return values."""
774 android_version = "android_test_version"
775 android_branch = "android_test_branch"
776 android_target = "android_test_target"
777 fw_versions = packages_service.FirmwareVersions(
778 None,
779 "Google_Caroline.7820.263.0",
780 "Google_Caroline.7820.286.0",
781 "caroline_v1.9.357-ac5c7b4",
782 "caroline_v1.9.370-e8b9bd2",
783 )
784 fingerprints = ["fingerprint1", "fingerprint2"]
Alex Klein2c3f1682022-08-30 16:52:28 -0600785
Alex Klein1699fab2022-09-08 08:46:06 -0600786 (
787 android_version_mock,
788 android_branch_mock,
789 android_target_mock,
790 ) = self._patch_all(
791 android_version,
792 android_branch,
793 android_target,
794 fw_versions,
795 fingerprints,
796 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600797
Alex Klein1699fab2022-09-08 08:46:06 -0600798 all_fw_versions = {
799 "pyro": packages_service.FirmwareVersions(
800 "pyro",
801 "Google_Pyro.9042.87.1",
802 "Google_Pyro.9042.110.0",
803 "pyro_v1.1.5900-ab1ee51",
804 "pyro_v1.1.5909-bd1f0c9",
805 ),
806 "reef": packages_service.FirmwareVersions(
807 "reef",
808 "Google_Reef.9042.87.1",
809 "Google_Reef.9042.110.0",
810 "reef_v1.1.5900-ab1ee51",
811 "reef_v1.1.5909-bd1f0c9",
812 ),
813 }
814 self._patch_get_all_firmware(all_fw_versions)
Michael Mortensen770bc122020-05-27 17:53:30 -0600815
Alex Klein1699fab2022-09-08 08:46:06 -0600816 request = self._GetRequest(board="betty")
817 packages_controller.GetBuilderMetadata(
818 request, self.response, self.api_config
819 )
820 self.assertEqual(
821 self.response.build_target_metadata[0].build_target, "betty"
822 )
823 self.assertEqual(
824 self.response.build_target_metadata[0].android_container_version,
825 android_version,
826 )
827 self.assertEqual(
828 self.response.build_target_metadata[0].android_container_branch,
829 android_branch,
830 )
831 self.assertEqual(
832 self.response.build_target_metadata[0].android_container_target,
833 android_target,
834 )
835 self.assertEqual(
836 self.response.build_target_metadata[0].arc_use_set, True
837 )
Alex Kleinab87ceb2023-01-24 12:00:51 -0700838 # Verify call to determine_android_version passes board name.
Alex Klein1699fab2022-09-08 08:46:06 -0600839 android_version_mock.assert_called_with("betty")
840 # Verify call to determine_android_branch passes board name.
841 android_branch_mock.assert_called_with("betty")
842 # Verify call to determine_android_target passes board name.
843 android_target_mock.assert_called_with("betty")
844 self.assertEqual(
845 self.response.build_target_metadata[0].main_firmware_version,
846 "Google_Caroline.7820.286.0",
847 )
848 self.assertEqual(
849 self.response.build_target_metadata[0].ec_firmware_version,
850 "caroline_v1.9.370-e8b9bd2",
851 )
852 self.assertEqual(
853 self.response.build_target_metadata[0].kernel_version,
854 "4.4.223-r2209",
855 )
856 self.assertEqual(
857 len(self.response.build_target_metadata[0].fingerprints), 2
858 )
859 self.assertEqual(
860 self.response.build_target_metadata[0].fingerprints, fingerprints
861 )
862 self.assertEqual(len(self.response.model_metadata), 2)
863 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
864 self.assertEqual(
865 self.response.model_metadata[0].ec_firmware_version,
866 "pyro_v1.1.5909-bd1f0c9",
867 )
868 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
869 self.assertEqual(
870 self.response.model_metadata[0].main_readonly_firmware_version,
871 "Google_Pyro.9042.87.1",
872 )
873 self.assertEqual(
874 self.response.model_metadata[0].main_readwrite_firmware_version,
875 "Google_Pyro.9042.110.0",
876 )
877 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
878 self.assertEqual(
879 self.response.model_metadata[1].ec_firmware_version,
880 "reef_v1.1.5909-bd1f0c9",
881 )
882 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
883 self.assertEqual(
884 self.response.model_metadata[1].main_readonly_firmware_version,
885 "Google_Reef.9042.87.1",
886 )
887 self.assertEqual(
888 self.response.model_metadata[1].main_readwrite_firmware_version,
889 "Google_Reef.9042.110.0",
890 )
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600891
Alex Klein1699fab2022-09-08 08:46:06 -0600892 # Test corner case where find_fingerprints returns None.
893 # Re-patch find_fingerprints to now return None and re-execute
894 # GetBuilderMetadata to verify behavior.
895 response = packages_pb2.GetBuilderMetadataResponse()
896 self.PatchObject(packages_service, "find_fingerprints", return_value=[])
897 request = self._GetRequest(board="betty")
898 packages_controller.GetBuilderMetadata(
899 request, response, self.api_config
900 )
901 # Verify a non-fingerprint build_target_metdata field was still set.
902 self.assertEqual(
903 response.build_target_metadata[0].kernel_version, "4.4.223-r2209"
904 )
905 # And then verify that fingerprints was empty.
906 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
Michael Mortensend81d81e2020-06-09 14:20:59 -0600907
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600908
Alex Kleinda39c6d2019-09-16 14:36:36 -0600909class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600910 """HasChromePrebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600911
Alex Klein1699fab2022-09-08 08:46:06 -0600912 def setUp(self):
913 self.response = packages_pb2.HasChromePrebuiltResponse()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600914
Alex Klein1699fab2022-09-08 08:46:06 -0600915 def _GetRequest(self, board=None):
916 """Helper to build out a request."""
917 request = packages_pb2.HasChromePrebuiltRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600918
Alex Klein1699fab2022-09-08 08:46:06 -0600919 if board:
920 request.build_target.name = board
Alex Kleinda39c6d2019-09-16 14:36:36 -0600921
Alex Klein1699fab2022-09-08 08:46:06 -0600922 return request
Alex Kleinda39c6d2019-09-16 14:36:36 -0600923
Alex Klein1699fab2022-09-08 08:46:06 -0600924 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700925 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600926 patch = self.PatchObject(packages_service, "has_prebuilt")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600927
Alex Klein1699fab2022-09-08 08:46:06 -0600928 request = self._GetRequest(board="betty")
929 packages_controller.HasChromePrebuilt(
930 request, self.response, self.validate_only_config
931 )
932 patch.assert_not_called()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600933
Alex Klein1699fab2022-09-08 08:46:06 -0600934 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700935 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600936 patch = self.PatchObject(packages_service, "has_prebuilt")
Michael Mortensen3232ab32020-01-05 19:14:36 -0700937
Alex Klein1699fab2022-09-08 08:46:06 -0600938 request = self._GetRequest(board="betty")
939 packages_controller.HasChromePrebuilt(
940 request, self.response, self.mock_call_config
941 )
942 patch.assert_not_called()
943 self.assertTrue(self.response.has_prebuilt)
Michael Mortensen3232ab32020-01-05 19:14:36 -0700944
Alex Klein1699fab2022-09-08 08:46:06 -0600945 def testNoBuildTargetFails(self):
946 """No build target argument should fail."""
947 request = self._GetRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600948
Alex Klein1699fab2022-09-08 08:46:06 -0600949 with self.assertRaises(cros_build_lib.DieSystemExit):
950 packages_controller.HasChromePrebuilt(
951 request, self.response, self.api_config
952 )
Alex Klein73fb6572019-09-30 16:55:23 -0600953
954
955class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600956 """BuildsChrome tests."""
Alex Klein73fb6572019-09-30 16:55:23 -0600957
Alex Klein1699fab2022-09-08 08:46:06 -0600958 def setUp(self):
959 self.response = packages_pb2.BuildsChromeResponse()
Alex Klein73fb6572019-09-30 16:55:23 -0600960
Alex Klein1699fab2022-09-08 08:46:06 -0600961 def _GetRequest(self, board=None, packages=None):
962 """Helper to build out a request."""
963 request = packages_pb2.BuildsChromeRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600964
Alex Klein1699fab2022-09-08 08:46:06 -0600965 if board:
966 request.build_target.name = board
Alex Klein73fb6572019-09-30 16:55:23 -0600967
Alex Klein1699fab2022-09-08 08:46:06 -0600968 if packages:
969 request.packages.extend(packages)
David Burger0f9dd4e2019-10-08 12:33:42 -0600970
Alex Klein1699fab2022-09-08 08:46:06 -0600971 return request
Alex Klein73fb6572019-09-30 16:55:23 -0600972
Alex Klein1699fab2022-09-08 08:46:06 -0600973 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700974 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600975 patch = self.PatchObject(packages_service, "builds")
Alex Klein73fb6572019-09-30 16:55:23 -0600976
Alex Klein1699fab2022-09-08 08:46:06 -0600977 request = self._GetRequest(board="betty")
978 packages_controller.BuildsChrome(
979 request, self.response, self.validate_only_config
980 )
981 patch.assert_not_called()
Alex Klein73fb6572019-09-30 16:55:23 -0600982
Alex Klein1699fab2022-09-08 08:46:06 -0600983 def testNoBuildTargetFails(self):
984 """No build target argument should fail."""
985 request = self._GetRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600986
Alex Klein1699fab2022-09-08 08:46:06 -0600987 with self.assertRaises(cros_build_lib.DieSystemExit):
988 packages_controller.BuildsChrome(
989 request, self.response, self.api_config
990 )
Alex Kleine65131f2019-10-03 10:34:01 -0600991
Alex Klein1699fab2022-09-08 08:46:06 -0600992 def testBuilds(self):
993 """Test successful call handling."""
994 patch = self.PatchObject(packages_service, "builds", return_value=True)
Alex Kleine65131f2019-10-03 10:34:01 -0600995
Alex Klein1699fab2022-09-08 08:46:06 -0600996 request = self._GetRequest(board="foo")
997 packages_controller.BuildsChrome(
998 request, self.response, self.api_config
999 )
1000 self.assertTrue(self.response.builds_chrome)
1001 patch.assert_called_once_with(
1002 constants.CHROME_CP, build_target_lib.BuildTarget("foo"), []
1003 )
David Burger0f9dd4e2019-10-08 12:33:42 -06001004
Alex Klein1699fab2022-09-08 08:46:06 -06001005 def testBuildsChromeWithPackages(self):
1006 """Test successful call with packages handling."""
1007 patch = self.PatchObject(packages_service, "builds", return_value=True)
David Burger0f9dd4e2019-10-08 12:33:42 -06001008
Alex Klein1699fab2022-09-08 08:46:06 -06001009 package = common_pb2.PackageInfo(
1010 category="category",
1011 package_name="name",
1012 version="1.01",
1013 )
1014 request = self._GetRequest(board="foo", packages=[package])
1015 packages_controller.BuildsChrome(
1016 request, self.response, self.api_config
1017 )
1018 self.assertTrue(self.response.builds_chrome)
1019 patch.assert_called_once_with(
1020 constants.CHROME_CP,
1021 build_target_lib.BuildTarget("foo"),
1022 [controller_util.PackageInfoToCPV(package)],
1023 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001024
1025
Alex Klein9ce3f682021-06-23 15:06:44 -06001026class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001027 """NeedsChromeSource tests."""
Alex Klein9ce3f682021-06-23 15:06:44 -06001028
Alex Klein1699fab2022-09-08 08:46:06 -06001029 def setUp(self):
1030 self.response = packages_pb2.NeedsChromeSourceResponse()
Alex Klein9ce3f682021-06-23 15:06:44 -06001031
Alex Klein1699fab2022-09-08 08:46:06 -06001032 self.board = "board"
1033 self.sysroot = self.tempdir
Alex Klein9ce3f682021-06-23 15:06:44 -06001034
Alex Klein1699fab2022-09-08 08:46:06 -06001035 def _GetRequest(self, compile_source=False):
1036 """Helper to build a request."""
1037 request = packages_pb2.NeedsChromeSourceRequest()
Alex Klein9ce3f682021-06-23 15:06:44 -06001038
Alex Klein1699fab2022-09-08 08:46:06 -06001039 request.install_request.sysroot.path = str(self.sysroot)
1040 request.install_request.sysroot.build_target.name = self.board
1041 request.install_request.flags.compile_source = compile_source
Alex Klein9ce3f682021-06-23 15:06:44 -06001042
Alex Klein1699fab2022-09-08 08:46:06 -06001043 return request
Alex Klein9ce3f682021-06-23 15:06:44 -06001044
Alex Klein1699fab2022-09-08 08:46:06 -06001045 def testAll(self):
1046 """Reason translation test."""
1047 result = packages_service.NeedsChromeSourceResult(
1048 needs_chrome_source=True,
1049 builds_chrome=True,
1050 packages=[package_info.parse("cat/pkg")],
1051 missing_chrome_prebuilt=True,
1052 missing_follower_prebuilt=True,
1053 local_uprev=True,
1054 )
1055 self.PatchObject(
1056 packages_service, "needs_chrome_source", return_value=result
1057 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001058
Alex Klein1699fab2022-09-08 08:46:06 -06001059 packages_controller.NeedsChromeSource(
1060 self._GetRequest(compile_source=True),
1061 self.response,
1062 self.api_config,
1063 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001064
Alex Klein1699fab2022-09-08 08:46:06 -06001065 self.assertIn(
1066 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1067 self.response.reasons,
1068 )
1069 self.assertIn(
1070 packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
1071 self.response.reasons,
1072 )
1073 self.assertIn(
1074 packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
1075 self.response.reasons,
1076 )
1077 self.assertIn(
1078 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
1079 self.response.reasons,
1080 )
1081 self.assertIn(
1082 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1083 self.response.reasons,
1084 )
1085 self.assertIn(
1086 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1087 self.response.reasons,
1088 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001089
Alex Klein1699fab2022-09-08 08:46:06 -06001090 self.assertEqual(1, len(self.response.packages))
1091 self.assertEqual(
1092 ("cat", "pkg"),
1093 (
1094 self.response.packages[0].category,
1095 self.response.packages[0].package_name,
1096 ),
1097 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001098
1099
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001100class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001101 """GetAndroidMetadata tests."""
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001102
Alex Klein1699fab2022-09-08 08:46:06 -06001103 def setUp(self):
1104 self.response = packages_pb2.GetAndroidMetadataResponse()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001105
Alex Klein1699fab2022-09-08 08:46:06 -06001106 def _GetRequest(self, board=None):
1107 """Helper to build out a request."""
1108 request = packages_pb2.GetAndroidMetadataRequest()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001109
Alex Klein1699fab2022-09-08 08:46:06 -06001110 if board:
1111 request.build_target.name = board
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001112
Alex Klein1699fab2022-09-08 08:46:06 -06001113 return request
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001114
Alex Klein1699fab2022-09-08 08:46:06 -06001115 def testValidateOnly(self):
1116 """Check that a validate only call does not execute any logic."""
1117 package_mock = self.PatchObject(
1118 packages_service, "determine_android_package"
1119 )
1120 branch_mock = self.PatchObject(
1121 packages_service, "determine_android_branch"
1122 )
1123 version_mock = self.PatchObject(
1124 packages_service, "determine_android_version"
1125 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001126
Alex Klein1699fab2022-09-08 08:46:06 -06001127 request = self._GetRequest(board="betty")
1128 packages_controller.GetAndroidMetadata(
1129 request, self.response, self.validate_only_config
1130 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001131
Alex Klein1699fab2022-09-08 08:46:06 -06001132 package_mock.assert_not_called()
1133 branch_mock.assert_not_called()
1134 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001135
Alex Klein1699fab2022-09-08 08:46:06 -06001136 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -07001137 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -06001138 package_mock = self.PatchObject(
1139 packages_service, "determine_android_package"
1140 )
1141 branch_mock = self.PatchObject(
1142 packages_service, "determine_android_branch"
1143 )
1144 version_mock = self.PatchObject(
1145 packages_service, "determine_android_version"
1146 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001147
Alex Klein1699fab2022-09-08 08:46:06 -06001148 request = self._GetRequest(board="betty")
1149 packages_controller.GetAndroidMetadata(
1150 request, self.response, self.mock_call_config
1151 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001152
Alex Klein1699fab2022-09-08 08:46:06 -06001153 package_mock.assert_not_called()
1154 branch_mock.assert_not_called()
1155 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001156
Alex Klein1699fab2022-09-08 08:46:06 -06001157 self.assertTrue(self.response.android_package)
1158 self.assertTrue(self.response.android_branch)
1159 self.assertTrue(self.response.android_version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001160
Alex Klein1699fab2022-09-08 08:46:06 -06001161 def testNoBuildTargetFails(self):
1162 """No build target argument should fail."""
1163 request = self._GetRequest()
1164 with self.assertRaises(cros_build_lib.DieSystemExit):
1165 packages_controller.GetAndroidMetadata(
1166 request, self.response, self.api_config
1167 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001168
Alex Klein1699fab2022-09-08 08:46:06 -06001169 def testSuccess(self):
1170 """Test a successful call."""
1171 board = "betty"
1172 package = "android-package"
1173 branch = "android-branch"
1174 version = "7123456"
1175 full_package = f"chromeos-base/{package}-{version}-r1"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001176
Alex Klein1699fab2022-09-08 08:46:06 -06001177 package_mock = self.PatchObject(
1178 packages_service,
1179 "determine_android_package",
1180 return_value=full_package,
1181 )
1182 branch_mock = self.PatchObject(
1183 packages_service, "determine_android_branch", return_value=branch
1184 )
1185 version_mock = self.PatchObject(
1186 packages_service, "determine_android_version", return_value=version
1187 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001188
Alex Klein1699fab2022-09-08 08:46:06 -06001189 request = self._GetRequest(board=board)
1190 packages_controller.GetAndroidMetadata(
1191 request, self.response, self.api_config
1192 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001193
Alex Klein1699fab2022-09-08 08:46:06 -06001194 package_mock.assert_called_once_with(board)
1195 branch_mock.assert_called_once_with(board, package=full_package)
1196 version_mock.assert_called_once_with(board, package=full_package)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001197
Alex Klein1699fab2022-09-08 08:46:06 -06001198 self.assertEqual(self.response.android_package, package)
1199 self.assertEqual(self.response.android_branch, branch)
1200 self.assertEqual(self.response.android_version, version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001201
Alex Klein1699fab2022-09-08 08:46:06 -06001202 def testNoAndroid(self):
1203 """Test returns an empty response if given board has no Android."""
1204 board = "betty"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001205
Alex Klein1699fab2022-09-08 08:46:06 -06001206 package_mock = self.PatchObject(
1207 packages_service, "determine_android_package", return_value=None
1208 )
1209 branch_mock = self.PatchObject(
1210 packages_service, "determine_android_branch"
1211 )
1212 version_mock = self.PatchObject(
1213 packages_service, "determine_android_version"
1214 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001215
Alex Klein1699fab2022-09-08 08:46:06 -06001216 request = self._GetRequest(board=board)
1217 packages_controller.GetAndroidMetadata(
1218 request, self.response, self.api_config
1219 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001220
Alex Klein1699fab2022-09-08 08:46:06 -06001221 package_mock.assert_called_once_with(board)
1222 branch_mock.assert_not_called()
1223 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001224
Alex Klein1699fab2022-09-08 08:46:06 -06001225 self.assertFalse(self.response.android_package)
1226 self.assertFalse(self.response.android_branch)
1227 self.assertFalse(self.response.android_version)