Test Failed
Pull Request — master (#68)
by Arturo
02:38 queued 41s
created

TestGraph.test_update_links()   A

Complexity

Conditions 2

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 9
nop 2
dl 0
loc 11
rs 9.95
c 0
b 0
f 0
1
"""Test Graph methods."""
2
from unittest import TestCase
3
from unittest.mock import MagicMock, call, patch
4
5
# from napps.kytos.pathfinder.graph import KytosGraph
6
from graph import KytosGraph
7
from tests.helpers import (get_filter_links_fake, get_topology_mock,
8
                           get_topology_with_metadata_mock)
9
10
# pylint: disable=arguments-differ, protected-access
11
12
13
class TestGraph(TestCase):
14
    """Tests for the Main class."""
15
16
    @patch('networkx.Graph')
17
    def setUp(self, mock_graph):
18
        """Execute steps before each tests."""
19
        self.mock_graph = mock_graph.return_value
20
        self.kytos_graph = KytosGraph()
21
22
    def test_clear(self):
23
        """Test clear."""
24
        self.kytos_graph.clear()
25
26
        self.mock_graph.clear.assert_called()
27
28
    def setting_update_topology(self, *args):
29
        """Set the primary elements needed to
30
        test the topology update process."""
31
        (mock_update_nodes, mock_update_links) = args
32
        topology = get_topology_mock()
33
        self.kytos_graph.update_topology(topology)
34
35
        self.mock_graph.clear.assert_called()
36
37
        return mock_update_nodes, mock_update_links, topology
38
39
    # @patch('napps.kytos.pathfinder.graph.KytosGraph.update_links')
40
    # @patch('napps.kytos.pathfinder.graph.KytosGraph.update_nodes')
41
    @patch('graph.KytosGraph.update_links')
42
    @patch('graph.KytosGraph.update_nodes')
43
    def test_update_topology_switches(self, *args):
44
        """Test update topology."""
45
        mock_update_nodes, _, topology = self.setting_update_topology(*args)
46
        mock_update_nodes.assert_called_with(topology.switches)
47
48
    # @patch('napps.kytos.pathfinder.graph.KytosGraph.update_links')
49
    # @patch('napps.kytos.pathfinder.graph.KytosGraph.update_nodes')
50
    @patch('graph.KytosGraph.update_links')
51
    @patch('graph.KytosGraph.update_nodes')
52
    def test_update_topology_links(self, *args):
53
        """Test update topology."""
54
        _, mock_update_links, topology = self.setting_update_topology(*args)
55
        mock_update_links.assert_called_with(topology.links)
56
57
    def test_update_nodes(self):
58
        """Test update nodes."""
59
        topology = get_topology_mock()
60
        self.kytos_graph.update_nodes(topology.switches)
61
        switch = topology.switches["00:00:00:00:00:00:00:01"]
62
63
        calls = [call(switch.id)]
64
        calls += [call(interface.id)
65
                  for interface in switch.interfaces.values()]
66
        self.mock_graph.add_node.assert_has_calls(calls)
67
68
        calls = [call(switch.id, interface.id)
69
                 for interface in switch.interfaces.values()]
70
71
        self.mock_graph.add_edge.assert_has_calls(calls)
72
73
    def test_update_nodes_2(self):
74
        """Test update nodes."""
75
76
        effect = MagicMock(side_effect=AttributeError)
77
78
        topology = get_topology_mock()
79
        with self.assertRaises(Exception):
80
            with patch.object(self.mock_graph, 'add_node', effect):
81
                self.kytos_graph.update_nodes(topology.switches)
82
83
        self.assertRaises(AttributeError)
84
85
    def test_remove_switch_hops(self):
86
        """Test remove switch hops."""
87
        circuit = {"hops": ["00:00:00:00:00:00:00:01:1",
88
                            "00:00:00:00:00:00:00:01",
89
                            "00:00:00:00:00:00:00:01:2"]}
90
91
        self.kytos_graph._remove_switch_hops(circuit)
92
93
        expected_circuit = {"hops": ["00:00:00:00:00:00:00:01:1",
94
                                     "00:00:00:00:00:00:00:01:2"]}
95
        self.assertEqual(circuit, expected_circuit)
96
97
    @patch('networkx.shortest_simple_paths', return_value=["any"])
98
    def test_shortest_paths(self, mock_shortest_simple_paths):
99
        """Test shortest paths."""
100
        source, dest = "00:00:00:00:00:00:00:01:1", "00:00:00:00:00:00:00:02:2"
101
        shortest_paths = self.kytos_graph.shortest_paths(source, dest)
102
103
        mock_shortest_simple_paths.assert_called_with(self.kytos_graph.graph,
104
                                                      source, dest, None)
105
        self.assertEqual(shortest_paths, ["any"])
106
107
    @patch('graph.combinations', autospec=True)
108
    def test_constrained_flexible_paths(self, mock_combinations):
109
        """Test shortest constrained paths."""
110
        source, dest = "00:00:00:00:00:00:00:01:1", "00:00:00:00:00:00:00:02:2"
111
        minimum_hits = 1
112
        base_metrics = {"apple": 1}
113
        flexible_metrics = {"pear": 2}
114
        mock_combinations.return_value = [(('pear', 2),)]
115
        filtered_links = ["a", "b", "c"]
116
        filtered_links_without_metadata = filtered_links[0:2]
117
        constrained_shortest_paths = [["path1"], ["path2"]]
118
119
        self.kytos_graph._constrained_shortest_paths = MagicMock(
120
            return_value=constrained_shortest_paths)
121
        self.kytos_graph._filter_links = MagicMock(
122
            side_effect=get_filter_links_fake)
123
        shortest_paths = self.kytos_graph.constrained_flexible_paths(
124
            source, dest, minimum_hits, base=base_metrics,
125
            flexible=flexible_metrics)
126
127
        self.kytos_graph._constrained_shortest_paths.assert_has_calls([
128
            call(source, dest, filtered_links_without_metadata)])
129
        self.kytos_graph._filter_links.assert_called()
130
        self.assertEqual(shortest_paths, [
131
            {"paths": constrained_shortest_paths, "metrics":
132
             {"apple": 1, "pear": 2}}])
133
134
    def test_get_link_metadata(self):
135
        """Test metadata retrieval."""
136
        topology = get_topology_with_metadata_mock()
137
        self.kytos_graph.update_nodes(topology.switches)
138
        self.kytos_graph.update_links(topology.links)
139
        endpoint_a = "S1:1"
140
        endpoint_b = "S2:1"
141
        metadata = {"reliability": 5, "bandwidth": 100, "delay": 105}
142
        self.kytos_graph.get_link_metadata = MagicMock(return_value=metadata)
143
144
        result = self.kytos_graph.get_link_metadata(
145
            endpoint_a, endpoint_b)
146
147
        self.assertEqual(result, metadata)
148