blob: de5e6c631fc833ce2093b7dcc30936c44f765501 [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
Alex Kleinda39c6d2019-09-16 14:36:36 -060010from chromite.api.api_config import ApiConfigMixin
David Burger0f9dd4e2019-10-08 12:33:42 -060011from chromite.api.controller import controller_util
Alex Kleineb77ffa2019-05-28 14:47:44 -060012from chromite.api.controller import packages as packages_controller
David Burger0f9dd4e2019-10-08 12:33:42 -060013from chromite.api.gen.chromiumos import common_pb2
Alex Kleineb77ffa2019-05-28 14:47:44 -060014from chromite.api.gen.chromite.api import binhost_pb2
15from chromite.api.gen.chromite.api import packages_pb2
Chris McDonald38409112020-09-24 11:24:51 -060016from chromite.lib import build_target_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060017from chromite.lib import constants
18from chromite.lib import cros_build_lib
19from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060020from chromite.lib import portage_util
Chris McDonald38409112020-09-24 11:24:51 -060021from chromite.lib import uprev_lib
Alex Klein75df1792020-06-11 14:42:49 -060022from chromite.lib.parser import package_info
Alex Kleineb77ffa2019-05-28 14:47:44 -060023from chromite.service import packages as packages_service
Mike Frysinger40ffb532021-02-12 07:36:08 -050024from chromite.third_party import mock
Alex Kleineb77ffa2019-05-28 14:47:44 -060025
26
Alex Kleinda39c6d2019-09-16 14:36:36 -060027class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060028 """Uprev tests."""
29
30 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
31 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
32 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
33 _NONE = binhost_pb2.OVERLAYTYPE_NONE
34
35 def setUp(self):
36 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060037 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060038
39 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
40 return packages_pb2.UprevPackagesRequest(
41 build_targets=[{'name': name} for name in targets or []],
42 overlay_type=overlay_type,
43 output_dir=output_dir,
44 )
45
Alex Klein231d2da2019-07-22 16:44:45 -060046 def testValidateOnly(self):
47 """Sanity check that a validate only call does not execute any logic."""
48 patch = self.PatchObject(packages_service, 'uprev_build_targets')
49
50 targets = ['foo', 'bar']
51 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
52 packages_controller.Uprev(request, self.response, self.validate_only_config)
53 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060054
Michael Mortensen2677bf62019-10-29 08:31:25 -060055 def testMockCall(self):
56 """Test that a mock call does not execute logic, returns mocked value."""
57 patch = self.PatchObject(packages_service, 'uprev_build_targets')
58 targets = ['foo', 'bar']
59 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
60 packages_controller.Uprev(request, self.response, self.mock_call_config)
61 patch.assert_not_called()
62 self.assertTrue(self.response.modified_ebuilds)
63
Alex Kleineb77ffa2019-05-28 14:47:44 -060064 def testNoOverlayTypeFails(self):
65 """No overlay type provided should fail."""
66 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060067
68 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060069 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060070
71 def testOverlayTypeNoneFails(self):
72 """Overlay type none means nothing here and should fail."""
73 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060074
75 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060076 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060077
78 def testSuccess(self):
79 """Test overall successful argument handling."""
80 targets = ['foo', 'bar']
81 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060082 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060083 expected_type = constants.BOTH_OVERLAYS
84 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
85 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060086 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
87 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060088
Alex Klein231d2da2019-07-22 16:44:45 -060089 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060090
91 # Make sure the type is right, verify build targets after.
92 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
93 output_dir)
94 # First argument (build targets) of the first (only) call.
95 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040096 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060097
Alex Klein231d2da2019-07-22 16:44:45 -060098 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060099 self.assertIn(ebuild.path, changed)
100 changed.remove(ebuild.path)
101 self.assertFalse(changed)
102
David Burger1e0fe232019-07-01 14:52:07 -0600103
Alex Kleinda39c6d2019-09-16 14:36:36 -0600104class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -0600105 """UprevVersionedPackage tests."""
106
107 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -0600108 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -0600109
110 def _addVersion(self, request, version):
111 """Helper method to add a full version message to the request."""
112 ref = request.versions.add()
113 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600114 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600115 ref.revision = 'abc123'
116
117 def testValidateOnly(self):
118 """Sanity check validate only calls are working properly."""
119 service = self.PatchObject(packages_service, 'uprev_versioned_package')
120
121 request = packages_pb2.UprevVersionedPackageRequest()
122 self._addVersion(request, '1.2.3.4')
123 request.package_info.category = 'chromeos-base'
124 request.package_info.package_name = 'chromeos-chrome'
125
126 packages_controller.UprevVersionedPackage(request, self.response,
127 self.validate_only_config)
128
129 service.assert_not_called()
130
Michael Mortensen2677bf62019-10-29 08:31:25 -0600131 def testMockCall(self):
132 """Test that a mock call does not execute logic, returns mocked value."""
133 patch = self.PatchObject(packages_service, 'uprev_versioned_package')
134 request = packages_pb2.UprevVersionedPackageRequest()
135 packages_controller.UprevVersionedPackage(request, self.response,
136 self.mock_call_config)
137 patch.assert_not_called()
138 self.assertTrue(self.response.responses)
139 self.assertTrue(self.response.responses[0].modified_ebuilds)
140
Alex Klein87531182019-08-12 15:23:37 -0600141 def testNoVersions(self):
142 """Test no versions provided."""
143 request = packages_pb2.UprevVersionedPackageRequest()
144 request.package_info.category = 'chromeos-base'
145 request.package_info.package_name = 'chromeos-chrome'
146
147 with self.assertRaises(cros_build_lib.DieSystemExit):
148 packages_controller.UprevVersionedPackage(request, self.response,
149 self.api_config)
150
151 def testNoPackageName(self):
152 """Test no package name provided."""
153 request = packages_pb2.UprevVersionedPackageRequest()
154 self._addVersion(request, '1.2.3.4')
155 request.package_info.category = 'chromeos-base'
156
157 with self.assertRaises(cros_build_lib.DieSystemExit):
158 packages_controller.UprevVersionedPackage(request, self.response,
159 self.api_config)
160
161 def testNoCategory(self):
162 """Test no package category provided."""
163 request = packages_pb2.UprevVersionedPackageRequest()
164 self._addVersion(request, '1.2.3.4')
165 request.package_info.package_name = 'chromeos-chrome'
166
167 with self.assertRaises(cros_build_lib.DieSystemExit):
168 packages_controller.UprevVersionedPackage(request, self.response,
169 self.api_config)
170
171 def testOutputHandling(self):
172 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600173 version = '1.2.3.4'
Chris McDonald38409112020-09-24 11:24:51 -0600174 result = uprev_lib.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600175 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600176
Alex Klein34afcbc2019-08-22 16:14:31 -0600177 self.PatchObject(
178 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600179
180 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600181 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600182 request.package_info.category = 'chromeos-base'
183 request.package_info.package_name = 'chromeos-chrome'
184
185 packages_controller.UprevVersionedPackage(request, self.response,
186 self.api_config)
187
Yaakov Shaul730814a2019-09-10 13:58:25 -0600188 for idx, uprev_response in enumerate(self.response.responses):
189 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400190 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600191 result.modified[idx].files,
192 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600193
194
Alex Kleinda39c6d2019-09-16 14:36:36 -0600195class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600196 """GetBestVisible tests."""
197
Alex Klein231d2da2019-07-22 16:44:45 -0600198 def setUp(self):
199 self.response = packages_pb2.GetBestVisibleResponse()
200
David Burger1e0fe232019-07-01 14:52:07 -0600201 def _GetRequest(self, atom=None):
202 return packages_pb2.GetBestVisibleRequest(
203 atom=atom,
204 )
205
David Burger1e0fe232019-07-01 14:52:07 -0600206 def _MakeCpv(self, category, package, version):
207 unused = {
208 'cp': None,
209 'cpv': None,
210 'cpf': None,
211 'pv': None,
212 'version_no_rev': None,
213 'rev': None,
214 }
Alex Klein75df1792020-06-11 14:42:49 -0600215 return package_info.CPV(
David Burger1e0fe232019-07-01 14:52:07 -0600216 category=category,
217 package=package,
218 version=version,
219 **unused
220 )
221
Alex Klein231d2da2019-07-22 16:44:45 -0600222 def testValidateOnly(self):
223 """Sanity check that a validate only call does not execute any logic."""
224 patch = self.PatchObject(packages_service, 'get_best_visible')
225
226 request = self._GetRequest(atom='chromeos-chrome')
227 packages_controller.GetBestVisible(request, self.response,
228 self.validate_only_config)
229 patch.assert_not_called()
230
Michael Mortensen2677bf62019-10-29 08:31:25 -0600231 def testMockCall(self):
232 """Test that a mock call does not execute logic, returns mocked value."""
233 patch = self.PatchObject(packages_service, 'get_best_visible')
234 request = self._GetRequest(atom='chromeos-chrome')
235 packages_controller.GetBestVisible(request, self.response,
236 self.mock_call_config)
237 patch.assert_not_called()
238 self.assertTrue(self.response.package_info)
239 self.assertTrue(self.response.package_info.category)
240 self.assertTrue(self.response.package_info.package_name)
241 self.assertTrue(self.response.package_info.version)
242
David Burger1e0fe232019-07-01 14:52:07 -0600243 def testNoAtomFails(self):
244 """No atom provided should fail."""
245 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600246 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600247 packages_controller.GetBestVisible(request, self.response,
248 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600249
250 def testSuccess(self):
251 """Test overall success, argument handling, result forwarding."""
252 cpv = self._MakeCpv('category', 'package', 'version')
253 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
254
255 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600256
Alex Klein231d2da2019-07-22 16:44:45 -0600257 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600258
Alex Klein75df1792020-06-11 14:42:49 -0600259 package_info_msg = self.response.package_info
260 self.assertEqual(package_info_msg.category, cpv.category)
261 self.assertEqual(package_info_msg.package_name, cpv.package)
262 self.assertEqual(package_info_msg.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600263
264
Michael Mortensen68abdb72019-10-28 09:43:52 -0600265class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
266 """GetChromeVersion tests."""
267
268 def setUp(self):
269 self.response = packages_pb2.GetChromeVersionResponse()
270
271 def _GetRequest(self, board=None):
272 """Helper to build out a request."""
273 request = packages_pb2.GetChromeVersionRequest()
274
275 if board:
276 request.build_target.name = board
277
278 return request
279
280 def testValidateOnly(self):
281 """Sanity check that a validate only call does not execute any logic."""
282 chrome_version = self.PatchObject(packages_service,
283 'determine_chrome_version')
284 request = self._GetRequest(board='betty')
285 packages_controller.GetChromeVersion(request, self.response,
286 self.validate_only_config)
287 chrome_version.assert_not_called()
288
289 def testMockCall(self):
290 """Test that a mock call does not execute logic, returns mocked value."""
291 chrome_version = self.PatchObject(packages_service,
292 'determine_chrome_version')
293 request = self._GetRequest(board='betty')
294 packages_controller.GetChromeVersion(request, self.response,
295 self.mock_call_config)
296 chrome_version.assert_not_called()
297 self.assertTrue(self.response.version)
298
299 def testGetChromeVersion(self):
300 """Verify basic return values."""
301 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600302 chrome_version_mock = self.PatchObject(packages_service,
303 'determine_chrome_version',
304 return_value=chrome_version)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600305 request = self._GetRequest(board='betty')
306 packages_controller.GetChromeVersion(request, self.response,
307 self.api_config)
308 self.assertEqual(self.response.version, chrome_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600309 # Verify call to determine_chrome_version passes a build_target object.
310 build_target = build_target_lib.BuildTarget('betty')
311 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen68abdb72019-10-28 09:43:52 -0600312
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600313 def testGetChromeVersionHandleNone(self):
314 """Verify basic return values."""
315 self.PatchObject(packages_service, 'determine_chrome_version',
316 return_value=None)
317 request = self._GetRequest(board='betty')
318 packages_controller.GetChromeVersion(request, self.response,
319 self.api_config)
320 self.assertFalse(self.response.version)
321
Michael Mortensen68abdb72019-10-28 09:43:52 -0600322
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600323class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
324 """GetTargetVersions tests."""
325
326 def setUp(self):
327 self.response = packages_pb2.GetTargetVersionsResponse()
328
329 def _GetRequest(self, board=None):
330 """Helper to build out a request."""
331 request = packages_pb2.GetTargetVersionsRequest()
332
333 if board:
334 request.build_target.name = board
335
336 return request
337
338 def testValidateOnly(self):
339 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600340 builds_chrome = self.PatchObject(
341 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600342 patch_version = self.PatchObject(packages_service,
343 'determine_android_version')
344 patch_branch_version = self.PatchObject(packages_service,
345 'determine_android_branch')
346 patch_target_version = self.PatchObject(packages_service,
347 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600348 chrome_version = self.PatchObject(packages_service,
349 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600350 platform_version = self.PatchObject(packages_service,
351 'determine_platform_version')
352 milestone_version = self.PatchObject(packages_service,
353 'determine_milestone_version')
354 full_version = self.PatchObject(packages_service,
355 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600356
357 request = self._GetRequest(board='betty')
358 packages_controller.GetTargetVersions(request, self.response,
359 self.validate_only_config)
360 patch_version.assert_not_called()
361 patch_branch_version.assert_not_called()
362 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600363 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600364 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600365 platform_version.assert_not_called()
366 milestone_version.assert_not_called()
367 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600368
Michael Mortensen2677bf62019-10-29 08:31:25 -0600369 def testMockCall(self):
370 """Test that a mock call does not execute logic, returns mocked value."""
371 builds_chrome = self.PatchObject(
372 packages_service, 'builds', return_value=True)
373 patch_version = self.PatchObject(packages_service,
374 'determine_android_version')
375 patch_branch_version = self.PatchObject(packages_service,
376 'determine_android_branch')
377 patch_target_version = self.PatchObject(packages_service,
378 'determine_android_target')
379 chrome_version = self.PatchObject(packages_service,
380 'determine_chrome_version')
381 platform_version = self.PatchObject(packages_service,
382 'determine_platform_version')
383 milestone_version = self.PatchObject(packages_service,
384 'determine_milestone_version')
385 full_version = self.PatchObject(packages_service,
386 'determine_full_version')
387
388 request = self._GetRequest(board='betty')
389 packages_controller.GetTargetVersions(request, self.response,
390 self.mock_call_config)
391
392 patch_version.assert_not_called()
393 patch_branch_version.assert_not_called()
394 patch_target_version.assert_not_called()
395 builds_chrome.assert_not_called()
396 chrome_version.assert_not_called()
397 platform_version.assert_not_called()
398 milestone_version.assert_not_called()
399 full_version.assert_not_called()
400
401 self.assertTrue(self.response.android_version)
402 self.assertTrue(self.response.android_branch_version)
403 self.assertTrue(self.response.android_target_version)
404 self.assertTrue(self.response.chrome_version)
405 self.assertTrue(self.response.platform_version)
406 self.assertTrue(self.response.milestone_version)
407 self.assertTrue(self.response.full_version)
408
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600409 def testNoBuildTargetFails(self):
410 """No build target argument should fail."""
411 request = self._GetRequest()
412
413 with self.assertRaises(cros_build_lib.DieSystemExit):
414 packages_controller.GetTargetVersions(request, self.response,
415 self.api_config)
416
Michael Mortensenc2615b72019-10-15 08:12:24 -0600417 def testGetTargetVersions(self):
418 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600419 # Mock that chrome is built and set the chrome_version.
420 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600421 chrome_version = '76.0.1.2'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600422 chrome_version_mock = self.PatchObject(packages_service,
423 'determine_chrome_version',
424 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500425 android_package = 'chromeos-base/android-container-pi-10.3'
426 self.PatchObject(packages_service, 'determine_android_package',
427 return_value=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600428 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600429 android_branch_mock = self.PatchObject(packages_service,
430 'determine_android_branch',
431 return_value=android_branch)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600432 platform_version = '12345.1.2'
433 self.PatchObject(packages_service, 'determine_platform_version',
434 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600435 milestone_version = '79'
436 self.PatchObject(packages_service, 'determine_milestone_version',
437 return_value=milestone_version)
438 full_version = 'R79-12345.1.2'
439 self.PatchObject(packages_service, 'determine_full_version',
440 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600441 request = self._GetRequest(board='betty')
442 packages_controller.GetTargetVersions(request, self.response,
443 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500444 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600445 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500446 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600447 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600448 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600449 self.assertEqual(self.response.milestone_version, milestone_version)
450 self.assertEqual(self.response.full_version, full_version)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600451 # Verify call to determine_chrome_version passes a build_target object.
452 build_target = build_target_lib.BuildTarget('betty')
453 chrome_version_mock.assert_called_with(build_target)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600454 # Verify call to determine_android_branch passes a board name.
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500455 android_branch_mock.assert_called_with('betty', package=android_package)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600456
Michael Mortensen42c330e32020-09-02 09:59:16 -0600457 def testGetTargetVersionsWithPackagesSet(self):
458 """Verify packages pass through and basic return values."""
459 # TODO(crbug.com/1124393): Migrate this test to use portage_testables
460 # rather than mocking the boundary to portage calls such as
461 # packages_service.builds).
462 builds_mock = self.PatchObject(packages_service, 'builds',
463 return_value=True)
464 # Mock that chrome is built and set the chrome_version.
465 chrome_version = '76.0.1.2'
466 self.PatchObject(packages_service, 'determine_chrome_version',
467 return_value=chrome_version)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500468 android_package = 'chromeos-base/android-container-pi-10.3'
469 self.PatchObject(packages_service, 'determine_android_package',
470 return_value=android_package)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600471 android_branch = 'android_test_branch'
472 self.PatchObject(packages_service, 'determine_android_branch',
473 return_value=android_branch)
Michael Mortensen42c330e32020-09-02 09:59:16 -0600474 platform_version = '12345.1.2'
475 self.PatchObject(packages_service, 'determine_platform_version',
476 return_value=platform_version)
477 milestone_version = '79'
478 self.PatchObject(packages_service, 'determine_milestone_version',
479 return_value=milestone_version)
480 full_version = 'R79-12345.1.2'
481 self.PatchObject(packages_service, 'determine_full_version',
482 return_value=full_version)
483 request = self._GetRequest(board='betty')
484 # Add optional packages to the request.
485 cpv_package_list = []
486 package = request.packages.add()
487 package.package_name = 'test'
488 package.category = 'chromeos-base'
489 package.version = '0.0.1-r1'
490 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
491 package = request.packages.add()
492 package.package_name = 'target-fuzzers'
493 package.category = 'virtual'
494 cpv_package_list.append(controller_util.PackageInfoToCPV(package))
495
496 packages_controller.GetTargetVersions(request, self.response,
497 self.api_config)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500498 self.assertEqual(self.response.android_version, '10.3')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600499 self.assertEqual(self.response.android_branch_version, android_branch)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500500 self.assertEqual(self.response.android_target_version, 'cheets')
Michael Mortensen42c330e32020-09-02 09:59:16 -0600501 self.assertEqual(self.response.chrome_version, chrome_version)
502 self.assertEqual(self.response.platform_version, platform_version)
503 self.assertEqual(self.response.milestone_version, milestone_version)
504 # Verify call to packages.builds passes the package list.
505 builds_mock.assert_called_with(constants.CHROME_CP,
506 mock.ANY, # Match the build target object
507 packages=cpv_package_list)
508
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600509 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600510 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600511 platform_version = '12345.1.2'
512 self.PatchObject(packages_service, 'determine_platform_version',
513 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600514 self.PatchObject(packages_service, 'builds', return_value=False)
Mike Frysinger8e1c99a2021-03-05 00:58:11 -0500515 self.PatchObject(packages_service, 'determine_android_package',
Michael Mortensenedf76532019-10-16 14:22:37 -0600516 return_value=None)
517 request = self._GetRequest(board='betty')
518 packages_controller.GetTargetVersions(request, self.response,
519 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600520 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600521 self.assertFalse(self.response.android_version)
522 self.assertFalse(self.response.android_branch_version)
523 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600524 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600525
Michael Mortensenbfc56392020-04-30 15:23:47 -0600526
527class GetBuilderMetadataTest(cros_test_lib.MockTestCase, ApiConfigMixin):
528 """GetBuilderMetadata tests."""
529
530 def setUp(self):
531 self.response = packages_pb2.GetBuilderMetadataResponse()
532
533 def _GetRequest(self, board=None):
534 """Helper to build out a request."""
535 request = packages_pb2.GetBuilderMetadataRequest()
536
537 if board:
538 request.build_target.name = board
539
540 return request
541
542 def testValidateOnly(self):
543 """Sanity check that a validate only call does not execute any logic."""
544 request = self._GetRequest(board='betty')
Michael Mortensen76e15122020-06-03 11:07:28 -0600545 patch_version = self.PatchObject(packages_service,
546 'determine_android_version')
547 patch_branch_version = self.PatchObject(packages_service,
548 'determine_android_branch')
549 patch_fw_versions = self.PatchObject(packages_service,
550 'determine_firmware_versions')
551 patch_fingerprints = self.PatchObject(packages_service,
552 'find_fingerprints')
553 patch_get_models = self.PatchObject(packages_service,
554 'get_models')
Michael Mortensenbfc56392020-04-30 15:23:47 -0600555 packages_controller.GetBuilderMetadata(request, self.response,
556 self.validate_only_config)
Michael Mortensen76e15122020-06-03 11:07:28 -0600557 patch_version.assert_not_called()
558 patch_branch_version.assert_not_called()
559 patch_fw_versions.assert_not_called()
560 patch_fingerprints.assert_not_called()
561 patch_get_models.assert_not_called()
Michael Mortensenbfc56392020-04-30 15:23:47 -0600562
563 def testMockCall(self):
564 """Test that a mock call does not execute logic, returns mocked value."""
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.mock_call_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 self.assertEqual(len(self.response.build_target_metadata), 1)
585 self.assertEqual(self.response.build_target_metadata[0].build_target,
586 request.build_target.name)
587 self.assertEqual(len(self.response.model_metadata), 1)
588 self.assertTrue(self.response.model_metadata[0].model_name)
589 self.assertTrue(self.response.model_metadata[0].ec_firmware_version)
590
591 def testNoBuildTargetFails(self):
592 """No build target argument should fail."""
593 request = self._GetRequest()
594
595 with self.assertRaises(cros_build_lib.DieSystemExit):
596 packages_controller.GetBuilderMetadata(request, self.response,
597 self.api_config)
598
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600599 def testGetBuilderMetadata(self):
600 """Verify basic return values."""
601 android_version = 'android_test_version'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600602 android_version_mock = self.PatchObject(packages_service,
603 'determine_android_version',
604 return_value=android_version)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600605 android_branch = 'android_test_branch'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600606 android_branch_mock = self.PatchObject(packages_service,
607 'determine_android_branch',
608 return_value=android_branch)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600609 android_target = 'android_test_target'
Michael Mortensen027ecd82020-05-05 13:13:40 -0600610 android_target_mock = self.PatchObject(packages_service,
611 'determine_android_target',
612 return_value=android_target)
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600613 self.PatchObject(portage_util, 'GetBoardUseFlags',
614 return_value=['arc', 'arcvm', 'big_little', 'cheets'])
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600615 package_result = ['sys-kernel/linux-headers-4.14-r24',
616 'sys-devel/flex-2.6.4-r1',
617 'sys-kernel/chromeos-kernel-4_4-4.4.223-r2209']
618 self.PatchObject(portage_util, 'GetPackageDependencies',
619 return_value=package_result)
620
Michael Mortensena4af79e2020-05-06 16:18:48 -0600621 fw_versions = packages_service.FirmwareVersions(
622 None,
623 'Google_Caroline.7820.263.0',
624 'Google_Caroline.7820.286.0',
625 'caroline_v1.9.357-ac5c7b4',
626 'caroline_v1.9.370-e8b9bd2')
627 self.PatchObject(packages_service, 'get_firmware_versions',
628 return_value=fw_versions)
Michael Mortensende716a12020-05-15 11:27:00 -0600629 fingerprints = ['fingerprint1', 'fingerprint2']
630 self.PatchObject(packages_service, 'find_fingerprints',
631 return_value=fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600632 # Patch packages.get_models, packages.get_all_firmware_versions,
633 # and packages.get_key_id for calls needed by model_metadata.
634 model_list = ['pyro', 'reef']
635 all_fw_versions = {
636 'pyro': packages_service.FirmwareVersions(
637 'pyro',
638 'Google_Pyro.9042.87.1',
639 'Google_Pyro.9042.110.0',
640 'pyro_v1.1.5900-ab1ee51',
641 'pyro_v1.1.5909-bd1f0c9'),
642 'reef': packages_service.FirmwareVersions(
643 'reef',
644 'Google_Reef.9042.87.1',
645 'Google_Reef.9042.110.0',
646 'reef_v1.1.5900-ab1ee51',
647 'reef_v1.1.5909-bd1f0c9')
648 }
649 self.PatchObject(packages_service, 'get_all_firmware_versions',
650 return_value=all_fw_versions)
651 self.PatchObject(packages_service, 'get_models',
652 return_value=model_list)
653 self.PatchObject(packages_service, 'get_key_id',
654 return_value='key')
655
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600656 request = self._GetRequest(board='betty')
657 packages_controller.GetBuilderMetadata(request, self.response,
658 self.api_config)
659 self.assertEqual(
660 self.response.build_target_metadata[0].build_target,
661 'betty')
662 self.assertEqual(
663 self.response.build_target_metadata[0].android_container_version,
664 android_version)
665 self.assertEqual(
666 self.response.build_target_metadata[0].android_container_branch,
667 android_branch)
668 self.assertEqual(
669 self.response.build_target_metadata[0].android_container_target,
670 android_target)
671 self.assertEqual(
672 self.response.build_target_metadata[0].arc_use_set,
673 True)
Michael Mortensen027ecd82020-05-05 13:13:40 -0600674 # Verify call to determine_android_version passes list of the board name.
Mike Frysingerb53f1822021-03-05 00:44:50 -0500675 android_version_mock.assert_called_with('betty')
Michael Mortensen027ecd82020-05-05 13:13:40 -0600676 # Verify call to determine_android_branch passes board name.
677 android_branch_mock.assert_called_with('betty')
678 # Verify call to determine_android_target passes board name.
679 android_target_mock.assert_called_with('betty')
Michael Mortensena4af79e2020-05-06 16:18:48 -0600680 self.assertEqual(
681 self.response.build_target_metadata[0].main_firmware_version,
682 'Google_Caroline.7820.286.0')
683 self.assertEqual(
684 self.response.build_target_metadata[0].ec_firmware_version,
685 'caroline_v1.9.370-e8b9bd2')
Michael Mortensenfbf2b2d2020-05-14 16:33:06 -0600686 self.assertEqual(
687 self.response.build_target_metadata[0].kernel_version,
688 '4.4.223-r2209')
Michael Mortensende716a12020-05-15 11:27:00 -0600689 self.assertEqual(
690 len(self.response.build_target_metadata[0].fingerprints),
691 2)
692 self.assertEqual(
693 self.response.build_target_metadata[0].fingerprints,
694 fingerprints)
Michael Mortensen770bc122020-05-27 17:53:30 -0600695 self.assertEqual(
696 len(self.response.model_metadata), 2)
697 self.assertEqual(
698 self.response.model_metadata[0].model_name, 'pyro')
699 self.assertEqual(
700 self.response.model_metadata[0].ec_firmware_version,
701 'pyro_v1.1.5909-bd1f0c9')
702 self.assertEqual(
703 self.response.model_metadata[0].firmware_key_id, 'key')
704 self.assertEqual(
705 self.response.model_metadata[0].main_readonly_firmware_version,
706 'Google_Pyro.9042.87.1')
707 self.assertEqual(
708 self.response.model_metadata[0].main_readwrite_firmware_version,
709 'Google_Pyro.9042.110.0')
710 self.assertEqual(
711 self.response.model_metadata[1].model_name, 'reef')
712 self.assertEqual(
713 self.response.model_metadata[1].ec_firmware_version,
714 'reef_v1.1.5909-bd1f0c9')
715 self.assertEqual(
716 self.response.model_metadata[1].firmware_key_id, 'key')
717 self.assertEqual(
718 self.response.model_metadata[1].main_readonly_firmware_version,
719 'Google_Reef.9042.87.1')
720 self.assertEqual(
721 self.response.model_metadata[1].main_readwrite_firmware_version,
722 'Google_Reef.9042.110.0')
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600723
Michael Mortensend81d81e2020-06-09 14:20:59 -0600724 # Test corner case where find_fingerprints returns None.
725 # Re-patch find_fingerprints to now return None and re-execute
726 # GetBuilderMetadata to verify behavior.
727 response = packages_pb2.GetBuilderMetadataResponse()
728 self.PatchObject(packages_service, 'find_fingerprints',
729 return_value=[])
730 request = self._GetRequest(board='betty')
731 packages_controller.GetBuilderMetadata(request, response,
732 self.api_config)
733 # Verify a non-fingerprint build_target_metdata field was still set.
734 self.assertEqual(
735 response.build_target_metadata[0].kernel_version,
736 '4.4.223-r2209')
737 # And then verify that fingerprints was empty.
738 self.assertEqual(response.build_target_metadata[0].fingerprints, [])
739
Michael Mortensenbbce7e42020-05-01 15:03:49 -0600740
Alex Kleinda39c6d2019-09-16 14:36:36 -0600741class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
742 """HasChromePrebuilt tests."""
743
744 def setUp(self):
745 self.response = packages_pb2.HasChromePrebuiltResponse()
746
747 def _GetRequest(self, board=None):
748 """Helper to build out a request."""
749 request = packages_pb2.HasChromePrebuiltRequest()
750
751 if board:
752 request.build_target.name = board
753
754 return request
755
756 def testValidateOnly(self):
757 """Sanity check that a validate only call does not execute any logic."""
758 patch = self.PatchObject(packages_service, 'has_prebuilt')
759
760 request = self._GetRequest(board='betty')
761 packages_controller.HasChromePrebuilt(request, self.response,
762 self.validate_only_config)
763 patch.assert_not_called()
764
Michael Mortensen3232ab32020-01-05 19:14:36 -0700765 def testMockCall(self):
766 """Test that a mock call does not execute logic, returns mocked value."""
767 patch = self.PatchObject(packages_service, 'has_prebuilt')
768
769 request = self._GetRequest(board='betty')
770 packages_controller.HasChromePrebuilt(request, self.response,
771 self.mock_call_config)
772 patch.assert_not_called()
773 self.assertTrue(self.response.has_prebuilt)
774
Alex Kleinda39c6d2019-09-16 14:36:36 -0600775 def testNoBuildTargetFails(self):
776 """No build target argument should fail."""
777 request = self._GetRequest()
778
779 with self.assertRaises(cros_build_lib.DieSystemExit):
780 packages_controller.HasChromePrebuilt(request, self.response,
781 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600782
783
784class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
785 """BuildsChrome tests."""
786
787 def setUp(self):
788 self.response = packages_pb2.BuildsChromeResponse()
789
David Burger0f9dd4e2019-10-08 12:33:42 -0600790 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600791 """Helper to build out a request."""
792 request = packages_pb2.BuildsChromeRequest()
793
794 if board:
795 request.build_target.name = board
796
David Burger0f9dd4e2019-10-08 12:33:42 -0600797 if packages:
798 request.packages.extend(packages)
799
Alex Klein73fb6572019-09-30 16:55:23 -0600800 return request
801
802 def testValidateOnly(self):
803 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600804 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600805
806 request = self._GetRequest(board='betty')
807 packages_controller.BuildsChrome(request, self.response,
808 self.validate_only_config)
809 patch.assert_not_called()
810
811 def testNoBuildTargetFails(self):
812 """No build target argument should fail."""
813 request = self._GetRequest()
814
815 with self.assertRaises(cros_build_lib.DieSystemExit):
816 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600817
818 def testBuilds(self):
819 """Test successful call handling."""
820 patch = self.PatchObject(packages_service, 'builds', return_value=True)
821
822 request = self._GetRequest(board='foo')
823 packages_controller.BuildsChrome(request, self.response, self.api_config)
824 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600825 patch.assert_called_once_with(constants.CHROME_CP,
826 build_target_lib.BuildTarget('foo'), [])
David Burger0f9dd4e2019-10-08 12:33:42 -0600827
828 def testBuildsChromeWithPackages(self):
829 """Test successful call with packages handling."""
830 patch = self.PatchObject(packages_service, 'builds', return_value=True)
831
832 package = common_pb2.PackageInfo(
833 category='category',
834 package_name='name',
835 version='1.01',
836 )
837 request = self._GetRequest(board='foo', packages=[package])
838 packages_controller.BuildsChrome(request, self.response, self.api_config)
839 self.assertTrue(self.response.builds_chrome)
Alex Klein26e472b2020-03-10 14:35:01 -0600840 patch.assert_called_once_with(constants.CHROME_CP,
841 build_target_lib.BuildTarget('foo'),
David Burger0f9dd4e2019-10-08 12:33:42 -0600842 [controller_util.PackageInfoToCPV(package)])