blob: 1c7ab80579c6410ba7f96b4449c76bfc89e52ccc [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']
Alex Kleineb77ffa2019-05-28 14:47:44 -060081 expected_type = constants.BOTH_OVERLAYS
82 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
83 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060084 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
85 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060086
Alex Klein231d2da2019-07-22 16:44:45 -060087 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060088
89 # Make sure the type is right, verify build targets after.
90 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
91 output_dir)
92 # First argument (build targets) of the first (only) call.
93 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040094 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060095
Alex Klein231d2da2019-07-22 16:44:45 -060096 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060097 self.assertIn(ebuild.path, changed)
98 changed.remove(ebuild.path)
99 self.assertFalse(changed)
100
David Burger1e0fe232019-07-01 14:52:07 -0600101
Alex Kleinda39c6d2019-09-16 14:36:36 -0600102class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -0600103 """UprevVersionedPackage tests."""
104
105 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -0600106 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600107
108 def _addVersion(self, request, version):
109 """Helper method to add a full version message to the request."""
110 ref = request.versions.add()
111 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600112 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600113 ref.revision = 'abc123'
114
115 def testValidateOnly(self):
116 """Sanity check validate only calls are working properly."""
117 service = self.PatchObject(packages_service, 'uprev_versioned_package')
118
119 request = packages_pb2.UprevVersionedPackageRequest()
120 self._addVersion(request, '1.2.3.4')
121 request.package_info.category = 'chromeos-base'
122 request.package_info.package_name = 'chromeos-chrome'
123
124 packages_controller.UprevVersionedPackage(request, self.response,
125 self.validate_only_config)
126
127 service.assert_not_called()
128
Michael Mortensen2677bf62019-10-29 08:31:25 -0600129 def testMockCall(self):
130 """Test that a mock call does not execute logic, returns mocked value."""
131 patch = self.PatchObject(packages_service, 'uprev_versioned_package')
132 request = packages_pb2.UprevVersionedPackageRequest()
133 packages_controller.UprevVersionedPackage(request, self.response,
134 self.mock_call_config)
135 patch.assert_not_called()
136 self.assertTrue(self.response.responses)
137 self.assertTrue(self.response.responses[0].modified_ebuilds)
138
Alex Klein87531182019-08-12 15:23:37 -0600139 def testNoVersions(self):
140 """Test no versions provided."""
141 request = packages_pb2.UprevVersionedPackageRequest()
142 request.package_info.category = 'chromeos-base'
143 request.package_info.package_name = 'chromeos-chrome'
144
145 with self.assertRaises(cros_build_lib.DieSystemExit):
146 packages_controller.UprevVersionedPackage(request, self.response,
147 self.api_config)
148
149 def testNoPackageName(self):
150 """Test no package name provided."""
151 request = packages_pb2.UprevVersionedPackageRequest()
152 self._addVersion(request, '1.2.3.4')
153 request.package_info.category = 'chromeos-base'
154
155 with self.assertRaises(cros_build_lib.DieSystemExit):
156 packages_controller.UprevVersionedPackage(request, self.response,
157 self.api_config)
158
159 def testNoCategory(self):
160 """Test no package category provided."""
161 request = packages_pb2.UprevVersionedPackageRequest()
162 self._addVersion(request, '1.2.3.4')
163 request.package_info.package_name = 'chromeos-chrome'
164
165 with self.assertRaises(cros_build_lib.DieSystemExit):
166 packages_controller.UprevVersionedPackage(request, self.response,
167 self.api_config)
168
169 def testOutputHandling(self):
170 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600171 version = '1.2.3.4'
Chris McDonald38409112020-09-24 11:24:51 -0600172 result = uprev_lib.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600173 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600174
Alex Klein34afcbc2019-08-22 16:14:31 -0600175 self.PatchObject(
176 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600177
178 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600179 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600180 request.package_info.category = 'chromeos-base'
181 request.package_info.package_name = 'chromeos-chrome'
182
183 packages_controller.UprevVersionedPackage(request, self.response,
184 self.api_config)
185
Yaakov Shaul730814a2019-09-10 13:58:25 -0600186 for idx, uprev_response in enumerate(self.response.responses):
187 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400188 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600189 result.modified[idx].files,
190 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600191
192
Alex Kleinda39c6d2019-09-16 14:36:36 -0600193class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600194 """GetBestVisible tests."""
195
Alex Klein231d2da2019-07-22 16:44:45 -0600196 def setUp(self):
197 self.response = packages_pb2.GetBestVisibleResponse()
198
David Burger1e0fe232019-07-01 14:52:07 -0600199 def _GetRequest(self, atom=None):
200 return packages_pb2.GetBestVisibleRequest(
201 atom=atom,
202 )
203
David Burger1e0fe232019-07-01 14:52:07 -0600204 def _MakeCpv(self, category, package, version):
205 unused = {
206 'cp': None,
207 'cpv': None,
208 'cpf': None,
209 'pv': None,
210 'version_no_rev': None,
211 'rev': None,
212 }
Alex Klein75df1792020-06-11 14:42:49 -0600213 return package_info.CPV(
David Burger1e0fe232019-07-01 14:52:07 -0600214 category=category,
215 package=package,
216 version=version,
217 **unused
218 )
219
Alex Klein231d2da2019-07-22 16:44:45 -0600220 def testValidateOnly(self):
221 """Sanity check that a validate only call does not execute any logic."""
222 patch = self.PatchObject(packages_service, 'get_best_visible')
223
224 request = self._GetRequest(atom='chromeos-chrome')
225 packages_controller.GetBestVisible(request, self.response,
226 self.validate_only_config)
227 patch.assert_not_called()
228
Michael Mortensen2677bf62019-10-29 08:31:25 -0600229 def testMockCall(self):
230 """Test that a mock call does not execute logic, returns mocked value."""
231 patch = self.PatchObject(packages_service, 'get_best_visible')
232 request = self._GetRequest(atom='chromeos-chrome')
233 packages_controller.GetBestVisible(request, self.response,
234 self.mock_call_config)
235 patch.assert_not_called()
236 self.assertTrue(self.response.package_info)
237 self.assertTrue(self.response.package_info.category)
238 self.assertTrue(self.response.package_info.package_name)
239 self.assertTrue(self.response.package_info.version)
240
David Burger1e0fe232019-07-01 14:52:07 -0600241 def testNoAtomFails(self):
242 """No atom provided should fail."""
243 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600244 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600245 packages_controller.GetBestVisible(request, self.response,
246 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600247
248 def testSuccess(self):
249 """Test overall success, argument handling, result forwarding."""
250 cpv = self._MakeCpv('category', 'package', 'version')
251 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
252
253 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600254
Alex Klein231d2da2019-07-22 16:44:45 -0600255 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600256
Alex Klein75df1792020-06-11 14:42:49 -0600257 package_info_msg = self.response.package_info
258 self.assertEqual(package_info_msg.category, cpv.category)
259 self.assertEqual(package_info_msg.package_name, cpv.package)
260 self.assertEqual(package_info_msg.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600261
262
Michael Mortensen68abdb72019-10-28 09:43:52 -0600263class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
264 """GetChromeVersion tests."""
265
266 def setUp(self):
267 self.response = packages_pb2.GetChromeVersionResponse()
268
269 def _GetRequest(self, board=None):
270 """Helper to build out a request."""
271 request = packages_pb2.GetChromeVersionRequest()
272
273 if board:
274 request.build_target.name = board
275
276 return request
277
278 def testValidateOnly(self):
279 """Sanity check that a validate only call does not execute any logic."""
280 chrome_version = self.PatchObject(packages_service,
281 'determine_chrome_version')
282 request = self._GetRequest(board='betty')
283 packages_controller.GetChromeVersion(request, self.response,
284 self.validate_only_config)
285 chrome_version.assert_not_called()
286
287 def testMockCall(self):
288 """Test that a mock call does not execute logic, returns mocked value."""
289 chrome_version = self.PatchObject(packages_service,
290 'determine_chrome_version')
291 request = self._GetRequest(board='betty')
292 packages_controller.GetChromeVersion(request, self.response,
293 self.mock_call_config)
294 chrome_version.assert_not_called()
295 self.assertTrue(self.response.version)
296
297 def testGetChromeVersion(self):
298 """Verify basic return values."""
299 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600300 chrome_version_mock = self.PatchObject(packages_service,
301 'determine_chrome_version',
302 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600303 request = self._GetRequest(board='betty')
304 packages_controller.GetChromeVersion(request, self.response,
305 self.api_config)
306 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600307 # Verify call to determine_chrome_version passes a build_target object.
308 build_target = build_target_lib.BuildTarget('betty')
309 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600310
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600311 def testGetChromeVersionHandleNone(self):
312 """Verify basic return values."""
313 self.PatchObject(packages_service, 'determine_chrome_version',
314 return_value=None)
315 request = self._GetRequest(board='betty')
316 packages_controller.GetChromeVersion(request, self.response,
317 self.api_config)
318 self.assertFalse(self.response.version)
319
Michael Mortensen68abdb72019-10-28 09:43:52 -0600320
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600321class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
322 """GetTargetVersions tests."""
323
324 def setUp(self):
325 self.response = packages_pb2.GetTargetVersionsResponse()
326
327 def _GetRequest(self, board=None):
328 """Helper to build out a request."""
329 request = packages_pb2.GetTargetVersionsRequest()
330
331 if board:
332 request.build_target.name = board
333
334 return request
335
336 def testValidateOnly(self):
337 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600338 builds_chrome = self.PatchObject(
339 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600340 patch_version = self.PatchObject(packages_service,
341 'determine_android_version')
342 patch_branch_version = self.PatchObject(packages_service,
343 'determine_android_branch')
344 patch_target_version = self.PatchObject(packages_service,
345 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600346 chrome_version = self.PatchObject(packages_service,
347 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600348 platform_version = self.PatchObject(packages_service,
349 'determine_platform_version')
350 milestone_version = self.PatchObject(packages_service,
351 'determine_milestone_version')
352 full_version = self.PatchObject(packages_service,
353 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600354
355 request = self._GetRequest(board='betty')
356 packages_controller.GetTargetVersions(request, self.response,
357 self.validate_only_config)
358 patch_version.assert_not_called()
359 patch_branch_version.assert_not_called()
360 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600361 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600362 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600363 platform_version.assert_not_called()
364 milestone_version.assert_not_called()
365 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600366
Michael Mortensen2677bf62019-10-29 08:31:25 -0600367 def testMockCall(self):
368 """Test that a mock call does not execute logic, returns mocked value."""
369 builds_chrome = self.PatchObject(
370 packages_service, 'builds', return_value=True)
371 patch_version = self.PatchObject(packages_service,
372 'determine_android_version')
373 patch_branch_version = self.PatchObject(packages_service,
374 'determine_android_branch')
375 patch_target_version = self.PatchObject(packages_service,
376 'determine_android_target')
377 chrome_version = self.PatchObject(packages_service,
378 'determine_chrome_version')
379 platform_version = self.PatchObject(packages_service,
380 'determine_platform_version')
381 milestone_version = self.PatchObject(packages_service,
382 'determine_milestone_version')
383 full_version = self.PatchObject(packages_service,
384 'determine_full_version')
385
386 request = self._GetRequest(board='betty')
387 packages_controller.GetTargetVersions(request, self.response,
388 self.mock_call_config)
389
390 patch_version.assert_not_called()
391 patch_branch_version.assert_not_called()
392 patch_target_version.assert_not_called()
393 builds_chrome.assert_not_called()
394 chrome_version.assert_not_called()
395 platform_version.assert_not_called()
396 milestone_version.assert_not_called()
397 full_version.assert_not_called()
398
399 self.assertTrue(self.response.android_version)
400 self.assertTrue(self.response.android_branch_version)
401 self.assertTrue(self.response.android_target_version)
402 self.assertTrue(self.response.chrome_version)
403 self.assertTrue(self.response.platform_version)
404 self.assertTrue(self.response.milestone_version)
405 self.assertTrue(self.response.full_version)
406
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600407 def testNoBuildTargetFails(self):
408 """No build target argument should fail."""
409 request = self._GetRequest()
410
411 with self.assertRaises(cros_build_lib.DieSystemExit):
412 packages_controller.GetTargetVersions(request, self.response,
413 self.api_config)
414
Michael Mortensenc2615b72019-10-15 08:12:24 -0600415 def testGetTargetVersions(self):
416 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600417 # Mock that chrome is built and set the chrome_version.
418 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600419 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600420 chrome_version_mock = self.PatchObject(packages_service,
421 'determine_chrome_version',
422 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500423 android_package = 'chromeos-base/android-container-pi-10.3'
424 self.PatchObject(packages_service, 'determine_android_package',
425 return_value=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600426 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600427 android_branch_mock = self.PatchObject(packages_service,
428 'determine_android_branch',
429 return_value=android_branch)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600430 platform_version = '12345.1.2'
431 self.PatchObject(packages_service, 'determine_platform_version',
432 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600433 milestone_version = '79'
434 self.PatchObject(packages_service, 'determine_milestone_version',
435 return_value=milestone_version)
436 full_version = 'R79-12345.1.2'
437 self.PatchObject(packages_service, 'determine_full_version',
438 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600439 request = self._GetRequest(board='betty')
440 packages_controller.GetTargetVersions(request, self.response,
441 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500442 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600443 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500444 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600445 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600446 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600447 self.assertEqual(self.response.milestone_version, milestone_version)
448 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600449 # Verify call to determine_chrome_version passes a build_target object.
450 build_target = build_target_lib.BuildTarget('betty')
451 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600452 # Verify call to determine_android_branch passes a board name.
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500453 android_branch_mock.assert_called_with('betty', package=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600454
Michael Mortensen42c330e32020-09-02 09:59:16 -0600455 def testGetTargetVersionsWithPackagesSet(self):
456 """Verify packages pass through and basic return values."""
457 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
458 # rather than mocking the boundary to portage calls such as
459 # packages_service.builds).
460 builds_mock = self.PatchObject(packages_service, 'builds',
461 return_value=True)
462 # Mock that chrome is built and set the chrome_version.
463 chrome_version = '76.0.1.2'
464 self.PatchObject(packages_service, 'determine_chrome_version',
465 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500466 android_package = 'chromeos-base/android-container-pi-10.3'
467 self.PatchObject(packages_service, 'determine_android_package',
468 return_value=android_package)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600469 android_branch = 'android_test_branch'
470 self.PatchObject(packages_service, 'determine_android_branch',
471 return_value=android_branch)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600472 platform_version = '12345.1.2'
473 self.PatchObject(packages_service, 'determine_platform_version',
474 return_value=platform_version)
475 milestone_version = '79'
476 self.PatchObject(packages_service, 'determine_milestone_version',
477 return_value=milestone_version)
478 full_version = 'R79-12345.1.2'
479 self.PatchObject(packages_service, 'determine_full_version',
480 return_value=full_version)
481 request = self._GetRequest(board='betty')
482 # Add optional packages to the request.
483 cpv_package_list = []
484 package = request.packages.add()
485 package.package_name = 'test'
486 package.category = 'chromeos-base'
487 package.version = '0.0.1-r1'
488 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
489 package = request.packages.add()
490 package.package_name = 'target-fuzzers'
491 package.category = 'virtual'
492 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
493
494 packages_controller.GetTargetVersions(request, self.response,
495 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500496 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600497 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500498 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600499 self.assertEqual(self.response.chrome_version, chrome_version)
500 self.assertEqual(self.response.platform_version, platform_version)
501 self.assertEqual(self.response.milestone_version, milestone_version)
502 # Verify call to packages.builds passes the package list.
503 builds_mock.assert_called_with(constants.CHROME_CP,
504 mock.ANY, # Match the build target object
505 packages=cpv_package_list)
506
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600507 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600508 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600509 platform_version = '12345.1.2'
510 self.PatchObject(packages_service, 'determine_platform_version',
511 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600512 self.PatchObject(packages_service, 'builds', return_value=False)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500513 self.PatchObject(packages_service, 'determine_android_package',
Michael Mortensenedf76532019-10-16 14:22:37 -0600514 return_value=None)
515 request = self._GetRequest(board='betty')
516 packages_controller.GetTargetVersions(request, self.response,
517 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600518 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600519 self.assertFalse(self.response.android_version)
520 self.assertFalse(self.response.android_branch_version)
521 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600522 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600523
Michael Mortensenbfc56392020-04-30 15:23:47 -0600524
525class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
526 """GetBuilderMetadata tests."""
527
528 def setUp(self):
529 self.response = packages_pb2.GetBuilderMetadataResponse()
530
531 def _GetRequest(self, board=None):
532 """Helper to build out a request."""
533 request = packages_pb2.GetBuilderMetadataRequest()
534
535 if board:
536 request.build_target.name = board
537
538 return request
539
540 def testValidateOnly(self):
541 """Sanity check that a validate only call does not execute any logic."""
542 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600543 patch_version = self.PatchObject(packages_service,
544 'determine_android_version')
545 patch_branch_version = self.PatchObject(packages_service,
546 'determine_android_branch')
547 patch_fw_versions = self.PatchObject(packages_service,
548 'determine_firmware_versions')
549 patch_fingerprints = self.PatchObject(packages_service,
550 'find_fingerprints')
551 patch_get_models = self.PatchObject(packages_service,
552 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600553 packages_controller.GetBuilderMetadata(request, self.response,
554 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600555 patch_version.assert_not_called()
556 patch_branch_version.assert_not_called()
557 patch_fw_versions.assert_not_called()
558 patch_fingerprints.assert_not_called()
559 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600560
561 def testMockCall(self):
562 """Test that a mock call does not execute logic, returns mocked value."""
563 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600564 patch_version = self.PatchObject(packages_service,
565 'determine_android_version')
566 patch_branch_version = self.PatchObject(packages_service,
567 'determine_android_branch')
568 patch_fw_versions = self.PatchObject(packages_service,
569 'determine_firmware_versions')
570 patch_fingerprints = self.PatchObject(packages_service,
571 'find_fingerprints')
572 patch_get_models = self.PatchObject(packages_service,
573 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600574 packages_controller.GetBuilderMetadata(request, self.response,
575 self.mock_call_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600576 patch_version.assert_not_called()
577 patch_branch_version.assert_not_called()
578 patch_fw_versions.assert_not_called()
579 patch_fingerprints.assert_not_called()
580 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600581
582 self.assertEqual(len(self.response.build_target_metadata), 1)
583 self.assertEqual(self.response.build_target_metadata[0].build_target,
584 request.build_target.name)
585 self.assertEqual(len(self.response.model_metadata), 1)
586 self.assertTrue(self.response.model_metadata[0].model_name)
587 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
588
589 def testNoBuildTargetFails(self):
590 """No build target argument should fail."""
591 request = self._GetRequest()
592
593 with self.assertRaises(cros_build_lib.DieSystemExit):
594 packages_controller.GetBuilderMetadata(request, self.response,
595 self.api_config)
596
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600597 def testGetBuilderMetadata(self):
598 """Verify basic return values."""
599 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600600 android_version_mock = self.PatchObject(packages_service,
601 'determine_android_version',
602 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600603 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600604 android_branch_mock = self.PatchObject(packages_service,
605 'determine_android_branch',
606 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600607 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600608 android_target_mock = self.PatchObject(packages_service,
609 'determine_android_target',
610 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600611 self.PatchObject(portage_util, 'GetBoardUseFlags',
612 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600613 package_result = ['sys-kernel/linux-headers-4.14-r24',
614 'sys-devel/flex-2.6.4-r1',
615 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
616 self.PatchObject(portage_util, 'GetPackageDependencies',
617 return_value=package_result)
618
Michael Mortensena4af79e2020-05-06 16:18:48 -0600619 fw_versions = packages_service.FirmwareVersions(
620 None,
621 'Google_Caroline.7820.263.0',
622 'Google_Caroline.7820.286.0',
623 'caroline_v1.9.357-ac5c7b4',
624 'caroline_v1.9.370-e8b9bd2')
625 self.PatchObject(packages_service, 'get_firmware_versions',
626 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600627 fingerprints = ['fingerprint1', 'fingerprint2']
628 self.PatchObject(packages_service, 'find_fingerprints',
629 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600630 # Patch packages.get_models, packages.get_all_firmware_versions,
631 # and packages.get_key_id for calls needed by model_metadata.
632 model_list = ['pyro', 'reef']
633 all_fw_versions = {
634 'pyro': packages_service.FirmwareVersions(
635 'pyro',
636 'Google_Pyro.9042.87.1',
637 'Google_Pyro.9042.110.0',
638 'pyro_v1.1.5900-ab1ee51',
639 'pyro_v1.1.5909-bd1f0c9'),
640 'reef': packages_service.FirmwareVersions(
641 'reef',
642 'Google_Reef.9042.87.1',
643 'Google_Reef.9042.110.0',
644 'reef_v1.1.5900-ab1ee51',
645 'reef_v1.1.5909-bd1f0c9')
646 }
647 self.PatchObject(packages_service, 'get_all_firmware_versions',
648 return_value=all_fw_versions)
649 self.PatchObject(packages_service, 'get_models',
650 return_value=model_list)
651 self.PatchObject(packages_service, 'get_key_id',
652 return_value='key')
653
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600654 request = self._GetRequest(board='betty')
655 packages_controller.GetBuilderMetadata(request, self.response,
656 self.api_config)
657 self.assertEqual(
658 self.response.build_target_metadata[0].build_target,
659 'betty')
660 self.assertEqual(
661 self.response.build_target_metadata[0].android_container_version,
662 android_version)
663 self.assertEqual(
664 self.response.build_target_metadata[0].android_container_branch,
665 android_branch)
666 self.assertEqual(
667 self.response.build_target_metadata[0].android_container_target,
668 android_target)
669 self.assertEqual(
670 self.response.build_target_metadata[0].arc_use_set,
671 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600672 # Verify call to determine_android_version passes list of the board name.
Mike Frysingerb53f1822021-03-05 00:44:50 -0500673 android_version_mock.assert_called_with('betty')
Michael Mortensen027ecd82020-05-05 13:13:40 -0600674 # Verify call to determine_android_branch passes board name.
675 android_branch_mock.assert_called_with('betty')
676 # Verify call to determine_android_target passes board name.
677 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600678 self.assertEqual(
679 self.response.build_target_metadata[0].main_firmware_version,
680 'Google_Caroline.7820.286.0')
681 self.assertEqual(
682 self.response.build_target_metadata[0].ec_firmware_version,
683 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600684 self.assertEqual(
685 self.response.build_target_metadata[0].kernel_version,
686 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600687 self.assertEqual(
688 len(self.response.build_target_metadata[0].fingerprints),
689 2)
690 self.assertEqual(
691 self.response.build_target_metadata[0].fingerprints,
692 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600693 self.assertEqual(
694 len(self.response.model_metadata), 2)
695 self.assertEqual(
696 self.response.model_metadata[0].model_name, 'pyro')
697 self.assertEqual(
698 self.response.model_metadata[0].ec_firmware_version,
699 'pyro_v1.1.5909-bd1f0c9')
700 self.assertEqual(
701 self.response.model_metadata[0].firmware_key_id, 'key')
702 self.assertEqual(
703 self.response.model_metadata[0].main_readonly_firmware_version,
704 'Google_Pyro.9042.87.1')
705 self.assertEqual(
706 self.response.model_metadata[0].main_readwrite_firmware_version,
707 'Google_Pyro.9042.110.0')
708 self.assertEqual(
709 self.response.model_metadata[1].model_name, 'reef')
710 self.assertEqual(
711 self.response.model_metadata[1].ec_firmware_version,
712 'reef_v1.1.5909-bd1f0c9')
713 self.assertEqual(
714 self.response.model_metadata[1].firmware_key_id, 'key')
715 self.assertEqual(
716 self.response.model_metadata[1].main_readonly_firmware_version,
717 'Google_Reef.9042.87.1')
718 self.assertEqual(
719 self.response.model_metadata[1].main_readwrite_firmware_version,
720 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600721
Michael Mortensend81d81e2020-06-09 14:20:59 -0600722 # Test corner case where find_fingerprints returns None.
723 # Re-patch find_fingerprints to now return None and re-execute
724 # GetBuilderMetadata to verify behavior.
725 response = packages_pb2.GetBuilderMetadataResponse()
726 self.PatchObject(packages_service, 'find_fingerprints',
727 return_value=[])
728 request = self._GetRequest(board='betty')
729 packages_controller.GetBuilderMetadata(request, response,
730 self.api_config)
731 # Verify a non-fingerprint build_target_metdata field was still set.
732 self.assertEqual(
733 response.build_target_metadata[0].kernel_version,
734 '4.4.223-r2209')
735 # And then verify that fingerprints was empty.
736 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
737
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600738
Alex Kleinda39c6d2019-09-16 14:36:36 -0600739class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
740 """HasChromePrebuilt tests."""
741
742 def setUp(self):
743 self.response = packages_pb2.HasChromePrebuiltResponse()
744
745 def _GetRequest(self, board=None):
746 """Helper to build out a request."""
747 request = packages_pb2.HasChromePrebuiltRequest()
748
749 if board:
750 request.build_target.name = board
751
752 return request
753
754 def testValidateOnly(self):
755 """Sanity check that a validate only call does not execute any logic."""
756 patch = self.PatchObject(packages_service, 'has_prebuilt')
757
758 request = self._GetRequest(board='betty')
759 packages_controller.HasChromePrebuilt(request, self.response,
760 self.validate_only_config)
761 patch.assert_not_called()
762
Michael Mortensen3232ab32020-01-05 19:14:36 -0700763 def testMockCall(self):
764 """Test that a mock call does not execute logic, returns mocked value."""
765 patch = self.PatchObject(packages_service, 'has_prebuilt')
766
767 request = self._GetRequest(board='betty')
768 packages_controller.HasChromePrebuilt(request, self.response,
769 self.mock_call_config)
770 patch.assert_not_called()
771 self.assertTrue(self.response.has_prebuilt)
772
Alex Kleinda39c6d2019-09-16 14:36:36 -0600773 def testNoBuildTargetFails(self):
774 """No build target argument should fail."""
775 request = self._GetRequest()
776
777 with self.assertRaises(cros_build_lib.DieSystemExit):
778 packages_controller.HasChromePrebuilt(request, self.response,
779 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600780
781
782class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
783 """BuildsChrome tests."""
784
785 def setUp(self):
786 self.response = packages_pb2.BuildsChromeResponse()
787
David Burger0f9dd4e2019-10-08 12:33:42 -0600788 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600789 """Helper to build out a request."""
790 request = packages_pb2.BuildsChromeRequest()
791
792 if board:
793 request.build_target.name = board
794
David Burger0f9dd4e2019-10-08 12:33:42 -0600795 if packages:
796 request.packages.extend(packages)
797
Alex Klein73fb6572019-09-30 16:55:23 -0600798 return request
799
800 def testValidateOnly(self):
801 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600802 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600803
804 request = self._GetRequest(board='betty')
805 packages_controller.BuildsChrome(request, self.response,
806 self.validate_only_config)
807 patch.assert_not_called()
808
809 def testNoBuildTargetFails(self):
810 """No build target argument should fail."""
811 request = self._GetRequest()
812
813 with self.assertRaises(cros_build_lib.DieSystemExit):
814 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600815
816 def testBuilds(self):
817 """Test successful call handling."""
818 patch = self.PatchObject(packages_service, 'builds', return_value=True)
819
820 request = self._GetRequest(board='foo')
821 packages_controller.BuildsChrome(request, self.response, self.api_config)
822 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600823 patch.assert_called_once_with(constants.CHROME_CP,
824 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600825
826 def testBuildsChromeWithPackages(self):
827 """Test successful call with packages handling."""
828 patch = self.PatchObject(packages_service, 'builds', return_value=True)
829
830 package = common_pb2.PackageInfo(
831 category='category',
832 package_name='name',
833 version='1.01',
834 )
835 request = self._GetRequest(board='foo', packages=[package])
836 packages_controller.BuildsChrome(request, self.response, self.api_config)
837 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600838 patch.assert_called_once_with(constants.CHROME_CP,
839 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600840 [controller_util.PackageInfoToCPV(package)])
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900841
842
Alex Klein9ce3f682021-06-23 15:06:44 -0600843class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
844 """NeedsChromeSource tests."""
845
846 def setUp(self):
847 self.response = packages_pb2.NeedsChromeSourceResponse()
848
849 self.board = 'board'
850 self.sysroot = self.tempdir
851
852 def _GetRequest(self, compile_source=False):
853 """Helper to build a request."""
854 request = packages_pb2.NeedsChromeSourceRequest()
855
856 request.install_request.sysroot.path = self.sysroot
857 request.install_request.sysroot.build_target.name = self.board
858 request.install_request.flags.compile_source = compile_source
859
860 return request
861
862 def testAll(self):
863 """Reason translation test."""
864 result = packages_service.NeedsChromeSourceResult(
865 needs_chrome_source=True,
866 builds_chrome=True,
867 packages=[package_info.parse('cat/pkg')],
868 missing_chrome_prebuilt=True,
869 missing_follower_prebuilt=True,
870 local_uprev=True,
871 )
872 self.PatchObject(packages_service, 'needs_chrome_source',
873 return_value=result)
874
875 packages_controller.NeedsChromeSource(self._GetRequest(compile_source=True),
876 self.response,
877 self.api_config)
878
879 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
880 self.response.reasons)
881 self.assertIn(packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
882 self.response.reasons)
883 self.assertIn(packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
884 self.response.reasons)
885 self.assertIn(
886 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
887 self.response.reasons)
888 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
889 self.response.reasons)
890 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
891 self.response.reasons)
892
893 self.assertEqual(1, len(self.response.packages))
894 self.assertEqual(('cat', 'pkg'), (self.response.packages[0].category,
895 self.response.packages[0].package_name))
896
897
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900898class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
899 """GetAndroidMetadata tests."""
900
901 def setUp(self):
902 self.response = packages_pb2.GetAndroidMetadataResponse()
903
904 def _GetRequest(self, board=None):
905 """Helper to build out a request."""
906 request = packages_pb2.GetAndroidMetadataRequest()
907
908 if board:
909 request.build_target.name = board
910
911 return request
912
913 def testValidateOnly(self):
914 """Check that a validate only call does not execute any logic."""
915 package_mock = self.PatchObject(packages_service,
916 'determine_android_package')
917 branch_mock = self.PatchObject(packages_service,
918 'determine_android_branch')
919 version_mock = self.PatchObject(packages_service,
920 'determine_android_version')
921
922 request = self._GetRequest(board='betty')
923 packages_controller.GetAndroidMetadata(request, self.response,
924 self.validate_only_config)
925
926 package_mock.assert_not_called()
927 branch_mock.assert_not_called()
928 version_mock.assert_not_called()
929
930 def testMockCall(self):
931 """Test that a mock call does not execute logic, returns mocked value."""
932 package_mock = self.PatchObject(packages_service,
933 'determine_android_package')
934 branch_mock = self.PatchObject(packages_service,
935 'determine_android_branch')
936 version_mock = self.PatchObject(packages_service,
937 'determine_android_version')
938
939 request = self._GetRequest(board='betty')
940 packages_controller.GetAndroidMetadata(request, self.response,
941 self.mock_call_config)
942
943 package_mock.assert_not_called()
944 branch_mock.assert_not_called()
945 version_mock.assert_not_called()
946
947 self.assertTrue(self.response.android_package)
948 self.assertTrue(self.response.android_branch)
949 self.assertTrue(self.response.android_version)
950
951 def testNoBuildTargetFails(self):
952 """No build target argument should fail."""
953 request = self._GetRequest()
954 with self.assertRaises(cros_build_lib.DieSystemExit):
955 packages_controller.GetAndroidMetadata(request, self.response,
956 self.api_config)
957
958 def testSuccess(self):
959 """Test a successful call."""
960 board = 'betty'
961 package = 'android-package'
962 branch = 'android-branch'
963 version = '7123456'
964 full_package = f'chromeos-base/{package}-{version}-r1'
965
966 package_mock = self.PatchObject(packages_service,
967 'determine_android_package',
968 return_value=full_package)
969 branch_mock = self.PatchObject(packages_service,
970 'determine_android_branch',
971 return_value=branch)
972 version_mock = self.PatchObject(packages_service,
973 'determine_android_version',
974 return_value=version)
975
976 request = self._GetRequest(board=board)
977 packages_controller.GetAndroidMetadata(request, self.response,
978 self.api_config)
979
980 package_mock.assert_called_once_with(board)
981 branch_mock.assert_called_once_with(board, package=full_package)
982 version_mock.assert_called_once_with(board, package=full_package)
983
984 self.assertEqual(self.response.android_package, package)
985 self.assertEqual(self.response.android_branch, branch)
986 self.assertEqual(self.response.android_version, version)
987
988 def testNoAndroid(self):
989 """Test returns an empty response if given board has no Android."""
990 board = 'betty'
991
992 package_mock = self.PatchObject(packages_service,
993 'determine_android_package',
994 return_value=None)
995 branch_mock = self.PatchObject(packages_service,
996 'determine_android_branch')
997 version_mock = self.PatchObject(packages_service,
998 'determine_android_version')
999
1000 request = self._GetRequest(board=board)
1001 packages_controller.GetAndroidMetadata(request, self.response,
1002 self.api_config)
1003
1004 package_mock.assert_called_once_with(board)
1005 branch_mock.assert_not_called()
1006 version_mock.assert_not_called()
1007
1008 self.assertFalse(self.response.android_package)
1009 self.assertFalse(self.response.android_branch)
1010 self.assertFalse(self.response.android_version)