blob: 354d7cc39066a859d7c2f7a51422999bee02c9de [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -06001# -*- coding: utf-8 -*-
2# Copyright 2019 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""packages controller unit tests."""
7
8from __future__ import print_function
9
Mike Frysingeref94e4c2020-02-10 23:59:54 -050010import sys
11
Alex Kleineb77ffa2019-05-28 14:47:44 -060012import mock
13
Alex Kleinda39c6d2019-09-16 14:36:36 -060014from chromite.api.api_config import ApiConfigMixin
David Burger0f9dd4e2019-10-08 12:33:42 -060015from chromite.api.controller import controller_util
Alex Kleineb77ffa2019-05-28 14:47:44 -060016from chromite.api.controller import packages as packages_controller
David Burger0f9dd4e2019-10-08 12:33:42 -060017from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060018from chromite.api.gen.chromite.api import binhost_pb2
19from chromite.api.gen.chromite.api import packages_pb2
20from chromite.lib import constants
21from chromite.lib import cros_build_lib
22from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060023from chromite.lib import portage_util
Alex Klein26e472b2020-03-10 14:35:01 -060024from chromite.lib import build_target_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060025from chromite.service import packages as packages_service
26
27
Mike Frysingeref94e4c2020-02-10 23:59:54 -050028assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
29
30
Alex Kleinda39c6d2019-09-16 14:36:36 -060031class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060032 """Uprev tests."""
33
34 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
35 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
36 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
37 _NONE = binhost_pb2.OVERLAYTYPE_NONE
38
39 def setUp(self):
40 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060041 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060042
43 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
44 return packages_pb2.UprevPackagesRequest(
45 build_targets=[{'name': name} for name in targets or []],
46 overlay_type=overlay_type,
47 output_dir=output_dir,
48 )
49
Alex Klein231d2da2019-07-22 16:44:45 -060050 def testValidateOnly(self):
51 """Sanity check that a validate only call does not execute any logic."""
52 patch = self.PatchObject(packages_service, 'uprev_build_targets')
53
54 targets = ['foo', 'bar']
55 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
56 packages_controller.Uprev(request, self.response, self.validate_only_config)
57 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060058
Michael Mortensen2677bf62019-10-29 08:31:25 -060059 def testMockCall(self):
60 """Test that a mock call does not execute logic, returns mocked value."""
61 patch = self.PatchObject(packages_service, 'uprev_build_targets')
62 targets = ['foo', 'bar']
63 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
64 packages_controller.Uprev(request, self.response, self.mock_call_config)
65 patch.assert_not_called()
66 self.assertTrue(self.response.modified_ebuilds)
67
Alex Kleineb77ffa2019-05-28 14:47:44 -060068 def testNoOverlayTypeFails(self):
69 """No overlay type provided should fail."""
70 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060071
72 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060073 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060074
75 def testOverlayTypeNoneFails(self):
76 """Overlay type none means nothing here and should fail."""
77 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060078
79 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060080 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060081
82 def testSuccess(self):
83 """Test overall successful argument handling."""
84 targets = ['foo', 'bar']
85 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060086 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060087 expected_type = constants.BOTH_OVERLAYS
88 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
89 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060090 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
91 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060092
Alex Klein231d2da2019-07-22 16:44:45 -060093 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060094
95 # Make sure the type is right, verify build targets after.
96 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
97 output_dir)
98 # First argument (build targets) of the first (only) call.
99 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -0400100 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -0600101
Alex Klein231d2da2019-07-22 16:44:45 -0600102 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -0600103 self.assertIn(ebuild.path, changed)
104 changed.remove(ebuild.path)
105 self.assertFalse(changed)
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'
Yaakov Shaul730814a2019-09-10 13:58:25 -0600178 result = packages_service.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600179 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600180
Alex Klein34afcbc2019-08-22 16:14:31 -0600181 self.PatchObject(
182 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600183
184 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600185 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600186 request.package_info.category = 'chromeos-base'
187 request.package_info.package_name = 'chromeos-chrome'
188
189 packages_controller.UprevVersionedPackage(request, self.response,
190 self.api_config)
191
Yaakov Shaul730814a2019-09-10 13:58:25 -0600192 for idx, uprev_response in enumerate(self.response.responses):
193 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400194 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600195 result.modified[idx].files,
196 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600197
198
Alex Kleinda39c6d2019-09-16 14:36:36 -0600199class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600200 """GetBestVisible tests."""
201
Alex Klein231d2da2019-07-22 16:44:45 -0600202 def setUp(self):
203 self.response = packages_pb2.GetBestVisibleResponse()
204
David Burger1e0fe232019-07-01 14:52:07 -0600205 def _GetRequest(self, atom=None):
206 return packages_pb2.GetBestVisibleRequest(
207 atom=atom,
208 )
209
David Burger1e0fe232019-07-01 14:52:07 -0600210 def _MakeCpv(self, category, package, version):
211 unused = {
212 'cp': None,
213 'cpv': None,
214 'cpf': None,
215 'pv': None,
216 'version_no_rev': None,
217 'rev': None,
218 }
219 return portage_util.CPV(
220 category=category,
221 package=package,
222 version=version,
223 **unused
224 )
225
Alex Klein231d2da2019-07-22 16:44:45 -0600226 def testValidateOnly(self):
227 """Sanity check that a validate only call does not execute any logic."""
228 patch = self.PatchObject(packages_service, 'get_best_visible')
229
230 request = self._GetRequest(atom='chromeos-chrome')
231 packages_controller.GetBestVisible(request, self.response,
232 self.validate_only_config)
233 patch.assert_not_called()
234
Michael Mortensen2677bf62019-10-29 08:31:25 -0600235 def testMockCall(self):
236 """Test that a mock call does not execute logic, returns mocked value."""
237 patch = self.PatchObject(packages_service, 'get_best_visible')
238 request = self._GetRequest(atom='chromeos-chrome')
239 packages_controller.GetBestVisible(request, self.response,
240 self.mock_call_config)
241 patch.assert_not_called()
242 self.assertTrue(self.response.package_info)
243 self.assertTrue(self.response.package_info.category)
244 self.assertTrue(self.response.package_info.package_name)
245 self.assertTrue(self.response.package_info.version)
246
David Burger1e0fe232019-07-01 14:52:07 -0600247 def testNoAtomFails(self):
248 """No atom provided should fail."""
249 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600250 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600251 packages_controller.GetBestVisible(request, self.response,
252 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600253
254 def testSuccess(self):
255 """Test overall success, argument handling, result forwarding."""
256 cpv = self._MakeCpv('category', 'package', 'version')
257 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
258
259 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600260
Alex Klein231d2da2019-07-22 16:44:45 -0600261 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600262
Alex Klein231d2da2019-07-22 16:44:45 -0600263 package_info = self.response.package_info
David Burger1e0fe232019-07-01 14:52:07 -0600264 self.assertEqual(package_info.category, cpv.category)
265 self.assertEqual(package_info.package_name, cpv.package)
266 self.assertEqual(package_info.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600267
268
Michael Mortensen68abdb72019-10-28 09:43:52 -0600269class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
270 """GetChromeVersion tests."""
271
272 def setUp(self):
273 self.response = packages_pb2.GetChromeVersionResponse()
274
275 def _GetRequest(self, board=None):
276 """Helper to build out a request."""
277 request = packages_pb2.GetChromeVersionRequest()
278
279 if board:
280 request.build_target.name = board
281
282 return request
283
284 def testValidateOnly(self):
285 """Sanity check that a validate only call does not execute any logic."""
286 chrome_version = self.PatchObject(packages_service,
287 'determine_chrome_version')
288 request = self._GetRequest(board='betty')
289 packages_controller.GetChromeVersion(request, self.response,
290 self.validate_only_config)
291 chrome_version.assert_not_called()
292
293 def testMockCall(self):
294 """Test that a mock call does not execute logic, returns mocked value."""
295 chrome_version = self.PatchObject(packages_service,
296 'determine_chrome_version')
297 request = self._GetRequest(board='betty')
298 packages_controller.GetChromeVersion(request, self.response,
299 self.mock_call_config)
300 chrome_version.assert_not_called()
301 self.assertTrue(self.response.version)
302
303 def testGetChromeVersion(self):
304 """Verify basic return values."""
305 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600306 chrome_version_mock = self.PatchObject(packages_service,
307 'determine_chrome_version',
308 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600309 request = self._GetRequest(board='betty')
310 packages_controller.GetChromeVersion(request, self.response,
311 self.api_config)
312 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600313 # Verify call to determine_chrome_version passes a build_target object.
314 build_target = build_target_lib.BuildTarget('betty')
315 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600316
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600317 def testGetChromeVersionHandleNone(self):
318 """Verify basic return values."""
319 self.PatchObject(packages_service, 'determine_chrome_version',
320 return_value=None)
321 request = self._GetRequest(board='betty')
322 packages_controller.GetChromeVersion(request, self.response,
323 self.api_config)
324 self.assertFalse(self.response.version)
325
Michael Mortensen68abdb72019-10-28 09:43:52 -0600326
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600327class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
328 """GetTargetVersions tests."""
329
330 def setUp(self):
331 self.response = packages_pb2.GetTargetVersionsResponse()
332
333 def _GetRequest(self, board=None):
334 """Helper to build out a request."""
335 request = packages_pb2.GetTargetVersionsRequest()
336
337 if board:
338 request.build_target.name = board
339
340 return request
341
342 def testValidateOnly(self):
343 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600344 builds_chrome = self.PatchObject(
345 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600346 patch_version = self.PatchObject(packages_service,
347 'determine_android_version')
348 patch_branch_version = self.PatchObject(packages_service,
349 'determine_android_branch')
350 patch_target_version = self.PatchObject(packages_service,
351 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600352 chrome_version = self.PatchObject(packages_service,
353 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600354 platform_version = self.PatchObject(packages_service,
355 'determine_platform_version')
356 milestone_version = self.PatchObject(packages_service,
357 'determine_milestone_version')
358 full_version = self.PatchObject(packages_service,
359 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600360
361 request = self._GetRequest(board='betty')
362 packages_controller.GetTargetVersions(request, self.response,
363 self.validate_only_config)
364 patch_version.assert_not_called()
365 patch_branch_version.assert_not_called()
366 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600367 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600368 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600369 platform_version.assert_not_called()
370 milestone_version.assert_not_called()
371 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600372
Michael Mortensen2677bf62019-10-29 08:31:25 -0600373 def testMockCall(self):
374 """Test that a mock call does not execute logic, returns mocked value."""
375 builds_chrome = self.PatchObject(
376 packages_service, 'builds', return_value=True)
377 patch_version = self.PatchObject(packages_service,
378 'determine_android_version')
379 patch_branch_version = self.PatchObject(packages_service,
380 'determine_android_branch')
381 patch_target_version = self.PatchObject(packages_service,
382 'determine_android_target')
383 chrome_version = self.PatchObject(packages_service,
384 'determine_chrome_version')
385 platform_version = self.PatchObject(packages_service,
386 'determine_platform_version')
387 milestone_version = self.PatchObject(packages_service,
388 'determine_milestone_version')
389 full_version = self.PatchObject(packages_service,
390 'determine_full_version')
391
392 request = self._GetRequest(board='betty')
393 packages_controller.GetTargetVersions(request, self.response,
394 self.mock_call_config)
395
396 patch_version.assert_not_called()
397 patch_branch_version.assert_not_called()
398 patch_target_version.assert_not_called()
399 builds_chrome.assert_not_called()
400 chrome_version.assert_not_called()
401 platform_version.assert_not_called()
402 milestone_version.assert_not_called()
403 full_version.assert_not_called()
404
405 self.assertTrue(self.response.android_version)
406 self.assertTrue(self.response.android_branch_version)
407 self.assertTrue(self.response.android_target_version)
408 self.assertTrue(self.response.chrome_version)
409 self.assertTrue(self.response.platform_version)
410 self.assertTrue(self.response.milestone_version)
411 self.assertTrue(self.response.full_version)
412
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600413 def testNoBuildTargetFails(self):
414 """No build target argument should fail."""
415 request = self._GetRequest()
416
417 with self.assertRaises(cros_build_lib.DieSystemExit):
418 packages_controller.GetTargetVersions(request, self.response,
419 self.api_config)
420
Michael Mortensenc2615b72019-10-15 08:12:24 -0600421 def testGetTargetVersions(self):
422 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600423 # Mock that chrome is built and set the chrome_version.
424 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600425 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600426 chrome_version_mock = self.PatchObject(packages_service,
427 'determine_chrome_version',
428 return_value=chrome_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600429 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600430 android_version_mock = self.PatchObject(packages_service,
431 'determine_android_version',
432 return_value=android_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600433 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600434 android_branch_mock = self.PatchObject(packages_service,
435 'determine_android_branch',
436 return_value=android_branch)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600437 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600438 android_target_mock = self.PatchObject(packages_service,
439 'determine_android_target',
440 return_value=android_target)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600441 platform_version = '12345.1.2'
442 self.PatchObject(packages_service, 'determine_platform_version',
443 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600444 milestone_version = '79'
445 self.PatchObject(packages_service, 'determine_milestone_version',
446 return_value=milestone_version)
447 full_version = 'R79-12345.1.2'
448 self.PatchObject(packages_service, 'determine_full_version',
449 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600450 request = self._GetRequest(board='betty')
451 packages_controller.GetTargetVersions(request, self.response,
452 self.api_config)
453 self.assertEqual(self.response.android_version, android_version)
454 self.assertEqual(self.response.android_branch_version, android_branch)
455 self.assertEqual(self.response.android_target_version, android_target)
456 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600457 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600458 self.assertEqual(self.response.milestone_version, milestone_version)
459 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600460 # Verify call to determine_chrome_version passes a build_target object.
461 build_target = build_target_lib.BuildTarget('betty')
462 chrome_version_mock.assert_called_with(build_target)
463 # Verify call to determine_android_version passes a list of the board name.
464 android_version_mock.assert_called_with(['betty'])
465 # Verify call to determine_android_branch passes a board name.
466 android_branch_mock.assert_called_with('betty')
467 # Verify call to determine_android_target passes a board name.
468 android_target_mock.assert_called_with('betty')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600469
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600470 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600471 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600472 platform_version = '12345.1.2'
473 self.PatchObject(packages_service, 'determine_platform_version',
474 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600475 self.PatchObject(packages_service, 'builds', return_value=False)
Michael Mortensenedf76532019-10-16 14:22:37 -0600476 self.PatchObject(packages_service, 'determine_android_version',
477 return_value=None)
478 self.PatchObject(packages_service, 'determine_android_branch',
479 return_value=None)
480 self.PatchObject(packages_service, 'determine_android_target',
481 return_value=None)
482 request = self._GetRequest(board='betty')
483 packages_controller.GetTargetVersions(request, self.response,
484 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600485 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600486 self.assertFalse(self.response.android_version)
487 self.assertFalse(self.response.android_branch_version)
488 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600489 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600490
Michael Mortensenbfc56392020-04-30 15:23:47 -0600491
492class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
493 """GetBuilderMetadata tests."""
494
495 def setUp(self):
496 self.response = packages_pb2.GetBuilderMetadataResponse()
497
498 def _GetRequest(self, board=None):
499 """Helper to build out a request."""
500 request = packages_pb2.GetBuilderMetadataRequest()
501
502 if board:
503 request.build_target.name = board
504
505 return request
506
507 def testValidateOnly(self):
508 """Sanity check that a validate only call does not execute any logic."""
509 request = self._GetRequest(board='betty')
510 # TODO(crbug/1071620): Add/check mock for service layer calls.
511 packages_controller.GetBuilderMetadata(request, self.response,
512 self.validate_only_config)
513
514 def testMockCall(self):
515 """Test that a mock call does not execute logic, returns mocked value."""
516 request = self._GetRequest(board='betty')
517 # TODO(crbug/1071620): Add/check mock for service layer calls.
518 packages_controller.GetBuilderMetadata(request, self.response,
519 self.mock_call_config)
520
521 self.assertEqual(len(self.response.build_target_metadata), 1)
522 self.assertEqual(self.response.build_target_metadata[0].build_target,
523 request.build_target.name)
524 self.assertEqual(len(self.response.model_metadata), 1)
525 self.assertTrue(self.response.model_metadata[0].model_name)
526 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
527
528 def testNoBuildTargetFails(self):
529 """No build target argument should fail."""
530 request = self._GetRequest()
531
532 with self.assertRaises(cros_build_lib.DieSystemExit):
533 packages_controller.GetBuilderMetadata(request, self.response,
534 self.api_config)
535
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600536 def testGetBuilderMetadata(self):
537 """Verify basic return values."""
538 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600539 android_version_mock = self.PatchObject(packages_service,
540 'determine_android_version',
541 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600542 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600543 android_branch_mock = self.PatchObject(packages_service,
544 'determine_android_branch',
545 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600546 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600547 android_target_mock = self.PatchObject(packages_service,
548 'determine_android_target',
549 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600550 self.PatchObject(portage_util, 'GetBoardUseFlags',
551 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600552 package_result = ['sys-kernel/linux-headers-4.14-r24',
553 'sys-devel/flex-2.6.4-r1',
554 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
555 self.PatchObject(portage_util, 'GetPackageDependencies',
556 return_value=package_result)
557
Michael Mortensena4af79e2020-05-06 16:18:48 -0600558 fw_versions = packages_service.FirmwareVersions(
559 None,
560 'Google_Caroline.7820.263.0',
561 'Google_Caroline.7820.286.0',
562 'caroline_v1.9.357-ac5c7b4',
563 'caroline_v1.9.370-e8b9bd2')
564 self.PatchObject(packages_service, 'get_firmware_versions',
565 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600566 fingerprints = ['fingerprint1', 'fingerprint2']
567 self.PatchObject(packages_service, 'find_fingerprints',
568 return_value=fingerprints)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600569 request = self._GetRequest(board='betty')
570 packages_controller.GetBuilderMetadata(request, self.response,
571 self.api_config)
572 self.assertEqual(
573 self.response.build_target_metadata[0].build_target,
574 'betty')
575 self.assertEqual(
576 self.response.build_target_metadata[0].android_container_version,
577 android_version)
578 self.assertEqual(
579 self.response.build_target_metadata[0].android_container_branch,
580 android_branch)
581 self.assertEqual(
582 self.response.build_target_metadata[0].android_container_target,
583 android_target)
584 self.assertEqual(
585 self.response.build_target_metadata[0].arc_use_set,
586 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600587 # Verify call to determine_android_version passes list of the board name.
588 android_version_mock.assert_called_with(['betty'])
589 # Verify call to determine_android_branch passes board name.
590 android_branch_mock.assert_called_with('betty')
591 # Verify call to determine_android_target passes board name.
592 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600593 self.assertEqual(
594 self.response.build_target_metadata[0].main_firmware_version,
595 'Google_Caroline.7820.286.0')
596 self.assertEqual(
597 self.response.build_target_metadata[0].ec_firmware_version,
598 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600599 self.assertEqual(
600 self.response.build_target_metadata[0].kernel_version,
601 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600602 self.assertEqual(
603 len(self.response.build_target_metadata[0].fingerprints),
604 2)
605 self.assertEqual(
606 self.response.build_target_metadata[0].fingerprints,
607 fingerprints)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600608
609
Alex Kleinda39c6d2019-09-16 14:36:36 -0600610class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
611 """HasChromePrebuilt tests."""
612
613 def setUp(self):
614 self.response = packages_pb2.HasChromePrebuiltResponse()
615
616 def _GetRequest(self, board=None):
617 """Helper to build out a request."""
618 request = packages_pb2.HasChromePrebuiltRequest()
619
620 if board:
621 request.build_target.name = board
622
623 return request
624
625 def testValidateOnly(self):
626 """Sanity check that a validate only call does not execute any logic."""
627 patch = self.PatchObject(packages_service, 'has_prebuilt')
628
629 request = self._GetRequest(board='betty')
630 packages_controller.HasChromePrebuilt(request, self.response,
631 self.validate_only_config)
632 patch.assert_not_called()
633
Michael Mortensen3232ab32020-01-05 19:14:36 -0700634 def testMockCall(self):
635 """Test that a mock call does not execute logic, returns mocked value."""
636 patch = self.PatchObject(packages_service, 'has_prebuilt')
637
638 request = self._GetRequest(board='betty')
639 packages_controller.HasChromePrebuilt(request, self.response,
640 self.mock_call_config)
641 patch.assert_not_called()
642 self.assertTrue(self.response.has_prebuilt)
643
Alex Kleinda39c6d2019-09-16 14:36:36 -0600644 def testNoBuildTargetFails(self):
645 """No build target argument should fail."""
646 request = self._GetRequest()
647
648 with self.assertRaises(cros_build_lib.DieSystemExit):
649 packages_controller.HasChromePrebuilt(request, self.response,
650 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600651
652
653class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
654 """BuildsChrome tests."""
655
656 def setUp(self):
657 self.response = packages_pb2.BuildsChromeResponse()
658
David Burger0f9dd4e2019-10-08 12:33:42 -0600659 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600660 """Helper to build out a request."""
661 request = packages_pb2.BuildsChromeRequest()
662
663 if board:
664 request.build_target.name = board
665
David Burger0f9dd4e2019-10-08 12:33:42 -0600666 if packages:
667 request.packages.extend(packages)
668
Alex Klein73fb6572019-09-30 16:55:23 -0600669 return request
670
671 def testValidateOnly(self):
672 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600673 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600674
675 request = self._GetRequest(board='betty')
676 packages_controller.BuildsChrome(request, self.response,
677 self.validate_only_config)
678 patch.assert_not_called()
679
680 def testNoBuildTargetFails(self):
681 """No build target argument should fail."""
682 request = self._GetRequest()
683
684 with self.assertRaises(cros_build_lib.DieSystemExit):
685 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600686
687 def testBuilds(self):
688 """Test successful call handling."""
689 patch = self.PatchObject(packages_service, 'builds', return_value=True)
690
691 request = self._GetRequest(board='foo')
692 packages_controller.BuildsChrome(request, self.response, self.api_config)
693 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600694 patch.assert_called_once_with(constants.CHROME_CP,
695 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600696
697 def testBuildsChromeWithPackages(self):
698 """Test successful call with packages handling."""
699 patch = self.PatchObject(packages_service, 'builds', return_value=True)
700
701 package = common_pb2.PackageInfo(
702 category='category',
703 package_name='name',
704 version='1.01',
705 )
706 request = self._GetRequest(board='foo', packages=[package])
707 packages_controller.BuildsChrome(request, self.response, self.api_config)
708 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600709 patch.assert_called_once_with(constants.CHROME_CP,
710 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600711 [controller_util.PackageInfoToCPV(package)])