| #!/usr/bin/env python3 |
| # Copyright 2020 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Unit tests for dependency_analysis.package_dependency.""" |
| |
| import unittest |
| import unittest.mock |
| |
| import package_dependency |
| |
| |
| def create_mock_java_class(pkg='package', cls='class'): |
| """Returns a Mock of JavaClass. |
| |
| The fields `class_name`, `package`, and `name` will be initialized. |
| """ |
| mock_class = unittest.mock.Mock() |
| mock_class.class_name = cls |
| mock_class.package = pkg |
| mock_class.name = f'{pkg}.{cls}' |
| return mock_class |
| |
| |
| class TestJavaPackageDependencyGraph(unittest.TestCase): |
| """Unit tests for JavaPackageDependencyGraph. |
| |
| Full name: dependency_analysis.class_dependency.JavaPackageDependencyGraph. |
| """ |
| TEST_PKG_1 = 'package1' |
| TEST_PKG_2 = 'package2' |
| TEST_CLS = 'class' |
| |
| def test_initialization(self): |
| """Tests that initialization collapses a class dependency graph.""" |
| # Create three class nodes (1, 2, 3) in two packages: [1, 2] and [3]. |
| |
| mock_class_node_1 = create_mock_java_class(pkg=self.TEST_PKG_1) |
| mock_class_node_2 = create_mock_java_class(pkg=self.TEST_PKG_1) |
| mock_class_node_3 = create_mock_java_class(pkg=self.TEST_PKG_2) |
| |
| # Create dependencies (1 -> 3) and (3 -> 2). |
| mock_class_graph = unittest.mock.Mock() |
| mock_class_graph.nodes = [ |
| mock_class_node_1, mock_class_node_2, mock_class_node_3 |
| ] |
| mock_class_graph.edges = [(mock_class_node_1, mock_class_node_3), |
| (mock_class_node_3, mock_class_node_2)] |
| |
| test_graph = package_dependency.JavaPackageDependencyGraph( |
| mock_class_graph) |
| |
| # Expected output: two-node package graph with a bidirectional edge. |
| self.assertEqual(test_graph.num_nodes, 2) |
| self.assertEqual(test_graph.num_edges, 2) |
| self.assertIsNotNone(test_graph.get_node_by_key(self.TEST_PKG_1)) |
| self.assertIsNotNone(test_graph.get_node_by_key(self.TEST_PKG_2)) |
| # Ensure there is a bidirectional edge. |
| (edge_1_start, edge_1_end), (edge_2_start, |
| edge_2_end) = test_graph.edges |
| self.assertEqual(edge_1_start, edge_2_end) |
| self.assertEqual(edge_2_start, edge_1_end) |
| |
| def test_initialization_no_dependencies(self): |
| """Tests that a package with no external dependencies is included.""" |
| # Create one class node (1) in one package: [1]. |
| mock_class_node = create_mock_java_class(pkg=self.TEST_PKG_1) |
| |
| # Do not create any dependencies. |
| mock_class_graph = unittest.mock.Mock() |
| mock_class_graph.nodes = [mock_class_node] |
| mock_class_graph.edges = [] |
| |
| test_graph = package_dependency.JavaPackageDependencyGraph( |
| mock_class_graph) |
| |
| # Expected output: one-node package graph with no edges. |
| self.assertEqual(test_graph.num_nodes, 1) |
| self.assertEqual(test_graph.num_edges, 0) |
| self.assertIsNotNone(test_graph.get_node_by_key(self.TEST_PKG_1)) |
| |
| def test_initialization_internal_dependencies(self): |
| """Tests that a package with only internal dependencies is included.""" |
| # Create two class nodes (1, 2) in one package: [1, 2]. |
| mock_class_node_1 = create_mock_java_class(pkg=self.TEST_PKG_1) |
| mock_class_node_2 = create_mock_java_class(pkg=self.TEST_PKG_1) |
| |
| # Create a dependency (1 -> 2). |
| mock_class_graph = unittest.mock.Mock() |
| mock_class_graph.nodes = [mock_class_node_1, mock_class_node_2] |
| mock_class_graph.edges = [(mock_class_node_1, mock_class_node_2)] |
| |
| test_graph = package_dependency.JavaPackageDependencyGraph( |
| mock_class_graph) |
| |
| # Expected output: one-node package graph with a self-edge. |
| self.assertEqual(test_graph.num_nodes, 1) |
| self.assertEqual(test_graph.num_edges, 1) |
| self.assertIsNotNone(test_graph.get_node_by_key(self.TEST_PKG_1)) |
| # Ensure there is a self-edge. |
| [(edge_start, edge_end)] = test_graph.edges |
| self.assertEqual(edge_start, edge_end) |
| |
| def test_create_node_from_key(self): |
| """Tests that a JavaPackage is correctly generated.""" |
| mock_class_graph = unittest.mock.Mock() |
| mock_class_graph.nodes = [] |
| mock_class_graph.edges = [] |
| test_graph = package_dependency.JavaPackageDependencyGraph( |
| mock_class_graph) |
| |
| created_node = test_graph.create_node_from_key(self.TEST_PKG_1) |
| self.assertEqual(created_node.name, self.TEST_PKG_1) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |