blob: f1f44af60d0f57564d2f074acc014d9a446ba656 [file] [log] [blame]
Ned Nguyene5d04852019-02-19 16:33:15 -07001# -*- 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"""Board build dependency service tests."""
6
7from __future__ import print_function
8
Navil Pereza7823262020-08-07 17:56:57 +00009import os
Mike Frysingeref94e4c2020-02-10 23:59:54 -050010
Michael Mortensenaf10cca2019-11-18 20:21:32 -070011from chromite.api import api_config
LaMont Jones00b9cff2019-12-12 12:14:07 -070012from chromite.api.controller import controller_util
Alex Kleinec869c12019-07-09 15:22:16 -060013from chromite.api.controller import dependency
Ned Nguyen8e144bd2019-05-02 09:09:41 -060014from chromite.api.gen.chromite.api import depgraph_pb2
Navil Pereza7823262020-08-07 17:56:57 +000015from chromite.api.gen.chromite.api import sysroot_pb2
LaMont Jones00b9cff2019-12-12 12:14:07 -070016from chromite.api.gen.chromiumos import common_pb2
Navil Pereza7823262020-08-07 17:56:57 +000017from chromite.lib import cros_build_lib
Ned Nguyene5d04852019-02-19 16:33:15 -070018from chromite.lib import cros_test_lib
Navil Pereza7823262020-08-07 17:56:57 +000019from chromite.lib import osutils
Navil Perez2c238b52021-03-17 16:33:12 +000020from chromite.lib.parser import package_info
Michael Mortensenaf10cca2019-11-18 20:21:32 -070021from chromite.service import dependency as dependency_service
Ned Nguyene5d04852019-02-19 16:33:15 -070022
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070023pytestmark = cros_test_lib.pytestmark_inside_only
24
Ned Nguyene5d04852019-02-19 16:33:15 -070025
Michael Mortensen3232ab32020-01-05 19:14:36 -070026class BoardBuildDependencyTest(cros_test_lib.MockTestCase,
27 api_config.ApiConfigMixin):
Ned Nguyene5d04852019-02-19 16:33:15 -070028 """Unittests for board_build_dependency."""
29
Michael Mortensenaf10cca2019-11-18 20:21:32 -070030 def setUp(self):
31 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
32 self.json_deps = {
Ned Nguyene5d04852019-02-19 16:33:15 -070033 'target_board': 'deathstar',
LaMont Jones4cbecba2020-05-12 11:54:27 -060034 'sysroot_path': '/build/deathstar',
Ned Nguyene5d04852019-02-19 16:33:15 -070035 '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': [],
Navil Pereza7823262020-08-07 17:56:57 +000050 'deps': ['equipment/jetpack'],
Ned Nguyene5d04852019-02-19 16:33:15 -070051 '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',
Ned Nguyen8be10052019-02-26 08:58:45 -070063 'name': 'robot',
Ned Nguyene5d04852019-02-19 16:33:15 -070064 'version': '2.3.4'
65 },
Navil Pereza7823262020-08-07 17:56:57 +000066 '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 },
77 'source_path_mapping': {
Ned Nguyen8be10052019-02-26 08:58:45 -070078 'commander/darthvader-1.49.3.3': ['/control/room'],
79 'troop/clone-1.2.3': ['/bunker'],
80 'troop/robot-2.3.4': ['/factory'],
Navil Pereza7823262020-08-07 17:56:57 +000081 'equipment/jetpack-3.4.5': ['/factory'],
Ned Nguyene5d04852019-02-19 16:33:15 -070082 },
83 }
84
Michael Mortensenaf10cca2019-11-18 20:21:32 -070085 def testCreateDepGraphProtoFromJsonMap(self):
86 """Test creating DepGraph protobuf from json map."""
Ned Nguyen8e144bd2019-05-02 09:09:41 -060087 depgraph_proto = depgraph_pb2.DepGraph()
Alex Kleinec869c12019-07-09 15:22:16 -060088 dependency.AugmentDepGraphProtoFromJsonMap(
Michael Mortensenaf10cca2019-11-18 20:21:32 -070089 self.json_deps, depgraph_proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070090 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)
Mike Frysinger2d589a12019-08-25 14:15:12 -040096 self.assertEqual(darthvader_dep.dependency_packages[0].category,
97 'troop')
98 self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
99 'clone')
100 self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
101 '/control/room')
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700102
103 def testGetBuildDependencyGraph(self):
104 """GetBuildDependencyGraph calls helper method with correct args."""
Chris McDonalda22b74f2019-11-22 13:55:06 -0700105 patch = self.PatchObject(
106 dependency_service,
107 'GetBuildDependency',
108 return_value=(self.json_deps, self.json_deps))
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700109 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
110 input_proto.build_target.name = 'target'
111 dependency.GetBuildDependencyGraph(input_proto, self.response,
112 self.api_config)
113 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
114 patch.assert_called_once()
115
LaMont Jones00b9cff2019-12-12 12:14:07 -0700116 def testGetBuildDependencyGraphForPackages(self):
117 """GetBuildDependencyGraph calls helper method with correct args."""
118 get_dep = self.PatchObject(
119 dependency_service,
120 'GetBuildDependency',
121 return_value=(self.json_deps, self.json_deps))
122 pkg_mock = 'package-CPV'
123 pkg_to_cpv = self.PatchObject(
124 controller_util,
125 'PackageInfoToCPV', return_value=pkg_mock)
126 package = common_pb2.PackageInfo(
127 package_name='chromeos-chrome', category='chromeos-base')
128 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
129 build_target=common_pb2.BuildTarget(name='target'),
130 packages=[package]
131 )
132 dependency.GetBuildDependencyGraph(input_proto, self.response,
133 self.api_config)
134 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
135 pkg_to_cpv.assert_called_once_with(package)
Alex Kleind8cd4c62020-09-14 13:37:47 -0600136 get_dep.assert_called_once_with('/build/target', 'target', (pkg_mock,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700137
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700138 def testValidateOnly(self):
139 """Sanity check that a validate only call does not execute any logic."""
140 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
141 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
142 input_proto.build_target.name = 'target'
143 dependency.GetBuildDependencyGraph(input_proto, self.response,
144 self.validate_only_config)
145 patch.assert_not_called()
146
147 def testMockCall(self):
148 """Test that a mock call does not execute logic, returns mocked value."""
149 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
150 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
151 input_proto.build_target.name = 'target'
152 dependency.GetBuildDependencyGraph(input_proto, self.response,
153 self.mock_call_config)
154 patch.assert_not_called()
155 self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')
Navil Pereza7823262020-08-07 17:56:57 +0000156
157
158class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
159 """Unittests for the List endpoint."""
160
161 def setUp(self):
162 self.response = depgraph_pb2.ListResponse()
163 self.build_target = common_pb2.BuildTarget(name='target')
164 self.sysroot = os.path.join(self.tempdir, 'target')
165 osutils.SafeMakedirs(self.sysroot)
166
167 def testValidateOnly(self):
168 """Sanity check that a validate only call does not execute any logic."""
169 sysroot = sysroot_pb2.Sysroot(
170 path=self.sysroot, build_target=self.build_target)
171 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
172 dependency.List(input_proto, self.response, self.validate_only_config)
173
174 def testArgumentValidationMissingSysrootPath(self):
175 """Test missing sysroot path."""
176 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
177 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
178 with self.assertRaises(cros_build_lib.DieSystemExit):
179 dependency.List(input_proto, self.response, self.api_config)
180
181 def testArgumentValidationMissingBuildTarget(self):
182 """Test missing build target name."""
183 sysroot = sysroot_pb2.Sysroot(
184 path=self.sysroot, build_target=common_pb2.BuildTarget())
185 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
186 with self.assertRaises(cros_build_lib.DieSystemExit):
187 dependency.List(input_proto, self.response, self.api_config)
188
189 def testListResponse(self):
190 """Test calls helper method with correct args."""
Navil Pereza7823262020-08-07 17:56:57 +0000191 sysroot = sysroot_pb2.Sysroot(
192 path=self.sysroot, build_target=self.build_target)
193 path = '/path'
Navil Perez2c238b52021-03-17 16:33:12 +0000194 return_package_info = package_info.parse('foo/bar-1.2.3')
195 return_package_info_proto = common_pb2.PackageInfo(
196 category='foo', package_name='bar', version='1.2.3')
197 mock_get_deps = self.PatchObject(
198 dependency_service,
199 'GetDependencies',
200 return_value=[return_package_info])
201
202 input_package_info_proto = common_pb2.PackageInfo(
203 category='foo', package_name='bar')
204 input_package_info = package_info.parse('foo/bar')
Navil Pereza7823262020-08-07 17:56:57 +0000205 input_proto = depgraph_pb2.ListRequest(
206 sysroot=sysroot,
207 src_paths=[
Navil Perez2c238b52021-03-17 16:33:12 +0000208 depgraph_pb2.SourcePath(path=path),
Navil Pereza7823262020-08-07 17:56:57 +0000209 ],
Navil Perez2c238b52021-03-17 16:33:12 +0000210 packages=[input_package_info_proto])
Navil Pereza7823262020-08-07 17:56:57 +0000211 dependency.List(input_proto, self.response, self.api_config)
212 mock_get_deps.assert_called_once_with(
Navil Perez2c238b52021-03-17 16:33:12 +0000213 self.sysroot, src_paths=[path], packages=[input_package_info])
214 self.assertCountEqual([return_package_info_proto],
215 self.response.package_deps)