blob: b696b5e99eadc5ec0b51c67af70ea95b344b1a25 [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 Klein75df1792020-06-11 14:42:49 -060025from chromite.lib.parser import package_info
Alex Kleineb77ffa2019-05-28 14:47:44 -060026from chromite.service import packages as packages_service
27
28
Mike Frysingeref94e4c2020-02-10 23:59:54 -050029assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
30
31
Alex Kleinda39c6d2019-09-16 14:36:36 -060032class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060033 """Uprev tests."""
34
35 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
36 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
37 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
38 _NONE = binhost_pb2.OVERLAYTYPE_NONE
39
40 def setUp(self):
41 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060042 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060043
44 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
45 return packages_pb2.UprevPackagesRequest(
46 build_targets=[{'name': name} for name in targets or []],
47 overlay_type=overlay_type,
48 output_dir=output_dir,
49 )
50
Alex Klein231d2da2019-07-22 16:44:45 -060051 def testValidateOnly(self):
52 """Sanity check that a validate only call does not execute any logic."""
53 patch = self.PatchObject(packages_service, 'uprev_build_targets')
54
55 targets = ['foo', 'bar']
56 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
57 packages_controller.Uprev(request, self.response, self.validate_only_config)
58 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060059
Michael Mortensen2677bf62019-10-29 08:31:25 -060060 def testMockCall(self):
61 """Test that a mock call does not execute logic, returns mocked value."""
62 patch = self.PatchObject(packages_service, 'uprev_build_targets')
63 targets = ['foo', 'bar']
64 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
65 packages_controller.Uprev(request, self.response, self.mock_call_config)
66 patch.assert_not_called()
67 self.assertTrue(self.response.modified_ebuilds)
68
Alex Kleineb77ffa2019-05-28 14:47:44 -060069 def testNoOverlayTypeFails(self):
70 """No overlay type provided should fail."""
71 request = self._GetRequest(targets=['foo'])
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 testOverlayTypeNoneFails(self):
77 """Overlay type none means nothing here and should fail."""
78 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060079
80 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060081 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060082
83 def testSuccess(self):
84 """Test overall successful argument handling."""
85 targets = ['foo', 'bar']
86 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060087 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060088 expected_type = constants.BOTH_OVERLAYS
89 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
90 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060091 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
92 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060093
Alex Klein231d2da2019-07-22 16:44:45 -060094 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060095
96 # Make sure the type is right, verify build targets after.
97 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
98 output_dir)
99 # First argument (build targets) of the first (only) call.
100 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -0400101 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -0600102
Alex Klein231d2da2019-07-22 16:44:45 -0600103 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -0600104 self.assertIn(ebuild.path, changed)
105 changed.remove(ebuild.path)
106 self.assertFalse(changed)
107
David Burger1e0fe232019-07-01 14:52:07 -0600108
Alex Kleinda39c6d2019-09-16 14:36:36 -0600109class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -0600110 """UprevVersionedPackage tests."""
111
112 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -0600113 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600114
115 def _addVersion(self, request, version):
116 """Helper method to add a full version message to the request."""
117 ref = request.versions.add()
118 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600119 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600120 ref.revision = 'abc123'
121
122 def testValidateOnly(self):
123 """Sanity check validate only calls are working properly."""
124 service = self.PatchObject(packages_service, 'uprev_versioned_package')
125
126 request = packages_pb2.UprevVersionedPackageRequest()
127 self._addVersion(request, '1.2.3.4')
128 request.package_info.category = 'chromeos-base'
129 request.package_info.package_name = 'chromeos-chrome'
130
131 packages_controller.UprevVersionedPackage(request, self.response,
132 self.validate_only_config)
133
134 service.assert_not_called()
135
Michael Mortensen2677bf62019-10-29 08:31:25 -0600136 def testMockCall(self):
137 """Test that a mock call does not execute logic, returns mocked value."""
138 patch = self.PatchObject(packages_service, 'uprev_versioned_package')
139 request = packages_pb2.UprevVersionedPackageRequest()
140 packages_controller.UprevVersionedPackage(request, self.response,
141 self.mock_call_config)
142 patch.assert_not_called()
143 self.assertTrue(self.response.responses)
144 self.assertTrue(self.response.responses[0].modified_ebuilds)
145
Alex Klein87531182019-08-12 15:23:37 -0600146 def testNoVersions(self):
147 """Test no versions provided."""
148 request = packages_pb2.UprevVersionedPackageRequest()
149 request.package_info.category = 'chromeos-base'
150 request.package_info.package_name = 'chromeos-chrome'
151
152 with self.assertRaises(cros_build_lib.DieSystemExit):
153 packages_controller.UprevVersionedPackage(request, self.response,
154 self.api_config)
155
156 def testNoPackageName(self):
157 """Test no package name provided."""
158 request = packages_pb2.UprevVersionedPackageRequest()
159 self._addVersion(request, '1.2.3.4')
160 request.package_info.category = 'chromeos-base'
161
162 with self.assertRaises(cros_build_lib.DieSystemExit):
163 packages_controller.UprevVersionedPackage(request, self.response,
164 self.api_config)
165
166 def testNoCategory(self):
167 """Test no package category provided."""
168 request = packages_pb2.UprevVersionedPackageRequest()
169 self._addVersion(request, '1.2.3.4')
170 request.package_info.package_name = 'chromeos-chrome'
171
172 with self.assertRaises(cros_build_lib.DieSystemExit):
173 packages_controller.UprevVersionedPackage(request, self.response,
174 self.api_config)
175
176 def testOutputHandling(self):
177 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600178 version = '1.2.3.4'
Yaakov Shaul730814a2019-09-10 13:58:25 -0600179 result = packages_service.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600180 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600181
Alex Klein34afcbc2019-08-22 16:14:31 -0600182 self.PatchObject(
183 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600184
185 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600186 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600187 request.package_info.category = 'chromeos-base'
188 request.package_info.package_name = 'chromeos-chrome'
189
190 packages_controller.UprevVersionedPackage(request, self.response,
191 self.api_config)
192
Yaakov Shaul730814a2019-09-10 13:58:25 -0600193 for idx, uprev_response in enumerate(self.response.responses):
194 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400195 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600196 result.modified[idx].files,
197 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600198
199
Alex Kleinda39c6d2019-09-16 14:36:36 -0600200class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600201 """GetBestVisible tests."""
202
Alex Klein231d2da2019-07-22 16:44:45 -0600203 def setUp(self):
204 self.response = packages_pb2.GetBestVisibleResponse()
205
David Burger1e0fe232019-07-01 14:52:07 -0600206 def _GetRequest(self, atom=None):
207 return packages_pb2.GetBestVisibleRequest(
208 atom=atom,
209 )
210
David Burger1e0fe232019-07-01 14:52:07 -0600211 def _MakeCpv(self, category, package, version):
212 unused = {
213 'cp': None,
214 'cpv': None,
215 'cpf': None,
216 'pv': None,
217 'version_no_rev': None,
218 'rev': None,
219 }
Alex Klein75df1792020-06-11 14:42:49 -0600220 return package_info.CPV(
David Burger1e0fe232019-07-01 14:52:07 -0600221 category=category,
222 package=package,
223 version=version,
224 **unused
225 )
226
Alex Klein231d2da2019-07-22 16:44:45 -0600227 def testValidateOnly(self):
228 """Sanity check that a validate only call does not execute any logic."""
229 patch = self.PatchObject(packages_service, 'get_best_visible')
230
231 request = self._GetRequest(atom='chromeos-chrome')
232 packages_controller.GetBestVisible(request, self.response,
233 self.validate_only_config)
234 patch.assert_not_called()
235
Michael Mortensen2677bf62019-10-29 08:31:25 -0600236 def testMockCall(self):
237 """Test that a mock call does not execute logic, returns mocked value."""
238 patch = self.PatchObject(packages_service, 'get_best_visible')
239 request = self._GetRequest(atom='chromeos-chrome')
240 packages_controller.GetBestVisible(request, self.response,
241 self.mock_call_config)
242 patch.assert_not_called()
243 self.assertTrue(self.response.package_info)
244 self.assertTrue(self.response.package_info.category)
245 self.assertTrue(self.response.package_info.package_name)
246 self.assertTrue(self.response.package_info.version)
247
David Burger1e0fe232019-07-01 14:52:07 -0600248 def testNoAtomFails(self):
249 """No atom provided should fail."""
250 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600251 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600252 packages_controller.GetBestVisible(request, self.response,
253 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600254
255 def testSuccess(self):
256 """Test overall success, argument handling, result forwarding."""
257 cpv = self._MakeCpv('category', 'package', 'version')
258 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
259
260 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600261
Alex Klein231d2da2019-07-22 16:44:45 -0600262 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600263
Alex Klein75df1792020-06-11 14:42:49 -0600264 package_info_msg = self.response.package_info
265 self.assertEqual(package_info_msg.category, cpv.category)
266 self.assertEqual(package_info_msg.package_name, cpv.package)
267 self.assertEqual(package_info_msg.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600268
269
Michael Mortensen68abdb72019-10-28 09:43:52 -0600270class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
271 """GetChromeVersion tests."""
272
273 def setUp(self):
274 self.response = packages_pb2.GetChromeVersionResponse()
275
276 def _GetRequest(self, board=None):
277 """Helper to build out a request."""
278 request = packages_pb2.GetChromeVersionRequest()
279
280 if board:
281 request.build_target.name = board
282
283 return request
284
285 def testValidateOnly(self):
286 """Sanity check that a validate only call does not execute any logic."""
287 chrome_version = self.PatchObject(packages_service,
288 'determine_chrome_version')
289 request = self._GetRequest(board='betty')
290 packages_controller.GetChromeVersion(request, self.response,
291 self.validate_only_config)
292 chrome_version.assert_not_called()
293
294 def testMockCall(self):
295 """Test that a mock call does not execute logic, returns mocked value."""
296 chrome_version = self.PatchObject(packages_service,
297 'determine_chrome_version')
298 request = self._GetRequest(board='betty')
299 packages_controller.GetChromeVersion(request, self.response,
300 self.mock_call_config)
301 chrome_version.assert_not_called()
302 self.assertTrue(self.response.version)
303
304 def testGetChromeVersion(self):
305 """Verify basic return values."""
306 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600307 chrome_version_mock = self.PatchObject(packages_service,
308 'determine_chrome_version',
309 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600310 request = self._GetRequest(board='betty')
311 packages_controller.GetChromeVersion(request, self.response,
312 self.api_config)
313 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600314 # Verify call to determine_chrome_version passes a build_target object.
315 build_target = build_target_lib.BuildTarget('betty')
316 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600317
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600318 def testGetChromeVersionHandleNone(self):
319 """Verify basic return values."""
320 self.PatchObject(packages_service, 'determine_chrome_version',
321 return_value=None)
322 request = self._GetRequest(board='betty')
323 packages_controller.GetChromeVersion(request, self.response,
324 self.api_config)
325 self.assertFalse(self.response.version)
326
Michael Mortensen68abdb72019-10-28 09:43:52 -0600327
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600328class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
329 """GetTargetVersions tests."""
330
331 def setUp(self):
332 self.response = packages_pb2.GetTargetVersionsResponse()
333
334 def _GetRequest(self, board=None):
335 """Helper to build out a request."""
336 request = packages_pb2.GetTargetVersionsRequest()
337
338 if board:
339 request.build_target.name = board
340
341 return request
342
343 def testValidateOnly(self):
344 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600345 builds_chrome = self.PatchObject(
346 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600347 patch_version = self.PatchObject(packages_service,
348 'determine_android_version')
349 patch_branch_version = self.PatchObject(packages_service,
350 'determine_android_branch')
351 patch_target_version = self.PatchObject(packages_service,
352 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600353 chrome_version = self.PatchObject(packages_service,
354 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600355 platform_version = self.PatchObject(packages_service,
356 'determine_platform_version')
357 milestone_version = self.PatchObject(packages_service,
358 'determine_milestone_version')
359 full_version = self.PatchObject(packages_service,
360 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600361
362 request = self._GetRequest(board='betty')
363 packages_controller.GetTargetVersions(request, self.response,
364 self.validate_only_config)
365 patch_version.assert_not_called()
366 patch_branch_version.assert_not_called()
367 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600368 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600369 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600370 platform_version.assert_not_called()
371 milestone_version.assert_not_called()
372 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600373
Michael Mortensen2677bf62019-10-29 08:31:25 -0600374 def testMockCall(self):
375 """Test that a mock call does not execute logic, returns mocked value."""
376 builds_chrome = self.PatchObject(
377 packages_service, 'builds', return_value=True)
378 patch_version = self.PatchObject(packages_service,
379 'determine_android_version')
380 patch_branch_version = self.PatchObject(packages_service,
381 'determine_android_branch')
382 patch_target_version = self.PatchObject(packages_service,
383 'determine_android_target')
384 chrome_version = self.PatchObject(packages_service,
385 'determine_chrome_version')
386 platform_version = self.PatchObject(packages_service,
387 'determine_platform_version')
388 milestone_version = self.PatchObject(packages_service,
389 'determine_milestone_version')
390 full_version = self.PatchObject(packages_service,
391 'determine_full_version')
392
393 request = self._GetRequest(board='betty')
394 packages_controller.GetTargetVersions(request, self.response,
395 self.mock_call_config)
396
397 patch_version.assert_not_called()
398 patch_branch_version.assert_not_called()
399 patch_target_version.assert_not_called()
400 builds_chrome.assert_not_called()
401 chrome_version.assert_not_called()
402 platform_version.assert_not_called()
403 milestone_version.assert_not_called()
404 full_version.assert_not_called()
405
406 self.assertTrue(self.response.android_version)
407 self.assertTrue(self.response.android_branch_version)
408 self.assertTrue(self.response.android_target_version)
409 self.assertTrue(self.response.chrome_version)
410 self.assertTrue(self.response.platform_version)
411 self.assertTrue(self.response.milestone_version)
412 self.assertTrue(self.response.full_version)
413
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600414 def testNoBuildTargetFails(self):
415 """No build target argument should fail."""
416 request = self._GetRequest()
417
418 with self.assertRaises(cros_build_lib.DieSystemExit):
419 packages_controller.GetTargetVersions(request, self.response,
420 self.api_config)
421
Michael Mortensenc2615b72019-10-15 08:12:24 -0600422 def testGetTargetVersions(self):
423 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600424 # Mock that chrome is built and set the chrome_version.
425 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600426 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600427 chrome_version_mock = self.PatchObject(packages_service,
428 'determine_chrome_version',
429 return_value=chrome_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600430 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600431 android_version_mock = self.PatchObject(packages_service,
432 'determine_android_version',
433 return_value=android_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600434 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600435 android_branch_mock = self.PatchObject(packages_service,
436 'determine_android_branch',
437 return_value=android_branch)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600438 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600439 android_target_mock = self.PatchObject(packages_service,
440 'determine_android_target',
441 return_value=android_target)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600442 platform_version = '12345.1.2'
443 self.PatchObject(packages_service, 'determine_platform_version',
444 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600445 milestone_version = '79'
446 self.PatchObject(packages_service, 'determine_milestone_version',
447 return_value=milestone_version)
448 full_version = 'R79-12345.1.2'
449 self.PatchObject(packages_service, 'determine_full_version',
450 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600451 request = self._GetRequest(board='betty')
452 packages_controller.GetTargetVersions(request, self.response,
453 self.api_config)
454 self.assertEqual(self.response.android_version, android_version)
455 self.assertEqual(self.response.android_branch_version, android_branch)
456 self.assertEqual(self.response.android_target_version, android_target)
457 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600458 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600459 self.assertEqual(self.response.milestone_version, milestone_version)
460 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600461 # Verify call to determine_chrome_version passes a build_target object.
462 build_target = build_target_lib.BuildTarget('betty')
463 chrome_version_mock.assert_called_with(build_target)
464 # Verify call to determine_android_version passes a list of the board name.
465 android_version_mock.assert_called_with(['betty'])
466 # Verify call to determine_android_branch passes a board name.
467 android_branch_mock.assert_called_with('betty')
468 # Verify call to determine_android_target passes a board name.
469 android_target_mock.assert_called_with('betty')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600470
Michael Mortensen42c330e32020-09-02 09:59:16 -0600471 def testGetTargetVersionsWithPackagesSet(self):
472 """Verify packages pass through and basic return values."""
473 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
474 # rather than mocking the boundary to portage calls such as
475 # packages_service.builds).
476 builds_mock = self.PatchObject(packages_service, 'builds',
477 return_value=True)
478 # Mock that chrome is built and set the chrome_version.
479 chrome_version = '76.0.1.2'
480 self.PatchObject(packages_service, 'determine_chrome_version',
481 return_value=chrome_version)
482 android_version = 'android_test_version'
483 self.PatchObject(packages_service, 'determine_android_version',
484 return_value=android_version)
485 android_branch = 'android_test_branch'
486 self.PatchObject(packages_service, 'determine_android_branch',
487 return_value=android_branch)
488 android_target = 'android_test_target'
489 self.PatchObject(packages_service, 'determine_android_target',
490 return_value=android_target)
491 platform_version = '12345.1.2'
492 self.PatchObject(packages_service, 'determine_platform_version',
493 return_value=platform_version)
494 milestone_version = '79'
495 self.PatchObject(packages_service, 'determine_milestone_version',
496 return_value=milestone_version)
497 full_version = 'R79-12345.1.2'
498 self.PatchObject(packages_service, 'determine_full_version',
499 return_value=full_version)
500 request = self._GetRequest(board='betty')
501 # Add optional packages to the request.
502 cpv_package_list = []
503 package = request.packages.add()
504 package.package_name = 'test'
505 package.category = 'chromeos-base'
506 package.version = '0.0.1-r1'
507 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
508 package = request.packages.add()
509 package.package_name = 'target-fuzzers'
510 package.category = 'virtual'
511 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
512
513 packages_controller.GetTargetVersions(request, self.response,
514 self.api_config)
515 self.assertEqual(self.response.android_version, android_version)
516 self.assertEqual(self.response.android_branch_version, android_branch)
517 self.assertEqual(self.response.android_target_version, android_target)
518 self.assertEqual(self.response.chrome_version, chrome_version)
519 self.assertEqual(self.response.platform_version, platform_version)
520 self.assertEqual(self.response.milestone_version, milestone_version)
521 # Verify call to packages.builds passes the package list.
522 builds_mock.assert_called_with(constants.CHROME_CP,
523 mock.ANY, # Match the build target object
524 packages=cpv_package_list)
525
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600526 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600527 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600528 platform_version = '12345.1.2'
529 self.PatchObject(packages_service, 'determine_platform_version',
530 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600531 self.PatchObject(packages_service, 'builds', return_value=False)
Michael Mortensenedf76532019-10-16 14:22:37 -0600532 self.PatchObject(packages_service, 'determine_android_version',
533 return_value=None)
534 self.PatchObject(packages_service, 'determine_android_branch',
535 return_value=None)
536 self.PatchObject(packages_service, 'determine_android_target',
537 return_value=None)
538 request = self._GetRequest(board='betty')
539 packages_controller.GetTargetVersions(request, self.response,
540 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600541 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600542 self.assertFalse(self.response.android_version)
543 self.assertFalse(self.response.android_branch_version)
544 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600545 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600546
Michael Mortensenbfc56392020-04-30 15:23:47 -0600547
548class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
549 """GetBuilderMetadata tests."""
550
551 def setUp(self):
552 self.response = packages_pb2.GetBuilderMetadataResponse()
553
554 def _GetRequest(self, board=None):
555 """Helper to build out a request."""
556 request = packages_pb2.GetBuilderMetadataRequest()
557
558 if board:
559 request.build_target.name = board
560
561 return request
562
563 def testValidateOnly(self):
564 """Sanity check that a validate only call does not execute any logic."""
565 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600566 patch_version = self.PatchObject(packages_service,
567 'determine_android_version')
568 patch_branch_version = self.PatchObject(packages_service,
569 'determine_android_branch')
570 patch_fw_versions = self.PatchObject(packages_service,
571 'determine_firmware_versions')
572 patch_fingerprints = self.PatchObject(packages_service,
573 'find_fingerprints')
574 patch_get_models = self.PatchObject(packages_service,
575 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600576 packages_controller.GetBuilderMetadata(request, self.response,
577 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600578 patch_version.assert_not_called()
579 patch_branch_version.assert_not_called()
580 patch_fw_versions.assert_not_called()
581 patch_fingerprints.assert_not_called()
582 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600583
584 def testMockCall(self):
585 """Test that a mock call does not execute logic, returns mocked value."""
586 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600587 patch_version = self.PatchObject(packages_service,
588 'determine_android_version')
589 patch_branch_version = self.PatchObject(packages_service,
590 'determine_android_branch')
591 patch_fw_versions = self.PatchObject(packages_service,
592 'determine_firmware_versions')
593 patch_fingerprints = self.PatchObject(packages_service,
594 'find_fingerprints')
595 patch_get_models = self.PatchObject(packages_service,
596 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600597 packages_controller.GetBuilderMetadata(request, self.response,
598 self.mock_call_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600599 patch_version.assert_not_called()
600 patch_branch_version.assert_not_called()
601 patch_fw_versions.assert_not_called()
602 patch_fingerprints.assert_not_called()
603 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600604
605 self.assertEqual(len(self.response.build_target_metadata), 1)
606 self.assertEqual(self.response.build_target_metadata[0].build_target,
607 request.build_target.name)
608 self.assertEqual(len(self.response.model_metadata), 1)
609 self.assertTrue(self.response.model_metadata[0].model_name)
610 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
611
612 def testNoBuildTargetFails(self):
613 """No build target argument should fail."""
614 request = self._GetRequest()
615
616 with self.assertRaises(cros_build_lib.DieSystemExit):
617 packages_controller.GetBuilderMetadata(request, self.response,
618 self.api_config)
619
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600620 def testGetBuilderMetadata(self):
621 """Verify basic return values."""
622 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600623 android_version_mock = self.PatchObject(packages_service,
624 'determine_android_version',
625 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600626 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600627 android_branch_mock = self.PatchObject(packages_service,
628 'determine_android_branch',
629 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600630 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600631 android_target_mock = self.PatchObject(packages_service,
632 'determine_android_target',
633 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600634 self.PatchObject(portage_util, 'GetBoardUseFlags',
635 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600636 package_result = ['sys-kernel/linux-headers-4.14-r24',
637 'sys-devel/flex-2.6.4-r1',
638 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
639 self.PatchObject(portage_util, 'GetPackageDependencies',
640 return_value=package_result)
641
Michael Mortensena4af79e2020-05-06 16:18:48 -0600642 fw_versions = packages_service.FirmwareVersions(
643 None,
644 'Google_Caroline.7820.263.0',
645 'Google_Caroline.7820.286.0',
646 'caroline_v1.9.357-ac5c7b4',
647 'caroline_v1.9.370-e8b9bd2')
648 self.PatchObject(packages_service, 'get_firmware_versions',
649 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600650 fingerprints = ['fingerprint1', 'fingerprint2']
651 self.PatchObject(packages_service, 'find_fingerprints',
652 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600653 # Patch packages.get_models, packages.get_all_firmware_versions,
654 # and packages.get_key_id for calls needed by model_metadata.
655 model_list = ['pyro', 'reef']
656 all_fw_versions = {
657 'pyro': packages_service.FirmwareVersions(
658 'pyro',
659 'Google_Pyro.9042.87.1',
660 'Google_Pyro.9042.110.0',
661 'pyro_v1.1.5900-ab1ee51',
662 'pyro_v1.1.5909-bd1f0c9'),
663 'reef': packages_service.FirmwareVersions(
664 'reef',
665 'Google_Reef.9042.87.1',
666 'Google_Reef.9042.110.0',
667 'reef_v1.1.5900-ab1ee51',
668 'reef_v1.1.5909-bd1f0c9')
669 }
670 self.PatchObject(packages_service, 'get_all_firmware_versions',
671 return_value=all_fw_versions)
672 self.PatchObject(packages_service, 'get_models',
673 return_value=model_list)
674 self.PatchObject(packages_service, 'get_key_id',
675 return_value='key')
676
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600677 request = self._GetRequest(board='betty')
678 packages_controller.GetBuilderMetadata(request, self.response,
679 self.api_config)
680 self.assertEqual(
681 self.response.build_target_metadata[0].build_target,
682 'betty')
683 self.assertEqual(
684 self.response.build_target_metadata[0].android_container_version,
685 android_version)
686 self.assertEqual(
687 self.response.build_target_metadata[0].android_container_branch,
688 android_branch)
689 self.assertEqual(
690 self.response.build_target_metadata[0].android_container_target,
691 android_target)
692 self.assertEqual(
693 self.response.build_target_metadata[0].arc_use_set,
694 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600695 # Verify call to determine_android_version passes list of the board name.
696 android_version_mock.assert_called_with(['betty'])
697 # Verify call to determine_android_branch passes board name.
698 android_branch_mock.assert_called_with('betty')
699 # Verify call to determine_android_target passes board name.
700 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600701 self.assertEqual(
702 self.response.build_target_metadata[0].main_firmware_version,
703 'Google_Caroline.7820.286.0')
704 self.assertEqual(
705 self.response.build_target_metadata[0].ec_firmware_version,
706 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600707 self.assertEqual(
708 self.response.build_target_metadata[0].kernel_version,
709 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600710 self.assertEqual(
711 len(self.response.build_target_metadata[0].fingerprints),
712 2)
713 self.assertEqual(
714 self.response.build_target_metadata[0].fingerprints,
715 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600716 self.assertEqual(
717 len(self.response.model_metadata), 2)
718 self.assertEqual(
719 self.response.model_metadata[0].model_name, 'pyro')
720 self.assertEqual(
721 self.response.model_metadata[0].ec_firmware_version,
722 'pyro_v1.1.5909-bd1f0c9')
723 self.assertEqual(
724 self.response.model_metadata[0].firmware_key_id, 'key')
725 self.assertEqual(
726 self.response.model_metadata[0].main_readonly_firmware_version,
727 'Google_Pyro.9042.87.1')
728 self.assertEqual(
729 self.response.model_metadata[0].main_readwrite_firmware_version,
730 'Google_Pyro.9042.110.0')
731 self.assertEqual(
732 self.response.model_metadata[1].model_name, 'reef')
733 self.assertEqual(
734 self.response.model_metadata[1].ec_firmware_version,
735 'reef_v1.1.5909-bd1f0c9')
736 self.assertEqual(
737 self.response.model_metadata[1].firmware_key_id, 'key')
738 self.assertEqual(
739 self.response.model_metadata[1].main_readonly_firmware_version,
740 'Google_Reef.9042.87.1')
741 self.assertEqual(
742 self.response.model_metadata[1].main_readwrite_firmware_version,
743 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600744
Michael Mortensend81d81e2020-06-09 14:20:59 -0600745 # Test corner case where find_fingerprints returns None.
746 # Re-patch find_fingerprints to now return None and re-execute
747 # GetBuilderMetadata to verify behavior.
748 response = packages_pb2.GetBuilderMetadataResponse()
749 self.PatchObject(packages_service, 'find_fingerprints',
750 return_value=[])
751 request = self._GetRequest(board='betty')
752 packages_controller.GetBuilderMetadata(request, response,
753 self.api_config)
754 # Verify a non-fingerprint build_target_metdata field was still set.
755 self.assertEqual(
756 response.build_target_metadata[0].kernel_version,
757 '4.4.223-r2209')
758 # And then verify that fingerprints was empty.
759 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
760
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600761
Alex Kleinda39c6d2019-09-16 14:36:36 -0600762class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
763 """HasChromePrebuilt tests."""
764
765 def setUp(self):
766 self.response = packages_pb2.HasChromePrebuiltResponse()
767
768 def _GetRequest(self, board=None):
769 """Helper to build out a request."""
770 request = packages_pb2.HasChromePrebuiltRequest()
771
772 if board:
773 request.build_target.name = board
774
775 return request
776
777 def testValidateOnly(self):
778 """Sanity check that a validate only call does not execute any logic."""
779 patch = self.PatchObject(packages_service, 'has_prebuilt')
780
781 request = self._GetRequest(board='betty')
782 packages_controller.HasChromePrebuilt(request, self.response,
783 self.validate_only_config)
784 patch.assert_not_called()
785
Michael Mortensen3232ab32020-01-05 19:14:36 -0700786 def testMockCall(self):
787 """Test that a mock call does not execute logic, returns mocked value."""
788 patch = self.PatchObject(packages_service, 'has_prebuilt')
789
790 request = self._GetRequest(board='betty')
791 packages_controller.HasChromePrebuilt(request, self.response,
792 self.mock_call_config)
793 patch.assert_not_called()
794 self.assertTrue(self.response.has_prebuilt)
795
Alex Kleinda39c6d2019-09-16 14:36:36 -0600796 def testNoBuildTargetFails(self):
797 """No build target argument should fail."""
798 request = self._GetRequest()
799
800 with self.assertRaises(cros_build_lib.DieSystemExit):
801 packages_controller.HasChromePrebuilt(request, self.response,
802 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600803
804
805class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
806 """BuildsChrome tests."""
807
808 def setUp(self):
809 self.response = packages_pb2.BuildsChromeResponse()
810
David Burger0f9dd4e2019-10-08 12:33:42 -0600811 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600812 """Helper to build out a request."""
813 request = packages_pb2.BuildsChromeRequest()
814
815 if board:
816 request.build_target.name = board
817
David Burger0f9dd4e2019-10-08 12:33:42 -0600818 if packages:
819 request.packages.extend(packages)
820
Alex Klein73fb6572019-09-30 16:55:23 -0600821 return request
822
823 def testValidateOnly(self):
824 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600825 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600826
827 request = self._GetRequest(board='betty')
828 packages_controller.BuildsChrome(request, self.response,
829 self.validate_only_config)
830 patch.assert_not_called()
831
832 def testNoBuildTargetFails(self):
833 """No build target argument should fail."""
834 request = self._GetRequest()
835
836 with self.assertRaises(cros_build_lib.DieSystemExit):
837 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600838
839 def testBuilds(self):
840 """Test successful call handling."""
841 patch = self.PatchObject(packages_service, 'builds', return_value=True)
842
843 request = self._GetRequest(board='foo')
844 packages_controller.BuildsChrome(request, self.response, self.api_config)
845 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600846 patch.assert_called_once_with(constants.CHROME_CP,
847 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600848
849 def testBuildsChromeWithPackages(self):
850 """Test successful call with packages handling."""
851 patch = self.PatchObject(packages_service, 'builds', return_value=True)
852
853 package = common_pb2.PackageInfo(
854 category='category',
855 package_name='name',
856 version='1.01',
857 )
858 request = self._GetRequest(board='foo', packages=[package])
859 packages_controller.BuildsChrome(request, self.response, self.api_config)
860 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600861 patch.assert_called_once_with(constants.CHROME_CP,
862 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600863 [controller_util.PackageInfoToCPV(package)])