TestMain.test_run_trace()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 41
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 28
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 32
nop 4
dl 0
loc 41
ccs 28
cts 28
cp 1
crap 1
rs 9.112
c 0
b 0
f 0
1
"""Module to test the main napp file."""
2
3 1
import asyncio
4 1
from unittest.mock import patch, MagicMock
5 1
from napps.amlight.sdntrace import settings
6 1
from napps.amlight.sdntrace.tracing.trace_entries import TraceEntries
7 1
from kytos.lib.helpers import get_controller_mock, get_test_client
8
9
10
# pylint: disable=too-many-public-methods, too-many-lines
11 1
class TestMain:
12
    """Test the Main class."""
13
14 1
    def setup_method(self):
15
        """Execute steps before each tests."""
16
17
        # The decorator run_on_thread is patched, so methods that listen
18
        # for events do not run on threads while tested.
19
        # Decorators have to be patched before the methods that are
20
        # decorated with them are imported.
21 1
        patch("kytos.core.helpers.run_on_thread", lambda x: x).start()
22
        # pylint: disable=import-outside-toplevel
23 1
        from napps.amlight.sdntrace.main import Main
24
25 1
        Main.get_eline_controller = MagicMock()
26 1
        self.controller = get_controller_mock()
27 1
        self.napp = Main(self.controller)
28 1
        self.api_client = get_test_client(self.controller, self.napp)
29 1
        self.base_endpoint = "amlight/sdntrace/v1"
30
31 1
    @patch(
32
        "napps.amlight.sdntrace.tracing.trace_manager.TraceManager.avoid_duplicated_request"
33
    )
34 1
    @patch("napps.amlight.sdntrace.tracing.trace_manager.TraceManager.is_entry_valid")
35 1
    @patch("napps.amlight.sdntrace.tracing.trace_manager.TraceManager.new_trace")
36 1
    async def test_run_trace(self, mock_trace, mock_entry, mock_duplicate):
37
        """Test run_trace"""
38 1
        self.napp.controller.loop = asyncio.get_running_loop()
39 1
        payload = {
40
            "trace": {
41
                "switch": {"dpid": "00:00:00:00:00:00:00:01", "in_port": 1},
42
                "eth": {"dl_vlan": 400, "dl_vlan_pcp": 4, "dl_type": 2048},
43
            }
44
        }
45
        # Error not TraceEntries instance
46 1
        mock_entry.return_value = "not_entry"
47 1
        url = f"{self.base_endpoint}/trace"
48 1
        response = await self.api_client.put(url, json=payload)
49 1
        assert response.status_code == 200
50 1
        actual_result = response.json()
51 1
        expected_result = {"result": {"error": "not_entry"}}
52 1
        assert actual_result == expected_result
53
54
        # Error duplicated trace
55 1
        mock_entry.return_value = TraceEntries()
56 1
        mock_duplicate.return_value = True
57 1
        url = f"{self.base_endpoint}/trace"
58 1
        response = await self.api_client.put(url, json=payload)
59 1
        assert response.status_code == 200
60 1
        result = response.json()
61 1
        assert result["result"]["error"] == "Duplicated Trace Request ignored"
62
63
        # Success
64 1
        mock_duplicate.return_value = False
65 1
        trace_id = 9999
66 1
        mock_trace.return_value = trace_id
67 1
        url = f"{self.base_endpoint}/trace"
68 1
        response = await self.api_client.put(url, json=payload)
69 1
        assert response.status_code == 200
70 1
        result = response.json()
71 1
        assert result["result"]["trace_id"] == trace_id
72
73 1
    @patch("napps.amlight.sdntrace.tracing.trace_manager.TraceManager.get_results")
74 1
    async def test_get_results(self, mock_rest_results):
75
        """Test get_results"""
76 1
        mock_rest_results.return_value = "mock_results"
77 1
        url = f"{self.base_endpoint}/trace"
78 1
        response = await self.api_client.get(url)
79 1
        assert response.status_code == 200
80 1
        result = response.json()
81 1
        assert result == "mock_results"
82 1
        assert mock_rest_results.call_count == 1
83
84
    # pylint: disable=protected-access
85 1
    async def test_get_result(self):
86
        """Test get_result"""
87 1
        trace_id = "9999"
88
89
        # Trace in process
90 1
        self.napp.tracing._results_queue = {}
91 1
        self.napp.tracing._running_traces = {int(trace_id): "mock"}
92 1
        url = f"{self.base_endpoint}/trace/{trace_id}"
93 1
        response = await self.api_client.get(url)
94 1
        assert response.status_code == 200
95 1
        result = response.json()
96 1
        assert result == {"msg": "trace in process"}
97
98
        # Trace pending
99 1
        self.napp.tracing._running_traces = {}
100 1
        self.napp.tracing._request_queue = {int(trace_id): "mock"}
101 1
        url = f"{self.base_endpoint}/trace/{trace_id}"
102 1
        response = await self.api_client.get(url)
103 1
        assert response.status_code == 200
104 1
        result = response.json()
105 1
        assert result == {"msg": "trace pending"}
106
107
        # Trace not found
108 1
        self.napp.tracing._request_queue = {}
109 1
        url = f"{self.base_endpoint}/trace/{int(trace_id)}"
110 1
        response = await self.api_client.get(url)
111 1
        assert response.status_code == 200
112 1
        result = response.json()
113 1
        assert result == {"msg": "unknown trace id"}
114
115
        # Success
116 1
        self.napp.tracing._results_queue = {int(trace_id): "success_mock"}
117 1
        url = f"{self.base_endpoint}/trace/{trace_id}"
118 1
        response = await self.api_client.get(url)
119 1
        assert response.status_code == 200
120 1
        result = response.json()
121 1
        assert result == "success_mock"
122
123
    # pylint: disable=protected-access
124 1
    @patch("napps.amlight.sdntrace.tracing.trace_manager.new_thread")
125 1
    async def test_get_stats(self, mock_thread):
126
        """Test get_stats"""
127 1
        mock_thread.return_value = True
128 1
        traces_n = 99
129 1
        self.napp.tracing.stop_traces()
130 1
        traces_running = {"mock": "request"}
131 1
        queue_request = {"mock1": "trace1", "mock2": "trace2"}
132 1
        queue_result = {"mock": "result"}
133 1
        self.napp.tracing._total_traces_requested = traces_n
134 1
        self.napp.tracing._running_traces = traces_running
135 1
        self.napp.tracing._request_queue = queue_request
136 1
        self.napp.tracing._results_queue = queue_result
137 1
        url = f"{self.base_endpoint}/stats"
138 1
        response = await self.api_client.get(url)
139 1
        assert response.status_code == 200
140 1
        actual_result = response.json()
141 1
        expected_result = {
142
            "number_of_requests": traces_n,
143
            "number_of_running_traces": len(traces_running),
144
            "number_of_pending_traces": len(queue_request),
145
            "list_of_pending_traces": queue_result,
146
        }
147 1
        assert actual_result == expected_result
148
149 1
    async def test_list_settings(self):
150
        """Test list_settings"""
151 1
        url = f"{self.base_endpoint}/settings"
152 1
        response = await self.api_client.get(url)
153 1
        actual_result = response.json()
154 1
        expected_result = {
155
            "color_field": settings.COLOR_FIELD,
156
            "color_value": settings.COLOR_VALUE,
157
            "trace_interval": settings.TRACE_INTERVAL,
158
            "parallel_traces": settings.PARALLEL_TRACES,
159
        }
160
        assert actual_result == expected_result
161