blob: b61b296301d21e52e8c71f8dc8f3036136076a16 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Board build dependency service tests."""
from __future__ import print_function
import os
from chromite.api import api_config
from chromite.api.controller import controller_util
from chromite.api.controller import dependency
from chromite.api.gen.chromite.api import depgraph_pb2
from chromite.api.gen.chromite.api import sysroot_pb2
from chromite.api.gen.chromiumos import common_pb2
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.service import dependency as dependency_service
pytestmark = cros_test_lib.pytestmark_inside_only
class BoardBuildDependencyTest(cros_test_lib.MockTestCase,
api_config.ApiConfigMixin):
"""Unittests for board_build_dependency."""
def setUp(self):
self.response = depgraph_pb2.GetBuildDependencyGraphResponse()
self.json_deps = {
'target_board': 'deathstar',
'sysroot_path': '/build/deathstar',
'package_deps': {
'commander/darthvader-1.49.3.3': {
'action': 'merge',
'category': 'commander',
'cpes': [],
'deps': ['troop/clone', 'troop/robot'],
'rev_deps': [],
'full_name': 'commander/darthvader-1.49.3.3',
'name': 'darthvader',
'version': '1.49.3.3'
},
'troop/clone-1.2.3': {
'action': 'merge',
'category': 'troop',
'cpes': [],
'deps': ['equipment/jetpack'],
'rev_deps': ['commander/darthvader'],
'full_name': 'troop/clone-1.2.3',
'name': 'clone',
'version': '1.2.3'
},
'troop/robot-2.3.4': {
'action': 'merge',
'category': 'troop',
'cpes': [],
'deps': [],
'rev_deps': ['commander/darthvader'],
'full_name': 'troop/robot-2.3.4',
'name': 'robot',
'version': '2.3.4'
},
'equipment/jetpack-3.4.5': {
'action': 'merge',
'category': 'equipment',
'cpes': [],
'deps': [],
'rev_deps': ['commander/darthvader'],
'full_name': 'equipment/jetpack-3.4.5',
'name': 'jetpack',
'version': '3.4.5'
},
},
'source_path_mapping': {
'commander/darthvader-1.49.3.3': ['/control/room'],
'troop/clone-1.2.3': ['/bunker'],
'troop/robot-2.3.4': ['/factory'],
'equipment/jetpack-3.4.5': ['/factory'],
},
}
def testCreateDepGraphProtoFromJsonMap(self):
"""Test creating DepGraph protobuf from json map."""
depgraph_proto = depgraph_pb2.DepGraph()
dependency.AugmentDepGraphProtoFromJsonMap(
self.json_deps, depgraph_proto)
self.assertEqual(depgraph_proto.build_target.name, 'deathstar')
darthvader_dep = None
for package_dep_info in depgraph_proto.package_deps:
if package_dep_info.package_info.package_name == 'darthvader':
darthvader_dep = package_dep_info
self.assertTrue(darthvader_dep)
self.assertEqual(darthvader_dep.dependency_packages[0].category,
'troop')
self.assertEqual(darthvader_dep.dependency_packages[0].package_name,
'clone')
self.assertEqual(darthvader_dep.dependency_source_paths[0].path,
'/control/room')
def testGetBuildDependencyGraph(self):
"""GetBuildDependencyGraph calls helper method with correct args."""
patch = self.PatchObject(
dependency_service,
'GetBuildDependency',
return_value=(self.json_deps, self.json_deps))
input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
input_proto.build_target.name = 'target'
dependency.GetBuildDependencyGraph(input_proto, self.response,
self.api_config)
self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
patch.assert_called_once()
def testGetBuildDependencyGraphForPackages(self):
"""GetBuildDependencyGraph calls helper method with correct args."""
get_dep = self.PatchObject(
dependency_service,
'GetBuildDependency',
return_value=(self.json_deps, self.json_deps))
pkg_mock = 'package-CPV'
pkg_to_cpv = self.PatchObject(
controller_util,
'PackageInfoToCPV', return_value=pkg_mock)
package = common_pb2.PackageInfo(
package_name='chromeos-chrome', category='chromeos-base')
input_proto = depgraph_pb2.GetBuildDependencyGraphRequest(
build_target=common_pb2.BuildTarget(name='target'),
packages=[package]
)
dependency.GetBuildDependencyGraph(input_proto, self.response,
self.api_config)
self.assertEqual(self.response.dep_graph.build_target.name, 'deathstar')
pkg_to_cpv.assert_called_once_with(package)
get_dep.assert_called_once_with('/build/target', 'target', (pkg_mock,))
def testValidateOnly(self):
"""Sanity check that a validate only call does not execute any logic."""
patch = self.PatchObject(dependency_service, 'GetBuildDependency')
input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
input_proto.build_target.name = 'target'
dependency.GetBuildDependencyGraph(input_proto, self.response,
self.validate_only_config)
patch.assert_not_called()
def testMockCall(self):
"""Test that a mock call does not execute logic, returns mocked value."""
patch = self.PatchObject(dependency_service, 'GetBuildDependency')
input_proto = depgraph_pb2.GetBuildDependencyGraphRequest()
input_proto.build_target.name = 'target'
dependency.GetBuildDependencyGraph(input_proto, self.response,
self.mock_call_config)
patch.assert_not_called()
self.assertEqual(self.response.dep_graph.build_target.name, 'target_board')
class ListTest(cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin):
"""Unittests for the List endpoint."""
def setUp(self):
self.response = depgraph_pb2.ListResponse()
self.build_target = common_pb2.BuildTarget(name='target')
self.sysroot = os.path.join(self.tempdir, 'target')
osutils.SafeMakedirs(self.sysroot)
def testValidateOnly(self):
"""Sanity check that a validate only call does not execute any logic."""
sysroot = sysroot_pb2.Sysroot(
path=self.sysroot, build_target=self.build_target)
input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
dependency.List(input_proto, self.response, self.validate_only_config)
def testArgumentValidationMissingSysrootPath(self):
"""Test missing sysroot path."""
sysroot = sysroot_pb2.Sysroot(build_target=self.build_target)
input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
with self.assertRaises(cros_build_lib.DieSystemExit):
dependency.List(input_proto, self.response, self.api_config)
def testArgumentValidationMissingBuildTarget(self):
"""Test missing build target name."""
sysroot = sysroot_pb2.Sysroot(
path=self.sysroot, build_target=common_pb2.BuildTarget())
input_proto = depgraph_pb2.ListRequest(sysroot=sysroot)
with self.assertRaises(cros_build_lib.DieSystemExit):
dependency.List(input_proto, self.response, self.api_config)
def testListResponse(self):
"""Test calls helper method with correct args."""
mock_get_deps = self.PatchObject(
dependency_service, 'GetDependencies', return_value=['foo/bar-1.2.3'])
sysroot = sysroot_pb2.Sysroot(
path=self.sysroot, build_target=self.build_target)
path = '/path'
package = common_pb2.PackageInfo(category='foo', package_name='bar')
input_proto = depgraph_pb2.ListRequest(
sysroot=sysroot,
src_paths=[
depgraph_pb2.SourcePath(path='/path'),
],
packages=[package])
dependency.List(input_proto, self.response, self.api_config)
mock_get_deps.assert_called_once_with(
self.sysroot,
build_target=controller_util.ParseBuildTarget(self.build_target),
src_paths=[path],
packages=[controller_util.PackageInfoToCPV(package)])
expected_deps = [
common_pb2.PackageInfo(
category='foo', package_name='bar', version='1.2.3')
]
self.assertCountEqual(expected_deps, self.response.package_deps)