blob: d89a53f4a0fc01b1ed2949e5af3fd8d515fda8b9 [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
18from chromite.lib import constants
19from chromite.lib import cros_build_lib
20from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060021from chromite.lib import portage_util
Alex Kleine65131f2019-10-03 10:34:01 -060022from chromite.lib.build_target_util import BuildTarget
Alex Kleineb77ffa2019-05-28 14:47:44 -060023from chromite.service import packages as packages_service
24
25
Alex Kleinda39c6d2019-09-16 14:36:36 -060026class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060027 """Uprev tests."""
28
29 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
30 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
31 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
32 _NONE = binhost_pb2.OVERLAYTYPE_NONE
33
34 def setUp(self):
35 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060036 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060037
38 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
39 return packages_pb2.UprevPackagesRequest(
40 build_targets=[{'name': name} for name in targets or []],
41 overlay_type=overlay_type,
42 output_dir=output_dir,
43 )
44
Alex Klein231d2da2019-07-22 16:44:45 -060045 def testValidateOnly(self):
46 """Sanity check that a validate only call does not execute any logic."""
47 patch = self.PatchObject(packages_service, 'uprev_build_targets')
48
49 targets = ['foo', 'bar']
50 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
51 packages_controller.Uprev(request, self.response, self.validate_only_config)
52 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060053
54 def testNoOverlayTypeFails(self):
55 """No overlay type provided should fail."""
56 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060057
58 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060059 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060060
61 def testOverlayTypeNoneFails(self):
62 """Overlay type none means nothing here and should fail."""
63 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060064
65 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060066 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060067
68 def testSuccess(self):
69 """Test overall successful argument handling."""
70 targets = ['foo', 'bar']
71 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060072 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060073 expected_type = constants.BOTH_OVERLAYS
74 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
75 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060076 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
77 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060078
Alex Klein231d2da2019-07-22 16:44:45 -060079 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060080
81 # Make sure the type is right, verify build targets after.
82 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
83 output_dir)
84 # First argument (build targets) of the first (only) call.
85 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040086 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060087
Alex Klein231d2da2019-07-22 16:44:45 -060088 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060089 self.assertIn(ebuild.path, changed)
90 changed.remove(ebuild.path)
91 self.assertFalse(changed)
92
David Burger1e0fe232019-07-01 14:52:07 -060093
Alex Kleinda39c6d2019-09-16 14:36:36 -060094class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -060095 """UprevVersionedPackage tests."""
96
97 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -060098 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -060099
100 def _addVersion(self, request, version):
101 """Helper method to add a full version message to the request."""
102 ref = request.versions.add()
103 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600104 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600105 ref.revision = 'abc123'
106
107 def testValidateOnly(self):
108 """Sanity check validate only calls are working properly."""
109 service = self.PatchObject(packages_service, 'uprev_versioned_package')
110
111 request = packages_pb2.UprevVersionedPackageRequest()
112 self._addVersion(request, '1.2.3.4')
113 request.package_info.category = 'chromeos-base'
114 request.package_info.package_name = 'chromeos-chrome'
115
116 packages_controller.UprevVersionedPackage(request, self.response,
117 self.validate_only_config)
118
119 service.assert_not_called()
120
121 def testNoVersions(self):
122 """Test no versions provided."""
123 request = packages_pb2.UprevVersionedPackageRequest()
124 request.package_info.category = 'chromeos-base'
125 request.package_info.package_name = 'chromeos-chrome'
126
127 with self.assertRaises(cros_build_lib.DieSystemExit):
128 packages_controller.UprevVersionedPackage(request, self.response,
129 self.api_config)
130
131 def testNoPackageName(self):
132 """Test no package name provided."""
133 request = packages_pb2.UprevVersionedPackageRequest()
134 self._addVersion(request, '1.2.3.4')
135 request.package_info.category = 'chromeos-base'
136
137 with self.assertRaises(cros_build_lib.DieSystemExit):
138 packages_controller.UprevVersionedPackage(request, self.response,
139 self.api_config)
140
141 def testNoCategory(self):
142 """Test no package category provided."""
143 request = packages_pb2.UprevVersionedPackageRequest()
144 self._addVersion(request, '1.2.3.4')
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 testOutputHandling(self):
152 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600153 version = '1.2.3.4'
Yaakov Shaul730814a2019-09-10 13:58:25 -0600154 result = packages_service.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600155 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600156
Alex Klein34afcbc2019-08-22 16:14:31 -0600157 self.PatchObject(
158 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600159
160 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600161 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600162 request.package_info.category = 'chromeos-base'
163 request.package_info.package_name = 'chromeos-chrome'
164
165 packages_controller.UprevVersionedPackage(request, self.response,
166 self.api_config)
167
Yaakov Shaul730814a2019-09-10 13:58:25 -0600168 for idx, uprev_response in enumerate(self.response.responses):
169 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400170 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600171 result.modified[idx].files,
172 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600173
174
Alex Kleinda39c6d2019-09-16 14:36:36 -0600175class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600176 """GetBestVisible tests."""
177
Alex Klein231d2da2019-07-22 16:44:45 -0600178 def setUp(self):
179 self.response = packages_pb2.GetBestVisibleResponse()
180
David Burger1e0fe232019-07-01 14:52:07 -0600181 def _GetRequest(self, atom=None):
182 return packages_pb2.GetBestVisibleRequest(
183 atom=atom,
184 )
185
David Burger1e0fe232019-07-01 14:52:07 -0600186 def _MakeCpv(self, category, package, version):
187 unused = {
188 'cp': None,
189 'cpv': None,
190 'cpf': None,
191 'pv': None,
192 'version_no_rev': None,
193 'rev': None,
194 }
195 return portage_util.CPV(
196 category=category,
197 package=package,
198 version=version,
199 **unused
200 )
201
Alex Klein231d2da2019-07-22 16:44:45 -0600202 def testValidateOnly(self):
203 """Sanity check that a validate only call does not execute any logic."""
204 patch = self.PatchObject(packages_service, 'get_best_visible')
205
206 request = self._GetRequest(atom='chromeos-chrome')
207 packages_controller.GetBestVisible(request, self.response,
208 self.validate_only_config)
209 patch.assert_not_called()
210
David Burger1e0fe232019-07-01 14:52:07 -0600211 def testNoAtomFails(self):
212 """No atom provided should fail."""
213 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600214 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600215 packages_controller.GetBestVisible(request, self.response,
216 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600217
218 def testSuccess(self):
219 """Test overall success, argument handling, result forwarding."""
220 cpv = self._MakeCpv('category', 'package', 'version')
221 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
222
223 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600224
Alex Klein231d2da2019-07-22 16:44:45 -0600225 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600226
Alex Klein231d2da2019-07-22 16:44:45 -0600227 package_info = self.response.package_info
David Burger1e0fe232019-07-01 14:52:07 -0600228 self.assertEqual(package_info.category, cpv.category)
229 self.assertEqual(package_info.package_name, cpv.package)
230 self.assertEqual(package_info.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600231
232
Michael Mortensen68abdb72019-10-28 09:43:52 -0600233class GetChromeVersion(cros_test_lib.MockTestCase, ApiConfigMixin):
234 """GetChromeVersion tests."""
235
236 def setUp(self):
237 self.response = packages_pb2.GetChromeVersionResponse()
238
239 def _GetRequest(self, board=None):
240 """Helper to build out a request."""
241 request = packages_pb2.GetChromeVersionRequest()
242
243 if board:
244 request.build_target.name = board
245
246 return request
247
248 def testValidateOnly(self):
249 """Sanity check that a validate only call does not execute any logic."""
250 chrome_version = self.PatchObject(packages_service,
251 'determine_chrome_version')
252 request = self._GetRequest(board='betty')
253 packages_controller.GetChromeVersion(request, self.response,
254 self.validate_only_config)
255 chrome_version.assert_not_called()
256
257 def testMockCall(self):
258 """Test that a mock call does not execute logic, returns mocked value."""
259 chrome_version = self.PatchObject(packages_service,
260 'determine_chrome_version')
261 request = self._GetRequest(board='betty')
262 packages_controller.GetChromeVersion(request, self.response,
263 self.mock_call_config)
264 chrome_version.assert_not_called()
265 self.assertTrue(self.response.version)
266
267 def testGetChromeVersion(self):
268 """Verify basic return values."""
269 chrome_version = '76.0.1.2'
270 self.PatchObject(packages_service, 'determine_chrome_version',
271 return_value=chrome_version)
272 request = self._GetRequest(board='betty')
273 packages_controller.GetChromeVersion(request, self.response,
274 self.api_config)
275 self.assertEqual(self.response.version, chrome_version)
276
277
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600278class GetTargetVersionsTest(cros_test_lib.MockTestCase, ApiConfigMixin):
279 """GetTargetVersions tests."""
280
281 def setUp(self):
282 self.response = packages_pb2.GetTargetVersionsResponse()
283
284 def _GetRequest(self, board=None):
285 """Helper to build out a request."""
286 request = packages_pb2.GetTargetVersionsRequest()
287
288 if board:
289 request.build_target.name = board
290
291 return request
292
293 def testValidateOnly(self):
294 """Sanity check that a validate only call does not execute any logic."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600295 builds_chrome = self.PatchObject(
296 packages_service, 'builds', return_value=True)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600297 patch_version = self.PatchObject(packages_service,
298 'determine_android_version')
299 patch_branch_version = self.PatchObject(packages_service,
300 'determine_android_branch')
301 patch_target_version = self.PatchObject(packages_service,
302 'determine_android_target')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600303 chrome_version = self.PatchObject(packages_service,
304 'determine_chrome_version')
Michael Mortensen009cb662019-10-21 11:38:43 -0600305 platform_version = self.PatchObject(packages_service,
306 'determine_platform_version')
307 milestone_version = self.PatchObject(packages_service,
308 'determine_milestone_version')
309 full_version = self.PatchObject(packages_service,
310 'determine_full_version')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600311
312 request = self._GetRequest(board='betty')
313 packages_controller.GetTargetVersions(request, self.response,
314 self.validate_only_config)
315 patch_version.assert_not_called()
316 patch_branch_version.assert_not_called()
317 patch_target_version.assert_not_called()
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600318 builds_chrome.assert_not_called()
Michael Mortensenc2615b72019-10-15 08:12:24 -0600319 chrome_version.assert_not_called()
Michael Mortensen009cb662019-10-21 11:38:43 -0600320 platform_version.assert_not_called()
321 milestone_version.assert_not_called()
322 full_version.assert_not_called()
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600323
324 def testNoBuildTargetFails(self):
325 """No build target argument should fail."""
326 request = self._GetRequest()
327
328 with self.assertRaises(cros_build_lib.DieSystemExit):
329 packages_controller.GetTargetVersions(request, self.response,
330 self.api_config)
331
Michael Mortensenc2615b72019-10-15 08:12:24 -0600332 def testGetTargetVersions(self):
333 """Verify basic return values."""
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600334 # Mock that chrome is built and set the chrome_version.
335 self.PatchObject(packages_service, 'builds', return_value=True)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600336 chrome_version = '76.0.1.2'
337 self.PatchObject(packages_service, 'determine_chrome_version',
338 return_value=chrome_version)
339 android_version = 'android_test_version'
340 self.PatchObject(packages_service, 'determine_android_version',
341 return_value=android_version)
342 android_branch = 'android_test_branch'
343 self.PatchObject(packages_service, 'determine_android_branch',
344 return_value=android_branch)
345 android_target = 'android_test_target'
346 self.PatchObject(packages_service, 'determine_android_target',
347 return_value=android_target)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600348 platform_version = '12345.1.2'
349 self.PatchObject(packages_service, 'determine_platform_version',
350 return_value=platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600351 milestone_version = '79'
352 self.PatchObject(packages_service, 'determine_milestone_version',
353 return_value=milestone_version)
354 full_version = 'R79-12345.1.2'
355 self.PatchObject(packages_service, 'determine_full_version',
356 return_value=full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600357 request = self._GetRequest(board='betty')
358 packages_controller.GetTargetVersions(request, self.response,
359 self.api_config)
360 self.assertEqual(self.response.android_version, android_version)
361 self.assertEqual(self.response.android_branch_version, android_branch)
362 self.assertEqual(self.response.android_target_version, android_target)
363 self.assertEqual(self.response.chrome_version, chrome_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600364 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensen009cb662019-10-21 11:38:43 -0600365 self.assertEqual(self.response.milestone_version, milestone_version)
366 self.assertEqual(self.response.full_version, full_version)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600367
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600368 def testGetTargetVersionNoAndroidNoChrome(self):
Michael Mortensenedf76532019-10-16 14:22:37 -0600369 """Verify return values on a board that does not have android."""
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600370 platform_version = '12345.1.2'
371 self.PatchObject(packages_service, 'determine_platform_version',
372 return_value=platform_version)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600373 self.PatchObject(packages_service, 'builds', return_value=False)
Michael Mortensenedf76532019-10-16 14:22:37 -0600374 self.PatchObject(packages_service, 'determine_android_version',
375 return_value=None)
376 self.PatchObject(packages_service, 'determine_android_branch',
377 return_value=None)
378 self.PatchObject(packages_service, 'determine_android_target',
379 return_value=None)
380 request = self._GetRequest(board='betty')
381 packages_controller.GetTargetVersions(request, self.response,
382 self.api_config)
Michael Mortensen1d2ab0d2019-10-17 13:19:25 -0600383 self.assertFalse(self.response.chrome_version)
Michael Mortensenedf76532019-10-16 14:22:37 -0600384 self.assertFalse(self.response.android_version)
385 self.assertFalse(self.response.android_branch_version)
386 self.assertFalse(self.response.android_target_version)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600387 self.assertEqual(self.response.platform_version, platform_version)
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600388
Alex Kleinda39c6d2019-09-16 14:36:36 -0600389class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
390 """HasChromePrebuilt tests."""
391
392 def setUp(self):
393 self.response = packages_pb2.HasChromePrebuiltResponse()
394
395 def _GetRequest(self, board=None):
396 """Helper to build out a request."""
397 request = packages_pb2.HasChromePrebuiltRequest()
398
399 if board:
400 request.build_target.name = board
401
402 return request
403
404 def testValidateOnly(self):
405 """Sanity check that a validate only call does not execute any logic."""
406 patch = self.PatchObject(packages_service, 'has_prebuilt')
407
408 request = self._GetRequest(board='betty')
409 packages_controller.HasChromePrebuilt(request, self.response,
410 self.validate_only_config)
411 patch.assert_not_called()
412
413 def testNoBuildTargetFails(self):
414 """No build target argument should fail."""
415 request = self._GetRequest()
416
417 with self.assertRaises(cros_build_lib.DieSystemExit):
418 packages_controller.HasChromePrebuilt(request, self.response,
419 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600420
421
422class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
423 """BuildsChrome tests."""
424
425 def setUp(self):
426 self.response = packages_pb2.BuildsChromeResponse()
427
David Burger0f9dd4e2019-10-08 12:33:42 -0600428 def _GetRequest(self, board=None, packages=None):
Alex Klein73fb6572019-09-30 16:55:23 -0600429 """Helper to build out a request."""
430 request = packages_pb2.BuildsChromeRequest()
431
432 if board:
433 request.build_target.name = board
434
David Burger0f9dd4e2019-10-08 12:33:42 -0600435 if packages:
436 request.packages.extend(packages)
437
Alex Klein73fb6572019-09-30 16:55:23 -0600438 return request
439
440 def testValidateOnly(self):
441 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600442 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600443
444 request = self._GetRequest(board='betty')
445 packages_controller.BuildsChrome(request, self.response,
446 self.validate_only_config)
447 patch.assert_not_called()
448
449 def testNoBuildTargetFails(self):
450 """No build target argument should fail."""
451 request = self._GetRequest()
452
453 with self.assertRaises(cros_build_lib.DieSystemExit):
454 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600455
456 def testBuilds(self):
457 """Test successful call handling."""
458 patch = self.PatchObject(packages_service, 'builds', return_value=True)
459
460 request = self._GetRequest(board='foo')
461 packages_controller.BuildsChrome(request, self.response, self.api_config)
462 self.assertTrue(self.response.builds_chrome)
David Burger0f9dd4e2019-10-08 12:33:42 -0600463 patch.assert_called_once_with(constants.CHROME_CP, BuildTarget('foo'), [])
464
465 def testBuildsChromeWithPackages(self):
466 """Test successful call with packages handling."""
467 patch = self.PatchObject(packages_service, 'builds', return_value=True)
468
469 package = common_pb2.PackageInfo(
470 category='category',
471 package_name='name',
472 version='1.01',
473 )
474 request = self._GetRequest(board='foo', packages=[package])
475 packages_controller.BuildsChrome(request, self.response, self.api_config)
476 self.assertTrue(self.response.builds_chrome)
477 patch.assert_called_once_with(constants.CHROME_CP, BuildTarget('foo'),
478 [controller_util.PackageInfoToCPV(package)])