blob: 51ea8b771964fd88bb00861c0aab51f73ad806d1 [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
13from chromite.lib import cros_test_lib
14from chromite.lib import portage_util
Alex Klein171da612019-08-06 14:00:42 -060015from chromite.lib.build_target_util import BuildTarget
16from chromite.lib.chroot_lib import Chroot
17
18
19class ParseChrootTest(cros_test_lib.TestCase):
20 """ParseChroot tests."""
21
22 def testSuccess(self):
23 """Test successful handling case."""
24 path = '/chroot/path'
25 cache_dir = '/cache/dir'
26 chrome_root = '/chrome/root'
27 use_flags = [{'flag': 'useflag1'}, {'flag': 'useflag2'}]
28 features = [{'feature': 'feature1'}, {'feature': 'feature2'}]
29 expected_env = {'USE': 'useflag1 useflag2',
30 'FEATURES': 'feature1 feature2'}
31
32 chroot_message = common_pb2.Chroot(path=path, cache_dir=cache_dir,
33 chrome_dir=chrome_root,
34 env={'use_flags': use_flags,
35 'features': features})
36
37 expected = Chroot(path=path, cache_dir=cache_dir, chrome_root=chrome_root,
38 env=expected_env)
39 result = controller_util.ParseChroot(chroot_message)
40
41 self.assertEqual(expected, result)
42
43 def testWrongMessage(self):
44 """Test invalid message type given."""
45 with self.assertRaises(AssertionError):
46 controller_util.ParseChroot(common_pb2.BuildTarget())
47
48
49class ParseBuildTargetTest(cros_test_lib.TestCase):
50 """ParseBuildTarget tests."""
51
52 def testSuccess(self):
53 """Test successful handling case."""
54 name = 'board'
55 build_target_message = common_pb2.BuildTarget(name=name)
56 expected = BuildTarget(name)
57 result = controller_util.ParseBuildTarget(build_target_message)
58
59 self.assertEqual(expected, result)
60
61 def testWrongMessage(self):
62 """Test invalid message type given."""
63 with self.assertRaises(AssertionError):
64 controller_util.ParseBuildTarget(common_pb2.Chroot())
65
66
67class ParseBuildTargetsTest(cros_test_lib.TestCase):
68 """ParseBuildTargets tests."""
69
70 def testSuccess(self):
71 """Test successful handling case."""
72 names = ['foo', 'bar', 'baz']
73 message = build_api_test_pb2.TestRequestMessage()
74 for name in names:
75 message.build_targets.add().name = name
76
77 result = controller_util.ParseBuildTargets(message.build_targets)
78
79 self.assertItemsEqual([BuildTarget(name) for name in names], result)
80
81 def testWrongMessage(self):
82 """Wrong message type handling."""
83 message = common_pb2.Chroot()
84 message.env.use_flags.add().flag = 'foo'
85 message.env.use_flags.add().flag = 'bar'
86
87 with self.assertRaises(AssertionError):
88 controller_util.ParseBuildTargets(message.env.use_flags)
Alex Kleina9d500b2019-04-22 15:37:51 -060089
90
91class CPVToPackageInfoTest(cros_test_lib.TestCase):
92 """CPVToPackageInfo tests."""
93
94 def testAllFields(self):
95 pi = common_pb2.PackageInfo()
96 cpv = portage_util.SplitCPV('cat/pkg-2.0.0', strict=False)
97
98 controller_util.CPVToPackageInfo(cpv, pi)
99 self.assertEqual('cat', pi.category)
100 self.assertEqual('pkg', pi.package_name)
101 self.assertEqual('2.0.0', pi.version)
102
103 def testNoVersion(self):
104 pi = common_pb2.PackageInfo()
105 cpv = portage_util.SplitCPV('cat/pkg', strict=False)
106
107 controller_util.CPVToPackageInfo(cpv, pi)
108 self.assertEqual('cat', pi.category)
109 self.assertEqual('pkg', pi.package_name)
110 self.assertEqual('', pi.version)
111
112 def testPackageOnly(self):
113 pi = common_pb2.PackageInfo()
114 cpv = portage_util.SplitCPV('pkg', strict=False)
115
116 controller_util.CPVToPackageInfo(cpv, pi)
117 self.assertEqual('', pi.category)
118 self.assertEqual('pkg', pi.package_name)
119 self.assertEqual('', pi.version)
120
121
122class PackageInfoToCPVTest(cros_test_lib.TestCase):
123 """PackageInfoToCPV tests."""
124
125 def testAllFields(self):
126 """Quick sanity check it's working properly."""
127 pi = common_pb2.PackageInfo()
128 pi.package_name = 'pkg'
129 pi.category = 'cat'
130 pi.version = '2.0.0'
131
132 cpv = controller_util.PackageInfoToCPV(pi)
133
134 self.assertEqual('pkg', cpv.package)
135 self.assertEqual('cat', cpv.category)
136 self.assertEqual('2.0.0', cpv.version)
137
138 def testNoPackageInfo(self):
139 """Test no package info given."""
140 self.assertIsNone(controller_util.PackageInfoToCPV(None))
141
142 def testNoPackageName(self):
143 """Test no package name given."""
144 pi = common_pb2.PackageInfo()
145 pi.category = 'cat'
146 pi.version = '2.0.0'
147
148 self.assertIsNone(controller_util.PackageInfoToCPV(pi))
149
150
151class PackageInfoToStringTest(cros_test_lib.TestCase):
152 """PackageInfoToString tests."""
153
154 def testAllFields(self):
155 """Test all fields present."""
156 pi = common_pb2.PackageInfo()
157 pi.package_name = 'pkg'
158 pi.category = 'cat'
159 pi.version = '2.0.0'
160
161 cpv_str = controller_util.PackageInfoToString(pi)
162
163 self.assertEqual('cat/pkg-2.0.0', cpv_str)
164
165 def testNoVersion(self):
166 """Test no version provided."""
167 pi = common_pb2.PackageInfo()
168 pi.package_name = 'pkg'
169 pi.category = 'cat'
170
171 cpv_str = controller_util.PackageInfoToString(pi)
172
173 self.assertEqual('cat/pkg', cpv_str)
174
175 def testPackageOnly(self):
176 """Test no version provided."""
177 pi = common_pb2.PackageInfo()
178 pi.package_name = 'pkg'
179
180 cpv_str = controller_util.PackageInfoToString(pi)
181
182 self.assertEqual('pkg', cpv_str)
183
184 def testNoPackageName(self):
185 """Test no package name given."""
186 pi = common_pb2.PackageInfo()
187
188 with self.assertRaises(ValueError):
189 controller_util.PackageInfoToString(pi)
190
191
192class CPVToStringTest(cros_test_lib.TestCase):
193 """CPVToString tests."""
194
195 def testTranslations(self):
196 """Test standard translations used."""
197 cases = [
198 'cat/pkg-2.0.0-r1',
199 'cat/pkg-2.0.0',
200 'cat/pkg',
201 'pkg',
202 ]
203
204 for case in cases:
205 cpv = portage_util.SplitCPV(case, strict=False)
206 # We should end up with as much info as is available, so we should see
207 # the original value in each case.
208 self.assertEqual(case, controller_util.CPVToString(cpv))
209
210 def testInvalidCPV(self):
211 """Test invalid CPV object."""
212 cpv = portage_util.SplitCPV('', strict=False)
213 with self.assertRaises(ValueError):
214 controller_util.CPVToString(cpv)