blob: 7834b249ab0a6407aea8fb32b7cea41f1f2ff2b1 [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
Alex Klein231d2da2019-07-22 16:44:45 -0600210 def testValidateOnly(self):
211 """Sanity check that a validate only call does not execute any logic."""
212 patch = self.PatchObject(packages_service, 'get_best_visible')
213
214 request = self._GetRequest(atom='chromeos-chrome')
215 packages_controller.GetBestVisible(request, self.response,
216 self.validate_only_config)
217 patch.assert_not_called()
218
Michael Mortensen2677bf62019-10-29 08:31:25 -0600219 def testMockCall(self):
220 """Test that a mock call does not execute logic, returns mocked value."""
221 patch = self.PatchObject(packages_service, 'get_best_visible')
222 request = self._GetRequest(atom='chromeos-chrome')
223 packages_controller.GetBestVisible(request, self.response,
224 self.mock_call_config)
225 patch.assert_not_called()
226 self.assertTrue(self.response.package_info)
227 self.assertTrue(self.response.package_info.category)
228 self.assertTrue(self.response.package_info.package_name)
229 self.assertTrue(self.response.package_info.version)
230
David Burger1e0fe232019-07-01 14:52:07 -0600231 def testNoAtomFails(self):
232 """No atom provided should fail."""
233 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600234 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600235 packages_controller.GetBestVisible(request, self.response,
236 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600237
238 def testSuccess(self):
239 """Test overall success, argument handling, result forwarding."""
Alex Klein5caab872021-09-10 11:44:37 -0600240 pkg = package_info.PackageInfo('category', 'package', '1.2.3.4', 5)
241 self.PatchObject(packages_service, 'get_best_visible', return_value=pkg)
David Burger1e0fe232019-07-01 14:52:07 -0600242
Alex Klein5caab872021-09-10 11:44:37 -0600243 request = self._GetRequest(atom='category/package')
David Burger1e0fe232019-07-01 14:52:07 -0600244
Alex Klein231d2da2019-07-22 16:44:45 -0600245 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600246
Alex Klein75df1792020-06-11 14:42:49 -0600247 package_info_msg = self.response.package_info
Alex Klein5caab872021-09-10 11:44:37 -0600248 self.assertEqual(package_info_msg.category, pkg.category)
249 self.assertEqual(package_info_msg.package_name, pkg.package)
250 self.assertEqual(package_info_msg.version, pkg.vr)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600251
252
Michael Mortensen68abdb72019-10-28 09:43:52 -0600253class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
254 """GetChromeVersion tests."""
255
256 def setUp(self):
257 self.response = packages_pb2.GetChromeVersionResponse()
258
259 def _GetRequest(self, board=None):
260 """Helper to build out a request."""
261 request = packages_pb2.GetChromeVersionRequest()
262
263 if board:
264 request.build_target.name = board
265
266 return request
267
268 def testValidateOnly(self):
269 """Sanity check that a validate only call does not execute any logic."""
270 chrome_version = self.PatchObject(packages_service,
271 'determine_chrome_version')
272 request = self._GetRequest(board='betty')
273 packages_controller.GetChromeVersion(request, self.response,
274 self.validate_only_config)
275 chrome_version.assert_not_called()
276
277 def testMockCall(self):
278 """Test that a mock call does not execute logic, returns mocked value."""
279 chrome_version = self.PatchObject(packages_service,
280 'determine_chrome_version')
281 request = self._GetRequest(board='betty')
282 packages_controller.GetChromeVersion(request, self.response,
283 self.mock_call_config)
284 chrome_version.assert_not_called()
285 self.assertTrue(self.response.version)
286
287 def testGetChromeVersion(self):
288 """Verify basic return values."""
289 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600290 chrome_version_mock = self.PatchObject(packages_service,
291 'determine_chrome_version',
292 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600293 request = self._GetRequest(board='betty')
294 packages_controller.GetChromeVersion(request, self.response,
295 self.api_config)
296 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600297 # Verify call to determine_chrome_version passes a build_target object.
298 build_target = build_target_lib.BuildTarget('betty')
299 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600300
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600301 def testGetChromeVersionHandleNone(self):
302 """Verify basic return values."""
303 self.PatchObject(packages_service, 'determine_chrome_version',
304 return_value=None)
305 request = self._GetRequest(board='betty')
306 packages_controller.GetChromeVersion(request, self.response,
307 self.api_config)
308 self.assertFalse(self.response.version)
309
Michael Mortensen68abdb72019-10-28 09:43:52 -0600310
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600311class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
312 """GetTargetVersions tests."""
313
314 def setUp(self):
315 self.response = packages_pb2.GetTargetVersionsResponse()
316
317 def _GetRequest(self, board=None):
318 """Helper to build out a request."""
319 request = packages_pb2.GetTargetVersionsRequest()
320
321 if board:
322 request.build_target.name = board
323
324 return request
325
326 def testValidateOnly(self):
327 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600328 builds_chrome = self.PatchObject(
329 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600330 patch_version = self.PatchObject(packages_service,
331 'determine_android_version')
332 patch_branch_version = self.PatchObject(packages_service,
333 'determine_android_branch')
334 patch_target_version = self.PatchObject(packages_service,
335 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600336 chrome_version = self.PatchObject(packages_service,
337 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600338 platform_version = self.PatchObject(packages_service,
339 'determine_platform_version')
340 milestone_version = self.PatchObject(packages_service,
341 'determine_milestone_version')
342 full_version = self.PatchObject(packages_service,
343 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600344
345 request = self._GetRequest(board='betty')
346 packages_controller.GetTargetVersions(request, self.response,
347 self.validate_only_config)
348 patch_version.assert_not_called()
349 patch_branch_version.assert_not_called()
350 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600351 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600352 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600353 platform_version.assert_not_called()
354 milestone_version.assert_not_called()
355 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600356
Michael Mortensen2677bf62019-10-29 08:31:25 -0600357 def testMockCall(self):
358 """Test that a mock call does not execute logic, returns mocked value."""
359 builds_chrome = self.PatchObject(
360 packages_service, 'builds', return_value=True)
361 patch_version = self.PatchObject(packages_service,
362 'determine_android_version')
363 patch_branch_version = self.PatchObject(packages_service,
364 'determine_android_branch')
365 patch_target_version = self.PatchObject(packages_service,
366 'determine_android_target')
367 chrome_version = self.PatchObject(packages_service,
368 'determine_chrome_version')
369 platform_version = self.PatchObject(packages_service,
370 'determine_platform_version')
371 milestone_version = self.PatchObject(packages_service,
372 'determine_milestone_version')
373 full_version = self.PatchObject(packages_service,
374 'determine_full_version')
375
376 request = self._GetRequest(board='betty')
377 packages_controller.GetTargetVersions(request, self.response,
378 self.mock_call_config)
379
380 patch_version.assert_not_called()
381 patch_branch_version.assert_not_called()
382 patch_target_version.assert_not_called()
383 builds_chrome.assert_not_called()
384 chrome_version.assert_not_called()
385 platform_version.assert_not_called()
386 milestone_version.assert_not_called()
387 full_version.assert_not_called()
388
389 self.assertTrue(self.response.android_version)
390 self.assertTrue(self.response.android_branch_version)
391 self.assertTrue(self.response.android_target_version)
392 self.assertTrue(self.response.chrome_version)
393 self.assertTrue(self.response.platform_version)
394 self.assertTrue(self.response.milestone_version)
395 self.assertTrue(self.response.full_version)
396
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600397 def testNoBuildTargetFails(self):
398 """No build target argument should fail."""
399 request = self._GetRequest()
400
401 with self.assertRaises(cros_build_lib.DieSystemExit):
402 packages_controller.GetTargetVersions(request, self.response,
403 self.api_config)
404
Michael Mortensenc2615b72019-10-15 08:12:24 -0600405 def testGetTargetVersions(self):
406 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600407 # Mock that chrome is built and set the chrome_version.
408 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600409 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600410 chrome_version_mock = self.PatchObject(packages_service,
411 'determine_chrome_version',
412 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500413 android_package = 'chromeos-base/android-container-pi-10.3'
414 self.PatchObject(packages_service, 'determine_android_package',
415 return_value=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600416 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600417 android_branch_mock = self.PatchObject(packages_service,
418 'determine_android_branch',
419 return_value=android_branch)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600420 platform_version = '12345.1.2'
421 self.PatchObject(packages_service, 'determine_platform_version',
422 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600423 milestone_version = '79'
424 self.PatchObject(packages_service, 'determine_milestone_version',
425 return_value=milestone_version)
426 full_version = 'R79-12345.1.2'
427 self.PatchObject(packages_service, 'determine_full_version',
428 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600429 request = self._GetRequest(board='betty')
430 packages_controller.GetTargetVersions(request, self.response,
431 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500432 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600433 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500434 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600435 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600436 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600437 self.assertEqual(self.response.milestone_version, milestone_version)
438 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600439 # Verify call to determine_chrome_version passes a build_target object.
440 build_target = build_target_lib.BuildTarget('betty')
441 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600442 # Verify call to determine_android_branch passes a board name.
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500443 android_branch_mock.assert_called_with('betty', package=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600444
Michael Mortensen42c330e32020-09-02 09:59:16 -0600445 def testGetTargetVersionsWithPackagesSet(self):
446 """Verify packages pass through and basic return values."""
447 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
448 # rather than mocking the boundary to portage calls such as
449 # packages_service.builds).
450 builds_mock = self.PatchObject(packages_service, 'builds',
451 return_value=True)
452 # Mock that chrome is built and set the chrome_version.
453 chrome_version = '76.0.1.2'
454 self.PatchObject(packages_service, 'determine_chrome_version',
455 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500456 android_package = 'chromeos-base/android-container-pi-10.3'
457 self.PatchObject(packages_service, 'determine_android_package',
458 return_value=android_package)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600459 android_branch = 'android_test_branch'
460 self.PatchObject(packages_service, 'determine_android_branch',
461 return_value=android_branch)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600462 platform_version = '12345.1.2'
463 self.PatchObject(packages_service, 'determine_platform_version',
464 return_value=platform_version)
465 milestone_version = '79'
466 self.PatchObject(packages_service, 'determine_milestone_version',
467 return_value=milestone_version)
468 full_version = 'R79-12345.1.2'
469 self.PatchObject(packages_service, 'determine_full_version',
470 return_value=full_version)
471 request = self._GetRequest(board='betty')
472 # Add optional packages to the request.
473 cpv_package_list = []
474 package = request.packages.add()
475 package.package_name = 'test'
476 package.category = 'chromeos-base'
477 package.version = '0.0.1-r1'
478 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
479 package = request.packages.add()
480 package.package_name = 'target-fuzzers'
481 package.category = 'virtual'
482 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
483
484 packages_controller.GetTargetVersions(request, self.response,
485 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500486 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600487 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500488 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600489 self.assertEqual(self.response.chrome_version, chrome_version)
490 self.assertEqual(self.response.platform_version, platform_version)
491 self.assertEqual(self.response.milestone_version, milestone_version)
492 # Verify call to packages.builds passes the package list.
493 builds_mock.assert_called_with(constants.CHROME_CP,
494 mock.ANY, # Match the build target object
495 packages=cpv_package_list)
496
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600497 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600498 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600499 platform_version = '12345.1.2'
500 self.PatchObject(packages_service, 'determine_platform_version',
501 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600502 self.PatchObject(packages_service, 'builds', return_value=False)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500503 self.PatchObject(packages_service, 'determine_android_package',
Michael Mortensenedf76532019-10-16 14:22:37 -0600504 return_value=None)
505 request = self._GetRequest(board='betty')
506 packages_controller.GetTargetVersions(request, self.response,
507 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600508 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600509 self.assertFalse(self.response.android_version)
510 self.assertFalse(self.response.android_branch_version)
511 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600512 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600513
Michael Mortensenbfc56392020-04-30 15:23:47 -0600514
515class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
516 """GetBuilderMetadata tests."""
517
518 def setUp(self):
519 self.response = packages_pb2.GetBuilderMetadataResponse()
520
521 def _GetRequest(self, board=None):
522 """Helper to build out a request."""
523 request = packages_pb2.GetBuilderMetadataRequest()
524
525 if board:
526 request.build_target.name = board
527
528 return request
529
530 def testValidateOnly(self):
531 """Sanity check that a validate only call does not execute any logic."""
532 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600533 patch_version = self.PatchObject(packages_service,
534 'determine_android_version')
535 patch_branch_version = self.PatchObject(packages_service,
536 'determine_android_branch')
537 patch_fw_versions = self.PatchObject(packages_service,
538 'determine_firmware_versions')
539 patch_fingerprints = self.PatchObject(packages_service,
540 'find_fingerprints')
541 patch_get_models = self.PatchObject(packages_service,
542 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600543 packages_controller.GetBuilderMetadata(request, self.response,
544 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600545 patch_version.assert_not_called()
546 patch_branch_version.assert_not_called()
547 patch_fw_versions.assert_not_called()
548 patch_fingerprints.assert_not_called()
549 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600550
551 def testMockCall(self):
552 """Test that a mock call does not execute logic, returns mocked value."""
553 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600554 patch_version = self.PatchObject(packages_service,
555 'determine_android_version')
556 patch_branch_version = self.PatchObject(packages_service,
557 'determine_android_branch')
558 patch_fw_versions = self.PatchObject(packages_service,
559 'determine_firmware_versions')
560 patch_fingerprints = self.PatchObject(packages_service,
561 'find_fingerprints')
562 patch_get_models = self.PatchObject(packages_service,
563 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600564 packages_controller.GetBuilderMetadata(request, self.response,
565 self.mock_call_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600566 patch_version.assert_not_called()
567 patch_branch_version.assert_not_called()
568 patch_fw_versions.assert_not_called()
569 patch_fingerprints.assert_not_called()
570 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600571
572 self.assertEqual(len(self.response.build_target_metadata), 1)
573 self.assertEqual(self.response.build_target_metadata[0].build_target,
574 request.build_target.name)
575 self.assertEqual(len(self.response.model_metadata), 1)
576 self.assertTrue(self.response.model_metadata[0].model_name)
577 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
578
579 def testNoBuildTargetFails(self):
580 """No build target argument should fail."""
581 request = self._GetRequest()
582
583 with self.assertRaises(cros_build_lib.DieSystemExit):
584 packages_controller.GetBuilderMetadata(request, self.response,
585 self.api_config)
586
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600587 def testGetBuilderMetadata(self):
588 """Verify basic return values."""
589 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600590 android_version_mock = self.PatchObject(packages_service,
591 'determine_android_version',
592 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600593 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600594 android_branch_mock = self.PatchObject(packages_service,
595 'determine_android_branch',
596 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600597 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600598 android_target_mock = self.PatchObject(packages_service,
599 'determine_android_target',
600 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600601 self.PatchObject(portage_util, 'GetBoardUseFlags',
602 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600603 package_result = ['sys-kernel/linux-headers-4.14-r24',
604 'sys-devel/flex-2.6.4-r1',
605 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
606 self.PatchObject(portage_util, 'GetPackageDependencies',
607 return_value=package_result)
608
Michael Mortensena4af79e2020-05-06 16:18:48 -0600609 fw_versions = packages_service.FirmwareVersions(
610 None,
611 'Google_Caroline.7820.263.0',
612 'Google_Caroline.7820.286.0',
613 'caroline_v1.9.357-ac5c7b4',
614 'caroline_v1.9.370-e8b9bd2')
615 self.PatchObject(packages_service, 'get_firmware_versions',
616 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600617 fingerprints = ['fingerprint1', 'fingerprint2']
618 self.PatchObject(packages_service, 'find_fingerprints',
619 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600620 # Patch packages.get_models, packages.get_all_firmware_versions,
621 # and packages.get_key_id for calls needed by model_metadata.
622 model_list = ['pyro', 'reef']
623 all_fw_versions = {
624 'pyro': packages_service.FirmwareVersions(
625 'pyro',
626 'Google_Pyro.9042.87.1',
627 'Google_Pyro.9042.110.0',
628 'pyro_v1.1.5900-ab1ee51',
629 'pyro_v1.1.5909-bd1f0c9'),
630 'reef': packages_service.FirmwareVersions(
631 'reef',
632 'Google_Reef.9042.87.1',
633 'Google_Reef.9042.110.0',
634 'reef_v1.1.5900-ab1ee51',
635 'reef_v1.1.5909-bd1f0c9')
636 }
637 self.PatchObject(packages_service, 'get_all_firmware_versions',
638 return_value=all_fw_versions)
639 self.PatchObject(packages_service, 'get_models',
640 return_value=model_list)
641 self.PatchObject(packages_service, 'get_key_id',
642 return_value='key')
643
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600644 request = self._GetRequest(board='betty')
645 packages_controller.GetBuilderMetadata(request, self.response,
646 self.api_config)
647 self.assertEqual(
648 self.response.build_target_metadata[0].build_target,
649 'betty')
650 self.assertEqual(
651 self.response.build_target_metadata[0].android_container_version,
652 android_version)
653 self.assertEqual(
654 self.response.build_target_metadata[0].android_container_branch,
655 android_branch)
656 self.assertEqual(
657 self.response.build_target_metadata[0].android_container_target,
658 android_target)
659 self.assertEqual(
660 self.response.build_target_metadata[0].arc_use_set,
661 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600662 # Verify call to determine_android_version passes list of the board name.
Mike Frysingerb53f1822021-03-05 00:44:50 -0500663 android_version_mock.assert_called_with('betty')
Michael Mortensen027ecd82020-05-05 13:13:40 -0600664 # Verify call to determine_android_branch passes board name.
665 android_branch_mock.assert_called_with('betty')
666 # Verify call to determine_android_target passes board name.
667 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600668 self.assertEqual(
669 self.response.build_target_metadata[0].main_firmware_version,
670 'Google_Caroline.7820.286.0')
671 self.assertEqual(
672 self.response.build_target_metadata[0].ec_firmware_version,
673 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600674 self.assertEqual(
675 self.response.build_target_metadata[0].kernel_version,
676 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600677 self.assertEqual(
678 len(self.response.build_target_metadata[0].fingerprints),
679 2)
680 self.assertEqual(
681 self.response.build_target_metadata[0].fingerprints,
682 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600683 self.assertEqual(
684 len(self.response.model_metadata), 2)
685 self.assertEqual(
686 self.response.model_metadata[0].model_name, 'pyro')
687 self.assertEqual(
688 self.response.model_metadata[0].ec_firmware_version,
689 'pyro_v1.1.5909-bd1f0c9')
690 self.assertEqual(
691 self.response.model_metadata[0].firmware_key_id, 'key')
692 self.assertEqual(
693 self.response.model_metadata[0].main_readonly_firmware_version,
694 'Google_Pyro.9042.87.1')
695 self.assertEqual(
696 self.response.model_metadata[0].main_readwrite_firmware_version,
697 'Google_Pyro.9042.110.0')
698 self.assertEqual(
699 self.response.model_metadata[1].model_name, 'reef')
700 self.assertEqual(
701 self.response.model_metadata[1].ec_firmware_version,
702 'reef_v1.1.5909-bd1f0c9')
703 self.assertEqual(
704 self.response.model_metadata[1].firmware_key_id, 'key')
705 self.assertEqual(
706 self.response.model_metadata[1].main_readonly_firmware_version,
707 'Google_Reef.9042.87.1')
708 self.assertEqual(
709 self.response.model_metadata[1].main_readwrite_firmware_version,
710 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600711
Michael Mortensend81d81e2020-06-09 14:20:59 -0600712 # Test corner case where find_fingerprints returns None.
713 # Re-patch find_fingerprints to now return None and re-execute
714 # GetBuilderMetadata to verify behavior.
715 response = packages_pb2.GetBuilderMetadataResponse()
716 self.PatchObject(packages_service, 'find_fingerprints',
717 return_value=[])
718 request = self._GetRequest(board='betty')
719 packages_controller.GetBuilderMetadata(request, response,
720 self.api_config)
721 # Verify a non-fingerprint build_target_metdata field was still set.
722 self.assertEqual(
723 response.build_target_metadata[0].kernel_version,
724 '4.4.223-r2209')
725 # And then verify that fingerprints was empty.
726 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
727
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600728
Alex Kleinda39c6d2019-09-16 14:36:36 -0600729class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
730 """HasChromePrebuilt tests."""
731
732 def setUp(self):
733 self.response = packages_pb2.HasChromePrebuiltResponse()
734
735 def _GetRequest(self, board=None):
736 """Helper to build out a request."""
737 request = packages_pb2.HasChromePrebuiltRequest()
738
739 if board:
740 request.build_target.name = board
741
742 return request
743
744 def testValidateOnly(self):
745 """Sanity check that a validate only call does not execute any logic."""
746 patch = self.PatchObject(packages_service, 'has_prebuilt')
747
748 request = self._GetRequest(board='betty')
749 packages_controller.HasChromePrebuilt(request, self.response,
750 self.validate_only_config)
751 patch.assert_not_called()
752
Michael Mortensen3232ab32020-01-05 19:14:36 -0700753 def testMockCall(self):
754 """Test that a mock call does not execute logic, returns mocked value."""
755 patch = self.PatchObject(packages_service, 'has_prebuilt')
756
757 request = self._GetRequest(board='betty')
758 packages_controller.HasChromePrebuilt(request, self.response,
759 self.mock_call_config)
760 patch.assert_not_called()
761 self.assertTrue(self.response.has_prebuilt)
762
Alex Kleinda39c6d2019-09-16 14:36:36 -0600763 def testNoBuildTargetFails(self):
764 """No build target argument should fail."""
765 request = self._GetRequest()
766
767 with self.assertRaises(cros_build_lib.DieSystemExit):
768 packages_controller.HasChromePrebuilt(request, self.response,
769 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600770
771
772class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
773 """BuildsChrome tests."""
774
775 def setUp(self):
776 self.response = packages_pb2.BuildsChromeResponse()
777
David Burger0f9dd4e2019-10-08 12:33:42 -0600778 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600779 """Helper to build out a request."""
780 request = packages_pb2.BuildsChromeRequest()
781
782 if board:
783 request.build_target.name = board
784
David Burger0f9dd4e2019-10-08 12:33:42 -0600785 if packages:
786 request.packages.extend(packages)
787
Alex Klein73fb6572019-09-30 16:55:23 -0600788 return request
789
790 def testValidateOnly(self):
791 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600792 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600793
794 request = self._GetRequest(board='betty')
795 packages_controller.BuildsChrome(request, self.response,
796 self.validate_only_config)
797 patch.assert_not_called()
798
799 def testNoBuildTargetFails(self):
800 """No build target argument should fail."""
801 request = self._GetRequest()
802
803 with self.assertRaises(cros_build_lib.DieSystemExit):
804 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600805
806 def testBuilds(self):
807 """Test successful call handling."""
808 patch = self.PatchObject(packages_service, 'builds', return_value=True)
809
810 request = self._GetRequest(board='foo')
811 packages_controller.BuildsChrome(request, self.response, self.api_config)
812 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600813 patch.assert_called_once_with(constants.CHROME_CP,
814 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600815
816 def testBuildsChromeWithPackages(self):
817 """Test successful call with packages handling."""
818 patch = self.PatchObject(packages_service, 'builds', return_value=True)
819
820 package = common_pb2.PackageInfo(
821 category='category',
822 package_name='name',
823 version='1.01',
824 )
825 request = self._GetRequest(board='foo', packages=[package])
826 packages_controller.BuildsChrome(request, self.response, self.api_config)
827 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600828 patch.assert_called_once_with(constants.CHROME_CP,
829 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600830 [controller_util.PackageInfoToCPV(package)])
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900831
832
Alex Klein9ce3f682021-06-23 15:06:44 -0600833class NeedsChromeSourceTest(cros_test_lib.MockTempDirTestCase, ApiConfigMixin):
834 """NeedsChromeSource tests."""
835
836 def setUp(self):
837 self.response = packages_pb2.NeedsChromeSourceResponse()
838
839 self.board = 'board'
840 self.sysroot = self.tempdir
841
842 def _GetRequest(self, compile_source=False):
843 """Helper to build a request."""
844 request = packages_pb2.NeedsChromeSourceRequest()
845
846 request.install_request.sysroot.path = self.sysroot
847 request.install_request.sysroot.build_target.name = self.board
848 request.install_request.flags.compile_source = compile_source
849
850 return request
851
852 def testAll(self):
853 """Reason translation test."""
854 result = packages_service.NeedsChromeSourceResult(
855 needs_chrome_source=True,
856 builds_chrome=True,
857 packages=[package_info.parse('cat/pkg')],
858 missing_chrome_prebuilt=True,
859 missing_follower_prebuilt=True,
860 local_uprev=True,
861 )
862 self.PatchObject(packages_service, 'needs_chrome_source',
863 return_value=result)
864
865 packages_controller.NeedsChromeSource(self._GetRequest(compile_source=True),
866 self.response,
867 self.api_config)
868
869 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
870 self.response.reasons)
871 self.assertIn(packages_pb2.NeedsChromeSourceResponse.LOCAL_UPREV,
872 self.response.reasons)
873 self.assertIn(packages_pb2.NeedsChromeSourceResponse.NO_PREBUILT,
874 self.response.reasons)
875 self.assertIn(
876 packages_pb2.NeedsChromeSourceResponse.FOLLOWER_LACKS_PREBUILT,
877 self.response.reasons)
878 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
879 self.response.reasons)
880 self.assertIn(packages_pb2.NeedsChromeSourceResponse.COMPILE_SOURCE,
881 self.response.reasons)
882
883 self.assertEqual(1, len(self.response.packages))
884 self.assertEqual(('cat', 'pkg'), (self.response.packages[0].category,
885 self.response.packages[0].package_name))
886
887
Shao-Chuan Leeeb834a32021-05-12 17:10:55 +0900888class GetAndroidMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
889 """GetAndroidMetadata tests."""
890
891 def setUp(self):
892 self.response = packages_pb2.GetAndroidMetadataResponse()
893
894 def _GetRequest(self, board=None):
895 """Helper to build out a request."""
896 request = packages_pb2.GetAndroidMetadataRequest()
897
898 if board:
899 request.build_target.name = board
900
901 return request
902
903 def testValidateOnly(self):
904 """Check that a validate only call does not execute any logic."""
905 package_mock = self.PatchObject(packages_service,
906 'determine_android_package')
907 branch_mock = self.PatchObject(packages_service,
908 'determine_android_branch')
909 version_mock = self.PatchObject(packages_service,
910 'determine_android_version')
911
912 request = self._GetRequest(board='betty')
913 packages_controller.GetAndroidMetadata(request, self.response,
914 self.validate_only_config)
915
916 package_mock.assert_not_called()
917 branch_mock.assert_not_called()
918 version_mock.assert_not_called()
919
920 def testMockCall(self):
921 """Test that a mock call does not execute logic, returns mocked value."""
922 package_mock = self.PatchObject(packages_service,
923 'determine_android_package')
924 branch_mock = self.PatchObject(packages_service,
925 'determine_android_branch')
926 version_mock = self.PatchObject(packages_service,
927 'determine_android_version')
928
929 request = self._GetRequest(board='betty')
930 packages_controller.GetAndroidMetadata(request, self.response,
931 self.mock_call_config)
932
933 package_mock.assert_not_called()
934 branch_mock.assert_not_called()
935 version_mock.assert_not_called()
936
937 self.assertTrue(self.response.android_package)
938 self.assertTrue(self.response.android_branch)
939 self.assertTrue(self.response.android_version)
940
941 def testNoBuildTargetFails(self):
942 """No build target argument should fail."""
943 request = self._GetRequest()
944 with self.assertRaises(cros_build_lib.DieSystemExit):
945 packages_controller.GetAndroidMetadata(request, self.response,
946 self.api_config)
947
948 def testSuccess(self):
949 """Test a successful call."""
950 board = 'betty'
951 package = 'android-package'
952 branch = 'android-branch'
953 version = '7123456'
954 full_package = f'chromeos-base/{package}-{version}-r1'
955
956 package_mock = self.PatchObject(packages_service,
957 'determine_android_package',
958 return_value=full_package)
959 branch_mock = self.PatchObject(packages_service,
960 'determine_android_branch',
961 return_value=branch)
962 version_mock = self.PatchObject(packages_service,
963 'determine_android_version',
964 return_value=version)
965
966 request = self._GetRequest(board=board)
967 packages_controller.GetAndroidMetadata(request, self.response,
968 self.api_config)
969
970 package_mock.assert_called_once_with(board)
971 branch_mock.assert_called_once_with(board, package=full_package)
972 version_mock.assert_called_once_with(board, package=full_package)
973
974 self.assertEqual(self.response.android_package, package)
975 self.assertEqual(self.response.android_branch, branch)
976 self.assertEqual(self.response.android_version, version)
977
978 def testNoAndroid(self):
979 """Test returns an empty response if given board has no Android."""
980 board = 'betty'
981
982 package_mock = self.PatchObject(packages_service,
983 'determine_android_package',
984 return_value=None)
985 branch_mock = self.PatchObject(packages_service,
986 'determine_android_branch')
987 version_mock = self.PatchObject(packages_service,
988 'determine_android_version')
989
990 request = self._GetRequest(board=board)
991 packages_controller.GetAndroidMetadata(request, self.response,
992 self.api_config)
993
994 package_mock.assert_called_once_with(board)
995 branch_mock.assert_not_called()
996 version_mock.assert_not_called()
997
998 self.assertFalse(self.response.android_package)
999 self.assertFalse(self.response.android_branch)
1000 self.assertFalse(self.response.android_version)