blob: 83dbd39326e86fd8c42e06ecfbd93f43cf069a72 [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
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
David Burger0f9dd4e2019-10-08 12:33:42 -060012from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060013from chromite.api.gen.chromite.api import binhost_pb2
14from chromite.api.gen.chromite.api import packages_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 Kleineb77ffa2019-05-28 14:47:44 -060026 """Uprev tests."""
27
28 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
29 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
30 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
31 _NONE = binhost_pb2.OVERLAYTYPE_NONE
32
33 def setUp(self):
34 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060035 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060036
37 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
38 return packages_pb2.UprevPackagesRequest(
39 build_targets=[{'name': name} for name in targets or []],
40 overlay_type=overlay_type,
41 output_dir=output_dir,
42 )
43
Alex Klein231d2da2019-07-22 16:44:45 -060044 def testValidateOnly(self):
45 """Sanity check that a validate only call does not execute any logic."""
46 patch = self.PatchObject(packages_service, 'uprev_build_targets')
47
48 targets = ['foo', 'bar']
49 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
50 packages_controller.Uprev(request, self.response, self.validate_only_config)
51 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060052
Michael Mortensen2677bf62019-10-29 08:31:25 -060053 def testMockCall(self):
54 """Test that a mock call does not execute logic, returns mocked value."""
55 patch = self.PatchObject(packages_service, 'uprev_build_targets')
56 targets = ['foo', 'bar']
57 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
58 packages_controller.Uprev(request, self.response, self.mock_call_config)
59 patch.assert_not_called()
60 self.assertTrue(self.response.modified_ebuilds)
61
Alex Kleineb77ffa2019-05-28 14:47:44 -060062 def testNoOverlayTypeFails(self):
63 """No overlay type provided should fail."""
64 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060065
66 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060067 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060068
69 def testOverlayTypeNoneFails(self):
70 """Overlay type none means nothing here and should fail."""
71 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060072
73 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060074 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060075
76 def testSuccess(self):
77 """Test overall successful argument handling."""
78 targets = ['foo', 'bar']
79 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060080 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Dhanya Ganeshd03a4162021-08-25 00:21:50 +000081 revved_packages = ['cat1/pkg1-1.11', 'cat2/pkg2-1.12']
Alex Kleineb77ffa2019-05-28 14:47:44 -060082 expected_type = constants.BOTH_OVERLAYS
83 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
84 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060085 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
Dhanya Ganeshd03a4162021-08-25 00:21:50 +000086 return_value=(changed, revved_packages))
Alex Kleineb77ffa2019-05-28 14:47:44 -060087
Alex Klein231d2da2019-07-22 16:44:45 -060088 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060089
90 # Make sure the type is right, verify build targets after.
91 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
92 output_dir)
93 # First argument (build targets) of the first (only) call.
94 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040095 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060096
Alex Klein231d2da2019-07-22 16:44:45 -060097 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060098 self.assertIn(ebuild.path, changed)
99 changed.remove(ebuild.path)
100 self.assertFalse(changed)
101
Dhanya Ganeshd03a4162021-08-25 00:21:50 +0000102 for pkg in self.response.packages:
103 self.assertTrue(pkg.category.startswith('cat'))
104 self.assertTrue(pkg.package_name.startswith('pkg'))
105 self.assertTrue(pkg.version.startswith('1.1'))
106
David Burger1e0fe232019-07-01 14:52:07 -0600107
Alex Kleinda39c6d2019-09-16 14:36:36 -0600108class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -0600109 """UprevVersionedPackage tests."""
110
111 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -0600112 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600113
114 def _addVersion(self, request, version):
115 """Helper method to add a full version message to the request."""
116 ref = request.versions.add()
117 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600118 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600119 ref.revision = 'abc123'
120
121 def testValidateOnly(self):
122 """Sanity check validate only calls are working properly."""
123 service = self.PatchObject(packages_service, 'uprev_versioned_package')
124
125 request = packages_pb2.UprevVersionedPackageRequest()
126 self._addVersion(request, '1.2.3.4')
127 request.package_info.category = 'chromeos-base'
128 request.package_info.package_name = 'chromeos-chrome'
129
130 packages_controller.UprevVersionedPackage(request, self.response,
131 self.validate_only_config)
132
133 service.assert_not_called()
134
Michael Mortensen2677bf62019-10-29 08:31:25 -0600135 def testMockCall(self):
136 """Test that a mock call does not execute logic, returns mocked value."""
137 patch = self.PatchObject(packages_service, 'uprev_versioned_package')
138 request = packages_pb2.UprevVersionedPackageRequest()
139 packages_controller.UprevVersionedPackage(request, self.response,
140 self.mock_call_config)
141 patch.assert_not_called()
142 self.assertTrue(self.response.responses)
143 self.assertTrue(self.response.responses[0].modified_ebuilds)
144
Alex Klein87531182019-08-12 15:23:37 -0600145 def testNoVersions(self):
146 """Test no versions provided."""
147 request = packages_pb2.UprevVersionedPackageRequest()
148 request.package_info.category = 'chromeos-base'
149 request.package_info.package_name = 'chromeos-chrome'
150
151 with self.assertRaises(cros_build_lib.DieSystemExit):
152 packages_controller.UprevVersionedPackage(request, self.response,
153 self.api_config)
154
155 def testNoPackageName(self):
156 """Test no package name provided."""
157 request = packages_pb2.UprevVersionedPackageRequest()
158 self._addVersion(request, '1.2.3.4')
159 request.package_info.category = 'chromeos-base'
160
161 with self.assertRaises(cros_build_lib.DieSystemExit):
162 packages_controller.UprevVersionedPackage(request, self.response,
163 self.api_config)
164
165 def testNoCategory(self):
166 """Test no package category provided."""
167 request = packages_pb2.UprevVersionedPackageRequest()
168 self._addVersion(request, '1.2.3.4')
169 request.package_info.package_name = 'chromeos-chrome'
170
171 with self.assertRaises(cros_build_lib.DieSystemExit):
172 packages_controller.UprevVersionedPackage(request, self.response,
173 self.api_config)
174
175 def testOutputHandling(self):
176 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600177 version = '1.2.3.4'
Chris McDonald38409112020-09-24 11:24:51 -0600178 result = uprev_lib.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600179 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600180
Alex Klein34afcbc2019-08-22 16:14:31 -0600181 self.PatchObject(
182 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600183
184 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600185 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600186 request.package_info.category = 'chromeos-base'
187 request.package_info.package_name = 'chromeos-chrome'
188
189 packages_controller.UprevVersionedPackage(request, self.response,
190 self.api_config)
191
Yaakov Shaul730814a2019-09-10 13:58:25 -0600192 for idx, uprev_response in enumerate(self.response.responses):
193 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400194 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600195 result.modified[idx].files,
196 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600197
198
Alex Kleinda39c6d2019-09-16 14:36:36 -0600199class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600200 """GetBestVisible tests."""
201
Alex Klein231d2da2019-07-22 16:44:45 -0600202 def setUp(self):
203 self.response = packages_pb2.GetBestVisibleResponse()
204
David Burger1e0fe232019-07-01 14:52:07 -0600205 def _GetRequest(self, atom=None):
206 return packages_pb2.GetBestVisibleRequest(
207 atom=atom,
208 )
209
David Burger1e0fe232019-07-01 14:52:07 -0600210 def _MakeCpv(self, category, package, version):
211 unused = {
212 'cp': None,
213 'cpv': None,
214 'cpf': None,
215 'pv': None,
216 'version_no_rev': None,
217 'rev': None,
218 }
Alex Klein75df1792020-06-11 14:42:49 -0600219 return package_info.CPV(
David Burger1e0fe232019-07-01 14:52:07 -0600220 category=category,
221 package=package,
222 version=version,
223 **unused
224 )
225
Alex Klein231d2da2019-07-22 16:44:45 -0600226 def testValidateOnly(self):
227 """Sanity check that a validate only call does not execute any logic."""
228 patch = self.PatchObject(packages_service, 'get_best_visible')
229
230 request = self._GetRequest(atom='chromeos-chrome')
231 packages_controller.GetBestVisible(request, self.response,
232 self.validate_only_config)
233 patch.assert_not_called()
234
Michael Mortensen2677bf62019-10-29 08:31:25 -0600235 def testMockCall(self):
236 """Test that a mock call does not execute logic, returns mocked value."""
237 patch = self.PatchObject(packages_service, 'get_best_visible')
238 request = self._GetRequest(atom='chromeos-chrome')
239 packages_controller.GetBestVisible(request, self.response,
240 self.mock_call_config)
241 patch.assert_not_called()
242 self.assertTrue(self.response.package_info)
243 self.assertTrue(self.response.package_info.category)
244 self.assertTrue(self.response.package_info.package_name)
245 self.assertTrue(self.response.package_info.version)
246
David Burger1e0fe232019-07-01 14:52:07 -0600247 def testNoAtomFails(self):
248 """No atom provided should fail."""
249 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600250 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600251 packages_controller.GetBestVisible(request, self.response,
252 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600253
254 def testSuccess(self):
255 """Test overall success, argument handling, result forwarding."""
256 cpv = self._MakeCpv('category', 'package', 'version')
257 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
258
259 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600260
Alex Klein231d2da2019-07-22 16:44:45 -0600261 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600262
Alex Klein75df1792020-06-11 14:42:49 -0600263 package_info_msg = self.response.package_info
264 self.assertEqual(package_info_msg.category, cpv.category)
265 self.assertEqual(package_info_msg.package_name, cpv.package)
266 self.assertEqual(package_info_msg.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600267
268
Michael Mortensen68abdb72019-10-28 09:43:52 -0600269class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
270 """GetChromeVersion tests."""
271
272 def setUp(self):
273 self.response = packages_pb2.GetChromeVersionResponse()
274
275 def _GetRequest(self, board=None):
276 """Helper to build out a request."""
277 request = packages_pb2.GetChromeVersionRequest()
278
279 if board:
280 request.build_target.name = board
281
282 return request
283
284 def testValidateOnly(self):
285 """Sanity check that a validate only call does not execute any logic."""
286 chrome_version = self.PatchObject(packages_service,
287 'determine_chrome_version')
288 request = self._GetRequest(board='betty')
289 packages_controller.GetChromeVersion(request, self.response,
290 self.validate_only_config)
291 chrome_version.assert_not_called()
292
293 def testMockCall(self):
294 """Test that a mock call does not execute logic, returns mocked value."""
295 chrome_version = self.PatchObject(packages_service,
296 'determine_chrome_version')
297 request = self._GetRequest(board='betty')
298 packages_controller.GetChromeVersion(request, self.response,
299 self.mock_call_config)
300 chrome_version.assert_not_called()
301 self.assertTrue(self.response.version)
302
303 def testGetChromeVersion(self):
304 """Verify basic return values."""
305 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600306 chrome_version_mock = self.PatchObject(packages_service,
307 'determine_chrome_version',
308 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600309 request = self._GetRequest(board='betty')
310 packages_controller.GetChromeVersion(request, self.response,
311 self.api_config)
312 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600313 # Verify call to determine_chrome_version passes a build_target object.
314 build_target = build_target_lib.BuildTarget('betty')
315 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600316
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600317 def testGetChromeVersionHandleNone(self):
318 """Verify basic return values."""
319 self.PatchObject(packages_service, 'determine_chrome_version',
320 return_value=None)
321 request = self._GetRequest(board='betty')
322 packages_controller.GetChromeVersion(request, self.response,
323 self.api_config)
324 self.assertFalse(self.response.version)
325
Michael Mortensen68abdb72019-10-28 09:43:52 -0600326
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600327class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
328 """GetTargetVersions tests."""
329
330 def setUp(self):
331 self.response = packages_pb2.GetTargetVersionsResponse()
332
333 def _GetRequest(self, board=None):
334 """Helper to build out a request."""
335 request = packages_pb2.GetTargetVersionsRequest()
336
337 if board:
338 request.build_target.name = board
339
340 return request
341
342 def testValidateOnly(self):
343 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600344 builds_chrome = self.PatchObject(
345 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600346 patch_version = self.PatchObject(packages_service,
347 'determine_android_version')
348 patch_branch_version = self.PatchObject(packages_service,
349 'determine_android_branch')
350 patch_target_version = self.PatchObject(packages_service,
351 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600352 chrome_version = self.PatchObject(packages_service,
353 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600354 platform_version = self.PatchObject(packages_service,
355 'determine_platform_version')
356 milestone_version = self.PatchObject(packages_service,
357 'determine_milestone_version')
358 full_version = self.PatchObject(packages_service,
359 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600360
361 request = self._GetRequest(board='betty')
362 packages_controller.GetTargetVersions(request, self.response,
363 self.validate_only_config)
364 patch_version.assert_not_called()
365 patch_branch_version.assert_not_called()
366 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600367 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600368 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600369 platform_version.assert_not_called()
370 milestone_version.assert_not_called()
371 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600372
Michael Mortensen2677bf62019-10-29 08:31:25 -0600373 def testMockCall(self):
374 """Test that a mock call does not execute logic, returns mocked value."""
375 builds_chrome = self.PatchObject(
376 packages_service, 'builds', return_value=True)
377 patch_version = self.PatchObject(packages_service,
378 'determine_android_version')
379 patch_branch_version = self.PatchObject(packages_service,
380 'determine_android_branch')
381 patch_target_version = self.PatchObject(packages_service,
382 'determine_android_target')
383 chrome_version = self.PatchObject(packages_service,
384 'determine_chrome_version')
385 platform_version = self.PatchObject(packages_service,
386 'determine_platform_version')
387 milestone_version = self.PatchObject(packages_service,
388 'determine_milestone_version')
389 full_version = self.PatchObject(packages_service,
390 'determine_full_version')
391
392 request = self._GetRequest(board='betty')
393 packages_controller.GetTargetVersions(request, self.response,
394 self.mock_call_config)
395
396 patch_version.assert_not_called()
397 patch_branch_version.assert_not_called()
398 patch_target_version.assert_not_called()
399 builds_chrome.assert_not_called()
400 chrome_version.assert_not_called()
401 platform_version.assert_not_called()
402 milestone_version.assert_not_called()
403 full_version.assert_not_called()
404
405 self.assertTrue(self.response.android_version)
406 self.assertTrue(self.response.android_branch_version)
407 self.assertTrue(self.response.android_target_version)
408 self.assertTrue(self.response.chrome_version)
409 self.assertTrue(self.response.platform_version)
410 self.assertTrue(self.response.milestone_version)
411 self.assertTrue(self.response.full_version)
412
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600413 def testNoBuildTargetFails(self):
414 """No build target argument should fail."""
415 request = self._GetRequest()
416
417 with self.assertRaises(cros_build_lib.DieSystemExit):
418 packages_controller.GetTargetVersions(request, self.response,
419 self.api_config)
420
Michael Mortensenc2615b72019-10-15 08:12:24 -0600421 def testGetTargetVersions(self):
422 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600423 # Mock that chrome is built and set the chrome_version.
424 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600425 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600426 chrome_version_mock = self.PatchObject(packages_service,
427 'determine_chrome_version',
428 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500429 android_package = 'chromeos-base/android-container-pi-10.3'
430 self.PatchObject(packages_service, 'determine_android_package',
431 return_value=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600432 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600433 android_branch_mock = self.PatchObject(packages_service,
434 'determine_android_branch',
435 return_value=android_branch)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600436 platform_version = '12345.1.2'
437 self.PatchObject(packages_service, 'determine_platform_version',
438 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600439 milestone_version = '79'
440 self.PatchObject(packages_service, 'determine_milestone_version',
441 return_value=milestone_version)
442 full_version = 'R79-12345.1.2'
443 self.PatchObject(packages_service, 'determine_full_version',
444 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600445 request = self._GetRequest(board='betty')
446 packages_controller.GetTargetVersions(request, self.response,
447 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500448 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600449 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500450 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600451 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600452 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600453 self.assertEqual(self.response.milestone_version, milestone_version)
454 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600455 # Verify call to determine_chrome_version passes a build_target object.
456 build_target = build_target_lib.BuildTarget('betty')
457 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600458 # Verify call to determine_android_branch passes a board name.
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500459 android_branch_mock.assert_called_with('betty', package=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600460
Michael Mortensen42c330e32020-09-02 09:59:16 -0600461 def testGetTargetVersionsWithPackagesSet(self):
462 """Verify packages pass through and basic return values."""
463 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
464 # rather than mocking the boundary to portage calls such as
465 # packages_service.builds).
466 builds_mock = self.PatchObject(packages_service, 'builds',
467 return_value=True)
468 # Mock that chrome is built and set the chrome_version.
469 chrome_version = '76.0.1.2'
470 self.PatchObject(packages_service, 'determine_chrome_version',
471 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500472 android_package = 'chromeos-base/android-container-pi-10.3'
473 self.PatchObject(packages_service, 'determine_android_package',
474 return_value=android_package)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600475 android_branch = 'android_test_branch'
476 self.PatchObject(packages_service, 'determine_android_branch',
477 return_value=android_branch)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600478 platform_version = '12345.1.2'
479 self.PatchObject(packages_service, 'determine_platform_version',
480 return_value=platform_version)
481 milestone_version = '79'
482 self.PatchObject(packages_service, 'determine_milestone_version',
483 return_value=milestone_version)
484 full_version = 'R79-12345.1.2'
485 self.PatchObject(packages_service, 'determine_full_version',
486 return_value=full_version)
487 request = self._GetRequest(board='betty')
488 # Add optional packages to the request.
489 cpv_package_list = []
490 package = request.packages.add()
491 package.package_name = 'test'
492 package.category = 'chromeos-base'
493 package.version = '0.0.1-r1'
494 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
495 package = request.packages.add()
496 package.package_name = 'target-fuzzers'
497 package.category = 'virtual'
498 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
499
500 packages_controller.GetTargetVersions(request, self.response,
501 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500502 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600503 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500504 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600505 self.assertEqual(self.response.chrome_version, chrome_version)
506 self.assertEqual(self.response.platform_version, platform_version)
507 self.assertEqual(self.response.milestone_version, milestone_version)
508 # Verify call to packages.builds passes the package list.
509 builds_mock.assert_called_with(constants.CHROME_CP,
510 mock.ANY, # Match the build target object
511 packages=cpv_package_list)
512
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600513 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600514 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600515 platform_version = '12345.1.2'
516 self.PatchObject(packages_service, 'determine_platform_version',
517 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600518 self.PatchObject(packages_service, 'builds', return_value=False)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500519 self.PatchObject(packages_service, 'determine_android_package',
Michael Mortensenedf76532019-10-16 14:22:37 -0600520 return_value=None)
521 request = self._GetRequest(board='betty')
522 packages_controller.GetTargetVersions(request, self.response,
523 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600524 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600525 self.assertFalse(self.response.android_version)
526 self.assertFalse(self.response.android_branch_version)
527 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600528 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600529
Michael Mortensenbfc56392020-04-30 15:23:47 -0600530
531class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
532 """GetBuilderMetadata tests."""
533
534 def setUp(self):
535 self.response = packages_pb2.GetBuilderMetadataResponse()
536
537 def _GetRequest(self, board=None):
538 """Helper to build out a request."""
539 request = packages_pb2.GetBuilderMetadataRequest()
540
541 if board:
542 request.build_target.name = board
543
544 return request
545
546 def testValidateOnly(self):
547 """Sanity check that a validate only call does not execute any logic."""
548 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600549 patch_version = self.PatchObject(packages_service,
550 'determine_android_version')
551 patch_branch_version = self.PatchObject(packages_service,
552 'determine_android_branch')
553 patch_fw_versions = self.PatchObject(packages_service,
554 'determine_firmware_versions')
555 patch_fingerprints = self.PatchObject(packages_service,
556 'find_fingerprints')
557 patch_get_models = self.PatchObject(packages_service,
558 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600559 packages_controller.GetBuilderMetadata(request, self.response,
560 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600561 patch_version.assert_not_called()
562 patch_branch_version.assert_not_called()
563 patch_fw_versions.assert_not_called()
564 patch_fingerprints.assert_not_called()
565 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600566
567 def testMockCall(self):
568 """Test that a mock call does not execute logic, returns mocked value."""
569 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600570 patch_version = self.PatchObject(packages_service,
571 'determine_android_version')
572 patch_branch_version = self.PatchObject(packages_service,
573 'determine_android_branch')
574 patch_fw_versions = self.PatchObject(packages_service,
575 'determine_firmware_versions')
576 patch_fingerprints = self.PatchObject(packages_service,
577 'find_fingerprints')
578 patch_get_models = self.PatchObject(packages_service,
579 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600580 packages_controller.GetBuilderMetadata(request, self.response,
581 self.mock_call_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600582 patch_version.assert_not_called()
583 patch_branch_version.assert_not_called()
584 patch_fw_versions.assert_not_called()
585 patch_fingerprints.assert_not_called()
586 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600587
588 self.assertEqual(len(self.response.build_target_metadata), 1)
589 self.assertEqual(self.response.build_target_metadata[0].build_target,
590 request.build_target.name)
591 self.assertEqual(len(self.response.model_metadata), 1)
592 self.assertTrue(self.response.model_metadata[0].model_name)
593 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
594
595 def testNoBuildTargetFails(self):
596 """No build target argument should fail."""
597 request = self._GetRequest()
598
599 with self.assertRaises(cros_build_lib.DieSystemExit):
600 packages_controller.GetBuilderMetadata(request, self.response,
601 self.api_config)
602
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600603 def testGetBuilderMetadata(self):
604 """Verify basic return values."""
605 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600606 android_version_mock = self.PatchObject(packages_service,
607 'determine_android_version',
608 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600609 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600610 android_branch_mock = self.PatchObject(packages_service,
611 'determine_android_branch',
612 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600613 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600614 android_target_mock = self.PatchObject(packages_service,
615 'determine_android_target',
616 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600617 self.PatchObject(portage_util, 'GetBoardUseFlags',
618 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600619 package_result = ['sys-kernel/linux-headers-4.14-r24',
620 'sys-devel/flex-2.6.4-r1',
621 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
622 self.PatchObject(portage_util, 'GetPackageDependencies',
623 return_value=package_result)
624
Michael Mortensena4af79e2020-05-06 16:18:48 -0600625 fw_versions = packages_service.FirmwareVersions(
626 None,
627 'Google_Caroline.7820.263.0',
628 'Google_Caroline.7820.286.0',
629 'caroline_v1.9.357-ac5c7b4',
630 'caroline_v1.9.370-e8b9bd2')
631 self.PatchObject(packages_service, 'get_firmware_versions',
632 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600633 fingerprints = ['fingerprint1', 'fingerprint2']
634 self.PatchObject(packages_service, 'find_fingerprints',
635 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600636 # Patch packages.get_models, packages.get_all_firmware_versions,
637 # and packages.get_key_id for calls needed by model_metadata.
638 model_list = ['pyro', 'reef']
639 all_fw_versions = {
640 'pyro': packages_service.FirmwareVersions(
641 'pyro',
642 'Google_Pyro.9042.87.1',
643 'Google_Pyro.9042.110.0',
644 'pyro_v1.1.5900-ab1ee51',
645 'pyro_v1.1.5909-bd1f0c9'),
646 'reef': packages_service.FirmwareVersions(
647 'reef',
648 'Google_Reef.9042.87.1',
649 'Google_Reef.9042.110.0',
650 'reef_v1.1.5900-ab1ee51',
651 'reef_v1.1.5909-bd1f0c9')
652 }
653 self.PatchObject(packages_service, 'get_all_firmware_versions',
654 return_value=all_fw_versions)
655 self.PatchObject(packages_service, 'get_models',
656 return_value=model_list)
657 self.PatchObject(packages_service, 'get_key_id',
658 return_value='key')
659
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600660 request = self._GetRequest(board='betty')
661 packages_controller.GetBuilderMetadata(request, self.response,
662 self.api_config)
663 self.assertEqual(
664 self.response.build_target_metadata[0].build_target,
665 'betty')
666 self.assertEqual(
667 self.response.build_target_metadata[0].android_container_version,
668 android_version)
669 self.assertEqual(
670 self.response.build_target_metadata[0].android_container_branch,
671 android_branch)
672 self.assertEqual(
673 self.response.build_target_metadata[0].android_container_target,
674 android_target)
675 self.assertEqual(
676 self.response.build_target_metadata[0].arc_use_set,
677 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600678 # Verify call to determine_android_version passes list of the board name.
Mike Frysingerb53f1822021-03-05 00:44:50 -0500679 android_version_mock.assert_called_with('betty')
Michael Mortensen027ecd82020-05-05 13:13:40 -0600680 # Verify call to determine_android_branch passes board name.
681 android_branch_mock.assert_called_with('betty')
682 # Verify call to determine_android_target passes board name.
683 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600684 self.assertEqual(
685 self.response.build_target_metadata[0].main_firmware_version,
686 'Google_Caroline.7820.286.0')
687 self.assertEqual(
688 self.response.build_target_metadata[0].ec_firmware_version,
689 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600690 self.assertEqual(
691 self.response.build_target_metadata[0].kernel_version,
692 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600693 self.assertEqual(
694 len(self.response.build_target_metadata[0].fingerprints),
695 2)
696 self.assertEqual(
697 self.response.build_target_metadata[0].fingerprints,
698 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600699 self.assertEqual(
700 len(self.response.model_metadata), 2)
701 self.assertEqual(
702 self.response.model_metadata[0].model_name, 'pyro')
703 self.assertEqual(
704 self.response.model_metadata[0].ec_firmware_version,
705 'pyro_v1.1.5909-bd1f0c9')
706 self.assertEqual(
707 self.response.model_metadata[0].firmware_key_id, 'key')
708 self.assertEqual(
709 self.response.model_metadata[0].main_readonly_firmware_version,
710 'Google_Pyro.9042.87.1')
711 self.assertEqual(
712 self.response.model_metadata[0].main_readwrite_firmware_version,
713 'Google_Pyro.9042.110.0')
714 self.assertEqual(
715 self.response.model_metadata[1].model_name, 'reef')
716 self.assertEqual(
717 self.response.model_metadata[1].ec_firmware_version,
718 'reef_v1.1.5909-bd1f0c9')
719 self.assertEqual(
720 self.response.model_metadata[1].firmware_key_id, 'key')
721 self.assertEqual(
722 self.response.model_metadata[1].main_readonly_firmware_version,
723 'Google_Reef.9042.87.1')
724 self.assertEqual(
725 self.response.model_metadata[1].main_readwrite_firmware_version,
726 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600727
Michael Mortensend81d81e2020-06-09 14:20:59 -0600728 # Test corner case where find_fingerprints returns None.
729 # Re-patch find_fingerprints to now return None and re-execute
730 # GetBuilderMetadata to verify behavior.
731 response = packages_pb2.GetBuilderMetadataResponse()
732 self.PatchObject(packages_service, 'find_fingerprints',
733 return_value=[])
734 request = self._GetRequest(board='betty')
735 packages_controller.GetBuilderMetadata(request, response,
736 self.api_config)
737 # Verify a non-fingerprint build_target_metdata field was still set.
738 self.assertEqual(
739 response.build_target_metadata[0].kernel_version,
740 '4.4.223-r2209')
741 # And then verify that fingerprints was empty.
742 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
743
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600744
Alex Kleinda39c6d2019-09-16 14:36:36 -0600745class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
746 """HasChromePrebuilt tests."""
747
748 def setUp(self):
749 self.response = packages_pb2.HasChromePrebuiltResponse()
750
751 def _GetRequest(self, board=None):
752 """Helper to build out a request."""
753 request = packages_pb2.HasChromePrebuiltRequest()
754
755 if board:
756 request.build_target.name = board
757
758 return request
759
760 def testValidateOnly(self):
761 """Sanity check that a validate only call does not execute any logic."""
762 patch = self.PatchObject(packages_service, 'has_prebuilt')
763
764 request = self._GetRequest(board='betty')
765 packages_controller.HasChromePrebuilt(request, self.response,
766 self.validate_only_config)
767 patch.assert_not_called()
768
Michael Mortensen3232ab32020-01-05 19:14:36 -0700769 def testMockCall(self):
770 """Test that a mock call does not execute logic, returns mocked value."""
771 patch = self.PatchObject(packages_service, 'has_prebuilt')
772
773 request = self._GetRequest(board='betty')
774 packages_controller.HasChromePrebuilt(request, self.response,
775 self.mock_call_config)
776 patch.assert_not_called()
777 self.assertTrue(self.response.has_prebuilt)
778
Alex Kleinda39c6d2019-09-16 14:36:36 -0600779 def testNoBuildTargetFails(self):
780 """No build target argument should fail."""
781 request = self._GetRequest()
782
783 with self.assertRaises(cros_build_lib.DieSystemExit):
784 packages_controller.HasChromePrebuilt(request, self.response,
785 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600786
787
788class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
789 """BuildsChrome tests."""
790
791 def setUp(self):
792 self.response = packages_pb2.BuildsChromeResponse()
793
David Burger0f9dd4e2019-10-08 12:33:42 -0600794 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600795 """Helper to build out a request."""
796 request = packages_pb2.BuildsChromeRequest()
797
798 if board:
799 request.build_target.name = board
800
David Burger0f9dd4e2019-10-08 12:33:42 -0600801 if packages:
802 request.packages.extend(packages)
803
Alex Klein73fb6572019-09-30 16:55:23 -0600804 return request
805
806 def testValidateOnly(self):
807 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600808 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600809
810 request = self._GetRequest(board='betty')
811 packages_controller.BuildsChrome(request, self.response,
812 self.validate_only_config)
813 patch.assert_not_called()
814
815 def testNoBuildTargetFails(self):
816 """No build target argument should fail."""
817 request = self._GetRequest()
818
819 with self.assertRaises(cros_build_lib.DieSystemExit):
820 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600821
822 def testBuilds(self):
823 """Test successful call handling."""
824 patch = self.PatchObject(packages_service, 'builds', return_value=True)
825
826 request = self._GetRequest(board='foo')
827 packages_controller.BuildsChrome(request, self.response, self.api_config)
828 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600829 patch.assert_called_once_with(constants.CHROME_CP,
830 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600831
832 def testBuildsChromeWithPackages(self):
833 """Test successful call with packages handling."""
834 patch = self.PatchObject(packages_service, 'builds', return_value=True)
835
836 package = common_pb2.PackageInfo(
837 category='category',
838 package_name='name',
839 version='1.01',
840 )
841 request = self._GetRequest(board='foo', packages=[package])
842 packages_controller.BuildsChrome(request, self.response, self.api_config)
843 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600844 patch.assert_called_once_with(constants.CHROME_CP,
845 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600846 [controller_util.PackageInfoToCPV(package)])
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900847
848
Alex Klein9ce3f682021-06-23 15:06:44 -0600849class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
850 """NeedsChromeSource tests."""
851
852 def setUp(self):
853 self.response = packages_pb2.NeedsChromeSourceResponse()
854
855 self.board = 'board'
856 self.sysroot = self.tempdir
857
858 def _GetRequest(self, compile_source=False):
859 """Helper to build a request."""
860 request = packages_pb2.NeedsChromeSourceRequest()
861
862 request.install_request.sysroot.path = self.sysroot
863 request.install_request.sysroot.build_target.name = self.board
864 request.install_request.flags.compile_source = compile_source
865
866 return request
867
868 def testAll(self):
869 """Reason translation test."""
870 result = packages_service.NeedsChromeSourceResult(
871 needs_chrome_source=True,
872 builds_chrome=True,
873 packages=[package_info.parse('cat/pkg')],
874 missing_chrome_prebuilt=True,
875 missing_follower_prebuilt=True,
876 local_uprev=True,
877 )
878 self.PatchObject(packages_service, 'needs_chrome_source',
879 return_value=result)
880
881 packages_controller.NeedsChromeSource(self._GetRequest(compile_source=True),
882 self.response,
883 self.api_config)
884
885 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
886 self.response.reasons)
887 self.assertIn(packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
888 self.response.reasons)
889 self.assertIn(packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
890 self.response.reasons)
891 self.assertIn(
892 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
893 self.response.reasons)
894 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
895 self.response.reasons)
896 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
897 self.response.reasons)
898
899 self.assertEqual(1, len(self.response.packages))
900 self.assertEqual(('cat', 'pkg'), (self.response.packages[0].category,
901 self.response.packages[0].package_name))
902
903
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900904class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
905 """GetAndroidMetadata tests."""
906
907 def setUp(self):
908 self.response = packages_pb2.GetAndroidMetadataResponse()
909
910 def _GetRequest(self, board=None):
911 """Helper to build out a request."""
912 request = packages_pb2.GetAndroidMetadataRequest()
913
914 if board:
915 request.build_target.name = board
916
917 return request
918
919 def testValidateOnly(self):
920 """Check that a validate only call does not execute any logic."""
921 package_mock = self.PatchObject(packages_service,
922 'determine_android_package')
923 branch_mock = self.PatchObject(packages_service,
924 'determine_android_branch')
925 version_mock = self.PatchObject(packages_service,
926 'determine_android_version')
927
928 request = self._GetRequest(board='betty')
929 packages_controller.GetAndroidMetadata(request, self.response,
930 self.validate_only_config)
931
932 package_mock.assert_not_called()
933 branch_mock.assert_not_called()
934 version_mock.assert_not_called()
935
936 def testMockCall(self):
937 """Test that a mock call does not execute logic, returns mocked value."""
938 package_mock = self.PatchObject(packages_service,
939 'determine_android_package')
940 branch_mock = self.PatchObject(packages_service,
941 'determine_android_branch')
942 version_mock = self.PatchObject(packages_service,
943 'determine_android_version')
944
945 request = self._GetRequest(board='betty')
946 packages_controller.GetAndroidMetadata(request, self.response,
947 self.mock_call_config)
948
949 package_mock.assert_not_called()
950 branch_mock.assert_not_called()
951 version_mock.assert_not_called()
952
953 self.assertTrue(self.response.android_package)
954 self.assertTrue(self.response.android_branch)
955 self.assertTrue(self.response.android_version)
956
957 def testNoBuildTargetFails(self):
958 """No build target argument should fail."""
959 request = self._GetRequest()
960 with self.assertRaises(cros_build_lib.DieSystemExit):
961 packages_controller.GetAndroidMetadata(request, self.response,
962 self.api_config)
963
964 def testSuccess(self):
965 """Test a successful call."""
966 board = 'betty'
967 package = 'android-package'
968 branch = 'android-branch'
969 version = '7123456'
970 full_package = f'chromeos-base/{package}-{version}-r1'
971
972 package_mock = self.PatchObject(packages_service,
973 'determine_android_package',
974 return_value=full_package)
975 branch_mock = self.PatchObject(packages_service,
976 'determine_android_branch',
977 return_value=branch)
978 version_mock = self.PatchObject(packages_service,
979 'determine_android_version',
980 return_value=version)
981
982 request = self._GetRequest(board=board)
983 packages_controller.GetAndroidMetadata(request, self.response,
984 self.api_config)
985
986 package_mock.assert_called_once_with(board)
987 branch_mock.assert_called_once_with(board, package=full_package)
988 version_mock.assert_called_once_with(board, package=full_package)
989
990 self.assertEqual(self.response.android_package, package)
991 self.assertEqual(self.response.android_branch, branch)
992 self.assertEqual(self.response.android_version, version)
993
994 def testNoAndroid(self):
995 """Test returns an empty response if given board has no Android."""
996 board = 'betty'
997
998 package_mock = self.PatchObject(packages_service,
999 'determine_android_package',
1000 return_value=None)
1001 branch_mock = self.PatchObject(packages_service,
1002 'determine_android_branch')
1003 version_mock = self.PatchObject(packages_service,
1004 'determine_android_version')
1005
1006 request = self._GetRequest(board=board)
1007 packages_controller.GetAndroidMetadata(request, self.response,
1008 self.api_config)
1009
1010 package_mock.assert_called_once_with(board)
1011 branch_mock.assert_not_called()
1012 version_mock.assert_not_called()
1013
1014 self.assertFalse(self.response.android_package)
1015 self.assertFalse(self.response.android_branch)
1016 self.assertFalse(self.response.android_version)