| 1 |  |  | """Module to test the main napp file.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 | 1 |  | from unittest.mock import Mock, patch, MagicMock | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  | # pylint: disable=import-error,no-name-in-module | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 | 1 |  | from kytos.core.events import KytosEvent | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 | 1 |  | from kytos.core.buffers import KytosBuffers | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 | 1 |  | from kytos.lib.helpers import get_controller_mock, get_test_client | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 | 1 |  | from tests.integration.helpers import (get_interface_mock, get_switch_mock) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  | # pylint: disable=import-outside-toplevel | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 | 1 |  | class TestMain: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |     """Test the Main class.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 | 1 |  |     def setup_method(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |         """Execute steps before each tests. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |         Set the server_name_url from kytos/topology | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |         """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 | 1 |  |         patch('kytos.core.helpers.run_on_thread', lambda x: x).start() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 | 1 |  |         from napps.kytos.topology.main import Main | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 | 1 |  |         Main.get_topo_controller = MagicMock() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 | 1 |  |         controller = get_controller_mock() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 | 1 |  |         self.napp = Main(controller) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 | 1 |  |         _ = self.napp.controller.buffers.app.get() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 | 1 |  |         self.api_client = get_test_client(controller, self.napp) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 | 1 |  |         self.base_endpoint = "kytos/topology/v3" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 | 1 |  |     def test_get_switches_dict(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |         """Basic test for switch listing.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |         # pylint: disable=protected-access, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |         # pylint: disable=use-implicit-booleaness-not-comparison | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 | 1 |  |         switches = self.napp._get_switches_dict() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 | 1 |  |         assert isinstance(switches['switches'], dict) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 | 1 |  |         assert switches['switches'] == {} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 | 1 |  |     def test_get_event_listeners(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |         """Verify all event listeners registered.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 | 1 |  |         actual_events = self.napp.listeners() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 | 1 |  |         expected_events = ['kytos/core.shutdown', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |                            'kytos/core.shutdown.kytos/topology', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |                            'kytos/maintenance.start_link', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |                            'kytos/maintenance.end_link', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |                            'kytos/maintenance.start_switch', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |                            'kytos/maintenance.end_switch', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |                            'kytos/.*.link_available_tags', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |                            'kytos/.*.liveness.(up|down)', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |                            'kytos/.*.liveness.disabled', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |                            'kytos/topology.get', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |                            '.*.topo_controller.upsert_switch', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |                            '.*.of_lldp.network_status.updated', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |                            '.*.interface.is.nni', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |                            '.*.connection.lost', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |                            '.*.switch.interfaces.created', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |                            '.*.topology.switch.interface.created', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |                            '.*.switch.interface.deleted', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |                            '.*.switch.interface.link_down', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |                            '.*.switch.interface.link_up', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |                            '.*.switch.(new|reconnected)', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |                            '.*.switch.port.created', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |                            'kytos/topology.notify_link_up_if_status'] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 | 1 |  |         assert sorted(expected_events) == sorted(actual_events) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 | 1 |  |     async def test_get_interfaces(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |         """test_get_interfaces.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 | 1 |  |         dpid = "00:00:00:00:00:00:00:01" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 | 1 |  |         switch = get_switch_mock(0x04, dpid=dpid) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 | 1 |  |         switch.dpid = dpid | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 | 1 |  |         switch.metadata = {"lat": 0, "lng": 0} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 | 1 |  |         switch.interfaces = {f"{dpid}:1": f"{dpid}:1"} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 | 1 |  |         switch.as_dict = lambda: {"dpid": dpid, "metadata": switch.metadata, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |                                   "interfaces": switch.interfaces} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 | 1 |  |         self.napp.controller.switches = {dpid: switch} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 | 1 |  |         endpoint = f"{self.base_endpoint}/interfaces" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 | 1 |  |         response = await self.api_client.get(endpoint) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 | 1 |  |         assert response.status_code == 200 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 | 1 |  |         data = response.json() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 | 1 |  |         assert "interfaces" in data | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 | 1 |  |         assert len(data["interfaces"]) == 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 | 1 |  |         assert data["interfaces"][f"{dpid}:1"] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 | 1 |  |     async def test_handle_new_switch(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |         """Test handle new switch.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 | 1 |  |         self.napp.controller._buffers = KytosBuffers() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 | 1 |  |         event_name = '.*.switch.(new|reconnected)' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 | 1 |  |         switch = get_switch_mock(0x04) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 | 1 |  |         event = KytosEvent(name=event_name, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |                            content={'switch': switch}) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 | 1 |  |         self.napp.handle_new_switch(event) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 | 1 |  |         event_response = self.napp.controller.buffers.app.get() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 | 1 |  |         assert event_response.name == 'kytos/topology.updated' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 | 1 |  |     async def test_handle_interface_deleted(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |         """Test handle interface deleted.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 | 1 |  |         self.napp.controller._buffers = KytosBuffers() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 | 1 |  |         event_name = '.*.switch.interface.deleted' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 | 1 |  |         interface = get_interface_mock("interface1", 7) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 | 1 |  |         interface.switch.dpid = "00:00:00:00:00:00:00:01" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 | 1 |  |         stats_event = KytosEvent(name=event_name, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |                                  content={'interface': interface}) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 | 1 |  |         self.napp.handle_interface_deleted(stats_event) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 | 1 |  |         event_updated_response = self.napp.controller.buffers.app.get() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 | 1 |  |         assert event_updated_response.name == 'kytos/topology.updated' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 | 1 |  |     async def test_handle_connection_lost(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |         """Test handle connection lost.""" | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 | 1 |  |         self.napp.controller._buffers = KytosBuffers() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 | 1 |  |         event_name = '.*.connection.lost' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 | 1 |  |         source = Mock() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 | 1 |  |         stats_event = KytosEvent(name=event_name, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 |  |  |                                  content={'source': source}) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 112 | 1 |  |         self.napp.handle_connection_lost(stats_event) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 113 | 1 |  |         event_updated_response = self.napp.controller.buffers.app.get() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 114 |  |  |         assert event_updated_response.name == 'kytos/topology.updated' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 115 |  |  |  |