blob: 34758c6e6ea9b68850d160ce6e2fe5c3eeb33295 [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
Mike Frysingeref94e4c2020-02-10 23:59:54 -05009import sys
10
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
LaMont Jones00b9cff2019-12-12 12:14:07 -070015from chromite.api.gen.chromiumos import common_pb2
Ned Nguyene5d04852019-02-19 16:33:15 -070016from chromite.lib import cros_test_lib
Michael Mortensenaf10cca2019-11-18 20:21:32 -070017from chromite.service import dependency as dependency_service
Ned Nguyene5d04852019-02-19 16:33:15 -070018
Greg Edelstona4c9b3b2020-01-07 17:51:13 -070019pytestmark = cros_test_lib.pytestmark_inside_only
20
Ned Nguyene5d04852019-02-19 16:33:15 -070021
Mike Frysingeref94e4c2020-02-10 23:59:54 -050022assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
23
24
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',
33 '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': [],
48 'deps': [],
49 '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 },
64 },
65 'source_path_mapping': {
Ned Nguyen8be10052019-02-26 08:58:45 -070066 'commander/darthvader-1.49.3.3': ['/control/room'],
67 'troop/clone-1.2.3': ['/bunker'],
68 'troop/robot-2.3.4': ['/factory'],
Ned Nguyene5d04852019-02-19 16:33:15 -070069 },
70 }
71
Michael Mortensenaf10cca2019-11-18 20:21:32 -070072 def testCreateDepGraphProtoFromJsonMap(self):
73 """Test creating DepGraph protobuf from json map."""
Ned Nguyen8e144bd2019-05-02 09:09:41 -060074 depgraph_proto = depgraph_pb2.DepGraph()
Alex Kleinec869c12019-07-09 15:22:16 -060075 dependency.AugmentDepGraphProtoFromJsonMap(
Michael Mortensenaf10cca2019-11-18 20:21:32 -070076 self.json_deps, depgraph_proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070077 self.assertEqual(depgraph_proto.build_target.name, 'deathstar')
78 darthvader_dep = None
79 for package_dep_info in depgraph_proto.package_deps:
80 if package_dep_info.package_info.package_name == 'darthvader':
81 darthvader_dep = package_dep_info
82 self.assertTrue(darthvader_dep)
Mike Frysinger2d589a12019-08-25 14:15:12 -040083 self.assertEqual(darthvader_dep.dependency_packages[0].category,
84 'troop')
85 self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
86 'clone')
87 self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
88 '/control/room')
Michael Mortensenaf10cca2019-11-18 20:21:32 -070089
90 def testGetBuildDependencyGraph(self):
91 """GetBuildDependencyGraph calls helper method with correct args."""
Chris McDonalda22b74f2019-11-22 13:55:06 -070092 patch = self.PatchObject(
93 dependency_service,
94 'GetBuildDependency',
95 return_value=(self.json_deps, self.json_deps))
Michael Mortensenaf10cca2019-11-18 20:21:32 -070096 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
97 input_proto.build_target.name = 'target'
98 dependency.GetBuildDependencyGraph(input_proto, self.response,
99 self.api_config)
100 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
101 patch.assert_called_once()
102
LaMont Jones00b9cff2019-12-12 12:14:07 -0700103 def testGetBuildDependencyGraphForPackages(self):
104 """GetBuildDependencyGraph calls helper method with correct args."""
105 get_dep = self.PatchObject(
106 dependency_service,
107 'GetBuildDependency',
108 return_value=(self.json_deps, self.json_deps))
109 pkg_mock = 'package-CPV'
110 pkg_to_cpv = self.PatchObject(
111 controller_util,
112 'PackageInfoToCPV', return_value=pkg_mock)
113 package = common_pb2.PackageInfo(
114 package_name='chromeos-chrome', category='chromeos-base')
115 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
116 build_target=common_pb2.BuildTarget(name='target'),
117 packages=[package]
118 )
119 dependency.GetBuildDependencyGraph(input_proto, self.response,
120 self.api_config)
121 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
122 pkg_to_cpv.assert_called_once_with(package)
123 get_dep.assert_called_once_with('target', [pkg_mock])
124
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700125 def testValidateOnly(self):
126 """Sanity check that a validate only call does not execute any logic."""
127 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
128 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
129 input_proto.build_target.name = 'target'
130 dependency.GetBuildDependencyGraph(input_proto, self.response,
131 self.validate_only_config)
132 patch.assert_not_called()
133
134 def testMockCall(self):
135 """Test that a mock call does not execute logic, returns mocked value."""
136 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
137 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
138 input_proto.build_target.name = 'target'
139 dependency.GetBuildDependencyGraph(input_proto, self.response,
140 self.mock_call_config)
141 patch.assert_not_called()
142 self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')