blob: a771017ce82a039f20426cbe879b311c464e3af3 [file] [log] [blame]
Ned Nguyene5d04852019-02-19 16:33:15 -07001# Copyright 2019 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4"""Board build dependency service tests."""
5
Navil Pereza7823262020-08-07 17:56:57 +00006import os
Mike Frysingeref94e4c2020-02-10 23:59:54 -05007
Michael Mortensenaf10cca2019-11-18 20:21:32 -07008from chromite.api import api_config
LaMont Jones00b9cff2019-12-12 12:14:07 -07009from chromite.api.controller import controller_util
Alex Kleinec869c12019-07-09 15:22:16 -060010from chromite.api.controller import dependency
Ned Nguyen8e144bd2019-05-02 09:09:41 -060011from chromite.api.gen.chromite.api import depgraph_pb2
Navil Pereza7823262020-08-07 17:56:57 +000012from chromite.api.gen.chromite.api import sysroot_pb2
LaMont Jones00b9cff2019-12-12 12:14:07 -070013from chromite.api.gen.chromiumos import common_pb2
Navil Pereza7823262020-08-07 17:56:57 +000014from chromite.lib import cros_build_lib
Ned Nguyene5d04852019-02-19 16:33:15 -070015from chromite.lib import cros_test_lib
Navil Pereza7823262020-08-07 17:56:57 +000016from chromite.lib import osutils
Navil Perez2c238b52021-03-17 16:33:12 +000017from chromite.lib.parser import package_info
Michael Mortensenaf10cca2019-11-18 20:21:32 -070018from chromite.service import dependency as dependency_service
Ned Nguyene5d04852019-02-19 16:33:15 -070019
Mike Frysinger1cc8f1f2022-04-28 22:40:40 -040020
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070021pytestmark = cros_test_lib.pytestmark_inside_only
22
Ned Nguyene5d04852019-02-19 16:33:15 -070023
Alex Klein1699fab2022-09-08 08:46:06 -060024class BoardBuildDependencyTest(
25 cros_test_lib.MockTestCase, api_config.ApiConfigMixin
26):
27 """Unittests for board_build_dependency."""
Ned Nguyene5d04852019-02-19 16:33:15 -070028
Alex Klein1699fab2022-09-08 08:46:06 -060029 def setUp(self):
30 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
31 self.json_deps = {
32 "target_board": "deathstar",
33 "sysroot_path": "/build/deathstar",
34 "package_deps": {
35 "commander/darthvader-1.49.3.3": {
36 "action": "merge",
37 "category": "commander",
38 "cpes": [],
39 "deps": ["troop/clone", "troop/robot"],
40 "rev_deps": [],
41 "full_name": "commander/darthvader-1.49.3.3",
42 "name": "darthvader",
43 "version": "1.49.3.3",
44 },
45 "troop/clone-1.2.3": {
46 "action": "merge",
47 "category": "troop",
48 "cpes": [],
49 "deps": ["equipment/jetpack"],
50 "rev_deps": ["commander/darthvader"],
51 "full_name": "troop/clone-1.2.3",
52 "name": "clone",
53 "version": "1.2.3",
54 },
55 "troop/robot-2.3.4": {
56 "action": "merge",
57 "category": "troop",
58 "cpes": [],
59 "deps": [],
60 "rev_deps": ["commander/darthvader"],
61 "full_name": "troop/robot-2.3.4",
62 "name": "robot",
63 "version": "2.3.4",
64 },
65 "equipment/jetpack-3.4.5": {
66 "action": "merge",
67 "category": "equipment",
68 "cpes": [],
69 "deps": [],
70 "rev_deps": ["commander/darthvader"],
71 "full_name": "equipment/jetpack-3.4.5",
72 "name": "jetpack",
73 "version": "3.4.5",
74 },
Ned Nguyene5d04852019-02-19 16:33:15 -070075 },
Alex Klein1699fab2022-09-08 08:46:06 -060076 "source_path_mapping": {
77 "commander/darthvader-1.49.3.3": ["/control/room"],
78 "troop/clone-1.2.3": ["/bunker"],
79 "troop/robot-2.3.4": ["/factory"],
80 "equipment/jetpack-3.4.5": ["/factory"],
Ned Nguyene5d04852019-02-19 16:33:15 -070081 },
Alex Klein1699fab2022-09-08 08:46:06 -060082 }
Ned Nguyene5d04852019-02-19 16:33:15 -070083
Alex Klein1699fab2022-09-08 08:46:06 -060084 def testCreateDepGraphProtoFromJsonMap(self):
85 """Test creating DepGraph protobuf from json map."""
86 depgraph_proto = depgraph_pb2.DepGraph()
87 dependency.AugmentDepGraphProtoFromJsonMap(
88 self.json_deps, depgraph_proto
89 )
90 self.assertEqual(depgraph_proto.build_target.name, "deathstar")
91 darthvader_dep = None
92 for package_dep_info in depgraph_proto.package_deps:
93 if package_dep_info.package_info.package_name == "darthvader":
94 darthvader_dep = package_dep_info
95 self.assertTrue(darthvader_dep)
96 self.assertEqual(
97 darthvader_dep.dependency_packages[0].category, "troop"
98 )
99 self.assertEqual(
100 darthvader_dep.dependency_packages[0].package_name, "clone"
101 )
102 self.assertEqual(
103 darthvader_dep.dependency_source_paths[0].path, "/control/room"
104 )
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700105
Alex Klein1699fab2022-09-08 08:46:06 -0600106 def testGetBuildDependencyGraph(self):
107 """GetBuildDependencyGraph calls helper method with correct args."""
108 patch = self.PatchObject(
109 dependency_service,
110 "GetBuildDependency",
111 return_value=(self.json_deps, self.json_deps),
112 )
113 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
114 input_proto.build_target.name = "target"
115 dependency.GetBuildDependencyGraph(
116 input_proto, self.response, self.api_config
117 )
118 self.assertEqual(self.response.dep_graph.build_target.name, "deathstar")
119 patch.assert_called_once()
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700120
Alex Klein1699fab2022-09-08 08:46:06 -0600121 def testGetBuildDependencyGraphForPackages(self):
122 """GetBuildDependencyGraph calls helper method with correct args."""
123 get_dep = self.PatchObject(
124 dependency_service,
125 "GetBuildDependency",
126 return_value=(self.json_deps, self.json_deps),
127 )
128 pkg_mock = "package-CPV"
129 pkg_to_cpv = self.PatchObject(
130 controller_util, "PackageInfoToCPV", return_value=pkg_mock
131 )
132 package = common_pb2.PackageInfo(
133 package_name="chromeos-chrome", category="chromeos-base"
134 )
135 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
136 build_target=common_pb2.BuildTarget(name="target"),
137 packages=[package],
138 )
139 dependency.GetBuildDependencyGraph(
140 input_proto, self.response, self.api_config
141 )
142 self.assertEqual(self.response.dep_graph.build_target.name, "deathstar")
143 pkg_to_cpv.assert_called_once_with(package)
144 get_dep.assert_called_once_with("/build/target", "target", (pkg_mock,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700145
Alex Klein1699fab2022-09-08 08:46:06 -0600146 def testValidateOnly(self):
147 """Test that a validate only call does not execute any logic."""
148 patch = self.PatchObject(dependency_service, "GetBuildDependency")
149 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
150 input_proto.build_target.name = "target"
151 dependency.GetBuildDependencyGraph(
152 input_proto, self.response, self.validate_only_config
153 )
154 patch.assert_not_called()
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700155
Alex Klein1699fab2022-09-08 08:46:06 -0600156 def testMockCall(self):
157 """Test that a mock call does not execute logic, returns mocked value."""
158 patch = self.PatchObject(dependency_service, "GetBuildDependency")
159 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
160 input_proto.build_target.name = "target"
161 dependency.GetBuildDependencyGraph(
162 input_proto, self.response, self.mock_call_config
163 )
164 patch.assert_not_called()
165 self.assertEqual(
166 self.response.dep_graph.build_target.name, "target_board"
167 )
Navil Pereza7823262020-08-07 17:56:57 +0000168
169
170class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600171 """Unittests for the List endpoint."""
Navil Pereza7823262020-08-07 17:56:57 +0000172
Alex Klein1699fab2022-09-08 08:46:06 -0600173 def setUp(self):
174 self.response = depgraph_pb2.ListResponse()
175 self.build_target = common_pb2.BuildTarget(name="target")
176 self.sysroot = os.path.join(self.tempdir, "target")
177 osutils.SafeMakedirs(self.sysroot)
Navil Pereza7823262020-08-07 17:56:57 +0000178
Alex Klein1699fab2022-09-08 08:46:06 -0600179 def testValidateOnly(self):
180 """Test that a validate only call does not execute any logic."""
181 sysroot = sysroot_pb2.Sysroot(
182 path=self.sysroot, build_target=self.build_target
183 )
184 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
185 dependency.List(input_proto, self.response, self.validate_only_config)
Navil Pereza7823262020-08-07 17:56:57 +0000186
Alex Klein1699fab2022-09-08 08:46:06 -0600187 def testArgumentValidationMissingSysrootPath(self):
188 """Test missing sysroot path."""
189 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
190 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
191 with self.assertRaises(cros_build_lib.DieSystemExit):
192 dependency.List(input_proto, self.response, self.api_config)
Navil Pereza7823262020-08-07 17:56:57 +0000193
Alex Klein1699fab2022-09-08 08:46:06 -0600194 def testArgumentValidationMissingBuildTarget(self):
195 """Test missing build target name."""
196 sysroot = sysroot_pb2.Sysroot(
197 path=self.sysroot, build_target=common_pb2.BuildTarget()
198 )
199 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
200 with self.assertRaises(cros_build_lib.DieSystemExit):
201 dependency.List(input_proto, self.response, self.api_config)
Navil Pereza7823262020-08-07 17:56:57 +0000202
Alex Klein1699fab2022-09-08 08:46:06 -0600203 def testDefaultArguments(self):
204 """Test with default arguments."""
205 sysroot = sysroot_pb2.Sysroot(
206 path=self.sysroot, build_target=self.build_target
207 )
208 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
209 mock_get_deps = self.PatchObject(dependency_service, "GetDependencies")
210 dependency.List(input_proto, self.response, self.api_config)
211 mock_get_deps.assert_called_once_with(
212 self.sysroot,
213 src_paths=[],
214 packages=[],
215 include_rev_dependencies=False,
216 )
Navil Perez2c108432021-04-09 04:17:30 +0000217
Alex Klein1699fab2022-09-08 08:46:06 -0600218 def testListResponse(self):
219 """Test calls helper method with correct args."""
220 sysroot = sysroot_pb2.Sysroot(
221 path=self.sysroot, build_target=self.build_target
222 )
223 path = "/path"
224 return_package_info = package_info.parse("foo/bar-1.2.3")
225 return_package_info_proto = common_pb2.PackageInfo(
226 category="foo", package_name="bar", version="1.2.3"
227 )
228 mock_get_deps = self.PatchObject(
229 dependency_service,
230 "GetDependencies",
231 return_value=[return_package_info],
232 )
Navil Perez2c238b52021-03-17 16:33:12 +0000233
Alex Klein1699fab2022-09-08 08:46:06 -0600234 input_package_info_proto = common_pb2.PackageInfo(
235 category="foo", package_name="bar"
236 )
237 input_package_info = package_info.parse("foo/bar")
238 input_proto = depgraph_pb2.ListRequest(
239 sysroot=sysroot,
240 src_paths=[
241 depgraph_pb2.SourcePath(path=path),
242 ],
243 packages=[input_package_info_proto],
244 include_rev_deps=True,
245 )
246 dependency.List(input_proto, self.response, self.api_config)
247 mock_get_deps.assert_called_once_with(
248 self.sysroot,
249 src_paths=[path],
250 packages=[input_package_info],
251 include_rev_dependencies=True,
252 )
253 self.assertCountEqual(
254 [return_package_info_proto], self.response.package_deps
255 )