blob: b61b296301d21e52e8c71f8dc8f3036136076a16 [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
Michael Mortensenaf10cca2019-11-18 20:21:32 -070020from chromite.service import dependency as dependency_service
Ned Nguyene5d04852019-02-19 16:33:15 -070021
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070022pytestmark = cros_test_lib.pytestmark_inside_only
23
Ned Nguyene5d04852019-02-19 16:33:15 -070024
Michael Mortensen3232ab32020-01-05 19:14:36 -070025class BoardBuildDependencyTest(cros_test_lib.MockTestCase,
26 api_config.ApiConfigMixin):
Ned Nguyene5d04852019-02-19 16:33:15 -070027 """Unittests for board_build_dependency."""
28
Michael Mortensenaf10cca2019-11-18 20:21:32 -070029 def setUp(self):
30 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
31 self.json_deps = {
Ned Nguyene5d04852019-02-19 16:33:15 -070032 'target_board': 'deathstar',
LaMont Jones4cbecba2020-05-12 11:54:27 -060033 'sysroot_path': '/build/deathstar',
Ned Nguyene5d04852019-02-19 16:33:15 -070034 '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': [],
Navil Pereza7823262020-08-07 17:56:57 +000049 'deps': ['equipment/jetpack'],
Ned Nguyene5d04852019-02-19 16:33:15 -070050 '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',
Ned Nguyen8be10052019-02-26 08:58:45 -070062 'name': 'robot',
Ned Nguyene5d04852019-02-19 16:33:15 -070063 'version': '2.3.4'
64 },
Navil Pereza7823262020-08-07 17:56:57 +000065 '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 },
76 'source_path_mapping': {
Ned Nguyen8be10052019-02-26 08:58:45 -070077 'commander/darthvader-1.49.3.3': ['/control/room'],
78 'troop/clone-1.2.3': ['/bunker'],
79 'troop/robot-2.3.4': ['/factory'],
Navil Pereza7823262020-08-07 17:56:57 +000080 'equipment/jetpack-3.4.5': ['/factory'],
Ned Nguyene5d04852019-02-19 16:33:15 -070081 },
82 }
83
Michael Mortensenaf10cca2019-11-18 20:21:32 -070084 def testCreateDepGraphProtoFromJsonMap(self):
85 """Test creating DepGraph protobuf from json map."""
Ned Nguyen8e144bd2019-05-02 09:09:41 -060086 depgraph_proto = depgraph_pb2.DepGraph()
Alex Kleinec869c12019-07-09 15:22:16 -060087 dependency.AugmentDepGraphProtoFromJsonMap(
Michael Mortensenaf10cca2019-11-18 20:21:32 -070088 self.json_deps, depgraph_proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070089 self.assertEqual(depgraph_proto.build_target.name, 'deathstar')
90 darthvader_dep = None
91 for package_dep_info in depgraph_proto.package_deps:
92 if package_dep_info.package_info.package_name == 'darthvader':
93 darthvader_dep = package_dep_info
94 self.assertTrue(darthvader_dep)
Mike Frysinger2d589a12019-08-25 14:15:12 -040095 self.assertEqual(darthvader_dep.dependency_packages[0].category,
96 'troop')
97 self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
98 'clone')
99 self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
100 '/control/room')
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700101
102 def testGetBuildDependencyGraph(self):
103 """GetBuildDependencyGraph calls helper method with correct args."""
Chris McDonalda22b74f2019-11-22 13:55:06 -0700104 patch = self.PatchObject(
105 dependency_service,
106 'GetBuildDependency',
107 return_value=(self.json_deps, self.json_deps))
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700108 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
109 input_proto.build_target.name = 'target'
110 dependency.GetBuildDependencyGraph(input_proto, self.response,
111 self.api_config)
112 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
113 patch.assert_called_once()
114
LaMont Jones00b9cff2019-12-12 12:14:07 -0700115 def testGetBuildDependencyGraphForPackages(self):
116 """GetBuildDependencyGraph calls helper method with correct args."""
117 get_dep = self.PatchObject(
118 dependency_service,
119 'GetBuildDependency',
120 return_value=(self.json_deps, self.json_deps))
121 pkg_mock = 'package-CPV'
122 pkg_to_cpv = self.PatchObject(
123 controller_util,
124 'PackageInfoToCPV', return_value=pkg_mock)
125 package = common_pb2.PackageInfo(
126 package_name='chromeos-chrome', category='chromeos-base')
127 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
128 build_target=common_pb2.BuildTarget(name='target'),
129 packages=[package]
130 )
131 dependency.GetBuildDependencyGraph(input_proto, self.response,
132 self.api_config)
133 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
134 pkg_to_cpv.assert_called_once_with(package)
Alex Kleind8cd4c62020-09-14 13:37:47 -0600135 get_dep.assert_called_once_with('/build/target', 'target', (pkg_mock,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700136
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700137 def testValidateOnly(self):
138 """Sanity check that a validate only call does not execute any logic."""
139 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
140 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
141 input_proto.build_target.name = 'target'
142 dependency.GetBuildDependencyGraph(input_proto, self.response,
143 self.validate_only_config)
144 patch.assert_not_called()
145
146 def testMockCall(self):
147 """Test that a mock call does not execute logic, returns mocked value."""
148 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
149 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
150 input_proto.build_target.name = 'target'
151 dependency.GetBuildDependencyGraph(input_proto, self.response,
152 self.mock_call_config)
153 patch.assert_not_called()
154 self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')
Navil Pereza7823262020-08-07 17:56:57 +0000155
156
157class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
158 """Unittests for the List endpoint."""
159
160 def setUp(self):
161 self.response = depgraph_pb2.ListResponse()
162 self.build_target = common_pb2.BuildTarget(name='target')
163 self.sysroot = os.path.join(self.tempdir, 'target')
164 osutils.SafeMakedirs(self.sysroot)
165
166 def testValidateOnly(self):
167 """Sanity check that a validate only call does not execute any logic."""
168 sysroot = sysroot_pb2.Sysroot(
169 path=self.sysroot, build_target=self.build_target)
170 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
171 dependency.List(input_proto, self.response, self.validate_only_config)
172
173 def testArgumentValidationMissingSysrootPath(self):
174 """Test missing sysroot path."""
175 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
176 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
177 with self.assertRaises(cros_build_lib.DieSystemExit):
178 dependency.List(input_proto, self.response, self.api_config)
179
180 def testArgumentValidationMissingBuildTarget(self):
181 """Test missing build target name."""
182 sysroot = sysroot_pb2.Sysroot(
183 path=self.sysroot, build_target=common_pb2.BuildTarget())
184 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
185 with self.assertRaises(cros_build_lib.DieSystemExit):
186 dependency.List(input_proto, self.response, self.api_config)
187
188 def testListResponse(self):
189 """Test calls helper method with correct args."""
190 mock_get_deps = self.PatchObject(
191 dependency_service, 'GetDependencies', return_value=['foo/bar-1.2.3'])
192 sysroot = sysroot_pb2.Sysroot(
193 path=self.sysroot, build_target=self.build_target)
194 path = '/path'
195 package = common_pb2.PackageInfo(category='foo', package_name='bar')
196 input_proto = depgraph_pb2.ListRequest(
197 sysroot=sysroot,
198 src_paths=[
199 depgraph_pb2.SourcePath(path='/path'),
200 ],
201 packages=[package])
202 dependency.List(input_proto, self.response, self.api_config)
203 mock_get_deps.assert_called_once_with(
204 self.sysroot,
205 build_target=controller_util.ParseBuildTarget(self.build_target),
206 src_paths=[path],
207 packages=[controller_util.PackageInfoToCPV(package)])
208 expected_deps = [
209 common_pb2.PackageInfo(
210 category='foo', package_name='bar', version='1.2.3')
211 ]
212 self.assertCountEqual(expected_deps, self.response.package_deps)