blob: 5bd1122994a9140b3b145f7a8446070d3f138a47 [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
Michael Mortensen3232ab32020-01-05 19:14:36 -070024class BoardBuildDependencyTest(cros_test_lib.MockTestCase,
25 api_config.ApiConfigMixin):
Ned Nguyene5d04852019-02-19 16:33:15 -070026 """Unittests for board_build_dependency."""
27
Michael Mortensenaf10cca2019-11-18 20:21:32 -070028 def setUp(self):
29 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
30 self.json_deps = {
Ned Nguyene5d04852019-02-19 16:33:15 -070031 'target_board': 'deathstar',
LaMont Jones4cbecba2020-05-12 11:54:27 -060032 'sysroot_path': '/build/deathstar',
Ned Nguyene5d04852019-02-19 16:33:15 -070033 'package_deps': {
34 'commander/darthvader-1.49.3.3': {
35 'action': 'merge',
36 'category': 'commander',
37 'cpes': [],
38 'deps': ['troop/clone', 'troop/robot'],
39 'rev_deps': [],
40 'full_name': 'commander/darthvader-1.49.3.3',
41 'name': 'darthvader',
42 'version': '1.49.3.3'
43 },
44 'troop/clone-1.2.3': {
45 'action': 'merge',
46 'category': 'troop',
47 'cpes': [],
Navil Pereza7823262020-08-07 17:56:57 +000048 'deps': ['equipment/jetpack'],
Ned Nguyene5d04852019-02-19 16:33:15 -070049 'rev_deps': ['commander/darthvader'],
50 'full_name': 'troop/clone-1.2.3',
51 'name': 'clone',
52 'version': '1.2.3'
53 },
54 'troop/robot-2.3.4': {
55 'action': 'merge',
56 'category': 'troop',
57 'cpes': [],
58 'deps': [],
59 'rev_deps': ['commander/darthvader'],
60 'full_name': 'troop/robot-2.3.4',
Ned Nguyen8be10052019-02-26 08:58:45 -070061 'name': 'robot',
Ned Nguyene5d04852019-02-19 16:33:15 -070062 'version': '2.3.4'
63 },
Navil Pereza7823262020-08-07 17:56:57 +000064 'equipment/jetpack-3.4.5': {
65 'action': 'merge',
66 'category': 'equipment',
67 'cpes': [],
68 'deps': [],
69 'rev_deps': ['commander/darthvader'],
70 'full_name': 'equipment/jetpack-3.4.5',
71 'name': 'jetpack',
72 'version': '3.4.5'
73 },
Ned Nguyene5d04852019-02-19 16:33:15 -070074 },
75 'source_path_mapping': {
Ned Nguyen8be10052019-02-26 08:58:45 -070076 'commander/darthvader-1.49.3.3': ['/control/room'],
77 'troop/clone-1.2.3': ['/bunker'],
78 'troop/robot-2.3.4': ['/factory'],
Navil Pereza7823262020-08-07 17:56:57 +000079 'equipment/jetpack-3.4.5': ['/factory'],
Ned Nguyene5d04852019-02-19 16:33:15 -070080 },
81 }
82
Michael Mortensenaf10cca2019-11-18 20:21:32 -070083 def testCreateDepGraphProtoFromJsonMap(self):
84 """Test creating DepGraph protobuf from json map."""
Ned Nguyen8e144bd2019-05-02 09:09:41 -060085 depgraph_proto = depgraph_pb2.DepGraph()
Alex Kleinec869c12019-07-09 15:22:16 -060086 dependency.AugmentDepGraphProtoFromJsonMap(
Michael Mortensenaf10cca2019-11-18 20:21:32 -070087 self.json_deps, depgraph_proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070088 self.assertEqual(depgraph_proto.build_target.name, 'deathstar')
89 darthvader_dep = None
90 for package_dep_info in depgraph_proto.package_deps:
91 if package_dep_info.package_info.package_name == 'darthvader':
92 darthvader_dep = package_dep_info
93 self.assertTrue(darthvader_dep)
Mike Frysinger2d589a12019-08-25 14:15:12 -040094 self.assertEqual(darthvader_dep.dependency_packages[0].category,
95 'troop')
96 self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
97 'clone')
98 self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
99 '/control/room')
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700100
101 def testGetBuildDependencyGraph(self):
102 """GetBuildDependencyGraph calls helper method with correct args."""
Chris McDonalda22b74f2019-11-22 13:55:06 -0700103 patch = self.PatchObject(
104 dependency_service,
105 'GetBuildDependency',
106 return_value=(self.json_deps, self.json_deps))
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700107 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
108 input_proto.build_target.name = 'target'
109 dependency.GetBuildDependencyGraph(input_proto, self.response,
110 self.api_config)
111 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
112 patch.assert_called_once()
113
LaMont Jones00b9cff2019-12-12 12:14:07 -0700114 def testGetBuildDependencyGraphForPackages(self):
115 """GetBuildDependencyGraph calls helper method with correct args."""
116 get_dep = self.PatchObject(
117 dependency_service,
118 'GetBuildDependency',
119 return_value=(self.json_deps, self.json_deps))
120 pkg_mock = 'package-CPV'
121 pkg_to_cpv = self.PatchObject(
122 controller_util,
123 'PackageInfoToCPV', return_value=pkg_mock)
124 package = common_pb2.PackageInfo(
125 package_name='chromeos-chrome', category='chromeos-base')
126 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
127 build_target=common_pb2.BuildTarget(name='target'),
128 packages=[package]
129 )
130 dependency.GetBuildDependencyGraph(input_proto, self.response,
131 self.api_config)
132 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
133 pkg_to_cpv.assert_called_once_with(package)
Alex Kleind8cd4c62020-09-14 13:37:47 -0600134 get_dep.assert_called_once_with('/build/target', 'target', (pkg_mock,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700135
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700136 def testValidateOnly(self):
Navil Perez2c108432021-04-09 04:17:30 +0000137 """Test that a validate only call does not execute any logic."""
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700138 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
139 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
140 input_proto.build_target.name = 'target'
141 dependency.GetBuildDependencyGraph(input_proto, self.response,
142 self.validate_only_config)
143 patch.assert_not_called()
144
145 def testMockCall(self):
146 """Test that a mock call does not execute logic, returns mocked value."""
147 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
148 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
149 input_proto.build_target.name = 'target'
150 dependency.GetBuildDependencyGraph(input_proto, self.response,
151 self.mock_call_config)
152 patch.assert_not_called()
153 self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')
Navil Pereza7823262020-08-07 17:56:57 +0000154
155
156class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
157 """Unittests for the List endpoint."""
158
159 def setUp(self):
160 self.response = depgraph_pb2.ListResponse()
161 self.build_target = common_pb2.BuildTarget(name='target')
162 self.sysroot = os.path.join(self.tempdir, 'target')
163 osutils.SafeMakedirs(self.sysroot)
164
165 def testValidateOnly(self):
Navil Perez2c108432021-04-09 04:17:30 +0000166 """Test that a validate only call does not execute any logic."""
Navil Pereza7823262020-08-07 17:56:57 +0000167 sysroot = sysroot_pb2.Sysroot(
168 path=self.sysroot, build_target=self.build_target)
169 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
170 dependency.List(input_proto, self.response, self.validate_only_config)
171
172 def testArgumentValidationMissingSysrootPath(self):
173 """Test missing sysroot path."""
174 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
175 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
176 with self.assertRaises(cros_build_lib.DieSystemExit):
177 dependency.List(input_proto, self.response, self.api_config)
178
179 def testArgumentValidationMissingBuildTarget(self):
180 """Test missing build target name."""
181 sysroot = sysroot_pb2.Sysroot(
182 path=self.sysroot, build_target=common_pb2.BuildTarget())
183 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
184 with self.assertRaises(cros_build_lib.DieSystemExit):
185 dependency.List(input_proto, self.response, self.api_config)
186
Navil Perez2c108432021-04-09 04:17:30 +0000187 def testDefaultArguments(self):
188 """Test with default arguments."""
189 sysroot = sysroot_pb2.Sysroot(
190 path=self.sysroot, build_target=self.build_target)
191 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
192 mock_get_deps = self.PatchObject(dependency_service, 'GetDependencies')
193 dependency.List(input_proto, self.response, self.api_config)
194 mock_get_deps.assert_called_once_with(
195 self.sysroot, src_paths=[], packages=[], include_rev_dependencies=False)
196
Navil Pereza7823262020-08-07 17:56:57 +0000197 def testListResponse(self):
198 """Test calls helper method with correct args."""
Navil Pereza7823262020-08-07 17:56:57 +0000199 sysroot = sysroot_pb2.Sysroot(
200 path=self.sysroot, build_target=self.build_target)
201 path = '/path'
Navil Perez2c238b52021-03-17 16:33:12 +0000202 return_package_info = package_info.parse('foo/bar-1.2.3')
203 return_package_info_proto = common_pb2.PackageInfo(
204 category='foo', package_name='bar', version='1.2.3')
205 mock_get_deps = self.PatchObject(
206 dependency_service,
207 'GetDependencies',
208 return_value=[return_package_info])
209
210 input_package_info_proto = common_pb2.PackageInfo(
211 category='foo', package_name='bar')
212 input_package_info = package_info.parse('foo/bar')
Navil Pereza7823262020-08-07 17:56:57 +0000213 input_proto = depgraph_pb2.ListRequest(
214 sysroot=sysroot,
215 src_paths=[
Navil Perez2c238b52021-03-17 16:33:12 +0000216 depgraph_pb2.SourcePath(path=path),
Navil Pereza7823262020-08-07 17:56:57 +0000217 ],
Navil Perez2c108432021-04-09 04:17:30 +0000218 packages=[input_package_info_proto],
219 include_rev_deps=True)
Navil Pereza7823262020-08-07 17:56:57 +0000220 dependency.List(input_proto, self.response, self.api_config)
221 mock_get_deps.assert_called_once_with(
Navil Perez3fa1ca82021-03-19 13:53:20 +0000222 self.sysroot,
223 src_paths=[path],
224 packages=[input_package_info],
225 include_rev_dependencies=True)
Navil Perez2c238b52021-03-17 16:33:12 +0000226 self.assertCountEqual([return_package_info_proto],
227 self.response.package_deps)