blob: 5d37e81ef82d0d6045a63e1675d38d9b2fda8013 [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):
47 """Sanity check that a validate only call does not execute any logic."""
48 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):
58 """Test that a mock call does not execute logic, returns mocked value."""
59 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):
146 """Test that a mock call does not execute logic, returns mocked value."""
147 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):
231 """Sanity check that a validate only call does not execute any logic."""
232 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):
241 """Test that a mock call does not execute logic, returns mocked value."""
242 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):
294 """Sanity check that a validate only call does not execute any logic."""
295 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):
305 """Test that a mock call does not execute logic, returns mocked value."""
306 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):
373 """Test that a mock call does not execute logic, returns mocked value."""
374 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):
572 """Sanity check that a validate only call does not execute any logic."""
573 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):
597 """Test that a mock call does not execute logic, returns mocked value."""
598 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 )
668 package_result = [
669 "sys-kernel/linux-headers-4.14-r24",
670 "sys-devel/flex-2.6.4-r1",
671 "sys-kernel/chromeos-kernel-4_4-4.4.223-r2209",
672 ]
673 self.PatchObject(
674 portage_util, "GetPackageDependencies", return_value=package_result
675 )
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600676
Alex Klein1699fab2022-09-08 08:46:06 -0600677 self.PatchObject(
678 packages_service, "get_firmware_versions", return_value=fw_versions
679 )
680 self.PatchObject(
681 packages_service, "find_fingerprints", return_value=fingerprints
682 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600683
Alex Klein1699fab2022-09-08 08:46:06 -0600684 return android_version_mock, android_branch_mock, android_target_mock
Alex Klein2c3f1682022-08-30 16:52:28 -0600685
Alex Klein1699fab2022-09-08 08:46:06 -0600686 def _patch_get_all_firmware(self, all_fw_versions):
687 """Patch get_all_firmware_versions and related functions."""
688 # Patch packages.get_models, packages.get_all_firmware_versions,
689 # and packages.get_key_id for calls needed by model_metadata.
690 model_list = list(all_fw_versions.keys())
691 self.PatchObject(
692 packages_service,
693 "get_all_firmware_versions",
694 return_value=all_fw_versions,
695 )
696 self.PatchObject(
697 packages_service, "get_models", return_value=model_list
698 )
699 self.PatchObject(packages_service, "get_key_id", return_value="key")
Alex Klein2c3f1682022-08-30 16:52:28 -0600700
Alex Klein1699fab2022-09-08 08:46:06 -0600701 def testNoFirmware(self):
702 """Test no firmware versions handled well."""
703 android_version = "android_test_version"
704 android_branch = "android_test_branch"
705 android_target = "android_test_target"
706 fw_versions = packages_service.FirmwareVersions(
707 None, None, None, None, None
708 )
709 fingerprints = ["fingerprint1", "fingerprint2"]
710 self._patch_all(
711 android_version,
712 android_branch,
713 android_target,
714 fw_versions,
715 fingerprints,
716 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600717
Alex Klein1699fab2022-09-08 08:46:06 -0600718 all_fw_versions = {
719 "pyro": packages_service.FirmwareVersions(
720 "pyro", None, None, None, None
721 ),
722 "reef": packages_service.FirmwareVersions(
723 "reef", None, None, None, None
724 ),
725 }
726 self._patch_get_all_firmware(all_fw_versions)
Alex Klein2c3f1682022-08-30 16:52:28 -0600727
Alex Klein1699fab2022-09-08 08:46:06 -0600728 request = self._GetRequest(board="betty")
729 packages_controller.GetBuilderMetadata(
730 request, self.response, self.api_config
731 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600732
Alex Klein1699fab2022-09-08 08:46:06 -0600733 self.assertFalse(
734 self.response.build_target_metadata[0].main_firmware_version
735 )
736 self.assertFalse(
737 self.response.build_target_metadata[0].ec_firmware_version
738 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600739
Alex Klein1699fab2022-09-08 08:46:06 -0600740 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
741 self.assertFalse(self.response.model_metadata[0].ec_firmware_version)
742 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
743 self.assertFalse(
744 self.response.model_metadata[0].main_readonly_firmware_version
745 )
746 self.assertFalse(
747 self.response.model_metadata[0].main_readwrite_firmware_version
748 )
749 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
750 self.assertFalse(self.response.model_metadata[1].ec_firmware_version)
751 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
752 self.assertFalse(
753 self.response.model_metadata[1].main_readonly_firmware_version
754 )
755 self.assertFalse(
756 self.response.model_metadata[1].main_readwrite_firmware_version
757 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600758
Alex Klein1699fab2022-09-08 08:46:06 -0600759 def testGetBuilderMetadata(self):
760 """Verify basic return values."""
761 android_version = "android_test_version"
762 android_branch = "android_test_branch"
763 android_target = "android_test_target"
764 fw_versions = packages_service.FirmwareVersions(
765 None,
766 "Google_Caroline.7820.263.0",
767 "Google_Caroline.7820.286.0",
768 "caroline_v1.9.357-ac5c7b4",
769 "caroline_v1.9.370-e8b9bd2",
770 )
771 fingerprints = ["fingerprint1", "fingerprint2"]
Alex Klein2c3f1682022-08-30 16:52:28 -0600772
Alex Klein1699fab2022-09-08 08:46:06 -0600773 (
774 android_version_mock,
775 android_branch_mock,
776 android_target_mock,
777 ) = self._patch_all(
778 android_version,
779 android_branch,
780 android_target,
781 fw_versions,
782 fingerprints,
783 )
Alex Klein2c3f1682022-08-30 16:52:28 -0600784
Alex Klein1699fab2022-09-08 08:46:06 -0600785 all_fw_versions = {
786 "pyro": packages_service.FirmwareVersions(
787 "pyro",
788 "Google_Pyro.9042.87.1",
789 "Google_Pyro.9042.110.0",
790 "pyro_v1.1.5900-ab1ee51",
791 "pyro_v1.1.5909-bd1f0c9",
792 ),
793 "reef": packages_service.FirmwareVersions(
794 "reef",
795 "Google_Reef.9042.87.1",
796 "Google_Reef.9042.110.0",
797 "reef_v1.1.5900-ab1ee51",
798 "reef_v1.1.5909-bd1f0c9",
799 ),
800 }
801 self._patch_get_all_firmware(all_fw_versions)
Michael Mortensen770bc122020-05-27 17:53:30 -0600802
Alex Klein1699fab2022-09-08 08:46:06 -0600803 request = self._GetRequest(board="betty")
804 packages_controller.GetBuilderMetadata(
805 request, self.response, self.api_config
806 )
807 self.assertEqual(
808 self.response.build_target_metadata[0].build_target, "betty"
809 )
810 self.assertEqual(
811 self.response.build_target_metadata[0].android_container_version,
812 android_version,
813 )
814 self.assertEqual(
815 self.response.build_target_metadata[0].android_container_branch,
816 android_branch,
817 )
818 self.assertEqual(
819 self.response.build_target_metadata[0].android_container_target,
820 android_target,
821 )
822 self.assertEqual(
823 self.response.build_target_metadata[0].arc_use_set, True
824 )
825 # Verify call to determine_android_version passes list of the board name.
826 android_version_mock.assert_called_with("betty")
827 # Verify call to determine_android_branch passes board name.
828 android_branch_mock.assert_called_with("betty")
829 # Verify call to determine_android_target passes board name.
830 android_target_mock.assert_called_with("betty")
831 self.assertEqual(
832 self.response.build_target_metadata[0].main_firmware_version,
833 "Google_Caroline.7820.286.0",
834 )
835 self.assertEqual(
836 self.response.build_target_metadata[0].ec_firmware_version,
837 "caroline_v1.9.370-e8b9bd2",
838 )
839 self.assertEqual(
840 self.response.build_target_metadata[0].kernel_version,
841 "4.4.223-r2209",
842 )
843 self.assertEqual(
844 len(self.response.build_target_metadata[0].fingerprints), 2
845 )
846 self.assertEqual(
847 self.response.build_target_metadata[0].fingerprints, fingerprints
848 )
849 self.assertEqual(len(self.response.model_metadata), 2)
850 self.assertEqual(self.response.model_metadata[0].model_name, "pyro")
851 self.assertEqual(
852 self.response.model_metadata[0].ec_firmware_version,
853 "pyro_v1.1.5909-bd1f0c9",
854 )
855 self.assertEqual(self.response.model_metadata[0].firmware_key_id, "key")
856 self.assertEqual(
857 self.response.model_metadata[0].main_readonly_firmware_version,
858 "Google_Pyro.9042.87.1",
859 )
860 self.assertEqual(
861 self.response.model_metadata[0].main_readwrite_firmware_version,
862 "Google_Pyro.9042.110.0",
863 )
864 self.assertEqual(self.response.model_metadata[1].model_name, "reef")
865 self.assertEqual(
866 self.response.model_metadata[1].ec_firmware_version,
867 "reef_v1.1.5909-bd1f0c9",
868 )
869 self.assertEqual(self.response.model_metadata[1].firmware_key_id, "key")
870 self.assertEqual(
871 self.response.model_metadata[1].main_readonly_firmware_version,
872 "Google_Reef.9042.87.1",
873 )
874 self.assertEqual(
875 self.response.model_metadata[1].main_readwrite_firmware_version,
876 "Google_Reef.9042.110.0",
877 )
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600878
Alex Klein1699fab2022-09-08 08:46:06 -0600879 # Test corner case where find_fingerprints returns None.
880 # Re-patch find_fingerprints to now return None and re-execute
881 # GetBuilderMetadata to verify behavior.
882 response = packages_pb2.GetBuilderMetadataResponse()
883 self.PatchObject(packages_service, "find_fingerprints", return_value=[])
884 request = self._GetRequest(board="betty")
885 packages_controller.GetBuilderMetadata(
886 request, response, self.api_config
887 )
888 # Verify a non-fingerprint build_target_metdata field was still set.
889 self.assertEqual(
890 response.build_target_metadata[0].kernel_version, "4.4.223-r2209"
891 )
892 # And then verify that fingerprints was empty.
893 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
Michael Mortensend81d81e2020-06-09 14:20:59 -0600894
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600895
Alex Kleinda39c6d2019-09-16 14:36:36 -0600896class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600897 """HasChromePrebuilt tests."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600898
Alex Klein1699fab2022-09-08 08:46:06 -0600899 def setUp(self):
900 self.response = packages_pb2.HasChromePrebuiltResponse()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600901
Alex Klein1699fab2022-09-08 08:46:06 -0600902 def _GetRequest(self, board=None):
903 """Helper to build out a request."""
904 request = packages_pb2.HasChromePrebuiltRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600905
Alex Klein1699fab2022-09-08 08:46:06 -0600906 if board:
907 request.build_target.name = board
Alex Kleinda39c6d2019-09-16 14:36:36 -0600908
Alex Klein1699fab2022-09-08 08:46:06 -0600909 return request
Alex Kleinda39c6d2019-09-16 14:36:36 -0600910
Alex Klein1699fab2022-09-08 08:46:06 -0600911 def testValidateOnly(self):
912 """Sanity check that a validate only call does not execute any logic."""
913 patch = self.PatchObject(packages_service, "has_prebuilt")
Alex Kleinda39c6d2019-09-16 14:36:36 -0600914
Alex Klein1699fab2022-09-08 08:46:06 -0600915 request = self._GetRequest(board="betty")
916 packages_controller.HasChromePrebuilt(
917 request, self.response, self.validate_only_config
918 )
919 patch.assert_not_called()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600920
Alex Klein1699fab2022-09-08 08:46:06 -0600921 def testMockCall(self):
922 """Test that a mock call does not execute logic, returns mocked value."""
923 patch = self.PatchObject(packages_service, "has_prebuilt")
Michael Mortensen3232ab32020-01-05 19:14:36 -0700924
Alex Klein1699fab2022-09-08 08:46:06 -0600925 request = self._GetRequest(board="betty")
926 packages_controller.HasChromePrebuilt(
927 request, self.response, self.mock_call_config
928 )
929 patch.assert_not_called()
930 self.assertTrue(self.response.has_prebuilt)
Michael Mortensen3232ab32020-01-05 19:14:36 -0700931
Alex Klein1699fab2022-09-08 08:46:06 -0600932 def testNoBuildTargetFails(self):
933 """No build target argument should fail."""
934 request = self._GetRequest()
Alex Kleinda39c6d2019-09-16 14:36:36 -0600935
Alex Klein1699fab2022-09-08 08:46:06 -0600936 with self.assertRaises(cros_build_lib.DieSystemExit):
937 packages_controller.HasChromePrebuilt(
938 request, self.response, self.api_config
939 )
Alex Klein73fb6572019-09-30 16:55:23 -0600940
941
942class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600943 """BuildsChrome tests."""
Alex Klein73fb6572019-09-30 16:55:23 -0600944
Alex Klein1699fab2022-09-08 08:46:06 -0600945 def setUp(self):
946 self.response = packages_pb2.BuildsChromeResponse()
Alex Klein73fb6572019-09-30 16:55:23 -0600947
Alex Klein1699fab2022-09-08 08:46:06 -0600948 def _GetRequest(self, board=None, packages=None):
949 """Helper to build out a request."""
950 request = packages_pb2.BuildsChromeRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600951
Alex Klein1699fab2022-09-08 08:46:06 -0600952 if board:
953 request.build_target.name = board
Alex Klein73fb6572019-09-30 16:55:23 -0600954
Alex Klein1699fab2022-09-08 08:46:06 -0600955 if packages:
956 request.packages.extend(packages)
David Burger0f9dd4e2019-10-08 12:33:42 -0600957
Alex Klein1699fab2022-09-08 08:46:06 -0600958 return request
Alex Klein73fb6572019-09-30 16:55:23 -0600959
Alex Klein1699fab2022-09-08 08:46:06 -0600960 def testValidateOnly(self):
961 """Sanity check that a validate only call does not execute any logic."""
962 patch = self.PatchObject(packages_service, "builds")
Alex Klein73fb6572019-09-30 16:55:23 -0600963
Alex Klein1699fab2022-09-08 08:46:06 -0600964 request = self._GetRequest(board="betty")
965 packages_controller.BuildsChrome(
966 request, self.response, self.validate_only_config
967 )
968 patch.assert_not_called()
Alex Klein73fb6572019-09-30 16:55:23 -0600969
Alex Klein1699fab2022-09-08 08:46:06 -0600970 def testNoBuildTargetFails(self):
971 """No build target argument should fail."""
972 request = self._GetRequest()
Alex Klein73fb6572019-09-30 16:55:23 -0600973
Alex Klein1699fab2022-09-08 08:46:06 -0600974 with self.assertRaises(cros_build_lib.DieSystemExit):
975 packages_controller.BuildsChrome(
976 request, self.response, self.api_config
977 )
Alex Kleine65131f2019-10-03 10:34:01 -0600978
Alex Klein1699fab2022-09-08 08:46:06 -0600979 def testBuilds(self):
980 """Test successful call handling."""
981 patch = self.PatchObject(packages_service, "builds", return_value=True)
Alex Kleine65131f2019-10-03 10:34:01 -0600982
Alex Klein1699fab2022-09-08 08:46:06 -0600983 request = self._GetRequest(board="foo")
984 packages_controller.BuildsChrome(
985 request, self.response, self.api_config
986 )
987 self.assertTrue(self.response.builds_chrome)
988 patch.assert_called_once_with(
989 constants.CHROME_CP, build_target_lib.BuildTarget("foo"), []
990 )
David Burger0f9dd4e2019-10-08 12:33:42 -0600991
Alex Klein1699fab2022-09-08 08:46:06 -0600992 def testBuildsChromeWithPackages(self):
993 """Test successful call with packages handling."""
994 patch = self.PatchObject(packages_service, "builds", return_value=True)
David Burger0f9dd4e2019-10-08 12:33:42 -0600995
Alex Klein1699fab2022-09-08 08:46:06 -0600996 package = common_pb2.PackageInfo(
997 category="category",
998 package_name="name",
999 version="1.01",
1000 )
1001 request = self._GetRequest(board="foo", packages=[package])
1002 packages_controller.BuildsChrome(
1003 request, self.response, self.api_config
1004 )
1005 self.assertTrue(self.response.builds_chrome)
1006 patch.assert_called_once_with(
1007 constants.CHROME_CP,
1008 build_target_lib.BuildTarget("foo"),
1009 [controller_util.PackageInfoToCPV(package)],
1010 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001011
1012
Alex Klein9ce3f682021-06-23 15:06:44 -06001013class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001014 """NeedsChromeSource tests."""
Alex Klein9ce3f682021-06-23 15:06:44 -06001015
Alex Klein1699fab2022-09-08 08:46:06 -06001016 def setUp(self):
1017 self.response = packages_pb2.NeedsChromeSourceResponse()
Alex Klein9ce3f682021-06-23 15:06:44 -06001018
Alex Klein1699fab2022-09-08 08:46:06 -06001019 self.board = "board"
1020 self.sysroot = self.tempdir
Alex Klein9ce3f682021-06-23 15:06:44 -06001021
Alex Klein1699fab2022-09-08 08:46:06 -06001022 def _GetRequest(self, compile_source=False):
1023 """Helper to build a request."""
1024 request = packages_pb2.NeedsChromeSourceRequest()
Alex Klein9ce3f682021-06-23 15:06:44 -06001025
Alex Klein1699fab2022-09-08 08:46:06 -06001026 request.install_request.sysroot.path = str(self.sysroot)
1027 request.install_request.sysroot.build_target.name = self.board
1028 request.install_request.flags.compile_source = compile_source
Alex Klein9ce3f682021-06-23 15:06:44 -06001029
Alex Klein1699fab2022-09-08 08:46:06 -06001030 return request
Alex Klein9ce3f682021-06-23 15:06:44 -06001031
Alex Klein1699fab2022-09-08 08:46:06 -06001032 def testAll(self):
1033 """Reason translation test."""
1034 result = packages_service.NeedsChromeSourceResult(
1035 needs_chrome_source=True,
1036 builds_chrome=True,
1037 packages=[package_info.parse("cat/pkg")],
1038 missing_chrome_prebuilt=True,
1039 missing_follower_prebuilt=True,
1040 local_uprev=True,
1041 )
1042 self.PatchObject(
1043 packages_service, "needs_chrome_source", return_value=result
1044 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001045
Alex Klein1699fab2022-09-08 08:46:06 -06001046 packages_controller.NeedsChromeSource(
1047 self._GetRequest(compile_source=True),
1048 self.response,
1049 self.api_config,
1050 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001051
Alex Klein1699fab2022-09-08 08:46:06 -06001052 self.assertIn(
1053 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1054 self.response.reasons,
1055 )
1056 self.assertIn(
1057 packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
1058 self.response.reasons,
1059 )
1060 self.assertIn(
1061 packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
1062 self.response.reasons,
1063 )
1064 self.assertIn(
1065 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
1066 self.response.reasons,
1067 )
1068 self.assertIn(
1069 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1070 self.response.reasons,
1071 )
1072 self.assertIn(
1073 packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
1074 self.response.reasons,
1075 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001076
Alex Klein1699fab2022-09-08 08:46:06 -06001077 self.assertEqual(1, len(self.response.packages))
1078 self.assertEqual(
1079 ("cat", "pkg"),
1080 (
1081 self.response.packages[0].category,
1082 self.response.packages[0].package_name,
1083 ),
1084 )
Alex Klein9ce3f682021-06-23 15:06:44 -06001085
1086
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001087class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -06001088 """GetAndroidMetadata tests."""
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001089
Alex Klein1699fab2022-09-08 08:46:06 -06001090 def setUp(self):
1091 self.response = packages_pb2.GetAndroidMetadataResponse()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001092
Alex Klein1699fab2022-09-08 08:46:06 -06001093 def _GetRequest(self, board=None):
1094 """Helper to build out a request."""
1095 request = packages_pb2.GetAndroidMetadataRequest()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001096
Alex Klein1699fab2022-09-08 08:46:06 -06001097 if board:
1098 request.build_target.name = board
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001099
Alex Klein1699fab2022-09-08 08:46:06 -06001100 return request
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001101
Alex Klein1699fab2022-09-08 08:46:06 -06001102 def testValidateOnly(self):
1103 """Check that a validate only call does not execute any logic."""
1104 package_mock = self.PatchObject(
1105 packages_service, "determine_android_package"
1106 )
1107 branch_mock = self.PatchObject(
1108 packages_service, "determine_android_branch"
1109 )
1110 version_mock = self.PatchObject(
1111 packages_service, "determine_android_version"
1112 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001113
Alex Klein1699fab2022-09-08 08:46:06 -06001114 request = self._GetRequest(board="betty")
1115 packages_controller.GetAndroidMetadata(
1116 request, self.response, self.validate_only_config
1117 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001118
Alex Klein1699fab2022-09-08 08:46:06 -06001119 package_mock.assert_not_called()
1120 branch_mock.assert_not_called()
1121 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001122
Alex Klein1699fab2022-09-08 08:46:06 -06001123 def testMockCall(self):
1124 """Test that a mock call does not execute logic, returns mocked value."""
1125 package_mock = self.PatchObject(
1126 packages_service, "determine_android_package"
1127 )
1128 branch_mock = self.PatchObject(
1129 packages_service, "determine_android_branch"
1130 )
1131 version_mock = self.PatchObject(
1132 packages_service, "determine_android_version"
1133 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001134
Alex Klein1699fab2022-09-08 08:46:06 -06001135 request = self._GetRequest(board="betty")
1136 packages_controller.GetAndroidMetadata(
1137 request, self.response, self.mock_call_config
1138 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001139
Alex Klein1699fab2022-09-08 08:46:06 -06001140 package_mock.assert_not_called()
1141 branch_mock.assert_not_called()
1142 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001143
Alex Klein1699fab2022-09-08 08:46:06 -06001144 self.assertTrue(self.response.android_package)
1145 self.assertTrue(self.response.android_branch)
1146 self.assertTrue(self.response.android_version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001147
Alex Klein1699fab2022-09-08 08:46:06 -06001148 def testNoBuildTargetFails(self):
1149 """No build target argument should fail."""
1150 request = self._GetRequest()
1151 with self.assertRaises(cros_build_lib.DieSystemExit):
1152 packages_controller.GetAndroidMetadata(
1153 request, self.response, self.api_config
1154 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001155
Alex Klein1699fab2022-09-08 08:46:06 -06001156 def testSuccess(self):
1157 """Test a successful call."""
1158 board = "betty"
1159 package = "android-package"
1160 branch = "android-branch"
1161 version = "7123456"
1162 full_package = f"chromeos-base/{package}-{version}-r1"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001163
Alex Klein1699fab2022-09-08 08:46:06 -06001164 package_mock = self.PatchObject(
1165 packages_service,
1166 "determine_android_package",
1167 return_value=full_package,
1168 )
1169 branch_mock = self.PatchObject(
1170 packages_service, "determine_android_branch", return_value=branch
1171 )
1172 version_mock = self.PatchObject(
1173 packages_service, "determine_android_version", return_value=version
1174 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001175
Alex Klein1699fab2022-09-08 08:46:06 -06001176 request = self._GetRequest(board=board)
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 package_mock.assert_called_once_with(board)
1182 branch_mock.assert_called_once_with(board, package=full_package)
1183 version_mock.assert_called_once_with(board, package=full_package)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001184
Alex Klein1699fab2022-09-08 08:46:06 -06001185 self.assertEqual(self.response.android_package, package)
1186 self.assertEqual(self.response.android_branch, branch)
1187 self.assertEqual(self.response.android_version, version)
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001188
Alex Klein1699fab2022-09-08 08:46:06 -06001189 def testNoAndroid(self):
1190 """Test returns an empty response if given board has no Android."""
1191 board = "betty"
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001192
Alex Klein1699fab2022-09-08 08:46:06 -06001193 package_mock = self.PatchObject(
1194 packages_service, "determine_android_package", return_value=None
1195 )
1196 branch_mock = self.PatchObject(
1197 packages_service, "determine_android_branch"
1198 )
1199 version_mock = self.PatchObject(
1200 packages_service, "determine_android_version"
1201 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001202
Alex Klein1699fab2022-09-08 08:46:06 -06001203 request = self._GetRequest(board=board)
1204 packages_controller.GetAndroidMetadata(
1205 request, self.response, self.api_config
1206 )
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001207
Alex Klein1699fab2022-09-08 08:46:06 -06001208 package_mock.assert_called_once_with(board)
1209 branch_mock.assert_not_called()
1210 version_mock.assert_not_called()
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +09001211
Alex Klein1699fab2022-09-08 08:46:06 -06001212 self.assertFalse(self.response.android_package)
1213 self.assertFalse(self.response.android_branch)
1214 self.assertFalse(self.response.android_version)