blob: 35ba7a9ff08fbaafd79104339ed58a016b739fe1 [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
10import mock
11
Alex Kleinda39c6d2019-09-16 14:36:36 -060012from chromite.api.api_config import ApiConfigMixin
David Burger0f9dd4e2019-10-08 12:33:42 -060013from chromite.api.controller import controller_util
Alex Kleineb77ffa2019-05-28 14:47:44 -060014from chromite.api.controller import packages as packages_controller
David Burger0f9dd4e2019-10-08 12:33:42 -060015from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060016from chromite.api.gen.chromite.api import binhost_pb2
17from chromite.api.gen.chromite.api import packages_pb2
Chris McDonald38409112020-09-24 11:24:51 -060018from chromite.lib import build_target_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060019from chromite.lib import constants
20from chromite.lib import cros_build_lib
21from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060022from chromite.lib import portage_util
Chris McDonald38409112020-09-24 11:24:51 -060023from chromite.lib import uprev_lib
Alex Klein75df1792020-06-11 14:42:49 -060024from chromite.lib.parser import package_info
Alex Kleineb77ffa2019-05-28 14:47:44 -060025from chromite.service import packages as packages_service
26
27
Alex Kleinda39c6d2019-09-16 14:36:36 -060028class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060029 """Uprev tests."""
30
31 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
32 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
33 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
34 _NONE = binhost_pb2.OVERLAYTYPE_NONE
35
36 def setUp(self):
37 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060038 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060039
40 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
41 return packages_pb2.UprevPackagesRequest(
42 build_targets=[{'name': name} for name in targets or []],
43 overlay_type=overlay_type,
44 output_dir=output_dir,
45 )
46
Alex Klein231d2da2019-07-22 16:44:45 -060047 def testValidateOnly(self):
48 """Sanity check that a validate only call does not execute any logic."""
49 patch = self.PatchObject(packages_service, 'uprev_build_targets')
50
51 targets = ['foo', 'bar']
52 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
53 packages_controller.Uprev(request, self.response, self.validate_only_config)
54 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060055
Michael Mortensen2677bf62019-10-29 08:31:25 -060056 def testMockCall(self):
57 """Test that a mock call does not execute logic, returns mocked value."""
58 patch = self.PatchObject(packages_service, 'uprev_build_targets')
59 targets = ['foo', 'bar']
60 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
61 packages_controller.Uprev(request, self.response, self.mock_call_config)
62 patch.assert_not_called()
63 self.assertTrue(self.response.modified_ebuilds)
64
Alex Kleineb77ffa2019-05-28 14:47:44 -060065 def testNoOverlayTypeFails(self):
66 """No overlay type provided should fail."""
67 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060068
69 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060070 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060071
72 def testOverlayTypeNoneFails(self):
73 """Overlay type none means nothing here and should fail."""
74 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060075
76 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060077 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060078
79 def testSuccess(self):
80 """Test overall successful argument handling."""
81 targets = ['foo', 'bar']
82 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060083 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060084 expected_type = constants.BOTH_OVERLAYS
85 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
86 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060087 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
88 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060089
Alex Klein231d2da2019-07-22 16:44:45 -060090 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060091
92 # Make sure the type is right, verify build targets after.
93 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
94 output_dir)
95 # First argument (build targets) of the first (only) call.
96 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040097 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060098
Alex Klein231d2da2019-07-22 16:44:45 -060099 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -0600100 self.assertIn(ebuild.path, changed)
101 changed.remove(ebuild.path)
102 self.assertFalse(changed)
103
David Burger1e0fe232019-07-01 14:52:07 -0600104
Alex Kleinda39c6d2019-09-16 14:36:36 -0600105class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -0600106 """UprevVersionedPackage tests."""
107
108 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -0600109 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600110
111 def _addVersion(self, request, version):
112 """Helper method to add a full version message to the request."""
113 ref = request.versions.add()
114 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600115 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600116 ref.revision = 'abc123'
117
118 def testValidateOnly(self):
119 """Sanity check validate only calls are working properly."""
120 service = self.PatchObject(packages_service, 'uprev_versioned_package')
121
122 request = packages_pb2.UprevVersionedPackageRequest()
123 self._addVersion(request, '1.2.3.4')
124 request.package_info.category = 'chromeos-base'
125 request.package_info.package_name = 'chromeos-chrome'
126
127 packages_controller.UprevVersionedPackage(request, self.response,
128 self.validate_only_config)
129
130 service.assert_not_called()
131
Michael Mortensen2677bf62019-10-29 08:31:25 -0600132 def testMockCall(self):
133 """Test that a mock call does not execute logic, returns mocked value."""
134 patch = self.PatchObject(packages_service, 'uprev_versioned_package')
135 request = packages_pb2.UprevVersionedPackageRequest()
136 packages_controller.UprevVersionedPackage(request, self.response,
137 self.mock_call_config)
138 patch.assert_not_called()
139 self.assertTrue(self.response.responses)
140 self.assertTrue(self.response.responses[0].modified_ebuilds)
141
Alex Klein87531182019-08-12 15:23:37 -0600142 def testNoVersions(self):
143 """Test no versions provided."""
144 request = packages_pb2.UprevVersionedPackageRequest()
145 request.package_info.category = 'chromeos-base'
146 request.package_info.package_name = 'chromeos-chrome'
147
148 with self.assertRaises(cros_build_lib.DieSystemExit):
149 packages_controller.UprevVersionedPackage(request, self.response,
150 self.api_config)
151
152 def testNoPackageName(self):
153 """Test no package name provided."""
154 request = packages_pb2.UprevVersionedPackageRequest()
155 self._addVersion(request, '1.2.3.4')
156 request.package_info.category = 'chromeos-base'
157
158 with self.assertRaises(cros_build_lib.DieSystemExit):
159 packages_controller.UprevVersionedPackage(request, self.response,
160 self.api_config)
161
162 def testNoCategory(self):
163 """Test no package category provided."""
164 request = packages_pb2.UprevVersionedPackageRequest()
165 self._addVersion(request, '1.2.3.4')
166 request.package_info.package_name = 'chromeos-chrome'
167
168 with self.assertRaises(cros_build_lib.DieSystemExit):
169 packages_controller.UprevVersionedPackage(request, self.response,
170 self.api_config)
171
172 def testOutputHandling(self):
173 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600174 version = '1.2.3.4'
Chris McDonald38409112020-09-24 11:24:51 -0600175 result = uprev_lib.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600176 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600177
Alex Klein34afcbc2019-08-22 16:14:31 -0600178 self.PatchObject(
179 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600180
181 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600182 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600183 request.package_info.category = 'chromeos-base'
184 request.package_info.package_name = 'chromeos-chrome'
185
186 packages_controller.UprevVersionedPackage(request, self.response,
187 self.api_config)
188
Yaakov Shaul730814a2019-09-10 13:58:25 -0600189 for idx, uprev_response in enumerate(self.response.responses):
190 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400191 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600192 result.modified[idx].files,
193 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600194
195
Alex Kleinda39c6d2019-09-16 14:36:36 -0600196class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600197 """GetBestVisible tests."""
198
Alex Klein231d2da2019-07-22 16:44:45 -0600199 def setUp(self):
200 self.response = packages_pb2.GetBestVisibleResponse()
201
David Burger1e0fe232019-07-01 14:52:07 -0600202 def _GetRequest(self, atom=None):
203 return packages_pb2.GetBestVisibleRequest(
204 atom=atom,
205 )
206
David Burger1e0fe232019-07-01 14:52:07 -0600207 def _MakeCpv(self, category, package, version):
208 unused = {
209 'cp': None,
210 'cpv': None,
211 'cpf': None,
212 'pv': None,
213 'version_no_rev': None,
214 'rev': None,
215 }
Alex Klein75df1792020-06-11 14:42:49 -0600216 return package_info.CPV(
David Burger1e0fe232019-07-01 14:52:07 -0600217 category=category,
218 package=package,
219 version=version,
220 **unused
221 )
222
Alex Klein231d2da2019-07-22 16:44:45 -0600223 def testValidateOnly(self):
224 """Sanity check that a validate only call does not execute any logic."""
225 patch = self.PatchObject(packages_service, 'get_best_visible')
226
227 request = self._GetRequest(atom='chromeos-chrome')
228 packages_controller.GetBestVisible(request, self.response,
229 self.validate_only_config)
230 patch.assert_not_called()
231
Michael Mortensen2677bf62019-10-29 08:31:25 -0600232 def testMockCall(self):
233 """Test that a mock call does not execute logic, returns mocked value."""
234 patch = self.PatchObject(packages_service, 'get_best_visible')
235 request = self._GetRequest(atom='chromeos-chrome')
236 packages_controller.GetBestVisible(request, self.response,
237 self.mock_call_config)
238 patch.assert_not_called()
239 self.assertTrue(self.response.package_info)
240 self.assertTrue(self.response.package_info.category)
241 self.assertTrue(self.response.package_info.package_name)
242 self.assertTrue(self.response.package_info.version)
243
David Burger1e0fe232019-07-01 14:52:07 -0600244 def testNoAtomFails(self):
245 """No atom provided should fail."""
246 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600247 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600248 packages_controller.GetBestVisible(request, self.response,
249 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600250
251 def testSuccess(self):
252 """Test overall success, argument handling, result forwarding."""
253 cpv = self._MakeCpv('category', 'package', 'version')
254 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
255
256 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600257
Alex Klein231d2da2019-07-22 16:44:45 -0600258 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600259
Alex Klein75df1792020-06-11 14:42:49 -0600260 package_info_msg = self.response.package_info
261 self.assertEqual(package_info_msg.category, cpv.category)
262 self.assertEqual(package_info_msg.package_name, cpv.package)
263 self.assertEqual(package_info_msg.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600264
265
Michael Mortensen68abdb72019-10-28 09:43:52 -0600266class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
267 """GetChromeVersion tests."""
268
269 def setUp(self):
270 self.response = packages_pb2.GetChromeVersionResponse()
271
272 def _GetRequest(self, board=None):
273 """Helper to build out a request."""
274 request = packages_pb2.GetChromeVersionRequest()
275
276 if board:
277 request.build_target.name = board
278
279 return request
280
281 def testValidateOnly(self):
282 """Sanity check that a validate only call does not execute any logic."""
283 chrome_version = self.PatchObject(packages_service,
284 'determine_chrome_version')
285 request = self._GetRequest(board='betty')
286 packages_controller.GetChromeVersion(request, self.response,
287 self.validate_only_config)
288 chrome_version.assert_not_called()
289
290 def testMockCall(self):
291 """Test that a mock call does not execute logic, returns mocked value."""
292 chrome_version = self.PatchObject(packages_service,
293 'determine_chrome_version')
294 request = self._GetRequest(board='betty')
295 packages_controller.GetChromeVersion(request, self.response,
296 self.mock_call_config)
297 chrome_version.assert_not_called()
298 self.assertTrue(self.response.version)
299
300 def testGetChromeVersion(self):
301 """Verify basic return values."""
302 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600303 chrome_version_mock = self.PatchObject(packages_service,
304 'determine_chrome_version',
305 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600306 request = self._GetRequest(board='betty')
307 packages_controller.GetChromeVersion(request, self.response,
308 self.api_config)
309 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600310 # Verify call to determine_chrome_version passes a build_target object.
311 build_target = build_target_lib.BuildTarget('betty')
312 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600313
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600314 def testGetChromeVersionHandleNone(self):
315 """Verify basic return values."""
316 self.PatchObject(packages_service, 'determine_chrome_version',
317 return_value=None)
318 request = self._GetRequest(board='betty')
319 packages_controller.GetChromeVersion(request, self.response,
320 self.api_config)
321 self.assertFalse(self.response.version)
322
Michael Mortensen68abdb72019-10-28 09:43:52 -0600323
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600324class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
325 """GetTargetVersions tests."""
326
327 def setUp(self):
328 self.response = packages_pb2.GetTargetVersionsResponse()
329
330 def _GetRequest(self, board=None):
331 """Helper to build out a request."""
332 request = packages_pb2.GetTargetVersionsRequest()
333
334 if board:
335 request.build_target.name = board
336
337 return request
338
339 def testValidateOnly(self):
340 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600341 builds_chrome = self.PatchObject(
342 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600343 patch_version = self.PatchObject(packages_service,
344 'determine_android_version')
345 patch_branch_version = self.PatchObject(packages_service,
346 'determine_android_branch')
347 patch_target_version = self.PatchObject(packages_service,
348 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600349 chrome_version = self.PatchObject(packages_service,
350 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600351 platform_version = self.PatchObject(packages_service,
352 'determine_platform_version')
353 milestone_version = self.PatchObject(packages_service,
354 'determine_milestone_version')
355 full_version = self.PatchObject(packages_service,
356 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600357
358 request = self._GetRequest(board='betty')
359 packages_controller.GetTargetVersions(request, self.response,
360 self.validate_only_config)
361 patch_version.assert_not_called()
362 patch_branch_version.assert_not_called()
363 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600364 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600365 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600366 platform_version.assert_not_called()
367 milestone_version.assert_not_called()
368 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600369
Michael Mortensen2677bf62019-10-29 08:31:25 -0600370 def testMockCall(self):
371 """Test that a mock call does not execute logic, returns mocked value."""
372 builds_chrome = self.PatchObject(
373 packages_service, 'builds', return_value=True)
374 patch_version = self.PatchObject(packages_service,
375 'determine_android_version')
376 patch_branch_version = self.PatchObject(packages_service,
377 'determine_android_branch')
378 patch_target_version = self.PatchObject(packages_service,
379 'determine_android_target')
380 chrome_version = self.PatchObject(packages_service,
381 'determine_chrome_version')
382 platform_version = self.PatchObject(packages_service,
383 'determine_platform_version')
384 milestone_version = self.PatchObject(packages_service,
385 'determine_milestone_version')
386 full_version = self.PatchObject(packages_service,
387 'determine_full_version')
388
389 request = self._GetRequest(board='betty')
390 packages_controller.GetTargetVersions(request, self.response,
391 self.mock_call_config)
392
393 patch_version.assert_not_called()
394 patch_branch_version.assert_not_called()
395 patch_target_version.assert_not_called()
396 builds_chrome.assert_not_called()
397 chrome_version.assert_not_called()
398 platform_version.assert_not_called()
399 milestone_version.assert_not_called()
400 full_version.assert_not_called()
401
402 self.assertTrue(self.response.android_version)
403 self.assertTrue(self.response.android_branch_version)
404 self.assertTrue(self.response.android_target_version)
405 self.assertTrue(self.response.chrome_version)
406 self.assertTrue(self.response.platform_version)
407 self.assertTrue(self.response.milestone_version)
408 self.assertTrue(self.response.full_version)
409
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600410 def testNoBuildTargetFails(self):
411 """No build target argument should fail."""
412 request = self._GetRequest()
413
414 with self.assertRaises(cros_build_lib.DieSystemExit):
415 packages_controller.GetTargetVersions(request, self.response,
416 self.api_config)
417
Michael Mortensenc2615b72019-10-15 08:12:24 -0600418 def testGetTargetVersions(self):
419 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600420 # Mock that chrome is built and set the chrome_version.
421 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600422 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600423 chrome_version_mock = self.PatchObject(packages_service,
424 'determine_chrome_version',
425 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500426 android_package = 'chromeos-base/android-container-pi-10.3'
427 self.PatchObject(packages_service, 'determine_android_package',
428 return_value=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600429 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600430 android_branch_mock = self.PatchObject(packages_service,
431 'determine_android_branch',
432 return_value=android_branch)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600433 platform_version = '12345.1.2'
434 self.PatchObject(packages_service, 'determine_platform_version',
435 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600436 milestone_version = '79'
437 self.PatchObject(packages_service, 'determine_milestone_version',
438 return_value=milestone_version)
439 full_version = 'R79-12345.1.2'
440 self.PatchObject(packages_service, 'determine_full_version',
441 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600442 request = self._GetRequest(board='betty')
443 packages_controller.GetTargetVersions(request, self.response,
444 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500445 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600446 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500447 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600448 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600449 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600450 self.assertEqual(self.response.milestone_version, milestone_version)
451 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600452 # Verify call to determine_chrome_version passes a build_target object.
453 build_target = build_target_lib.BuildTarget('betty')
454 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600455 # Verify call to determine_android_branch passes a board name.
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500456 android_branch_mock.assert_called_with('betty', package=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600457
Michael Mortensen42c330e32020-09-02 09:59:16 -0600458 def testGetTargetVersionsWithPackagesSet(self):
459 """Verify packages pass through and basic return values."""
460 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
461 # rather than mocking the boundary to portage calls such as
462 # packages_service.builds).
463 builds_mock = self.PatchObject(packages_service, 'builds',
464 return_value=True)
465 # Mock that chrome is built and set the chrome_version.
466 chrome_version = '76.0.1.2'
467 self.PatchObject(packages_service, 'determine_chrome_version',
468 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500469 android_package = 'chromeos-base/android-container-pi-10.3'
470 self.PatchObject(packages_service, 'determine_android_package',
471 return_value=android_package)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600472 android_branch = 'android_test_branch'
473 self.PatchObject(packages_service, 'determine_android_branch',
474 return_value=android_branch)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600475 platform_version = '12345.1.2'
476 self.PatchObject(packages_service, 'determine_platform_version',
477 return_value=platform_version)
478 milestone_version = '79'
479 self.PatchObject(packages_service, 'determine_milestone_version',
480 return_value=milestone_version)
481 full_version = 'R79-12345.1.2'
482 self.PatchObject(packages_service, 'determine_full_version',
483 return_value=full_version)
484 request = self._GetRequest(board='betty')
485 # Add optional packages to the request.
486 cpv_package_list = []
487 package = request.packages.add()
488 package.package_name = 'test'
489 package.category = 'chromeos-base'
490 package.version = '0.0.1-r1'
491 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
492 package = request.packages.add()
493 package.package_name = 'target-fuzzers'
494 package.category = 'virtual'
495 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
496
497 packages_controller.GetTargetVersions(request, self.response,
498 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500499 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600500 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500501 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600502 self.assertEqual(self.response.chrome_version, chrome_version)
503 self.assertEqual(self.response.platform_version, platform_version)
504 self.assertEqual(self.response.milestone_version, milestone_version)
505 # Verify call to packages.builds passes the package list.
506 builds_mock.assert_called_with(constants.CHROME_CP,
507 mock.ANY, # Match the build target object
508 packages=cpv_package_list)
509
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600510 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600511 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600512 platform_version = '12345.1.2'
513 self.PatchObject(packages_service, 'determine_platform_version',
514 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600515 self.PatchObject(packages_service, 'builds', return_value=False)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500516 self.PatchObject(packages_service, 'determine_android_package',
Michael Mortensenedf76532019-10-16 14:22:37 -0600517 return_value=None)
518 request = self._GetRequest(board='betty')
519 packages_controller.GetTargetVersions(request, self.response,
520 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600521 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600522 self.assertFalse(self.response.android_version)
523 self.assertFalse(self.response.android_branch_version)
524 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600525 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600526
Michael Mortensenbfc56392020-04-30 15:23:47 -0600527
528class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
529 """GetBuilderMetadata tests."""
530
531 def setUp(self):
532 self.response = packages_pb2.GetBuilderMetadataResponse()
533
534 def _GetRequest(self, board=None):
535 """Helper to build out a request."""
536 request = packages_pb2.GetBuilderMetadataRequest()
537
538 if board:
539 request.build_target.name = board
540
541 return request
542
543 def testValidateOnly(self):
544 """Sanity check that a validate only call does not execute any logic."""
545 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600546 patch_version = self.PatchObject(packages_service,
547 'determine_android_version')
548 patch_branch_version = self.PatchObject(packages_service,
549 'determine_android_branch')
550 patch_fw_versions = self.PatchObject(packages_service,
551 'determine_firmware_versions')
552 patch_fingerprints = self.PatchObject(packages_service,
553 'find_fingerprints')
554 patch_get_models = self.PatchObject(packages_service,
555 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600556 packages_controller.GetBuilderMetadata(request, self.response,
557 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600558 patch_version.assert_not_called()
559 patch_branch_version.assert_not_called()
560 patch_fw_versions.assert_not_called()
561 patch_fingerprints.assert_not_called()
562 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600563
564 def testMockCall(self):
565 """Test that a mock call does not execute logic, returns mocked value."""
566 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600567 patch_version = self.PatchObject(packages_service,
568 'determine_android_version')
569 patch_branch_version = self.PatchObject(packages_service,
570 'determine_android_branch')
571 patch_fw_versions = self.PatchObject(packages_service,
572 'determine_firmware_versions')
573 patch_fingerprints = self.PatchObject(packages_service,
574 'find_fingerprints')
575 patch_get_models = self.PatchObject(packages_service,
576 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600577 packages_controller.GetBuilderMetadata(request, self.response,
578 self.mock_call_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600579 patch_version.assert_not_called()
580 patch_branch_version.assert_not_called()
581 patch_fw_versions.assert_not_called()
582 patch_fingerprints.assert_not_called()
583 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600584
585 self.assertEqual(len(self.response.build_target_metadata), 1)
586 self.assertEqual(self.response.build_target_metadata[0].build_target,
587 request.build_target.name)
588 self.assertEqual(len(self.response.model_metadata), 1)
589 self.assertTrue(self.response.model_metadata[0].model_name)
590 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
591
592 def testNoBuildTargetFails(self):
593 """No build target argument should fail."""
594 request = self._GetRequest()
595
596 with self.assertRaises(cros_build_lib.DieSystemExit):
597 packages_controller.GetBuilderMetadata(request, self.response,
598 self.api_config)
599
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600600 def testGetBuilderMetadata(self):
601 """Verify basic return values."""
602 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600603 android_version_mock = self.PatchObject(packages_service,
604 'determine_android_version',
605 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600606 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600607 android_branch_mock = self.PatchObject(packages_service,
608 'determine_android_branch',
609 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600610 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600611 android_target_mock = self.PatchObject(packages_service,
612 'determine_android_target',
613 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600614 self.PatchObject(portage_util, 'GetBoardUseFlags',
615 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600616 package_result = ['sys-kernel/linux-headers-4.14-r24',
617 'sys-devel/flex-2.6.4-r1',
618 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
619 self.PatchObject(portage_util, 'GetPackageDependencies',
620 return_value=package_result)
621
Michael Mortensena4af79e2020-05-06 16:18:48 -0600622 fw_versions = packages_service.FirmwareVersions(
623 None,
624 'Google_Caroline.7820.263.0',
625 'Google_Caroline.7820.286.0',
626 'caroline_v1.9.357-ac5c7b4',
627 'caroline_v1.9.370-e8b9bd2')
628 self.PatchObject(packages_service, 'get_firmware_versions',
629 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600630 fingerprints = ['fingerprint1', 'fingerprint2']
631 self.PatchObject(packages_service, 'find_fingerprints',
632 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600633 # Patch packages.get_models, packages.get_all_firmware_versions,
634 # and packages.get_key_id for calls needed by model_metadata.
635 model_list = ['pyro', 'reef']
636 all_fw_versions = {
637 'pyro': packages_service.FirmwareVersions(
638 'pyro',
639 'Google_Pyro.9042.87.1',
640 'Google_Pyro.9042.110.0',
641 'pyro_v1.1.5900-ab1ee51',
642 'pyro_v1.1.5909-bd1f0c9'),
643 'reef': packages_service.FirmwareVersions(
644 'reef',
645 'Google_Reef.9042.87.1',
646 'Google_Reef.9042.110.0',
647 'reef_v1.1.5900-ab1ee51',
648 'reef_v1.1.5909-bd1f0c9')
649 }
650 self.PatchObject(packages_service, 'get_all_firmware_versions',
651 return_value=all_fw_versions)
652 self.PatchObject(packages_service, 'get_models',
653 return_value=model_list)
654 self.PatchObject(packages_service, 'get_key_id',
655 return_value='key')
656
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600657 request = self._GetRequest(board='betty')
658 packages_controller.GetBuilderMetadata(request, self.response,
659 self.api_config)
660 self.assertEqual(
661 self.response.build_target_metadata[0].build_target,
662 'betty')
663 self.assertEqual(
664 self.response.build_target_metadata[0].android_container_version,
665 android_version)
666 self.assertEqual(
667 self.response.build_target_metadata[0].android_container_branch,
668 android_branch)
669 self.assertEqual(
670 self.response.build_target_metadata[0].android_container_target,
671 android_target)
672 self.assertEqual(
673 self.response.build_target_metadata[0].arc_use_set,
674 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600675 # Verify call to determine_android_version passes list of the board name.
Mike Frysingerb53f1822021-03-05 00:44:50 -0500676 android_version_mock.assert_called_with('betty')
Michael Mortensen027ecd82020-05-05 13:13:40 -0600677 # Verify call to determine_android_branch passes board name.
678 android_branch_mock.assert_called_with('betty')
679 # Verify call to determine_android_target passes board name.
680 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600681 self.assertEqual(
682 self.response.build_target_metadata[0].main_firmware_version,
683 'Google_Caroline.7820.286.0')
684 self.assertEqual(
685 self.response.build_target_metadata[0].ec_firmware_version,
686 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600687 self.assertEqual(
688 self.response.build_target_metadata[0].kernel_version,
689 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600690 self.assertEqual(
691 len(self.response.build_target_metadata[0].fingerprints),
692 2)
693 self.assertEqual(
694 self.response.build_target_metadata[0].fingerprints,
695 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600696 self.assertEqual(
697 len(self.response.model_metadata), 2)
698 self.assertEqual(
699 self.response.model_metadata[0].model_name, 'pyro')
700 self.assertEqual(
701 self.response.model_metadata[0].ec_firmware_version,
702 'pyro_v1.1.5909-bd1f0c9')
703 self.assertEqual(
704 self.response.model_metadata[0].firmware_key_id, 'key')
705 self.assertEqual(
706 self.response.model_metadata[0].main_readonly_firmware_version,
707 'Google_Pyro.9042.87.1')
708 self.assertEqual(
709 self.response.model_metadata[0].main_readwrite_firmware_version,
710 'Google_Pyro.9042.110.0')
711 self.assertEqual(
712 self.response.model_metadata[1].model_name, 'reef')
713 self.assertEqual(
714 self.response.model_metadata[1].ec_firmware_version,
715 'reef_v1.1.5909-bd1f0c9')
716 self.assertEqual(
717 self.response.model_metadata[1].firmware_key_id, 'key')
718 self.assertEqual(
719 self.response.model_metadata[1].main_readonly_firmware_version,
720 'Google_Reef.9042.87.1')
721 self.assertEqual(
722 self.response.model_metadata[1].main_readwrite_firmware_version,
723 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600724
Michael Mortensend81d81e2020-06-09 14:20:59 -0600725 # Test corner case where find_fingerprints returns None.
726 # Re-patch find_fingerprints to now return None and re-execute
727 # GetBuilderMetadata to verify behavior.
728 response = packages_pb2.GetBuilderMetadataResponse()
729 self.PatchObject(packages_service, 'find_fingerprints',
730 return_value=[])
731 request = self._GetRequest(board='betty')
732 packages_controller.GetBuilderMetadata(request, response,
733 self.api_config)
734 # Verify a non-fingerprint build_target_metdata field was still set.
735 self.assertEqual(
736 response.build_target_metadata[0].kernel_version,
737 '4.4.223-r2209')
738 # And then verify that fingerprints was empty.
739 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
740
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600741
Alex Kleinda39c6d2019-09-16 14:36:36 -0600742class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
743 """HasChromePrebuilt tests."""
744
745 def setUp(self):
746 self.response = packages_pb2.HasChromePrebuiltResponse()
747
748 def _GetRequest(self, board=None):
749 """Helper to build out a request."""
750 request = packages_pb2.HasChromePrebuiltRequest()
751
752 if board:
753 request.build_target.name = board
754
755 return request
756
757 def testValidateOnly(self):
758 """Sanity check that a validate only call does not execute any logic."""
759 patch = self.PatchObject(packages_service, 'has_prebuilt')
760
761 request = self._GetRequest(board='betty')
762 packages_controller.HasChromePrebuilt(request, self.response,
763 self.validate_only_config)
764 patch.assert_not_called()
765
Michael Mortensen3232ab32020-01-05 19:14:36 -0700766 def testMockCall(self):
767 """Test that a mock call does not execute logic, returns mocked value."""
768 patch = self.PatchObject(packages_service, 'has_prebuilt')
769
770 request = self._GetRequest(board='betty')
771 packages_controller.HasChromePrebuilt(request, self.response,
772 self.mock_call_config)
773 patch.assert_not_called()
774 self.assertTrue(self.response.has_prebuilt)
775
Alex Kleinda39c6d2019-09-16 14:36:36 -0600776 def testNoBuildTargetFails(self):
777 """No build target argument should fail."""
778 request = self._GetRequest()
779
780 with self.assertRaises(cros_build_lib.DieSystemExit):
781 packages_controller.HasChromePrebuilt(request, self.response,
782 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600783
784
785class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
786 """BuildsChrome tests."""
787
788 def setUp(self):
789 self.response = packages_pb2.BuildsChromeResponse()
790
David Burger0f9dd4e2019-10-08 12:33:42 -0600791 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600792 """Helper to build out a request."""
793 request = packages_pb2.BuildsChromeRequest()
794
795 if board:
796 request.build_target.name = board
797
David Burger0f9dd4e2019-10-08 12:33:42 -0600798 if packages:
799 request.packages.extend(packages)
800
Alex Klein73fb6572019-09-30 16:55:23 -0600801 return request
802
803 def testValidateOnly(self):
804 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600805 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600806
807 request = self._GetRequest(board='betty')
808 packages_controller.BuildsChrome(request, self.response,
809 self.validate_only_config)
810 patch.assert_not_called()
811
812 def testNoBuildTargetFails(self):
813 """No build target argument should fail."""
814 request = self._GetRequest()
815
816 with self.assertRaises(cros_build_lib.DieSystemExit):
817 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600818
819 def testBuilds(self):
820 """Test successful call handling."""
821 patch = self.PatchObject(packages_service, 'builds', return_value=True)
822
823 request = self._GetRequest(board='foo')
824 packages_controller.BuildsChrome(request, self.response, self.api_config)
825 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600826 patch.assert_called_once_with(constants.CHROME_CP,
827 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600828
829 def testBuildsChromeWithPackages(self):
830 """Test successful call with packages handling."""
831 patch = self.PatchObject(packages_service, 'builds', return_value=True)
832
833 package = common_pb2.PackageInfo(
834 category='category',
835 package_name='name',
836 version='1.01',
837 )
838 request = self._GetRequest(board='foo', packages=[package])
839 packages_controller.BuildsChrome(request, self.response, self.api_config)
840 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600841 patch.assert_called_once_with(constants.CHROME_CP,
842 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600843 [controller_util.PackageInfoToCPV(package)])