Passed
Push — master ( 55f662...e18d69 )
by Humberto
02:50 queued 11s
created

build.tests.unit.test_flow.TestFlowFactory.setUp()   A

Complexity

Conditions 2

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 17
rs 9.85
c 0
b 0
f 0
cc 2
nop 1
1
"""Tests for high-level Flow of OpenFlow 1.0 and 1.3."""
2
from unittest import TestCase
3
from unittest.mock import MagicMock, patch
4
5
6
from kytos.lib.helpers import get_switch_mock, get_connection_mock
7
from napps.kytos.of_core.v0x01.flow import Flow as Flow01
8
from napps.kytos.of_core.v0x04.flow import Flow as Flow04
9
10
11
class TestFlowFactory(TestCase):
12
    """Test the FlowFactory class."""
13
14
    def setUp(self):
15
        """Execute steps before each tests.
16
        Set the server_name_url from kytos/of_core
17
        """
18
        self.switch_v0x01 = get_switch_mock("00:00:00:00:00:00:00:01")
19
        self.switch_v0x04 = get_switch_mock("00:00:00:00:00:00:00:02")
20
        self.switch_v0x01.connection = get_connection_mock(
21
            0x01, get_switch_mock("00:00:00:00:00:00:00:03"))
22
        self.switch_v0x04.connection = get_connection_mock(
23
            0x04, get_switch_mock("00:00:00:00:00:00:00:04"))
24
25
        patch('kytos.core.helpers.run_on_thread', lambda x: x).start()
26
        # pylint: disable=bad-option-value
27
        from napps.kytos.of_core.flow import FlowFactory
28
        self.addCleanup(patch.stopall)
29
30
        self.napp = FlowFactory()
31
32
    @patch('napps.kytos.of_core.flow.v0x01')
33
    @patch('napps.kytos.of_core.flow.v0x04')
34
    def test_from_of_flow_stats(self, *args):
35
        """Test from_of_flow_stats."""
36
        (mock_flow_v0x04, mock_flow_v0x01) = args
37
        mock_stats = MagicMock()
38
39
        self.napp.from_of_flow_stats(mock_stats, self.switch_v0x01)
40
        mock_flow_v0x01.flow.Flow.from_of_flow_stats.assert_called()
41
42
        self.napp.from_of_flow_stats(mock_stats, self.switch_v0x04)
43
        mock_flow_v0x04.flow.Flow.from_of_flow_stats.assert_called()
44
45
46
class TestFlow(TestCase):
47
    """Test OF flow abstraction."""
48
49
    mock_switch = get_switch_mock("00:00:00:00:00:00:00:01")
50
    mock_switch.id = "00:00:00:00:00:00:00:01"
51
    expected = {'id': 'ca11e386e4bb5b0301b775c4640573e7',
52
                'switch': mock_switch.id,
53
                'table_id': 1,
54
                'match': {
55
                    'dl_src': '11:22:33:44:55:66'
56
                },
57
                'priority': 2,
58
                'idle_timeout': 3,
59
                'hard_timeout': 4,
60
                'cookie': 5,
61
                'actions': [
62
                    {'action_type': 'set_vlan',
63
                     'vlan_id': 6}],
64
                'stats': {}}
65
66
    def test_flow_mod(self):
67
        """Convert a dict to flow and vice-versa."""
68
        for flow_class in Flow01, Flow04:
69
            with self.subTest(flow_class=flow_class):
70
                flow = flow_class.from_dict(self.expected, self.mock_switch)
71
                actual = flow.as_dict()
72
                self.assertDictEqual(self.expected, actual)
73
74
    @patch('napps.kytos.of_core.flow.FlowBase._as_of_flow_mod')
75
    def test_of_flow_mod(self, mock_flow_mod):
76
        """Test convertion from Flow to OFFlow."""
77
78
        for flow_class in Flow01, Flow04:
79
            with self.subTest(flow_class=flow_class):
80
                flow = flow_class.from_dict(self.expected, self.mock_switch)
81
                flow.as_of_add_flow_mod()
82
                mock_flow_mod.assert_called()
83
84
                flow.as_of_delete_flow_mod()
85
                mock_flow_mod.assert_called()
86
87
    # pylint: disable = protected-access
88
    def test_as_of_flow_mod(self):
89
        """Test _as_of_flow_mod."""
90
        mock_command = MagicMock()
91
        for flow_class in Flow01, Flow04:
92
            with self.subTest(flow_class=flow_class):
93
                flow_mod = flow_class.from_dict(self.expected,
94
                                                self.mock_switch)
95
                response = flow_mod._as_of_flow_mod(mock_command)
96
                self.assertEqual(response.cookie, self.expected['cookie'])
97
                self.assertEqual(response.idle_timeout,
98
                                 self.expected['idle_timeout'])
99
                self.assertEqual(response.hard_timeout,
100
                                 self.expected['hard_timeout'])
101