blob: ea96fc31061ee86f16081eb04b7600a7d0afc560 [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
57 patch = self.PatchObject(goma_util, 'Goma')
58
59 goma_config = common_pb2.GomaConfig(goma_dir=goma_test_dir,
60 goma_client_json=goma_test_json_string)
61 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
62 chrome_dir=chrome_root,
63 env={'use_flags': use_flags,
64 'features': features},
65 goma=goma_config)
66
67 controller_util.ParseChroot(chroot_message)
68 patch.assert_called_with(goma_test_dir, goma_test_json_string,
69 stage_name='BuildAPI', chromeos_goma_dir=None)
70
71 goma_config.chromeos_goma_dir = chromeos_goma_test_dir
72 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
73 chrome_dir=chrome_root,
74 env={'use_flags': use_flags,
75 'features': features},
76 goma=goma_config)
77
78 controller_util.ParseChroot(chroot_message)
79 patch.assert_called_with(goma_test_dir, goma_test_json_string,
80 stage_name='BuildAPI',
81 chromeos_goma_dir=chromeos_goma_test_dir)
82
83
Alex Klein171da612019-08-06 14:00:42 -060084 def testWrongMessage(self):
85 """Test invalid message type given."""
86 with self.assertRaises(AssertionError):
87 controller_util.ParseChroot(common_pb2.BuildTarget())
88
89
90class ParseBuildTargetTest(cros_test_lib.TestCase):
91 """ParseBuildTarget tests."""
92
93 def testSuccess(self):
94 """Test successful handling case."""
95 name = 'board'
96 build_target_message = common_pb2.BuildTarget(name=name)
97 expected = BuildTarget(name)
98 result = controller_util.ParseBuildTarget(build_target_message)
99
100 self.assertEqual(expected, result)
101
102 def testWrongMessage(self):
103 """Test invalid message type given."""
104 with self.assertRaises(AssertionError):
105 controller_util.ParseBuildTarget(common_pb2.Chroot())
106
107
108class ParseBuildTargetsTest(cros_test_lib.TestCase):
109 """ParseBuildTargets tests."""
110
111 def testSuccess(self):
112 """Test successful handling case."""
113 names = ['foo', 'bar', 'baz']
114 message = build_api_test_pb2.TestRequestMessage()
115 for name in names:
116 message.build_targets.add().name = name
117
118 result = controller_util.ParseBuildTargets(message.build_targets)
119
Mike Frysinger678735c2019-09-28 18:23:28 -0400120 self.assertCountEqual([BuildTarget(name) for name in names], result)
Alex Klein171da612019-08-06 14:00:42 -0600121
122 def testWrongMessage(self):
123 """Wrong message type handling."""
124 message = common_pb2.Chroot()
125 message.env.use_flags.add().flag = 'foo'
126 message.env.use_flags.add().flag = 'bar'
127
128 with self.assertRaises(AssertionError):
129 controller_util.ParseBuildTargets(message.env.use_flags)
Alex Kleina9d500b2019-04-22 15:37:51 -0600130
131
132class CPVToPackageInfoTest(cros_test_lib.TestCase):
133 """CPVToPackageInfo tests."""
134
135 def testAllFields(self):
Alex Kleine1abe2c2019-08-14 10:29:46 -0600136 """Test handling when all fields present."""
Alex Kleina9d500b2019-04-22 15:37:51 -0600137 pi = common_pb2.PackageInfo()
138 cpv = portage_util.SplitCPV('cat/pkg-2.0.0', strict=False)
139
140 controller_util.CPVToPackageInfo(cpv, pi)
141 self.assertEqual('cat', pi.category)
142 self.assertEqual('pkg', pi.package_name)
143 self.assertEqual('2.0.0', pi.version)
144
145 def testNoVersion(self):
Alex Kleine1abe2c2019-08-14 10:29:46 -0600146 """Test handling when no version given."""
Alex Kleina9d500b2019-04-22 15:37:51 -0600147 pi = common_pb2.PackageInfo()
148 cpv = portage_util.SplitCPV('cat/pkg', strict=False)
149
150 controller_util.CPVToPackageInfo(cpv, pi)
151 self.assertEqual('cat', pi.category)
152 self.assertEqual('pkg', pi.package_name)
153 self.assertEqual('', pi.version)
154
155 def testPackageOnly(self):
Alex Kleine1abe2c2019-08-14 10:29:46 -0600156 """Test handling when only given the package name."""
Alex Kleina9d500b2019-04-22 15:37:51 -0600157 pi = common_pb2.PackageInfo()
158 cpv = portage_util.SplitCPV('pkg', strict=False)
159
160 controller_util.CPVToPackageInfo(cpv, pi)
161 self.assertEqual('', pi.category)
162 self.assertEqual('pkg', pi.package_name)
163 self.assertEqual('', pi.version)
164
165
166class PackageInfoToCPVTest(cros_test_lib.TestCase):
167 """PackageInfoToCPV tests."""
168
169 def testAllFields(self):
170 """Quick sanity check it's working properly."""
171 pi = common_pb2.PackageInfo()
172 pi.package_name = 'pkg'
173 pi.category = 'cat'
174 pi.version = '2.0.0'
175
176 cpv = controller_util.PackageInfoToCPV(pi)
177
178 self.assertEqual('pkg', cpv.package)
179 self.assertEqual('cat', cpv.category)
180 self.assertEqual('2.0.0', cpv.version)
181
182 def testNoPackageInfo(self):
183 """Test no package info given."""
184 self.assertIsNone(controller_util.PackageInfoToCPV(None))
185
186 def testNoPackageName(self):
187 """Test no package name given."""
188 pi = common_pb2.PackageInfo()
189 pi.category = 'cat'
190 pi.version = '2.0.0'
191
192 self.assertIsNone(controller_util.PackageInfoToCPV(pi))
193
194
195class PackageInfoToStringTest(cros_test_lib.TestCase):
196 """PackageInfoToString tests."""
197
198 def testAllFields(self):
199 """Test all fields present."""
200 pi = common_pb2.PackageInfo()
201 pi.package_name = 'pkg'
202 pi.category = 'cat'
203 pi.version = '2.0.0'
204
205 cpv_str = controller_util.PackageInfoToString(pi)
206
207 self.assertEqual('cat/pkg-2.0.0', cpv_str)
208
209 def testNoVersion(self):
210 """Test no version provided."""
211 pi = common_pb2.PackageInfo()
212 pi.package_name = 'pkg'
213 pi.category = 'cat'
214
215 cpv_str = controller_util.PackageInfoToString(pi)
216
217 self.assertEqual('cat/pkg', cpv_str)
218
219 def testPackageOnly(self):
220 """Test no version provided."""
221 pi = common_pb2.PackageInfo()
222 pi.package_name = 'pkg'
223
224 cpv_str = controller_util.PackageInfoToString(pi)
225
226 self.assertEqual('pkg', cpv_str)
227
228 def testNoPackageName(self):
229 """Test no package name given."""
230 pi = common_pb2.PackageInfo()
231
232 with self.assertRaises(ValueError):
233 controller_util.PackageInfoToString(pi)
234
235
236class CPVToStringTest(cros_test_lib.TestCase):
237 """CPVToString tests."""
238
239 def testTranslations(self):
240 """Test standard translations used."""
241 cases = [
242 'cat/pkg-2.0.0-r1',
243 'cat/pkg-2.0.0',
244 'cat/pkg',
245 'pkg',
246 ]
247
248 for case in cases:
249 cpv = portage_util.SplitCPV(case, strict=False)
250 # We should end up with as much info as is available, so we should see
251 # the original value in each case.
252 self.assertEqual(case, controller_util.CPVToString(cpv))
253
254 def testInvalidCPV(self):
255 """Test invalid CPV object."""
256 cpv = portage_util.SplitCPV('', strict=False)
257 with self.assertRaises(ValueError):
258 controller_util.CPVToString(cpv)