| #!/usr/bin/env python3 |
| # Copyright 2022 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.java_group.""" |
| |
| import unittest |
| import unittest.mock |
| |
| import java_group |
| |
| |
| def create_mock_java_class(cls='class'): |
| """Returns a Mock of JavaClass. |
| |
| The fields `class_name`, and `name` will be initialized. |
| """ |
| mock_class = unittest.mock.Mock() |
| mock_class.class_name = cls |
| mock_class.name = f'package.{cls}' |
| return mock_class |
| |
| |
| class TestJavaPackage(unittest.TestCase): |
| """Unit tests for dependency_analysis.class_dependency.JavaGroup.""" |
| TEST_GRP_1 = 'group1' |
| TEST_GRP_2 = 'group2' |
| TEST_CLS_1 = 'class1' |
| TEST_CLS_2 = 'class2' |
| TEST_CLS_3 = 'class3' |
| |
| def test_initialization(self): |
| """Tests that JavaGroup is initialized correctly.""" |
| test_node = java_group.JavaGroup(self.TEST_GRP_1) |
| self.assertEqual(test_node.name, self.TEST_GRP_1) |
| self.assertEqual(test_node.classes, {}) |
| |
| def test_add_class(self): |
| """Tests adding a single class to this group.""" |
| test_node = java_group.JavaGroup(self.TEST_GRP_1) |
| mock_class_node = create_mock_java_class() |
| test_node.add_class(mock_class_node) |
| self.assertEqual(test_node.classes, |
| {mock_class_node.name: mock_class_node}) |
| |
| def test_add_class_multiple(self): |
| """Tests adding multiple classes to this group.""" |
| test_node = java_group.JavaGroup(self.TEST_GRP_1) |
| mock_class_node_1 = create_mock_java_class(cls=self.TEST_CLS_1) |
| mock_class_node_2 = create_mock_java_class(cls=self.TEST_CLS_2) |
| test_node.add_class(mock_class_node_1) |
| test_node.add_class(mock_class_node_2) |
| self.assertEqual( |
| test_node.classes, { |
| mock_class_node_1.name: mock_class_node_1, |
| mock_class_node_2.name: mock_class_node_2 |
| }) |
| |
| def test_add_class_duplicate(self): |
| """Tests that adding the same class twice will not dupe.""" |
| test_node = java_group.JavaGroup(self.TEST_GRP_1) |
| mock_class_node = create_mock_java_class() |
| test_node.add_class(mock_class_node) |
| test_node.add_class(mock_class_node) |
| self.assertEqual(test_node.classes, |
| {mock_class_node.name: mock_class_node}) |
| |
| def test_get_class_dependencies_in_outbound_edge(self): |
| """Tests adding/getting class dependency edges for a package edge.""" |
| start_node = java_group.JavaGroup(self.TEST_GRP_1) |
| end_node = java_group.JavaGroup(self.TEST_GRP_2) |
| |
| # Create three class nodes (1, 2, 3) |
| mock_class_node_1 = create_mock_java_class(cls=self.TEST_CLS_1) |
| mock_class_node_2 = create_mock_java_class(cls=self.TEST_CLS_2) |
| mock_class_node_3 = create_mock_java_class(cls=self.TEST_CLS_3) |
| |
| # Add the class dependencies (1 -> 2), (1 -> 2) (duplicate), (1 -> 3) |
| start_node.add_class_dependency_edge(end_node, mock_class_node_1, |
| mock_class_node_2) |
| start_node.add_class_dependency_edge(end_node, mock_class_node_1, |
| mock_class_node_2) |
| start_node.add_class_dependency_edge(end_node, mock_class_node_1, |
| mock_class_node_3) |
| |
| # Expected output: the two deduped dependencies (1 -> 2), (1 -> 3) |
| # making up the edge (start_node, end_node). |
| deps = start_node.get_class_dependencies_in_outbound_edge(end_node) |
| self.assertEqual(len(deps), 2) |
| self.assertEqual( |
| deps, {(mock_class_node_1, mock_class_node_2), |
| (mock_class_node_1, mock_class_node_3)}) |
| |
| def test_get_class_dependencies_in_outbound_edge_not_outbound(self): |
| """Tests getting dependencies for a non-outbound edge.""" |
| test_node_1 = java_group.JavaGroup(self.TEST_GRP_1) |
| test_node_2 = java_group.JavaGroup(self.TEST_GRP_2) |
| |
| # Expected output: an empty set, since there are no class dependencies |
| # comprising a package dependency edge that doesn't exist. |
| deps = test_node_1.get_class_dependencies_in_outbound_edge(test_node_2) |
| self.assertEqual(deps, set()) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |