Skip to content

Commit

Permalink
unittest okay
Browse files Browse the repository at this point in the history
Signed-off-by: Dante Su <dante.su@broadcom.com>
  • Loading branch information
ds952811 committed Nov 19, 2021
1 parent 187f746 commit 2bf4580
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 42 deletions.
114 changes: 74 additions & 40 deletions sonic-xcvrd/tests/test_xcvrd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand All @@ -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):
Expand Down
8 changes: 6 additions & 2 deletions sonic-xcvrd/xcvrd/xcvrd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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"))
Expand Down

0 comments on commit 2bf4580

Please sign in to comment.