blob: 2cd9f84fcf4963e39e416a62f8e84b3850d57fdc [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -06001# Copyright 2019 The Chromium OS Authors. All rights reserved.
2# 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
Alex Kleinda39c6d2019-09-16 14:36:36 -06007from chromite.api.api_config import ApiConfigMixin
David Burger0f9dd4e2019-10-08 12:33:42 -06008from chromite.api.controller import controller_util
Alex Kleineb77ffa2019-05-28 14:47:44 -06009from chromite.api.controller import packages as packages_controller
David Burger0f9dd4e2019-10-08 12:33:42 -060010from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060011from chromite.api.gen.chromite.api import binhost_pb2
12from chromite.api.gen.chromite.api import packages_pb2
Chris McDonald38409112020-09-24 11:24:51 -060013from chromite.lib import build_target_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060014from chromite.lib import constants
15from chromite.lib import cros_build_lib
16from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060017from chromite.lib import portage_util
Chris McDonald38409112020-09-24 11:24:51 -060018from chromite.lib import uprev_lib
Alex Klein75df1792020-06-11 14:42:49 -060019from chromite.lib.parser import package_info
Alex Kleineb77ffa2019-05-28 14:47:44 -060020from chromite.service import packages as packages_service
Mike Frysinger40ffb532021-02-12 07:36:08 -050021from chromite.third_party import mock
Alex Kleineb77ffa2019-05-28 14:47:44 -060022
23
Alex Kleinda39c6d2019-09-16 14:36:36 -060024class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060025 """Uprev tests."""
26
27 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
28 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
29 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
30 _NONE = binhost_pb2.OVERLAYTYPE_NONE
31
32 def setUp(self):
33 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060034 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060035
36 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
37 return packages_pb2.UprevPackagesRequest(
38 build_targets=[{'name': name} for name in targets or []],
39 overlay_type=overlay_type,
40 output_dir=output_dir,
41 )
42
Alex Klein231d2da2019-07-22 16:44:45 -060043 def testValidateOnly(self):
44 """Sanity check that a validate only call does not execute any logic."""
45 patch = self.PatchObject(packages_service, 'uprev_build_targets')
46
47 targets = ['foo', 'bar']
48 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
49 packages_controller.Uprev(request, self.response, self.validate_only_config)
50 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060051
Michael Mortensen2677bf62019-10-29 08:31:25 -060052 def testMockCall(self):
53 """Test that a mock call does not execute logic, returns mocked value."""
54 patch = self.PatchObject(packages_service, 'uprev_build_targets')
55 targets = ['foo', 'bar']
56 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
57 packages_controller.Uprev(request, self.response, self.mock_call_config)
58 patch.assert_not_called()
59 self.assertTrue(self.response.modified_ebuilds)
60
Alex Kleineb77ffa2019-05-28 14:47:44 -060061 def testNoOverlayTypeFails(self):
62 """No overlay type provided should fail."""
63 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060064
65 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060066 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060067
68 def testOverlayTypeNoneFails(self):
69 """Overlay type none means nothing here and should fail."""
70 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060071
72 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060073 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060074
75 def testSuccess(self):
76 """Test overall successful argument handling."""
77 targets = ['foo', 'bar']
78 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060079 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060080 expected_type = constants.BOTH_OVERLAYS
81 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
82 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060083 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
84 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060085
Alex Klein231d2da2019-07-22 16:44:45 -060086 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060087
88 # Make sure the type is right, verify build targets after.
89 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
90 output_dir)
91 # First argument (build targets) of the first (only) call.
92 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040093 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060094
Alex Klein231d2da2019-07-22 16:44:45 -060095 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060096 self.assertIn(ebuild.path, changed)
97 changed.remove(ebuild.path)
98 self.assertFalse(changed)
99
David Burger1e0fe232019-07-01 14:52:07 -0600100
Alex Kleinda39c6d2019-09-16 14:36:36 -0600101class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -0600102 """UprevVersionedPackage tests."""
103
104 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -0600105 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600106
107 def _addVersion(self, request, version):
108 """Helper method to add a full version message to the request."""
109 ref = request.versions.add()
110 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600111 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600112 ref.revision = 'abc123'
113
114 def testValidateOnly(self):
115 """Sanity check validate only calls are working properly."""
116 service = self.PatchObject(packages_service, 'uprev_versioned_package')
117
118 request = packages_pb2.UprevVersionedPackageRequest()
119 self._addVersion(request, '1.2.3.4')
120 request.package_info.category = 'chromeos-base'
121 request.package_info.package_name = 'chromeos-chrome'
122
123 packages_controller.UprevVersionedPackage(request, self.response,
124 self.validate_only_config)
125
126 service.assert_not_called()
127
Michael Mortensen2677bf62019-10-29 08:31:25 -0600128 def testMockCall(self):
129 """Test that a mock call does not execute logic, returns mocked value."""
130 patch = self.PatchObject(packages_service, 'uprev_versioned_package')
131 request = packages_pb2.UprevVersionedPackageRequest()
132 packages_controller.UprevVersionedPackage(request, self.response,
133 self.mock_call_config)
134 patch.assert_not_called()
135 self.assertTrue(self.response.responses)
136 self.assertTrue(self.response.responses[0].modified_ebuilds)
137
Alex Klein87531182019-08-12 15:23:37 -0600138 def testNoVersions(self):
139 """Test no versions provided."""
140 request = packages_pb2.UprevVersionedPackageRequest()
141 request.package_info.category = 'chromeos-base'
142 request.package_info.package_name = 'chromeos-chrome'
143
144 with self.assertRaises(cros_build_lib.DieSystemExit):
145 packages_controller.UprevVersionedPackage(request, self.response,
146 self.api_config)
147
148 def testNoPackageName(self):
149 """Test no package name provided."""
150 request = packages_pb2.UprevVersionedPackageRequest()
151 self._addVersion(request, '1.2.3.4')
152 request.package_info.category = 'chromeos-base'
153
154 with self.assertRaises(cros_build_lib.DieSystemExit):
155 packages_controller.UprevVersionedPackage(request, self.response,
156 self.api_config)
157
158 def testNoCategory(self):
159 """Test no package category provided."""
160 request = packages_pb2.UprevVersionedPackageRequest()
161 self._addVersion(request, '1.2.3.4')
162 request.package_info.package_name = 'chromeos-chrome'
163
164 with self.assertRaises(cros_build_lib.DieSystemExit):
165 packages_controller.UprevVersionedPackage(request, self.response,
166 self.api_config)
167
168 def testOutputHandling(self):
169 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600170 version = '1.2.3.4'
Chris McDonald38409112020-09-24 11:24:51 -0600171 result = uprev_lib.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600172 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600173
Alex Klein34afcbc2019-08-22 16:14:31 -0600174 self.PatchObject(
175 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600176
177 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600178 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600179 request.package_info.category = 'chromeos-base'
180 request.package_info.package_name = 'chromeos-chrome'
181
182 packages_controller.UprevVersionedPackage(request, self.response,
183 self.api_config)
184
Yaakov Shaul730814a2019-09-10 13:58:25 -0600185 for idx, uprev_response in enumerate(self.response.responses):
186 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400187 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600188 result.modified[idx].files,
189 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600190
191
Alex Kleinda39c6d2019-09-16 14:36:36 -0600192class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600193 """GetBestVisible tests."""
194
Alex Klein231d2da2019-07-22 16:44:45 -0600195 def setUp(self):
196 self.response = packages_pb2.GetBestVisibleResponse()
197
David Burger1e0fe232019-07-01 14:52:07 -0600198 def _GetRequest(self, atom=None):
199 return packages_pb2.GetBestVisibleRequest(
200 atom=atom,
201 )
202
David Burger1e0fe232019-07-01 14:52:07 -0600203 def _MakeCpv(self, category, package, version):
204 unused = {
205 'cp': None,
206 'cpv': None,
207 'cpf': None,
208 'pv': None,
209 'version_no_rev': None,
210 'rev': None,
211 }
Alex Klein75df1792020-06-11 14:42:49 -0600212 return package_info.CPV(
David Burger1e0fe232019-07-01 14:52:07 -0600213 category=category,
214 package=package,
215 version=version,
216 **unused
217 )
218
Alex Klein231d2da2019-07-22 16:44:45 -0600219 def testValidateOnly(self):
220 """Sanity check that a validate only call does not execute any logic."""
221 patch = self.PatchObject(packages_service, 'get_best_visible')
222
223 request = self._GetRequest(atom='chromeos-chrome')
224 packages_controller.GetBestVisible(request, self.response,
225 self.validate_only_config)
226 patch.assert_not_called()
227
Michael Mortensen2677bf62019-10-29 08:31:25 -0600228 def testMockCall(self):
229 """Test that a mock call does not execute logic, returns mocked value."""
230 patch = self.PatchObject(packages_service, 'get_best_visible')
231 request = self._GetRequest(atom='chromeos-chrome')
232 packages_controller.GetBestVisible(request, self.response,
233 self.mock_call_config)
234 patch.assert_not_called()
235 self.assertTrue(self.response.package_info)
236 self.assertTrue(self.response.package_info.category)
237 self.assertTrue(self.response.package_info.package_name)
238 self.assertTrue(self.response.package_info.version)
239
David Burger1e0fe232019-07-01 14:52:07 -0600240 def testNoAtomFails(self):
241 """No atom provided should fail."""
242 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600243 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600244 packages_controller.GetBestVisible(request, self.response,
245 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600246
247 def testSuccess(self):
248 """Test overall success, argument handling, result forwarding."""
249 cpv = self._MakeCpv('category', 'package', 'version')
250 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
251
252 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600253
Alex Klein231d2da2019-07-22 16:44:45 -0600254 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600255
Alex Klein75df1792020-06-11 14:42:49 -0600256 package_info_msg = self.response.package_info
257 self.assertEqual(package_info_msg.category, cpv.category)
258 self.assertEqual(package_info_msg.package_name, cpv.package)
259 self.assertEqual(package_info_msg.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600260
261
Michael Mortensen68abdb72019-10-28 09:43:52 -0600262class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
263 """GetChromeVersion tests."""
264
265 def setUp(self):
266 self.response = packages_pb2.GetChromeVersionResponse()
267
268 def _GetRequest(self, board=None):
269 """Helper to build out a request."""
270 request = packages_pb2.GetChromeVersionRequest()
271
272 if board:
273 request.build_target.name = board
274
275 return request
276
277 def testValidateOnly(self):
278 """Sanity check that a validate only call does not execute any logic."""
279 chrome_version = self.PatchObject(packages_service,
280 'determine_chrome_version')
281 request = self._GetRequest(board='betty')
282 packages_controller.GetChromeVersion(request, self.response,
283 self.validate_only_config)
284 chrome_version.assert_not_called()
285
286 def testMockCall(self):
287 """Test that a mock call does not execute logic, returns mocked value."""
288 chrome_version = self.PatchObject(packages_service,
289 'determine_chrome_version')
290 request = self._GetRequest(board='betty')
291 packages_controller.GetChromeVersion(request, self.response,
292 self.mock_call_config)
293 chrome_version.assert_not_called()
294 self.assertTrue(self.response.version)
295
296 def testGetChromeVersion(self):
297 """Verify basic return values."""
298 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600299 chrome_version_mock = self.PatchObject(packages_service,
300 'determine_chrome_version',
301 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600302 request = self._GetRequest(board='betty')
303 packages_controller.GetChromeVersion(request, self.response,
304 self.api_config)
305 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600306 # Verify call to determine_chrome_version passes a build_target object.
307 build_target = build_target_lib.BuildTarget('betty')
308 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600309
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600310 def testGetChromeVersionHandleNone(self):
311 """Verify basic return values."""
312 self.PatchObject(packages_service, 'determine_chrome_version',
313 return_value=None)
314 request = self._GetRequest(board='betty')
315 packages_controller.GetChromeVersion(request, self.response,
316 self.api_config)
317 self.assertFalse(self.response.version)
318
Michael Mortensen68abdb72019-10-28 09:43:52 -0600319
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600320class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
321 """GetTargetVersions tests."""
322
323 def setUp(self):
324 self.response = packages_pb2.GetTargetVersionsResponse()
325
326 def _GetRequest(self, board=None):
327 """Helper to build out a request."""
328 request = packages_pb2.GetTargetVersionsRequest()
329
330 if board:
331 request.build_target.name = board
332
333 return request
334
335 def testValidateOnly(self):
336 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600337 builds_chrome = self.PatchObject(
338 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600339 patch_version = self.PatchObject(packages_service,
340 'determine_android_version')
341 patch_branch_version = self.PatchObject(packages_service,
342 'determine_android_branch')
343 patch_target_version = self.PatchObject(packages_service,
344 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600345 chrome_version = self.PatchObject(packages_service,
346 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600347 platform_version = self.PatchObject(packages_service,
348 'determine_platform_version')
349 milestone_version = self.PatchObject(packages_service,
350 'determine_milestone_version')
351 full_version = self.PatchObject(packages_service,
352 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600353
354 request = self._GetRequest(board='betty')
355 packages_controller.GetTargetVersions(request, self.response,
356 self.validate_only_config)
357 patch_version.assert_not_called()
358 patch_branch_version.assert_not_called()
359 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600360 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600361 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600362 platform_version.assert_not_called()
363 milestone_version.assert_not_called()
364 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600365
Michael Mortensen2677bf62019-10-29 08:31:25 -0600366 def testMockCall(self):
367 """Test that a mock call does not execute logic, returns mocked value."""
368 builds_chrome = self.PatchObject(
369 packages_service, 'builds', return_value=True)
370 patch_version = self.PatchObject(packages_service,
371 'determine_android_version')
372 patch_branch_version = self.PatchObject(packages_service,
373 'determine_android_branch')
374 patch_target_version = self.PatchObject(packages_service,
375 'determine_android_target')
376 chrome_version = self.PatchObject(packages_service,
377 'determine_chrome_version')
378 platform_version = self.PatchObject(packages_service,
379 'determine_platform_version')
380 milestone_version = self.PatchObject(packages_service,
381 'determine_milestone_version')
382 full_version = self.PatchObject(packages_service,
383 'determine_full_version')
384
385 request = self._GetRequest(board='betty')
386 packages_controller.GetTargetVersions(request, self.response,
387 self.mock_call_config)
388
389 patch_version.assert_not_called()
390 patch_branch_version.assert_not_called()
391 patch_target_version.assert_not_called()
392 builds_chrome.assert_not_called()
393 chrome_version.assert_not_called()
394 platform_version.assert_not_called()
395 milestone_version.assert_not_called()
396 full_version.assert_not_called()
397
398 self.assertTrue(self.response.android_version)
399 self.assertTrue(self.response.android_branch_version)
400 self.assertTrue(self.response.android_target_version)
401 self.assertTrue(self.response.chrome_version)
402 self.assertTrue(self.response.platform_version)
403 self.assertTrue(self.response.milestone_version)
404 self.assertTrue(self.response.full_version)
405
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600406 def testNoBuildTargetFails(self):
407 """No build target argument should fail."""
408 request = self._GetRequest()
409
410 with self.assertRaises(cros_build_lib.DieSystemExit):
411 packages_controller.GetTargetVersions(request, self.response,
412 self.api_config)
413
Michael Mortensenc2615b72019-10-15 08:12:24 -0600414 def testGetTargetVersions(self):
415 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600416 # Mock that chrome is built and set the chrome_version.
417 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600418 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600419 chrome_version_mock = self.PatchObject(packages_service,
420 'determine_chrome_version',
421 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500422 android_package = 'chromeos-base/android-container-pi-10.3'
423 self.PatchObject(packages_service, 'determine_android_package',
424 return_value=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600425 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600426 android_branch_mock = self.PatchObject(packages_service,
427 'determine_android_branch',
428 return_value=android_branch)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600429 platform_version = '12345.1.2'
430 self.PatchObject(packages_service, 'determine_platform_version',
431 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600432 milestone_version = '79'
433 self.PatchObject(packages_service, 'determine_milestone_version',
434 return_value=milestone_version)
435 full_version = 'R79-12345.1.2'
436 self.PatchObject(packages_service, 'determine_full_version',
437 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600438 request = self._GetRequest(board='betty')
439 packages_controller.GetTargetVersions(request, self.response,
440 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500441 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600442 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500443 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600444 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600445 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600446 self.assertEqual(self.response.milestone_version, milestone_version)
447 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600448 # Verify call to determine_chrome_version passes a build_target object.
449 build_target = build_target_lib.BuildTarget('betty')
450 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600451 # Verify call to determine_android_branch passes a board name.
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500452 android_branch_mock.assert_called_with('betty', package=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600453
Michael Mortensen42c330e32020-09-02 09:59:16 -0600454 def testGetTargetVersionsWithPackagesSet(self):
455 """Verify packages pass through and basic return values."""
456 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
457 # rather than mocking the boundary to portage calls such as
458 # packages_service.builds).
459 builds_mock = self.PatchObject(packages_service, 'builds',
460 return_value=True)
461 # Mock that chrome is built and set the chrome_version.
462 chrome_version = '76.0.1.2'
463 self.PatchObject(packages_service, 'determine_chrome_version',
464 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500465 android_package = 'chromeos-base/android-container-pi-10.3'
466 self.PatchObject(packages_service, 'determine_android_package',
467 return_value=android_package)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600468 android_branch = 'android_test_branch'
469 self.PatchObject(packages_service, 'determine_android_branch',
470 return_value=android_branch)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600471 platform_version = '12345.1.2'
472 self.PatchObject(packages_service, 'determine_platform_version',
473 return_value=platform_version)
474 milestone_version = '79'
475 self.PatchObject(packages_service, 'determine_milestone_version',
476 return_value=milestone_version)
477 full_version = 'R79-12345.1.2'
478 self.PatchObject(packages_service, 'determine_full_version',
479 return_value=full_version)
480 request = self._GetRequest(board='betty')
481 # Add optional packages to the request.
482 cpv_package_list = []
483 package = request.packages.add()
484 package.package_name = 'test'
485 package.category = 'chromeos-base'
486 package.version = '0.0.1-r1'
487 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
488 package = request.packages.add()
489 package.package_name = 'target-fuzzers'
490 package.category = 'virtual'
491 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
492
493 packages_controller.GetTargetVersions(request, self.response,
494 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500495 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600496 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500497 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600498 self.assertEqual(self.response.chrome_version, chrome_version)
499 self.assertEqual(self.response.platform_version, platform_version)
500 self.assertEqual(self.response.milestone_version, milestone_version)
501 # Verify call to packages.builds passes the package list.
502 builds_mock.assert_called_with(constants.CHROME_CP,
503 mock.ANY, # Match the build target object
504 packages=cpv_package_list)
505
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600506 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600507 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600508 platform_version = '12345.1.2'
509 self.PatchObject(packages_service, 'determine_platform_version',
510 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600511 self.PatchObject(packages_service, 'builds', return_value=False)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500512 self.PatchObject(packages_service, 'determine_android_package',
Michael Mortensenedf76532019-10-16 14:22:37 -0600513 return_value=None)
514 request = self._GetRequest(board='betty')
515 packages_controller.GetTargetVersions(request, self.response,
516 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600517 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600518 self.assertFalse(self.response.android_version)
519 self.assertFalse(self.response.android_branch_version)
520 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600521 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600522
Michael Mortensenbfc56392020-04-30 15:23:47 -0600523
524class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
525 """GetBuilderMetadata tests."""
526
527 def setUp(self):
528 self.response = packages_pb2.GetBuilderMetadataResponse()
529
530 def _GetRequest(self, board=None):
531 """Helper to build out a request."""
532 request = packages_pb2.GetBuilderMetadataRequest()
533
534 if board:
535 request.build_target.name = board
536
537 return request
538
539 def testValidateOnly(self):
540 """Sanity check that a validate only call does not execute any logic."""
541 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600542 patch_version = self.PatchObject(packages_service,
543 'determine_android_version')
544 patch_branch_version = self.PatchObject(packages_service,
545 'determine_android_branch')
546 patch_fw_versions = self.PatchObject(packages_service,
547 'determine_firmware_versions')
548 patch_fingerprints = self.PatchObject(packages_service,
549 'find_fingerprints')
550 patch_get_models = self.PatchObject(packages_service,
551 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600552 packages_controller.GetBuilderMetadata(request, self.response,
553 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600554 patch_version.assert_not_called()
555 patch_branch_version.assert_not_called()
556 patch_fw_versions.assert_not_called()
557 patch_fingerprints.assert_not_called()
558 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600559
560 def testMockCall(self):
561 """Test that a mock call does not execute logic, returns mocked value."""
562 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600563 patch_version = self.PatchObject(packages_service,
564 'determine_android_version')
565 patch_branch_version = self.PatchObject(packages_service,
566 'determine_android_branch')
567 patch_fw_versions = self.PatchObject(packages_service,
568 'determine_firmware_versions')
569 patch_fingerprints = self.PatchObject(packages_service,
570 'find_fingerprints')
571 patch_get_models = self.PatchObject(packages_service,
572 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600573 packages_controller.GetBuilderMetadata(request, self.response,
574 self.mock_call_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600575 patch_version.assert_not_called()
576 patch_branch_version.assert_not_called()
577 patch_fw_versions.assert_not_called()
578 patch_fingerprints.assert_not_called()
579 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600580
581 self.assertEqual(len(self.response.build_target_metadata), 1)
582 self.assertEqual(self.response.build_target_metadata[0].build_target,
583 request.build_target.name)
584 self.assertEqual(len(self.response.model_metadata), 1)
585 self.assertTrue(self.response.model_metadata[0].model_name)
586 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
587
588 def testNoBuildTargetFails(self):
589 """No build target argument should fail."""
590 request = self._GetRequest()
591
592 with self.assertRaises(cros_build_lib.DieSystemExit):
593 packages_controller.GetBuilderMetadata(request, self.response,
594 self.api_config)
595
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600596 def testGetBuilderMetadata(self):
597 """Verify basic return values."""
598 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600599 android_version_mock = self.PatchObject(packages_service,
600 'determine_android_version',
601 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600602 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600603 android_branch_mock = self.PatchObject(packages_service,
604 'determine_android_branch',
605 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600606 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600607 android_target_mock = self.PatchObject(packages_service,
608 'determine_android_target',
609 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600610 self.PatchObject(portage_util, 'GetBoardUseFlags',
611 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600612 package_result = ['sys-kernel/linux-headers-4.14-r24',
613 'sys-devel/flex-2.6.4-r1',
614 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
615 self.PatchObject(portage_util, 'GetPackageDependencies',
616 return_value=package_result)
617
Michael Mortensena4af79e2020-05-06 16:18:48 -0600618 fw_versions = packages_service.FirmwareVersions(
619 None,
620 'Google_Caroline.7820.263.0',
621 'Google_Caroline.7820.286.0',
622 'caroline_v1.9.357-ac5c7b4',
623 'caroline_v1.9.370-e8b9bd2')
624 self.PatchObject(packages_service, 'get_firmware_versions',
625 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600626 fingerprints = ['fingerprint1', 'fingerprint2']
627 self.PatchObject(packages_service, 'find_fingerprints',
628 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600629 # Patch packages.get_models, packages.get_all_firmware_versions,
630 # and packages.get_key_id for calls needed by model_metadata.
631 model_list = ['pyro', 'reef']
632 all_fw_versions = {
633 'pyro': packages_service.FirmwareVersions(
634 'pyro',
635 'Google_Pyro.9042.87.1',
636 'Google_Pyro.9042.110.0',
637 'pyro_v1.1.5900-ab1ee51',
638 'pyro_v1.1.5909-bd1f0c9'),
639 'reef': packages_service.FirmwareVersions(
640 'reef',
641 'Google_Reef.9042.87.1',
642 'Google_Reef.9042.110.0',
643 'reef_v1.1.5900-ab1ee51',
644 'reef_v1.1.5909-bd1f0c9')
645 }
646 self.PatchObject(packages_service, 'get_all_firmware_versions',
647 return_value=all_fw_versions)
648 self.PatchObject(packages_service, 'get_models',
649 return_value=model_list)
650 self.PatchObject(packages_service, 'get_key_id',
651 return_value='key')
652
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600653 request = self._GetRequest(board='betty')
654 packages_controller.GetBuilderMetadata(request, self.response,
655 self.api_config)
656 self.assertEqual(
657 self.response.build_target_metadata[0].build_target,
658 'betty')
659 self.assertEqual(
660 self.response.build_target_metadata[0].android_container_version,
661 android_version)
662 self.assertEqual(
663 self.response.build_target_metadata[0].android_container_branch,
664 android_branch)
665 self.assertEqual(
666 self.response.build_target_metadata[0].android_container_target,
667 android_target)
668 self.assertEqual(
669 self.response.build_target_metadata[0].arc_use_set,
670 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600671 # Verify call to determine_android_version passes list of the board name.
Mike Frysingerb53f1822021-03-05 00:44:50 -0500672 android_version_mock.assert_called_with('betty')
Michael Mortensen027ecd82020-05-05 13:13:40 -0600673 # Verify call to determine_android_branch passes board name.
674 android_branch_mock.assert_called_with('betty')
675 # Verify call to determine_android_target passes board name.
676 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600677 self.assertEqual(
678 self.response.build_target_metadata[0].main_firmware_version,
679 'Google_Caroline.7820.286.0')
680 self.assertEqual(
681 self.response.build_target_metadata[0].ec_firmware_version,
682 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600683 self.assertEqual(
684 self.response.build_target_metadata[0].kernel_version,
685 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600686 self.assertEqual(
687 len(self.response.build_target_metadata[0].fingerprints),
688 2)
689 self.assertEqual(
690 self.response.build_target_metadata[0].fingerprints,
691 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600692 self.assertEqual(
693 len(self.response.model_metadata), 2)
694 self.assertEqual(
695 self.response.model_metadata[0].model_name, 'pyro')
696 self.assertEqual(
697 self.response.model_metadata[0].ec_firmware_version,
698 'pyro_v1.1.5909-bd1f0c9')
699 self.assertEqual(
700 self.response.model_metadata[0].firmware_key_id, 'key')
701 self.assertEqual(
702 self.response.model_metadata[0].main_readonly_firmware_version,
703 'Google_Pyro.9042.87.1')
704 self.assertEqual(
705 self.response.model_metadata[0].main_readwrite_firmware_version,
706 'Google_Pyro.9042.110.0')
707 self.assertEqual(
708 self.response.model_metadata[1].model_name, 'reef')
709 self.assertEqual(
710 self.response.model_metadata[1].ec_firmware_version,
711 'reef_v1.1.5909-bd1f0c9')
712 self.assertEqual(
713 self.response.model_metadata[1].firmware_key_id, 'key')
714 self.assertEqual(
715 self.response.model_metadata[1].main_readonly_firmware_version,
716 'Google_Reef.9042.87.1')
717 self.assertEqual(
718 self.response.model_metadata[1].main_readwrite_firmware_version,
719 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600720
Michael Mortensend81d81e2020-06-09 14:20:59 -0600721 # Test corner case where find_fingerprints returns None.
722 # Re-patch find_fingerprints to now return None and re-execute
723 # GetBuilderMetadata to verify behavior.
724 response = packages_pb2.GetBuilderMetadataResponse()
725 self.PatchObject(packages_service, 'find_fingerprints',
726 return_value=[])
727 request = self._GetRequest(board='betty')
728 packages_controller.GetBuilderMetadata(request, response,
729 self.api_config)
730 # Verify a non-fingerprint build_target_metdata field was still set.
731 self.assertEqual(
732 response.build_target_metadata[0].kernel_version,
733 '4.4.223-r2209')
734 # And then verify that fingerprints was empty.
735 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
736
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600737
Alex Kleinda39c6d2019-09-16 14:36:36 -0600738class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
739 """HasChromePrebuilt tests."""
740
741 def setUp(self):
742 self.response = packages_pb2.HasChromePrebuiltResponse()
743
744 def _GetRequest(self, board=None):
745 """Helper to build out a request."""
746 request = packages_pb2.HasChromePrebuiltRequest()
747
748 if board:
749 request.build_target.name = board
750
751 return request
752
753 def testValidateOnly(self):
754 """Sanity check that a validate only call does not execute any logic."""
755 patch = self.PatchObject(packages_service, 'has_prebuilt')
756
757 request = self._GetRequest(board='betty')
758 packages_controller.HasChromePrebuilt(request, self.response,
759 self.validate_only_config)
760 patch.assert_not_called()
761
Michael Mortensen3232ab32020-01-05 19:14:36 -0700762 def testMockCall(self):
763 """Test that a mock call does not execute logic, returns mocked value."""
764 patch = self.PatchObject(packages_service, 'has_prebuilt')
765
766 request = self._GetRequest(board='betty')
767 packages_controller.HasChromePrebuilt(request, self.response,
768 self.mock_call_config)
769 patch.assert_not_called()
770 self.assertTrue(self.response.has_prebuilt)
771
Alex Kleinda39c6d2019-09-16 14:36:36 -0600772 def testNoBuildTargetFails(self):
773 """No build target argument should fail."""
774 request = self._GetRequest()
775
776 with self.assertRaises(cros_build_lib.DieSystemExit):
777 packages_controller.HasChromePrebuilt(request, self.response,
778 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600779
780
781class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
782 """BuildsChrome tests."""
783
784 def setUp(self):
785 self.response = packages_pb2.BuildsChromeResponse()
786
David Burger0f9dd4e2019-10-08 12:33:42 -0600787 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600788 """Helper to build out a request."""
789 request = packages_pb2.BuildsChromeRequest()
790
791 if board:
792 request.build_target.name = board
793
David Burger0f9dd4e2019-10-08 12:33:42 -0600794 if packages:
795 request.packages.extend(packages)
796
Alex Klein73fb6572019-09-30 16:55:23 -0600797 return request
798
799 def testValidateOnly(self):
800 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600801 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600802
803 request = self._GetRequest(board='betty')
804 packages_controller.BuildsChrome(request, self.response,
805 self.validate_only_config)
806 patch.assert_not_called()
807
808 def testNoBuildTargetFails(self):
809 """No build target argument should fail."""
810 request = self._GetRequest()
811
812 with self.assertRaises(cros_build_lib.DieSystemExit):
813 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600814
815 def testBuilds(self):
816 """Test successful call handling."""
817 patch = self.PatchObject(packages_service, 'builds', return_value=True)
818
819 request = self._GetRequest(board='foo')
820 packages_controller.BuildsChrome(request, self.response, self.api_config)
821 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600822 patch.assert_called_once_with(constants.CHROME_CP,
823 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600824
825 def testBuildsChromeWithPackages(self):
826 """Test successful call with packages handling."""
827 patch = self.PatchObject(packages_service, 'builds', return_value=True)
828
829 package = common_pb2.PackageInfo(
830 category='category',
831 package_name='name',
832 version='1.01',
833 )
834 request = self._GetRequest(board='foo', packages=[package])
835 packages_controller.BuildsChrome(request, self.response, self.api_config)
836 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600837 patch.assert_called_once_with(constants.CHROME_CP,
838 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600839 [controller_util.PackageInfoToCPV(package)])
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900840
841
842class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
843 """GetAndroidMetadata tests."""
844
845 def setUp(self):
846 self.response = packages_pb2.GetAndroidMetadataResponse()
847
848 def _GetRequest(self, board=None):
849 """Helper to build out a request."""
850 request = packages_pb2.GetAndroidMetadataRequest()
851
852 if board:
853 request.build_target.name = board
854
855 return request
856
857 def testValidateOnly(self):
858 """Check that a validate only call does not execute any logic."""
859 package_mock = self.PatchObject(packages_service,
860 'determine_android_package')
861 branch_mock = self.PatchObject(packages_service,
862 'determine_android_branch')
863 version_mock = self.PatchObject(packages_service,
864 'determine_android_version')
865
866 request = self._GetRequest(board='betty')
867 packages_controller.GetAndroidMetadata(request, self.response,
868 self.validate_only_config)
869
870 package_mock.assert_not_called()
871 branch_mock.assert_not_called()
872 version_mock.assert_not_called()
873
874 def testMockCall(self):
875 """Test that a mock call does not execute logic, returns mocked value."""
876 package_mock = self.PatchObject(packages_service,
877 'determine_android_package')
878 branch_mock = self.PatchObject(packages_service,
879 'determine_android_branch')
880 version_mock = self.PatchObject(packages_service,
881 'determine_android_version')
882
883 request = self._GetRequest(board='betty')
884 packages_controller.GetAndroidMetadata(request, self.response,
885 self.mock_call_config)
886
887 package_mock.assert_not_called()
888 branch_mock.assert_not_called()
889 version_mock.assert_not_called()
890
891 self.assertTrue(self.response.android_package)
892 self.assertTrue(self.response.android_branch)
893 self.assertTrue(self.response.android_version)
894
895 def testNoBuildTargetFails(self):
896 """No build target argument should fail."""
897 request = self._GetRequest()
898 with self.assertRaises(cros_build_lib.DieSystemExit):
899 packages_controller.GetAndroidMetadata(request, self.response,
900 self.api_config)
901
902 def testSuccess(self):
903 """Test a successful call."""
904 board = 'betty'
905 package = 'android-package'
906 branch = 'android-branch'
907 version = '7123456'
908 full_package = f'chromeos-base/{package}-{version}-r1'
909
910 package_mock = self.PatchObject(packages_service,
911 'determine_android_package',
912 return_value=full_package)
913 branch_mock = self.PatchObject(packages_service,
914 'determine_android_branch',
915 return_value=branch)
916 version_mock = self.PatchObject(packages_service,
917 'determine_android_version',
918 return_value=version)
919
920 request = self._GetRequest(board=board)
921 packages_controller.GetAndroidMetadata(request, self.response,
922 self.api_config)
923
924 package_mock.assert_called_once_with(board)
925 branch_mock.assert_called_once_with(board, package=full_package)
926 version_mock.assert_called_once_with(board, package=full_package)
927
928 self.assertEqual(self.response.android_package, package)
929 self.assertEqual(self.response.android_branch, branch)
930 self.assertEqual(self.response.android_version, version)
931
932 def testNoAndroid(self):
933 """Test returns an empty response if given board has no Android."""
934 board = 'betty'
935
936 package_mock = self.PatchObject(packages_service,
937 'determine_android_package',
938 return_value=None)
939 branch_mock = self.PatchObject(packages_service,
940 'determine_android_branch')
941 version_mock = self.PatchObject(packages_service,
942 'determine_android_version')
943
944 request = self._GetRequest(board=board)
945 packages_controller.GetAndroidMetadata(request, self.response,
946 self.api_config)
947
948 package_mock.assert_called_once_with(board)
949 branch_mock.assert_not_called()
950 version_mock.assert_not_called()
951
952 self.assertFalse(self.response.android_package)
953 self.assertFalse(self.response.android_branch)
954 self.assertFalse(self.response.android_version)