blob: 99c717bb1ef688e92bcff95059d22a2c9c8ab763 [file] [log] [blame]
Alex Kleina9d500b2019-04-22 15:37:51 -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"""controller_util unittests."""
7
8from __future__ import print_function
9
10from chromite.api.controller import controller_util
Alex Klein171da612019-08-06 14:00:42 -060011from chromite.api.gen.chromite.api import build_api_test_pb2
Alex Kleina9d500b2019-04-22 15:37:51 -060012from chromite.api.gen.chromiumos import common_pb2
Michael Mortensen9a73c322019-10-03 17:14:37 -060013from chromite.cbuildbot import goma_util
Alex Kleina9d500b2019-04-22 15:37:51 -060014from chromite.lib import cros_test_lib
15from chromite.lib import portage_util
Alex Klein171da612019-08-06 14:00:42 -060016from chromite.lib.build_target_util import BuildTarget
17from chromite.lib.chroot_lib import Chroot
18
19
Michael Mortensen9a73c322019-10-03 17:14:37 -060020class ParseChrootTest(cros_test_lib.MockTestCase):
Alex Klein171da612019-08-06 14:00:42 -060021 """ParseChroot tests."""
22
23 def testSuccess(self):
24 """Test successful handling case."""
25 path = '/chroot/path'
26 cache_dir = '/cache/dir'
27 chrome_root = '/chrome/root'
28 use_flags = [{'flag': 'useflag1'}, {'flag': 'useflag2'}]
29 features = [{'feature': 'feature1'}, {'feature': 'feature2'}]
30 expected_env = {'USE': 'useflag1 useflag2',
Alex Kleinb7485bb2019-09-19 13:23:37 -060031 'FEATURES': 'feature1 feature2',
32 'CHROME_ORIGIN': 'LOCAL_SOURCE'}
Alex Klein171da612019-08-06 14:00:42 -060033
34 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
35 chrome_dir=chrome_root,
36 env={'use_flags': use_flags,
37 'features': features})
38
39 expected = Chroot(path=path, cache_dir=cache_dir, chrome_root=chrome_root,
40 env=expected_env)
41 result = controller_util.ParseChroot(chroot_message)
42
43 self.assertEqual(expected, result)
44
Michael Mortensen9a73c322019-10-03 17:14:37 -060045
46 def testChrootCallToGoma(self):
47 """Test calls to goma."""
48 path = '/chroot/path'
49 cache_dir = '/cache/dir'
50 chrome_root = '/chrome/root'
51 use_flags = [{'flag': 'useflag1'}, {'flag': 'useflag2'}]
52 features = [{'feature': 'feature1'}, {'feature': 'feature2'}]
53 goma_test_dir = '/goma/test/dir'
54 goma_test_json_string = 'goma_json'
55 chromeos_goma_test_dir = '/chromeos/goma/test/dir'
56
Alex Klein1f67cf32019-10-09 11:13:42 -060057 # Patch goma constructor to avoid creating misc dirs.
Michael Mortensen9a73c322019-10-03 17:14:37 -060058 patch = self.PatchObject(goma_util, 'Goma')
59
60 goma_config = common_pb2.GomaConfig(goma_dir=goma_test_dir,
61 goma_client_json=goma_test_json_string)
62 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
63 chrome_dir=chrome_root,
64 env={'use_flags': use_flags,
65 'features': features},
66 goma=goma_config)
67
68 controller_util.ParseChroot(chroot_message)
69 patch.assert_called_with(goma_test_dir, goma_test_json_string,
Alex Klein1f67cf32019-10-09 11:13:42 -060070 stage_name='BuildAPI', chromeos_goma_dir=None,
David Burgere3dcc752019-10-18 09:55:32 -060071 chroot_dir=path,
72 goma_approach=None)
Michael Mortensen9a73c322019-10-03 17:14:37 -060073
74 goma_config.chromeos_goma_dir = chromeos_goma_test_dir
75 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
76 chrome_dir=chrome_root,
77 env={'use_flags': use_flags,
78 'features': features},
79 goma=goma_config)
80
81 controller_util.ParseChroot(chroot_message)
82 patch.assert_called_with(goma_test_dir, goma_test_json_string,
83 stage_name='BuildAPI',
Alex Klein1f67cf32019-10-09 11:13:42 -060084 chromeos_goma_dir=chromeos_goma_test_dir,
David Burgere3dcc752019-10-18 09:55:32 -060085 chroot_dir=path,
86 goma_approach=None)
Michael Mortensen9a73c322019-10-03 17:14:37 -060087
David Burgere3dcc752019-10-18 09:55:32 -060088 goma_config.goma_approach = common_pb2.GomaConfig.RBE_PROD
89 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
90 chrome_dir=chrome_root,
91 env={'use_flags': use_flags,
92 'features': features},
93 goma=goma_config)
94
95 controller_util.ParseChroot(chroot_message)
96 patch.assert_called_with(goma_test_dir, goma_test_json_string,
97 stage_name='BuildAPI',
98 chromeos_goma_dir=chromeos_goma_test_dir,
99 chroot_dir=path,
100 goma_approach=goma_util.GomaApproach(
101 '?prod', 'goma.chromium.org', True))
102
103 goma_config.goma_approach = common_pb2.GomaConfig.RBE_STAGING
104 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
105 chrome_dir=chrome_root,
106 env={'use_flags': use_flags,
107 'features': features},
108 goma=goma_config)
109
110 controller_util.ParseChroot(chroot_message)
111 patch.assert_called_with(goma_test_dir, goma_test_json_string,
112 stage_name='BuildAPI',
113 chromeos_goma_dir=chromeos_goma_test_dir,
114 chroot_dir=path,
115 goma_approach=goma_util.GomaApproach(
116 '?staging', 'staging-goma.chromium.org', True))
Michael Mortensen9a73c322019-10-03 17:14:37 -0600117
Alex Klein171da612019-08-06 14:00:42 -0600118 def testWrongMessage(self):
119 """Test invalid message type given."""
120 with self.assertRaises(AssertionError):
121 controller_util.ParseChroot(common_pb2.BuildTarget())
122
123
124class ParseBuildTargetTest(cros_test_lib.TestCase):
125 """ParseBuildTarget tests."""
126
127 def testSuccess(self):
128 """Test successful handling case."""
129 name = 'board'
130 build_target_message = common_pb2.BuildTarget(name=name)
131 expected = BuildTarget(name)
132 result = controller_util.ParseBuildTarget(build_target_message)
133
134 self.assertEqual(expected, result)
135
136 def testWrongMessage(self):
137 """Test invalid message type given."""
138 with self.assertRaises(AssertionError):
139 controller_util.ParseBuildTarget(common_pb2.Chroot())
140
141
142class ParseBuildTargetsTest(cros_test_lib.TestCase):
143 """ParseBuildTargets tests."""
144
145 def testSuccess(self):
146 """Test successful handling case."""
147 names = ['foo', 'bar', 'baz']
148 message = build_api_test_pb2.TestRequestMessage()
149 for name in names:
150 message.build_targets.add().name = name
151
152 result = controller_util.ParseBuildTargets(message.build_targets)
153
Mike Frysinger678735c2019-09-28 18:23:28 -0400154 self.assertCountEqual([BuildTarget(name) for name in names], result)
Alex Klein171da612019-08-06 14:00:42 -0600155
156 def testWrongMessage(self):
157 """Wrong message type handling."""
158 message = common_pb2.Chroot()
159 message.env.use_flags.add().flag = 'foo'
160 message.env.use_flags.add().flag = 'bar'
161
162 with self.assertRaises(AssertionError):
163 controller_util.ParseBuildTargets(message.env.use_flags)
Alex Kleina9d500b2019-04-22 15:37:51 -0600164
165
166class CPVToPackageInfoTest(cros_test_lib.TestCase):
167 """CPVToPackageInfo tests."""
168
169 def testAllFields(self):
Alex Kleine1abe2c2019-08-14 10:29:46 -0600170 """Test handling when all fields present."""
Alex Kleina9d500b2019-04-22 15:37:51 -0600171 pi = common_pb2.PackageInfo()
172 cpv = portage_util.SplitCPV('cat/pkg-2.0.0', strict=False)
173
174 controller_util.CPVToPackageInfo(cpv, pi)
175 self.assertEqual('cat', pi.category)
176 self.assertEqual('pkg', pi.package_name)
177 self.assertEqual('2.0.0', pi.version)
178
179 def testNoVersion(self):
Alex Kleine1abe2c2019-08-14 10:29:46 -0600180 """Test handling when no version given."""
Alex Kleina9d500b2019-04-22 15:37:51 -0600181 pi = common_pb2.PackageInfo()
182 cpv = portage_util.SplitCPV('cat/pkg', strict=False)
183
184 controller_util.CPVToPackageInfo(cpv, pi)
185 self.assertEqual('cat', pi.category)
186 self.assertEqual('pkg', pi.package_name)
187 self.assertEqual('', pi.version)
188
189 def testPackageOnly(self):
Alex Kleine1abe2c2019-08-14 10:29:46 -0600190 """Test handling when only given the package name."""
Alex Kleina9d500b2019-04-22 15:37:51 -0600191 pi = common_pb2.PackageInfo()
192 cpv = portage_util.SplitCPV('pkg', strict=False)
193
194 controller_util.CPVToPackageInfo(cpv, pi)
195 self.assertEqual('', pi.category)
196 self.assertEqual('pkg', pi.package_name)
197 self.assertEqual('', pi.version)
198
199
200class PackageInfoToCPVTest(cros_test_lib.TestCase):
201 """PackageInfoToCPV tests."""
202
203 def testAllFields(self):
204 """Quick sanity check it's working properly."""
205 pi = common_pb2.PackageInfo()
206 pi.package_name = 'pkg'
207 pi.category = 'cat'
208 pi.version = '2.0.0'
209
210 cpv = controller_util.PackageInfoToCPV(pi)
211
212 self.assertEqual('pkg', cpv.package)
213 self.assertEqual('cat', cpv.category)
214 self.assertEqual('2.0.0', cpv.version)
215
216 def testNoPackageInfo(self):
217 """Test no package info given."""
218 self.assertIsNone(controller_util.PackageInfoToCPV(None))
219
220 def testNoPackageName(self):
221 """Test no package name given."""
222 pi = common_pb2.PackageInfo()
223 pi.category = 'cat'
224 pi.version = '2.0.0'
225
226 self.assertIsNone(controller_util.PackageInfoToCPV(pi))
227
228
229class PackageInfoToStringTest(cros_test_lib.TestCase):
230 """PackageInfoToString tests."""
231
232 def testAllFields(self):
233 """Test all fields present."""
234 pi = common_pb2.PackageInfo()
235 pi.package_name = 'pkg'
236 pi.category = 'cat'
237 pi.version = '2.0.0'
238
239 cpv_str = controller_util.PackageInfoToString(pi)
240
241 self.assertEqual('cat/pkg-2.0.0', cpv_str)
242
243 def testNoVersion(self):
244 """Test no version provided."""
245 pi = common_pb2.PackageInfo()
246 pi.package_name = 'pkg'
247 pi.category = 'cat'
248
249 cpv_str = controller_util.PackageInfoToString(pi)
250
251 self.assertEqual('cat/pkg', cpv_str)
252
253 def testPackageOnly(self):
254 """Test no version provided."""
255 pi = common_pb2.PackageInfo()
256 pi.package_name = 'pkg'
257
258 cpv_str = controller_util.PackageInfoToString(pi)
259
260 self.assertEqual('pkg', cpv_str)
261
262 def testNoPackageName(self):
263 """Test no package name given."""
264 pi = common_pb2.PackageInfo()
265
266 with self.assertRaises(ValueError):
267 controller_util.PackageInfoToString(pi)
268
269
270class CPVToStringTest(cros_test_lib.TestCase):
271 """CPVToString tests."""
272
273 def testTranslations(self):
274 """Test standard translations used."""
275 cases = [
276 'cat/pkg-2.0.0-r1',
277 'cat/pkg-2.0.0',
278 'cat/pkg',
279 'pkg',
280 ]
281
282 for case in cases:
283 cpv = portage_util.SplitCPV(case, strict=False)
284 # We should end up with as much info as is available, so we should see
285 # the original value in each case.
286 self.assertEqual(case, controller_util.CPVToString(cpv))
287
288 def testInvalidCPV(self):
289 """Test invalid CPV object."""
290 cpv = portage_util.SplitCPV('', strict=False)
291 with self.assertRaises(ValueError):
292 controller_util.CPVToString(cpv)