blob: 9dfd670d6a1923573fa68c4f12086f2b1ecfa9f2 [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 -050010import sys
11
Michael Mortensenaf10cca2019-11-18 20:21:32 -070012from chromite.api import api_config
LaMont Jones00b9cff2019-12-12 12:14:07 -070013from chromite.api.controller import controller_util
Alex Kleinec869c12019-07-09 15:22:16 -060014from chromite.api.controller import dependency
Ned Nguyen8e144bd2019-05-02 09:09:41 -060015from chromite.api.gen.chromite.api import depgraph_pb2
Navil Pereza7823262020-08-07 17:56:57 +000016from chromite.api.gen.chromite.api import sysroot_pb2
LaMont Jones00b9cff2019-12-12 12:14:07 -070017from chromite.api.gen.chromiumos import common_pb2
Navil Pereza7823262020-08-07 17:56:57 +000018from chromite.lib import cros_build_lib
Ned Nguyene5d04852019-02-19 16:33:15 -070019from chromite.lib import cros_test_lib
Navil Pereza7823262020-08-07 17:56:57 +000020from chromite.lib import osutils
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
Mike Frysingeref94e4c2020-02-10 23:59:54 -050026assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
27
28
Michael Mortensen3232ab32020-01-05 19:14:36 -070029class BoardBuildDependencyTest(cros_test_lib.MockTestCase,
30 api_config.ApiConfigMixin):
Ned Nguyene5d04852019-02-19 16:33:15 -070031 """Unittests for board_build_dependency."""
32
Michael Mortensenaf10cca2019-11-18 20:21:32 -070033 def setUp(self):
34 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
35 self.json_deps = {
Ned Nguyene5d04852019-02-19 16:33:15 -070036 'target_board': 'deathstar',
LaMont Jones4cbecba2020-05-12 11:54:27 -060037 'sysroot_path': '/build/deathstar',
Ned Nguyene5d04852019-02-19 16:33:15 -070038 'package_deps': {
39 'commander/darthvader-1.49.3.3': {
40 'action': 'merge',
41 'category': 'commander',
42 'cpes': [],
43 'deps': ['troop/clone', 'troop/robot'],
44 'rev_deps': [],
45 'full_name': 'commander/darthvader-1.49.3.3',
46 'name': 'darthvader',
47 'version': '1.49.3.3'
48 },
49 'troop/clone-1.2.3': {
50 'action': 'merge',
51 'category': 'troop',
52 'cpes': [],
Navil Pereza7823262020-08-07 17:56:57 +000053 'deps': ['equipment/jetpack'],
Ned Nguyene5d04852019-02-19 16:33:15 -070054 'rev_deps': ['commander/darthvader'],
55 'full_name': 'troop/clone-1.2.3',
56 'name': 'clone',
57 'version': '1.2.3'
58 },
59 'troop/robot-2.3.4': {
60 'action': 'merge',
61 'category': 'troop',
62 'cpes': [],
63 'deps': [],
64 'rev_deps': ['commander/darthvader'],
65 'full_name': 'troop/robot-2.3.4',
Ned Nguyen8be10052019-02-26 08:58:45 -070066 'name': 'robot',
Ned Nguyene5d04852019-02-19 16:33:15 -070067 'version': '2.3.4'
68 },
Navil Pereza7823262020-08-07 17:56:57 +000069 'equipment/jetpack-3.4.5': {
70 'action': 'merge',
71 'category': 'equipment',
72 'cpes': [],
73 'deps': [],
74 'rev_deps': ['commander/darthvader'],
75 'full_name': 'equipment/jetpack-3.4.5',
76 'name': 'jetpack',
77 'version': '3.4.5'
78 },
Ned Nguyene5d04852019-02-19 16:33:15 -070079 },
80 'source_path_mapping': {
Ned Nguyen8be10052019-02-26 08:58:45 -070081 'commander/darthvader-1.49.3.3': ['/control/room'],
82 'troop/clone-1.2.3': ['/bunker'],
83 'troop/robot-2.3.4': ['/factory'],
Navil Pereza7823262020-08-07 17:56:57 +000084 'equipment/jetpack-3.4.5': ['/factory'],
Ned Nguyene5d04852019-02-19 16:33:15 -070085 },
86 }
87
Michael Mortensenaf10cca2019-11-18 20:21:32 -070088 def testCreateDepGraphProtoFromJsonMap(self):
89 """Test creating DepGraph protobuf from json map."""
Ned Nguyen8e144bd2019-05-02 09:09:41 -060090 depgraph_proto = depgraph_pb2.DepGraph()
Alex Kleinec869c12019-07-09 15:22:16 -060091 dependency.AugmentDepGraphProtoFromJsonMap(
Michael Mortensenaf10cca2019-11-18 20:21:32 -070092 self.json_deps, depgraph_proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070093 self.assertEqual(depgraph_proto.build_target.name, 'deathstar')
94 darthvader_dep = None
95 for package_dep_info in depgraph_proto.package_deps:
96 if package_dep_info.package_info.package_name == 'darthvader':
97 darthvader_dep = package_dep_info
98 self.assertTrue(darthvader_dep)
Mike Frysinger2d589a12019-08-25 14:15:12 -040099 self.assertEqual(darthvader_dep.dependency_packages[0].category,
100 'troop')
101 self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
102 'clone')
103 self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
104 '/control/room')
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700105
106 def testGetBuildDependencyGraph(self):
107 """GetBuildDependencyGraph calls helper method with correct args."""
Chris McDonalda22b74f2019-11-22 13:55:06 -0700108 patch = self.PatchObject(
109 dependency_service,
110 'GetBuildDependency',
111 return_value=(self.json_deps, self.json_deps))
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700112 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
113 input_proto.build_target.name = 'target'
114 dependency.GetBuildDependencyGraph(input_proto, self.response,
115 self.api_config)
116 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
117 patch.assert_called_once()
118
LaMont Jones00b9cff2019-12-12 12:14:07 -0700119 def testGetBuildDependencyGraphForPackages(self):
120 """GetBuildDependencyGraph calls helper method with correct args."""
121 get_dep = self.PatchObject(
122 dependency_service,
123 'GetBuildDependency',
124 return_value=(self.json_deps, self.json_deps))
125 pkg_mock = 'package-CPV'
126 pkg_to_cpv = self.PatchObject(
127 controller_util,
128 'PackageInfoToCPV', return_value=pkg_mock)
129 package = common_pb2.PackageInfo(
130 package_name='chromeos-chrome', category='chromeos-base')
131 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
132 build_target=common_pb2.BuildTarget(name='target'),
133 packages=[package]
134 )
135 dependency.GetBuildDependencyGraph(input_proto, self.response,
136 self.api_config)
137 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
138 pkg_to_cpv.assert_called_once_with(package)
Alex Kleind8cd4c62020-09-14 13:37:47 -0600139 get_dep.assert_called_once_with('/build/target', 'target', (pkg_mock,))
LaMont Jones00b9cff2019-12-12 12:14:07 -0700140
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700141 def testValidateOnly(self):
142 """Sanity check that a validate only call does not execute any logic."""
143 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
144 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
145 input_proto.build_target.name = 'target'
146 dependency.GetBuildDependencyGraph(input_proto, self.response,
147 self.validate_only_config)
148 patch.assert_not_called()
149
150 def testMockCall(self):
151 """Test that a mock call does not execute logic, returns mocked value."""
152 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
153 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
154 input_proto.build_target.name = 'target'
155 dependency.GetBuildDependencyGraph(input_proto, self.response,
156 self.mock_call_config)
157 patch.assert_not_called()
158 self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')
Navil Pereza7823262020-08-07 17:56:57 +0000159
160
161class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
162 """Unittests for the List endpoint."""
163
164 def setUp(self):
165 self.response = depgraph_pb2.ListResponse()
166 self.build_target = common_pb2.BuildTarget(name='target')
167 self.sysroot = os.path.join(self.tempdir, 'target')
168 osutils.SafeMakedirs(self.sysroot)
169
170 def testValidateOnly(self):
171 """Sanity check that a validate only call does not execute any logic."""
172 sysroot = sysroot_pb2.Sysroot(
173 path=self.sysroot, build_target=self.build_target)
174 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
175 dependency.List(input_proto, self.response, self.validate_only_config)
176
177 def testArgumentValidationMissingSysrootPath(self):
178 """Test missing sysroot path."""
179 sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
180 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
181 with self.assertRaises(cros_build_lib.DieSystemExit):
182 dependency.List(input_proto, self.response, self.api_config)
183
184 def testArgumentValidationMissingBuildTarget(self):
185 """Test missing build target name."""
186 sysroot = sysroot_pb2.Sysroot(
187 path=self.sysroot, build_target=common_pb2.BuildTarget())
188 input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
189 with self.assertRaises(cros_build_lib.DieSystemExit):
190 dependency.List(input_proto, self.response, self.api_config)
191
192 def testListResponse(self):
193 """Test calls helper method with correct args."""
194 mock_get_deps = self.PatchObject(
195 dependency_service, 'GetDependencies', return_value=['foo/bar-1.2.3'])
196 sysroot = sysroot_pb2.Sysroot(
197 path=self.sysroot, build_target=self.build_target)
198 path = '/path'
199 package = common_pb2.PackageInfo(category='foo', package_name='bar')
200 input_proto = depgraph_pb2.ListRequest(
201 sysroot=sysroot,
202 src_paths=[
203 depgraph_pb2.SourcePath(path='/path'),
204 ],
205 packages=[package])
206 dependency.List(input_proto, self.response, self.api_config)
207 mock_get_deps.assert_called_once_with(
208 self.sysroot,
209 build_target=controller_util.ParseBuildTarget(self.build_target),
210 src_paths=[path],
211 packages=[controller_util.PackageInfoToCPV(package)])
212 expected_deps = [
213 common_pb2.PackageInfo(
214 category='foo', package_name='bar', version='1.2.3')
215 ]
216 self.assertCountEqual(expected_deps, self.response.package_deps)