blob: 459175fa836330953795f74027f59eda11a977fd [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
Michael Mortensenaf10cca2019-11-18 20:21:32 -07009from chromite.api import api_config
LaMont Jones00b9cff2019-12-12 12:14:07 -070010from chromite.api.controller import controller_util
Alex Kleinec869c12019-07-09 15:22:16 -060011from chromite.api.controller import dependency
Ned Nguyen8e144bd2019-05-02 09:09:41 -060012from chromite.api.gen.chromite.api import depgraph_pb2
LaMont Jones00b9cff2019-12-12 12:14:07 -070013from chromite.api.gen.chromiumos import common_pb2
Ned Nguyene5d04852019-02-19 16:33:15 -070014from chromite.lib import cros_test_lib
Michael Mortensenaf10cca2019-11-18 20:21:32 -070015from chromite.service import dependency as dependency_service
Ned Nguyene5d04852019-02-19 16:33:15 -070016
17
Michael Mortensenaf10cca2019-11-18 20:21:32 -070018class BoardBuilDependencyTest(cros_test_lib.MockTestCase,
19 api_config.ApiConfigMixin):
Ned Nguyene5d04852019-02-19 16:33:15 -070020 """Unittests for board_build_dependency."""
21
Michael Mortensenaf10cca2019-11-18 20:21:32 -070022 def setUp(self):
23 self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
24 self.json_deps = {
Ned Nguyene5d04852019-02-19 16:33:15 -070025 'target_board': 'deathstar',
26 'package_deps': {
27 'commander/darthvader-1.49.3.3': {
28 'action': 'merge',
29 'category': 'commander',
30 'cpes': [],
31 'deps': ['troop/clone', 'troop/robot'],
32 'rev_deps': [],
33 'full_name': 'commander/darthvader-1.49.3.3',
34 'name': 'darthvader',
35 'version': '1.49.3.3'
36 },
37 'troop/clone-1.2.3': {
38 'action': 'merge',
39 'category': 'troop',
40 'cpes': [],
41 'deps': [],
42 'rev_deps': ['commander/darthvader'],
43 'full_name': 'troop/clone-1.2.3',
44 'name': 'clone',
45 'version': '1.2.3'
46 },
47 'troop/robot-2.3.4': {
48 'action': 'merge',
49 'category': 'troop',
50 'cpes': [],
51 'deps': [],
52 'rev_deps': ['commander/darthvader'],
53 'full_name': 'troop/robot-2.3.4',
Ned Nguyen8be10052019-02-26 08:58:45 -070054 'name': 'robot',
Ned Nguyene5d04852019-02-19 16:33:15 -070055 'version': '2.3.4'
56 },
57 },
58 'source_path_mapping': {
Ned Nguyen8be10052019-02-26 08:58:45 -070059 'commander/darthvader-1.49.3.3': ['/control/room'],
60 'troop/clone-1.2.3': ['/bunker'],
61 'troop/robot-2.3.4': ['/factory'],
Ned Nguyene5d04852019-02-19 16:33:15 -070062 },
63 }
64
Michael Mortensenaf10cca2019-11-18 20:21:32 -070065 def testCreateDepGraphProtoFromJsonMap(self):
66 """Test creating DepGraph protobuf from json map."""
Ned Nguyen8e144bd2019-05-02 09:09:41 -060067 depgraph_proto = depgraph_pb2.DepGraph()
Alex Kleinec869c12019-07-09 15:22:16 -060068 dependency.AugmentDepGraphProtoFromJsonMap(
Michael Mortensenaf10cca2019-11-18 20:21:32 -070069 self.json_deps, depgraph_proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070070 self.assertEqual(depgraph_proto.build_target.name, 'deathstar')
71 darthvader_dep = None
72 for package_dep_info in depgraph_proto.package_deps:
73 if package_dep_info.package_info.package_name == 'darthvader':
74 darthvader_dep = package_dep_info
75 self.assertTrue(darthvader_dep)
Mike Frysinger2d589a12019-08-25 14:15:12 -040076 self.assertEqual(darthvader_dep.dependency_packages[0].category,
77 'troop')
78 self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
79 'clone')
80 self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
81 '/control/room')
Michael Mortensenaf10cca2019-11-18 20:21:32 -070082
83 def testGetBuildDependencyGraph(self):
84 """GetBuildDependencyGraph calls helper method with correct args."""
Chris McDonalda22b74f2019-11-22 13:55:06 -070085 patch = self.PatchObject(
86 dependency_service,
87 'GetBuildDependency',
88 return_value=(self.json_deps, self.json_deps))
Michael Mortensenaf10cca2019-11-18 20:21:32 -070089 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
90 input_proto.build_target.name = 'target'
91 dependency.GetBuildDependencyGraph(input_proto, self.response,
92 self.api_config)
93 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
94 patch.assert_called_once()
95
LaMont Jones00b9cff2019-12-12 12:14:07 -070096 def testGetBuildDependencyGraphForPackages(self):
97 """GetBuildDependencyGraph calls helper method with correct args."""
98 get_dep = self.PatchObject(
99 dependency_service,
100 'GetBuildDependency',
101 return_value=(self.json_deps, self.json_deps))
102 pkg_mock = 'package-CPV'
103 pkg_to_cpv = self.PatchObject(
104 controller_util,
105 'PackageInfoToCPV', return_value=pkg_mock)
106 package = common_pb2.PackageInfo(
107 package_name='chromeos-chrome', category='chromeos-base')
108 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
109 build_target=common_pb2.BuildTarget(name='target'),
110 packages=[package]
111 )
112 dependency.GetBuildDependencyGraph(input_proto, self.response,
113 self.api_config)
114 self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
115 pkg_to_cpv.assert_called_once_with(package)
116 get_dep.assert_called_once_with('target', [pkg_mock])
117
Michael Mortensenaf10cca2019-11-18 20:21:32 -0700118 def testValidateOnly(self):
119 """Sanity check that a validate only call does not execute any logic."""
120 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
121 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
122 input_proto.build_target.name = 'target'
123 dependency.GetBuildDependencyGraph(input_proto, self.response,
124 self.validate_only_config)
125 patch.assert_not_called()
126
127 def testMockCall(self):
128 """Test that a mock call does not execute logic, returns mocked value."""
129 patch = self.PatchObject(dependency_service, 'GetBuildDependency')
130 input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
131 input_proto.build_target.name = 'target'
132 dependency.GetBuildDependencyGraph(input_proto, self.response,
133 self.mock_call_config)
134 patch.assert_not_called()
135 self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')