blob: 83aeec8bd6a278c29dba3c9d316d0c3cad10e4aa [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
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 )
Alex Kleind3b84042023-05-19 14:43:59 -0600128 pkg_atom = "chromeos-base/chromeos-chrome"
Alex Klein1699fab2022-09-08 08:46:06 -0600129 package = common_pb2.PackageInfo(
130 package_name="chromeos-chrome", category="chromeos-base"
131 )
132 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
133 build_target=common_pb2.BuildTarget(name="target"),
134 packages=[package],
135 )
136 dependency.GetBuildDependencyGraph(
137 input_proto, self.response, self.api_config
138 )
139 self.assertEqual(self.response.dep_graph.build_target.name, "deathstar")
Alex Kleind3b84042023-05-19 14:43:59 -0600140 get_dep.assert_called_once_with("/build/target", "target", (pkg_atom,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700141
Alex Klein1699fab2022-09-08 08:46:06 -0600142 def testValidateOnly(self):
143 """Test that a validate only call does not execute any logic."""
144 patch = self.PatchObject(dependency_service, "GetBuildDependency")
145 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
146 input_proto.build_target.name = "target"
147 dependency.GetBuildDependencyGraph(
148 input_proto, self.response, self.validate_only_config
149 )
150 patch.assert_not_called()
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700151
Alex Klein1699fab2022-09-08 08:46:06 -0600152 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700153 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600154 patch = self.PatchObject(dependency_service, "GetBuildDependency")
155 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
156 input_proto.build_target.name = "target"
157 dependency.GetBuildDependencyGraph(
158 input_proto, self.response, self.mock_call_config
159 )
160 patch.assert_not_called()
161 self.assertEqual(
162 self.response.dep_graph.build_target.name, "target_board"
163 )
Navil Pereza7823262020-08-07 17:56:57 +0000164
165
166class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600167 """Unittests for the List endpoint."""
Navil Pereza7823262020-08-07 17:56:57 +0000168
Alex Klein1699fab2022-09-08 08:46:06 -0600169 def setUp(self):
170 self.response = depgraph_pb2.ListResponse()
171 self.build_target = common_pb2.BuildTarget(name="target")
172 self.sysroot = os.path.join(self.tempdir, "target")
173 osutils.SafeMakedirs(self.sysroot)
Navil Pereza7823262020-08-07 17:56:57 +0000174
Alex Klein1699fab2022-09-08 08:46:06 -0600175 def testValidateOnly(self):
176 """Test that a validate only call does not execute any logic."""
177 sysroot = sysroot_pb2.Sysroot(
178 path=self.sysroot, build_target=self.build_target
179 )
180 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
181 dependency.List(input_proto, self.response, self.validate_only_config)
Navil Pereza7823262020-08-07 17:56:57 +0000182
Alex Klein1699fab2022-09-08 08:46:06 -0600183 def testArgumentValidationMissingSysrootPath(self):
184 """Test missing sysroot path."""
185 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
186 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
187 with self.assertRaises(cros_build_lib.DieSystemExit):
188 dependency.List(input_proto, self.response, self.api_config)
Navil Pereza7823262020-08-07 17:56:57 +0000189
Alex Klein1699fab2022-09-08 08:46:06 -0600190 def testArgumentValidationMissingBuildTarget(self):
191 """Test missing build target name."""
192 sysroot = sysroot_pb2.Sysroot(
193 path=self.sysroot, build_target=common_pb2.BuildTarget()
194 )
195 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
196 with self.assertRaises(cros_build_lib.DieSystemExit):
197 dependency.List(input_proto, self.response, self.api_config)
Navil Pereza7823262020-08-07 17:56:57 +0000198
Alex Klein1699fab2022-09-08 08:46:06 -0600199 def testDefaultArguments(self):
200 """Test with default arguments."""
201 sysroot = sysroot_pb2.Sysroot(
202 path=self.sysroot, build_target=self.build_target
203 )
204 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
205 mock_get_deps = self.PatchObject(dependency_service, "GetDependencies")
206 dependency.List(input_proto, self.response, self.api_config)
207 mock_get_deps.assert_called_once_with(
208 self.sysroot,
209 src_paths=[],
210 packages=[],
Alex Klein19c06742022-08-08 18:10:27 -0600211 include_affected_pkgs=False,
Alex Klein1699fab2022-09-08 08:46:06 -0600212 )
Navil Perez2c108432021-04-09 04:17:30 +0000213
Alex Klein1699fab2022-09-08 08:46:06 -0600214 def testListResponse(self):
215 """Test calls helper method with correct args."""
216 sysroot = sysroot_pb2.Sysroot(
217 path=self.sysroot, build_target=self.build_target
218 )
219 path = "/path"
220 return_package_info = package_info.parse("foo/bar-1.2.3")
221 return_package_info_proto = common_pb2.PackageInfo(
222 category="foo", package_name="bar", version="1.2.3"
223 )
224 mock_get_deps = self.PatchObject(
225 dependency_service,
226 "GetDependencies",
227 return_value=[return_package_info],
228 )
Navil Perez2c238b52021-03-17 16:33:12 +0000229
Alex Klein1699fab2022-09-08 08:46:06 -0600230 input_package_info_proto = common_pb2.PackageInfo(
231 category="foo", package_name="bar"
232 )
233 input_package_info = package_info.parse("foo/bar")
234 input_proto = depgraph_pb2.ListRequest(
235 sysroot=sysroot,
236 src_paths=[
237 depgraph_pb2.SourcePath(path=path),
238 ],
239 packages=[input_package_info_proto],
240 include_rev_deps=True,
241 )
242 dependency.List(input_proto, self.response, self.api_config)
243 mock_get_deps.assert_called_once_with(
244 self.sysroot,
245 src_paths=[path],
246 packages=[input_package_info],
Alex Klein19c06742022-08-08 18:10:27 -0600247 include_affected_pkgs=True,
Alex Klein1699fab2022-09-08 08:46:06 -0600248 )
249 self.assertCountEqual(
250 [return_package_info_proto], self.response.package_deps
251 )