blob: 6a7e305e43808af18403d9dbb82c716a2451e5f2 [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
Alex Kleineb77ffa2019-05-28 14:47:44 -060013from chromite.api.controller import packages as packages_controller
14from chromite.api.gen.chromite.api import binhost_pb2
15from chromite.api.gen.chromite.api import packages_pb2
16from chromite.lib import constants
17from chromite.lib import cros_build_lib
18from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060019from chromite.lib import portage_util
Alex Kleine65131f2019-10-03 10:34:01 -060020from chromite.lib.build_target_util import BuildTarget
Alex Kleineb77ffa2019-05-28 14:47:44 -060021from chromite.service import packages as packages_service
22
23
Alex Kleinda39c6d2019-09-16 14:36:36 -060024class UprevTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Kleineb77ffa2019-05-28 14:47:44 -060025 """Uprev tests."""
26
27 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
28 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
29 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
30 _NONE = binhost_pb2.OVERLAYTYPE_NONE
31
32 def setUp(self):
33 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
Alex Klein231d2da2019-07-22 16:44:45 -060034 self.response = packages_pb2.UprevPackagesResponse()
Alex Kleineb77ffa2019-05-28 14:47:44 -060035
36 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
37 return packages_pb2.UprevPackagesRequest(
38 build_targets=[{'name': name} for name in targets or []],
39 overlay_type=overlay_type,
40 output_dir=output_dir,
41 )
42
Alex Klein231d2da2019-07-22 16:44:45 -060043 def testValidateOnly(self):
44 """Sanity check that a validate only call does not execute any logic."""
45 patch = self.PatchObject(packages_service, 'uprev_build_targets')
46
47 targets = ['foo', 'bar']
48 request = self._GetRequest(targets=targets, overlay_type=self._BOTH)
49 packages_controller.Uprev(request, self.response, self.validate_only_config)
50 patch.assert_not_called()
Alex Kleineb77ffa2019-05-28 14:47:44 -060051
52 def testNoOverlayTypeFails(self):
53 """No overlay type provided should fail."""
54 request = self._GetRequest(targets=['foo'])
Alex Kleineb77ffa2019-05-28 14:47:44 -060055
56 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060057 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060058
59 def testOverlayTypeNoneFails(self):
60 """Overlay type none means nothing here and should fail."""
61 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
Alex Kleineb77ffa2019-05-28 14:47:44 -060062
63 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060064 packages_controller.Uprev(request, self.response, self.api_config)
Alex Kleineb77ffa2019-05-28 14:47:44 -060065
66 def testSuccess(self):
67 """Test overall successful argument handling."""
68 targets = ['foo', 'bar']
69 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060070 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060071 expected_type = constants.BOTH_OVERLAYS
72 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
73 output_dir=output_dir)
Alex Klein5dd6b1e2019-07-31 15:45:24 -060074 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
75 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060076
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 # Make sure the type is right, verify build targets after.
80 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
81 output_dir)
82 # First argument (build targets) of the first (only) call.
83 call_targets = uprev_patch.call_args[0][0]
Mike Frysinger678735c2019-09-28 18:23:28 -040084 self.assertCountEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060085
Alex Klein231d2da2019-07-22 16:44:45 -060086 for ebuild in self.response.modified_ebuilds:
Alex Klein5dd6b1e2019-07-31 15:45:24 -060087 self.assertIn(ebuild.path, changed)
88 changed.remove(ebuild.path)
89 self.assertFalse(changed)
90
David Burger1e0fe232019-07-01 14:52:07 -060091
Alex Kleinda39c6d2019-09-16 14:36:36 -060092class UprevVersionedPackageTest(cros_test_lib.MockTestCase, ApiConfigMixin):
Alex Klein87531182019-08-12 15:23:37 -060093 """UprevVersionedPackage tests."""
94
95 def setUp(self):
Yaakov Shaul730814a2019-09-10 13:58:25 -060096 self.response = packages_pb2.UprevVersionedPackageResponse()
Alex Klein87531182019-08-12 15:23:37 -060097
98 def _addVersion(self, request, version):
99 """Helper method to add a full version message to the request."""
100 ref = request.versions.add()
101 ref.repository = '/some/path'
Alex Klein34afcbc2019-08-22 16:14:31 -0600102 ref.ref = 'refs/tags/%s' % version
Alex Klein87531182019-08-12 15:23:37 -0600103 ref.revision = 'abc123'
104
105 def testValidateOnly(self):
106 """Sanity check validate only calls are working properly."""
107 service = self.PatchObject(packages_service, 'uprev_versioned_package')
108
109 request = packages_pb2.UprevVersionedPackageRequest()
110 self._addVersion(request, '1.2.3.4')
111 request.package_info.category = 'chromeos-base'
112 request.package_info.package_name = 'chromeos-chrome'
113
114 packages_controller.UprevVersionedPackage(request, self.response,
115 self.validate_only_config)
116
117 service.assert_not_called()
118
119 def testNoVersions(self):
120 """Test no versions provided."""
121 request = packages_pb2.UprevVersionedPackageRequest()
122 request.package_info.category = 'chromeos-base'
123 request.package_info.package_name = 'chromeos-chrome'
124
125 with self.assertRaises(cros_build_lib.DieSystemExit):
126 packages_controller.UprevVersionedPackage(request, self.response,
127 self.api_config)
128
129 def testNoPackageName(self):
130 """Test no package name provided."""
131 request = packages_pb2.UprevVersionedPackageRequest()
132 self._addVersion(request, '1.2.3.4')
133 request.package_info.category = 'chromeos-base'
134
135 with self.assertRaises(cros_build_lib.DieSystemExit):
136 packages_controller.UprevVersionedPackage(request, self.response,
137 self.api_config)
138
139 def testNoCategory(self):
140 """Test no package category provided."""
141 request = packages_pb2.UprevVersionedPackageRequest()
142 self._addVersion(request, '1.2.3.4')
143 request.package_info.package_name = 'chromeos-chrome'
144
145 with self.assertRaises(cros_build_lib.DieSystemExit):
146 packages_controller.UprevVersionedPackage(request, self.response,
147 self.api_config)
148
149 def testOutputHandling(self):
150 """Test the modified files are getting correctly added to the output."""
Alex Klein34afcbc2019-08-22 16:14:31 -0600151 version = '1.2.3.4'
Yaakov Shaul730814a2019-09-10 13:58:25 -0600152 result = packages_service.UprevVersionedPackageResult().add_result(
Alex Klein34afcbc2019-08-22 16:14:31 -0600153 version, ['/file/one', '/file/two'])
Yaakov Shaul730814a2019-09-10 13:58:25 -0600154
Alex Klein34afcbc2019-08-22 16:14:31 -0600155 self.PatchObject(
156 packages_service, 'uprev_versioned_package', return_value=result)
Alex Klein87531182019-08-12 15:23:37 -0600157
158 request = packages_pb2.UprevVersionedPackageRequest()
Alex Klein34afcbc2019-08-22 16:14:31 -0600159 self._addVersion(request, version)
Alex Klein87531182019-08-12 15:23:37 -0600160 request.package_info.category = 'chromeos-base'
161 request.package_info.package_name = 'chromeos-chrome'
162
163 packages_controller.UprevVersionedPackage(request, self.response,
164 self.api_config)
165
Yaakov Shaul730814a2019-09-10 13:58:25 -0600166 for idx, uprev_response in enumerate(self.response.responses):
167 self.assertEqual(result.modified[idx].new_version, uprev_response.version)
Mike Frysinger678735c2019-09-28 18:23:28 -0400168 self.assertCountEqual(
Yaakov Shaul730814a2019-09-10 13:58:25 -0600169 result.modified[idx].files,
170 [ebuild.path for ebuild in uprev_response.modified_ebuilds])
Alex Klein87531182019-08-12 15:23:37 -0600171
172
Alex Kleinda39c6d2019-09-16 14:36:36 -0600173class GetBestVisibleTest(cros_test_lib.MockTestCase, ApiConfigMixin):
David Burger1e0fe232019-07-01 14:52:07 -0600174 """GetBestVisible tests."""
175
Alex Klein231d2da2019-07-22 16:44:45 -0600176 def setUp(self):
177 self.response = packages_pb2.GetBestVisibleResponse()
178
David Burger1e0fe232019-07-01 14:52:07 -0600179 def _GetRequest(self, atom=None):
180 return packages_pb2.GetBestVisibleRequest(
181 atom=atom,
182 )
183
David Burger1e0fe232019-07-01 14:52:07 -0600184 def _MakeCpv(self, category, package, version):
185 unused = {
186 'cp': None,
187 'cpv': None,
188 'cpf': None,
189 'pv': None,
190 'version_no_rev': None,
191 'rev': None,
192 }
193 return portage_util.CPV(
194 category=category,
195 package=package,
196 version=version,
197 **unused
198 )
199
Alex Klein231d2da2019-07-22 16:44:45 -0600200 def testValidateOnly(self):
201 """Sanity check that a validate only call does not execute any logic."""
202 patch = self.PatchObject(packages_service, 'get_best_visible')
203
204 request = self._GetRequest(atom='chromeos-chrome')
205 packages_controller.GetBestVisible(request, self.response,
206 self.validate_only_config)
207 patch.assert_not_called()
208
David Burger1e0fe232019-07-01 14:52:07 -0600209 def testNoAtomFails(self):
210 """No atom provided should fail."""
211 request = self._GetRequest()
David Burger1e0fe232019-07-01 14:52:07 -0600212 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600213 packages_controller.GetBestVisible(request, self.response,
214 self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600215
216 def testSuccess(self):
217 """Test overall success, argument handling, result forwarding."""
218 cpv = self._MakeCpv('category', 'package', 'version')
219 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
220
221 request = self._GetRequest(atom='chromeos-chrome')
David Burger1e0fe232019-07-01 14:52:07 -0600222
Alex Klein231d2da2019-07-22 16:44:45 -0600223 packages_controller.GetBestVisible(request, self.response, self.api_config)
David Burger1e0fe232019-07-01 14:52:07 -0600224
Alex Klein231d2da2019-07-22 16:44:45 -0600225 package_info = self.response.package_info
David Burger1e0fe232019-07-01 14:52:07 -0600226 self.assertEqual(package_info.category, cpv.category)
227 self.assertEqual(package_info.package_name, cpv.package)
228 self.assertEqual(package_info.version, cpv.version)
Alex Kleinda39c6d2019-09-16 14:36:36 -0600229
230
231class HasChromePrebuiltTest(cros_test_lib.MockTestCase, ApiConfigMixin):
232 """HasChromePrebuilt tests."""
233
234 def setUp(self):
235 self.response = packages_pb2.HasChromePrebuiltResponse()
236
237 def _GetRequest(self, board=None):
238 """Helper to build out a request."""
239 request = packages_pb2.HasChromePrebuiltRequest()
240
241 if board:
242 request.build_target.name = board
243
244 return request
245
246 def testValidateOnly(self):
247 """Sanity check that a validate only call does not execute any logic."""
248 patch = self.PatchObject(packages_service, 'has_prebuilt')
249
250 request = self._GetRequest(board='betty')
251 packages_controller.HasChromePrebuilt(request, self.response,
252 self.validate_only_config)
253 patch.assert_not_called()
254
255 def testNoBuildTargetFails(self):
256 """No build target argument should fail."""
257 request = self._GetRequest()
258
259 with self.assertRaises(cros_build_lib.DieSystemExit):
260 packages_controller.HasChromePrebuilt(request, self.response,
261 self.api_config)
Alex Klein73fb6572019-09-30 16:55:23 -0600262
263
264class BuildsChromeTest(cros_test_lib.MockTestCase, ApiConfigMixin):
265 """BuildsChrome tests."""
266
267 def setUp(self):
268 self.response = packages_pb2.BuildsChromeResponse()
269
270 def _GetRequest(self, board=None):
271 """Helper to build out a request."""
272 request = packages_pb2.BuildsChromeRequest()
273
274 if board:
275 request.build_target.name = board
276
277 return request
278
279 def testValidateOnly(self):
280 """Sanity check that a validate only call does not execute any logic."""
Alex Kleine65131f2019-10-03 10:34:01 -0600281 patch = self.PatchObject(packages_service, 'builds')
Alex Klein73fb6572019-09-30 16:55:23 -0600282
283 request = self._GetRequest(board='betty')
284 packages_controller.BuildsChrome(request, self.response,
285 self.validate_only_config)
286 patch.assert_not_called()
287
288 def testNoBuildTargetFails(self):
289 """No build target argument should fail."""
290 request = self._GetRequest()
291
292 with self.assertRaises(cros_build_lib.DieSystemExit):
293 packages_controller.BuildsChrome(request, self.response, self.api_config)
Alex Kleine65131f2019-10-03 10:34:01 -0600294
295 def testBuilds(self):
296 """Test successful call handling."""
297 patch = self.PatchObject(packages_service, 'builds', return_value=True)
298
299 request = self._GetRequest(board='foo')
300 packages_controller.BuildsChrome(request, self.response, self.api_config)
301 self.assertTrue(self.response.builds_chrome)
302 patch.assert_called_once_with(constants.CHROME_CP, BuildTarget('foo'))