| # Copyright 2021 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. |
| |
| """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, |
| }], |
| '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, |
| }], |
| '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): |
| """Build 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): |
| """Build 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): |
| """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): |
| """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) |
| |
| |
| def test_get_build_target_dependency_graph(monkeypatch): |
| """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) |