blob: acd0370f0bd32d4ba3b93f81341ed61c7b1b48f4 [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
Ned Nguyene5d04852019-02-19 16:33:15 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
Mike Frysingera2527f82023-02-03 04:32:15 -05004
Ned Nguyene5d04852019-02-19 16:33:15 -07005"""Board build dependency service tests."""
6
Navil Pereza7823262020-08-07 17:56:57 +00007import os
Mike Frysingeref94e4c2020-02-10 23:59:54 -05008
Michael Mortensenaf10cca2019-11-18 20:21:32 -07009from chromite.api import api_config
LaMont Jones00b9cff2019-12-12 12:14:07 -070010from chromite.api.controller import controller_util
Alex Kleinec869c12019-07-09 15:22:16 -060011from chromite.api.controller import dependency
Ned Nguyen8e144bd2019-05-02 09:09:41 -060012from chromite.api.gen.chromite.api import depgraph_pb2
Navil Pereza7823262020-08-07 17:56:57 +000013from chromite.api.gen.chromite.api import sysroot_pb2
LaMont Jones00b9cff2019-12-12 12:14:07 -070014from chromite.api.gen.chromiumos import common_pb2
Navil Pereza7823262020-08-07 17:56:57 +000015from chromite.lib import cros_build_lib
Ned Nguyene5d04852019-02-19 16:33:15 -070016from chromite.lib import cros_test_lib
Navil Pereza7823262020-08-07 17:56:57 +000017from chromite.lib import osutils
Navil Perez2c238b52021-03-17 16:33:12 +000018from chromite.lib.parser import package_info
Michael Mortensenaf10cca2019-11-18 20:21:32 -070019from chromite.service import dependency as dependency_service
Ned Nguyene5d04852019-02-19 16:33:15 -070020
Mike Frysinger1cc8f1f2022-04-28 22:40:40 -040021
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070022pytestmark = cros_test_lib.pytestmark_inside_only
23
Ned Nguyene5d04852019-02-19 16:33:15 -070024
Alex Klein1699fab2022-09-08 08:46:06 -060025class BoardBuildDependencyTest(
26 cros_test_lib.MockTestCase, api_config.ApiConfigMixin
27):
28 """Unittests for board_build_dependency."""
Ned Nguyene5d04852019-02-19 16:33:15 -070029
Alex Klein1699fab2022-09-08 08:46:06 -060030 def setUp(self):
31 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
32 self.json_deps = {
33 "target_board": "deathstar",
34 "sysroot_path": "/build/deathstar",
35 "package_deps": {
36 "commander/darthvader-1.49.3.3": {
37 "action": "merge",
38 "category": "commander",
39 "cpes": [],
40 "deps": ["troop/clone", "troop/robot"],
41 "rev_deps": [],
42 "full_name": "commander/darthvader-1.49.3.3",
43 "name": "darthvader",
44 "version": "1.49.3.3",
45 },
46 "troop/clone-1.2.3": {
47 "action": "merge",
48 "category": "troop",
49 "cpes": [],
50 "deps": ["equipment/jetpack"],
51 "rev_deps": ["commander/darthvader"],
52 "full_name": "troop/clone-1.2.3",
53 "name": "clone",
54 "version": "1.2.3",
55 },
56 "troop/robot-2.3.4": {
57 "action": "merge",
58 "category": "troop",
59 "cpes": [],
60 "deps": [],
61 "rev_deps": ["commander/darthvader"],
62 "full_name": "troop/robot-2.3.4",
63 "name": "robot",
64 "version": "2.3.4",
65 },
66 "equipment/jetpack-3.4.5": {
67 "action": "merge",
68 "category": "equipment",
69 "cpes": [],
70 "deps": [],
71 "rev_deps": ["commander/darthvader"],
72 "full_name": "equipment/jetpack-3.4.5",
73 "name": "jetpack",
74 "version": "3.4.5",
75 },
Ned Nguyene5d04852019-02-19 16:33:15 -070076 },
Alex Klein1699fab2022-09-08 08:46:06 -060077 "source_path_mapping": {
78 "commander/darthvader-1.49.3.3": ["/control/room"],
79 "troop/clone-1.2.3": ["/bunker"],
80 "troop/robot-2.3.4": ["/factory"],
81 "equipment/jetpack-3.4.5": ["/factory"],
Ned Nguyene5d04852019-02-19 16:33:15 -070082 },
Alex Klein1699fab2022-09-08 08:46:06 -060083 }
Ned Nguyene5d04852019-02-19 16:33:15 -070084
Alex Klein1699fab2022-09-08 08:46:06 -060085 def testCreateDepGraphProtoFromJsonMap(self):
86 """Test creating DepGraph protobuf from json map."""
87 depgraph_proto = depgraph_pb2.DepGraph()
88 dependency.AugmentDepGraphProtoFromJsonMap(
89 self.json_deps, depgraph_proto
90 )
91 self.assertEqual(depgraph_proto.build_target.name, "deathstar")
92 darthvader_dep = None
93 for package_dep_info in depgraph_proto.package_deps:
94 if package_dep_info.package_info.package_name == "darthvader":
95 darthvader_dep = package_dep_info
96 self.assertTrue(darthvader_dep)
97 self.assertEqual(
98 darthvader_dep.dependency_packages[0].category, "troop"
99 )
100 self.assertEqual(
101 darthvader_dep.dependency_packages[0].package_name, "clone"
102 )
103 self.assertEqual(
104 darthvader_dep.dependency_source_paths[0].path, "/control/room"
105 )
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700106
Alex Klein1699fab2022-09-08 08:46:06 -0600107 def testGetBuildDependencyGraph(self):
108 """GetBuildDependencyGraph calls helper method with correct args."""
109 patch = self.PatchObject(
110 dependency_service,
111 "GetBuildDependency",
112 return_value=(self.json_deps, self.json_deps),
113 )
114 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
115 input_proto.build_target.name = "target"
116 dependency.GetBuildDependencyGraph(
117 input_proto, self.response, self.api_config
118 )
119 self.assertEqual(self.response.dep_graph.build_target.name, "deathstar")
120 patch.assert_called_once()
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700121
Alex Klein1699fab2022-09-08 08:46:06 -0600122 def testGetBuildDependencyGraphForPackages(self):
123 """GetBuildDependencyGraph calls helper method with correct args."""
124 get_dep = self.PatchObject(
125 dependency_service,
126 "GetBuildDependency",
127 return_value=(self.json_deps, self.json_deps),
128 )
129 pkg_mock = "package-CPV"
130 pkg_to_cpv = self.PatchObject(
131 controller_util, "PackageInfoToCPV", return_value=pkg_mock
132 )
133 package = common_pb2.PackageInfo(
134 package_name="chromeos-chrome", category="chromeos-base"
135 )
136 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
137 build_target=common_pb2.BuildTarget(name="target"),
138 packages=[package],
139 )
140 dependency.GetBuildDependencyGraph(
141 input_proto, self.response, self.api_config
142 )
143 self.assertEqual(self.response.dep_graph.build_target.name, "deathstar")
144 pkg_to_cpv.assert_called_once_with(package)
145 get_dep.assert_called_once_with("/build/target", "target", (pkg_mock,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700146
Alex Klein1699fab2022-09-08 08:46:06 -0600147 def testValidateOnly(self):
148 """Test that a validate only call does not execute any logic."""
149 patch = self.PatchObject(dependency_service, "GetBuildDependency")
150 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
151 input_proto.build_target.name = "target"
152 dependency.GetBuildDependencyGraph(
153 input_proto, self.response, self.validate_only_config
154 )
155 patch.assert_not_called()
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700156
Alex Klein1699fab2022-09-08 08:46:06 -0600157 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700158 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600159 patch = self.PatchObject(dependency_service, "GetBuildDependency")
160 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
161 input_proto.build_target.name = "target"
162 dependency.GetBuildDependencyGraph(
163 input_proto, self.response, self.mock_call_config
164 )
165 patch.assert_not_called()
166 self.assertEqual(
167 self.response.dep_graph.build_target.name, "target_board"
168 )
Navil Pereza7823262020-08-07 17:56:57 +0000169
170
171class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600172 """Unittests for the List endpoint."""
Navil Pereza7823262020-08-07 17:56:57 +0000173
Alex Klein1699fab2022-09-08 08:46:06 -0600174 def setUp(self):
175 self.response = depgraph_pb2.ListResponse()
176 self.build_target = common_pb2.BuildTarget(name="target")
177 self.sysroot = os.path.join(self.tempdir, "target")
178 osutils.SafeMakedirs(self.sysroot)
Navil Pereza7823262020-08-07 17:56:57 +0000179
Alex Klein1699fab2022-09-08 08:46:06 -0600180 def testValidateOnly(self):
181 """Test that a validate only call does not execute any logic."""
182 sysroot = sysroot_pb2.Sysroot(
183 path=self.sysroot, build_target=self.build_target
184 )
185 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
186 dependency.List(input_proto, self.response, self.validate_only_config)
Navil Pereza7823262020-08-07 17:56:57 +0000187
Alex Klein1699fab2022-09-08 08:46:06 -0600188 def testArgumentValidationMissingSysrootPath(self):
189 """Test missing sysroot path."""
190 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
191 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
192 with self.assertRaises(cros_build_lib.DieSystemExit):
193 dependency.List(input_proto, self.response, self.api_config)
Navil Pereza7823262020-08-07 17:56:57 +0000194
Alex Klein1699fab2022-09-08 08:46:06 -0600195 def testArgumentValidationMissingBuildTarget(self):
196 """Test missing build target name."""
197 sysroot = sysroot_pb2.Sysroot(
198 path=self.sysroot, build_target=common_pb2.BuildTarget()
199 )
200 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
201 with self.assertRaises(cros_build_lib.DieSystemExit):
202 dependency.List(input_proto, self.response, self.api_config)
Navil Pereza7823262020-08-07 17:56:57 +0000203
Alex Klein1699fab2022-09-08 08:46:06 -0600204 def testDefaultArguments(self):
205 """Test with default arguments."""
206 sysroot = sysroot_pb2.Sysroot(
207 path=self.sysroot, build_target=self.build_target
208 )
209 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
210 mock_get_deps = self.PatchObject(dependency_service, "GetDependencies")
211 dependency.List(input_proto, self.response, self.api_config)
212 mock_get_deps.assert_called_once_with(
213 self.sysroot,
214 src_paths=[],
215 packages=[],
216 include_rev_dependencies=False,
217 )
Navil Perez2c108432021-04-09 04:17:30 +0000218
Alex Klein1699fab2022-09-08 08:46:06 -0600219 def testListResponse(self):
220 """Test calls helper method with correct args."""
221 sysroot = sysroot_pb2.Sysroot(
222 path=self.sysroot, build_target=self.build_target
223 )
224 path = "/path"
225 return_package_info = package_info.parse("foo/bar-1.2.3")
226 return_package_info_proto = common_pb2.PackageInfo(
227 category="foo", package_name="bar", version="1.2.3"
228 )
229 mock_get_deps = self.PatchObject(
230 dependency_service,
231 "GetDependencies",
232 return_value=[return_package_info],
233 )
Navil Perez2c238b52021-03-17 16:33:12 +0000234
Alex Klein1699fab2022-09-08 08:46:06 -0600235 input_package_info_proto = common_pb2.PackageInfo(
236 category="foo", package_name="bar"
237 )
238 input_package_info = package_info.parse("foo/bar")
239 input_proto = depgraph_pb2.ListRequest(
240 sysroot=sysroot,
241 src_paths=[
242 depgraph_pb2.SourcePath(path=path),
243 ],
244 packages=[input_package_info_proto],
245 include_rev_deps=True,
246 )
247 dependency.List(input_proto, self.response, self.api_config)
248 mock_get_deps.assert_called_once_with(
249 self.sysroot,
250 src_paths=[path],
251 packages=[input_package_info],
252 include_rev_dependencies=True,
253 )
254 self.assertCountEqual(
255 [return_package_info_proto], self.response.package_deps
256 )