From 2bf4580ec15db91d9f30271d3e9184ae6500d8b1 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Fri, 19 Nov 2021 03:16:46 +0000 Subject: [PATCH] unittest okay Signed-off-by: Dante Su --- sonic-xcvrd/tests/test_xcvrd.py | 114 +++++++++++++++++++++----------- sonic-xcvrd/xcvrd/xcvrd.py | 8 ++- 2 files changed, 80 insertions(+), 42 deletions(-) diff --git a/sonic-xcvrd/tests/test_xcvrd.py b/sonic-xcvrd/tests/test_xcvrd.py index 1099191a6..c6636228b 100644 --- a/sonic-xcvrd/tests/test_xcvrd.py +++ b/sonic-xcvrd/tests/test_xcvrd.py @@ -530,26 +530,31 @@ def test_DaemonXcvrd_run(self, mock_task_stop1, mock_task_stop2, mock_task_run1, assert mock_deinit.call_count == 1 assert mock_init.call_count == 1 - @patch('xcvrd.xcvrd.xcvr_table_helper', MagicMock()) + @patch('xcvrd.xcvrd._wrapper_get_sfp_type', MagicMock(return_value='QSFP_DD')) def test_CmisManagerTask_handle_port_change_event(self): port_mapping = PortMapping() task = CmisManagerTask(port_mapping) + assert not task.isPortConfigDone + port_change_event = PortChangeEvent('PortConfigDone', -1, 0, PortChangeEvent.PORT_SET) + task.on_port_config_change(port_change_event) + assert task.isPortConfigDone + port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_ADD) task.on_port_config_change(port_change_event) - assert task.task_queue.empty() + assert len(task.port_dict) == 0 port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_REMOVE) task.on_port_config_change(port_change_event) - assert task.task_queue.empty() + assert len(task.port_dict) == 0 port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_DEL) task.on_port_config_change(port_change_event) - assert task.task_queue.empty() + assert len(task.port_dict) == 1 port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET) task.on_port_config_change(port_change_event) - assert not task.task_queue.empty() + assert len(task.port_dict) == 1 @patch('xcvrd.xcvrd.platform_chassis') @patch('xcvrd.xcvrd_utilities.port_mapping.subscribe_port_config_change', MagicMock(return_value=(None, None))) @@ -564,53 +569,82 @@ def test_CmisManagerTask_task_run_stop(self, mock_chassis): task = CmisManagerTask(port_mapping) task.task_run([False]) task.task_stop() - for worker in task.task_workers: - assert not worker.is_alive() + assert task.task_process is not None + assert not task.task_process.is_alive() @patch('xcvrd.xcvrd.platform_chassis') @patch('xcvrd.xcvrd_utilities.port_mapping.subscribe_port_config_change', MagicMock(return_value=(None, None))) @patch('xcvrd.xcvrd_utilities.port_mapping.handle_port_config_change', MagicMock()) + @patch('xcvrd.xcvrd._wrapper_get_sfp_type', MagicMock(return_value='QSFP_DD')) def test_CmisManagerTask_task_worker(self, mock_chassis): - mock_object = MagicMock() - mock_object.get_presence = MagicMock(return_value=True) - mock_object.get_port_type = MagicMock(return_value="QSFP_DD") - mock_object.set_cmis_application = MagicMock() - mock_chassis.get_all_sfps = MagicMock(return_value=[mock_object]) - mock_chassis.get_sfp = MagicMock(return_value=mock_object) - - port_mapping = PortMapping() - port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET) + mock_sfp = MagicMock() + mock_sfp.get_presence = MagicMock(return_value=True) + mock_sfp.get_port_type = MagicMock(return_value="QSFP_DD") + mock_sfp.get_transceiver_info = MagicMock(return_value={'type_abbrv_name':'QSFP_DD', 'memory_type':'paged'}) + mock_sfp.get_module_state = MagicMock(return_value="ModuleReady") + mock_sfp.get_cmis_state = MagicMock(return_value={ + 'config_state': { + 'ConfigStatusLane1': 'ConfigSuccess', + 'ConfigStatusLane2': 'ConfigSuccess', + 'ConfigStatusLane3': 'ConfigSuccess', + 'ConfigStatusLane4': 'ConfigSuccess', + 'ConfigStatusLane5': 'ConfigSuccess', + 'ConfigStatusLane6': 'ConfigSuccess', + 'ConfigStatusLane7': 'ConfigSuccess', + 'ConfigStatusLane8': 'ConfigSuccess' + }, + 'datapath_state': { + 'DP1State': 'DataPathInitialized', + 'DP2State': 'DataPathInitialized', + 'DP3State': 'DataPathInitialized', + 'DP4State': 'DataPathInitialized', + 'DP5State': 'DataPathInitialized', + 'DP6State': 'DataPathInitialized', + 'DP7State': 'DataPathInitialized', + 'DP8State': 'DataPathInitialized' + } + }) + mock_sfp.get_cmis_application_update = MagicMock(return_value=(True, 1)) + mock_sfp.set_cmis_application_stop = MagicMock(return_value=True) + mock_sfp.set_cmis_application_apsel = MagicMock(return_value=True) + mock_sfp.set_cmis_application_start = MagicMock(return_value=True) + mock_sfp.set_cmis_application_txon = MagicMock(return_value=True) - # Case 1: Both port speed and lanes are unset - task = CmisManagerTask(port_mapping) - task.task_stopping_event.is_set = MagicMock(side_effect=[False, True]) - task.on_port_config_change(port_change_event) - task.task_worker(False) - assert mock_object.set_cmis_application.call_count == 0 + mock_chassis.get_all_sfps = MagicMock(return_value=[mock_sfp]) + mock_chassis.get_sfp = MagicMock(return_value=mock_sfp) - # Case 2: Invalid port speed while lanes is valid - port_change_event.port_dict = {'speed': 0, 'lanes': "1,2,3,4,5,6,7,8"} + port_mapping = PortMapping() task = CmisManagerTask(port_mapping) - task.task_stopping_event.is_set = MagicMock(side_effect=[False, True]) - task.on_port_config_change(port_change_event) - task.task_worker(False) - assert mock_object.set_cmis_application.call_count == 0 - # Case 3: Valid port speed with invalid lanes - port_change_event.port_dict = {'speed': 400000, 'lanes': None} - task = CmisManagerTask(port_mapping) - task.task_stopping_event.is_set = MagicMock(side_effect=[False, True]) + port_change_event = PortChangeEvent('PortConfigDone', -1, 0, PortChangeEvent.PORT_SET) task.on_port_config_change(port_change_event) - task.task_worker(False) - assert mock_object.set_cmis_application.call_count == 0 + assert task.isPortConfigDone - # Case 4: valid port speed and lanes - port_change_event.port_dict = {'speed': 400000, 'lanes': "1,2,3,4,5,6,7,8"} - task = CmisManagerTask(port_mapping) - task.task_stopping_event.is_set = MagicMock(side_effect=[False, True]) + port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET, + {'speed':'400000', 'lanes':'1,2,3,4,5,6,7,8'}) task.on_port_config_change(port_change_event) - task.task_worker(False) - assert mock_object.set_cmis_application.call_count == 1 + assert len(task.port_dict) == 1 + + # Case 1: Module Inserted --> DP_DEINIT + task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True]) + task.task_worker() + assert mock_sfp.get_cmis_application_update.call_count > 0 + assert mock_sfp.set_cmis_application_stop.call_count > 0 + + # Case 2: DP_DEINIT --> AP Configured + task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True]) + task.task_worker() + assert mock_sfp.set_cmis_application_apsel.call_count > 0 + + # Case 3: AP Configured --> DP_INIT + task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True]) + task.task_worker() + assert mock_sfp.set_cmis_application_start.call_count > 0 + + # Case 4: DP_INIT --> DP_TXON + task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True]) + task.task_worker() + assert mock_sfp.set_cmis_application_txon.call_count > 0 @patch('xcvrd.xcvrd.xcvr_table_helper', MagicMock()) def test_DomInfoUpdateTask_handle_port_change_event(self): diff --git a/sonic-xcvrd/xcvrd/xcvrd.py b/sonic-xcvrd/xcvrd/xcvrd.py index 8f7f7ddf6..6f0bbdcb7 100644 --- a/sonic-xcvrd/xcvrd/xcvrd.py +++ b/sonic-xcvrd/xcvrd/xcvrd.py @@ -854,6 +854,7 @@ def is_fast_reboot_enabled(): class CmisManagerTask: + CMIS_STATE_UNKNOWN = 'UNKNOWN' CMIS_STATE_INSERTED = 'INSERTED' CMIS_STATE_DP_DEINIT = 'DP_DEINIT' CMIS_STATE_AP_CONF = 'AP_CONFIGURED' @@ -946,8 +947,11 @@ def task_worker(self): if lport not in self.port_dict: continue - state = self.port_dict[lport].get('cmis_state', self.CMIS_STATE_REMOVED) - if state in [self.CMIS_STATE_FAILED, self.CMIS_STATE_READY, self.CMIS_STATE_REMOVED]: + state = self.port_dict[lport].get('cmis_state', self.CMIS_STATE_UNKNOWN) + if state in [self.CMIS_STATE_UNKNOWN, + self.CMIS_STATE_FAILED, + self.CMIS_STATE_READY, + self.CMIS_STATE_REMOVED]: continue pport = int(info.get('index', "-1"))