blob: 5df0e59fc7107d94dcbe8a6c0054416e5865180b [file] [log] [blame]
# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for depgraph."""
from chromite.lib import dependency_graph
from chromite.lib import depgraph
def _get_trees():
"""Get the hand-built deps trees for tests.
Returns:
tuple: (deps tree with bdeps,
deps tree without bdeps,
bdeps tree,
sdk tree)
"""
sysroot = "/build/target/"
# Quick access to complete deps entries for each package.
deps = {
"virtual/sysroot-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": sysroot,
}
],
"virtual/sdk-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": "/",
}
],
"sysroot/both-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": "/",
},
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": sysroot,
},
],
"sysroot/both-1-sysroot": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": sysroot,
}
],
"sysroot/dep-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": sysroot,
},
{
"action": "uninstall",
"deptypes": [],
"deps": {},
"root": sysroot,
},
],
"sysroot/uninstall-dep-1": [
{
"action": "uninstall",
"deptypes": [],
"deps": {},
"root": sysroot,
}
],
"sysroot/bdep-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": "/",
}
],
"sdk/dep-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": "/",
}
],
"sdk/bdep-1": [
{
"action": "merge",
"deptypes": [],
"deps": {},
"root": "/",
}
],
}
# The build target tree, deps + bdeps.
full_dep_tree = {
"virtual/sysroot-1": [
{
"action": "merge",
"deps": {
"sysroot/dep-1": deps["sysroot/dep-1"],
"sysroot/bdep-1": deps["sysroot/bdep-1"],
"sysroot/both-1": deps["sysroot/both-1"],
},
"root": sysroot,
}
],
"sysroot/dep-1": [
{
"action": "merge",
"deps": {},
"root": sysroot,
},
{
"action": "uninstall",
"deps": {
"sysroot/uninstall-dep-1": deps["sysroot/uninstall-dep-1"],
},
"root": sysroot,
},
],
"sysroot/uninstall-dep-1": [
{
"action": "uninstall",
"deps": {},
"root": sysroot,
},
],
"sysroot/bdep-1": [
{
"action": "merge",
"deps": {},
"root": "/",
}
],
"sysroot/both-1": [
{
"action": "merge",
"deps": {},
"root": "/",
},
{
"action": "merge",
"deps": {},
"root": sysroot,
},
],
}
# The sysroot tree, only deps.
no_bdeps_dep_tree = {
"virtual/sysroot-1": [
{
"action": "merge",
"deps": {
"sysroot/dep-1": deps["sysroot/dep-1"],
"sysroot/both-1": deps["sysroot/both-1-sysroot"],
},
"root": sysroot,
}
],
"sysroot/both-1": [
{
"action": "merge",
"deps": {},
"root": sysroot,
}
],
"sysroot/dep-1": [
{
"action": "merge",
"deps": {},
"root": sysroot,
}
],
}
# The bdeps tree for build target and sysroot trees.
bdep_tree = {
"sysroot/both-1": [
{
"action": "merge",
"deps": {},
"root": "/",
}
],
"sysroot/bdep-1": [
{
"action": "merge",
"deps": {},
"root": "/",
}
],
}
# The SDK tree.
sdk_tree = {
"virtual/sdk-1": [
{
"action": "merge",
"deps": {
"sdk/dep-1": deps["sdk/dep-1"],
"sdk/bdep-1": deps["sdk/bdep-1"],
},
"root": "/",
}
],
"sdk/dep-1": [
{
"action": "merge",
"deps": {},
"root": "/",
}
],
"sdk/bdep-1": [
{
"action": "merge",
"deps": {},
"root": "/",
}
],
}
return full_dep_tree, no_bdeps_dep_tree, bdep_tree, sdk_tree
def _get_raw_sdk_depgraph(*_args, **_kwargs):
"""Build a DepgraphResult instance corresponding to the test SDK data."""
_, _, _, sdk_tree = _get_trees()
return depgraph.DepgraphResult(sdk_tree, {}, ["virtual/sdk-1"])
def _get_raw_sysroot_depgraph(*_args, **_kwargs):
"""Get a DepgraphResult instance corresponding to the test sysroot data."""
_, deps_tree, bdeps_tree, _ = _get_trees()
return depgraph.DepgraphResult(deps_tree, bdeps_tree, ["virtual/sysroot-1"])
def _get_raw_build_target_depgraph(*_args, **_kwargs):
"""Get a DepgraphResult instance corresponding to the full depgraph data."""
deps_tree, _, bdeps_tree, _ = _get_trees()
return depgraph.DepgraphResult(deps_tree, bdeps_tree, ["virtual/sysroot-1"])
def test_get_sdk_dependency_graph(monkeypatch) -> None:
"""Test the SDK depgraph is built correctly."""
monkeypatch.setattr(
depgraph, "_get_raw_sdk_depgraph", _get_raw_sdk_depgraph
)
graph = depgraph.get_sdk_dependency_graph()
assert "virtual/sdk-1" in graph
assert "sdk/dep-1" in graph
assert "sdk/bdep-1" in graph
assert "virtual/sysroot-1" not in graph
assert "sysroot/both-1" not in graph
assert "sysroot/dep-1" not in graph
assert "sysroot/bdep-1" not in graph
assert graph.sysroot_path == "/"
def test_get_sysroot_dependency_graph(monkeypatch) -> None:
"""Test the sysroot depgraph is built correctly."""
monkeypatch.setattr(
depgraph, "_get_raw_sysroot_depgraph", _get_raw_sysroot_depgraph
)
graph = depgraph.get_sysroot_dependency_graph("/build/target")
assert "virtual/sysroot-1" in graph
assert "sysroot/both-1" in graph
assert "sysroot/dep-1" in graph
assert "sysroot/bdep-1" not in graph
assert "virtual/sdk-1" not in graph
assert "sdk/dep-1" not in graph
assert "sdk/bdep-1" not in graph
assert graph.sysroot_path == "/build/target"
assert not graph.sdk_root
assert len(graph.get_nodes(["sysroot/both-1"])) == 1
assert graph.get_nodes(
["sysroot/both-1"], dependency_graph.RootType.SYSROOT
)
assert not graph.get_nodes(
["sysroot/both-1"], dependency_graph.RootType.SDK
)
# We currently skip uninstalls.
assert "sysroot/uninstall-dep-1" not in graph
assert (
"sysroot/uninstall-dep-1"
not in graph.get_nodes(["sysroot/dep-1"])[0].dependencies
)
def test_get_build_target_dependency_graph(monkeypatch) -> None:
"""Test the build target depgraph is built correctly."""
monkeypatch.setattr(
depgraph,
"_get_raw_build_target_depgraph",
_get_raw_build_target_depgraph,
)
graph = depgraph.get_build_target_dependency_graph("/build/target")
assert "virtual/sysroot-1" in graph
assert "sysroot/both-1" in graph
assert "sysroot/dep-1" in graph
assert "sysroot/bdep-1" in graph
assert "virtual/sdk-1" not in graph
assert "sdk/dep-1" not in graph
assert "sdk/bdep-1" not in graph
assert graph.sysroot_path == "/build/target"
assert graph.sdk_root
assert len(graph.get_nodes(["sysroot/both-1"])) == 2
assert graph.get_nodes(
["sysroot/both-1"], dependency_graph.RootType.SYSROOT
)
assert graph.get_nodes(["sysroot/both-1"], dependency_graph.RootType.SDK)