def test_signal_handler(self): psud.platform_chassis = MockChassis() daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.stop_event.set = mock.MagicMock() daemon_psud.log_info = mock.MagicMock() daemon_psud.log_warning = mock.MagicMock() # Test SIGHUP daemon_psud.signal_handler(psud.signal.SIGHUP, None) assert daemon_psud.log_info.call_count == 1 daemon_psud.log_info.assert_called_with( "Caught signal 'SIGHUP' - ignoring...") assert daemon_psud.log_warning.call_count == 0 assert daemon_psud.stop_event.set.call_count == 0 assert psud.exit_code == 0 # Reset daemon_psud.log_info.reset_mock() daemon_psud.log_warning.reset_mock() daemon_psud.stop_event.set.reset_mock() # Test SIGINT test_signal = psud.signal.SIGINT daemon_psud.signal_handler(test_signal, None) assert daemon_psud.log_info.call_count == 1 daemon_psud.log_info.assert_called_with( "Caught signal 'SIGINT' - exiting...") assert daemon_psud.log_warning.call_count == 0 assert daemon_psud.stop_event.set.call_count == 1 assert psud.exit_code == (128 + test_signal) # Reset daemon_psud.log_info.reset_mock() daemon_psud.log_warning.reset_mock() daemon_psud.stop_event.set.reset_mock() # Test SIGTERM test_signal = psud.signal.SIGTERM daemon_psud.signal_handler(test_signal, None) assert daemon_psud.log_info.call_count == 1 daemon_psud.log_info.assert_called_with( "Caught signal 'SIGTERM' - exiting...") assert daemon_psud.log_warning.call_count == 0 assert daemon_psud.stop_event.set.call_count == 1 assert psud.exit_code == (128 + test_signal) # Reset daemon_psud.log_info.reset_mock() daemon_psud.log_warning.reset_mock() daemon_psud.stop_event.set.reset_mock() psud.exit_code = 0 # Test an unhandled signal daemon_psud.signal_handler(psud.signal.SIGUSR1, None) assert daemon_psud.log_warning.call_count == 1 daemon_psud.log_warning.assert_called_with( "Caught unhandled signal 'SIGUSR1' - ignoring...") assert daemon_psud.log_info.call_count == 0 assert daemon_psud.stop_event.set.call_count == 0 assert psud.exit_code == 0
def test_update_psu_fan_data(self, mock_datetime): fake_time = datetime.datetime(2021, 1, 1, 12, 34, 56) mock_datetime.now.return_value = fake_time mock_fan = MockFan("PSU 1 Test Fan 1", MockFan.FAN_DIRECTION_INTAKE) mock_psu1 = MockPsu("PSU 1", 0, True, True) mock_psu1._fan_list = [mock_fan] mock_logger = mock.MagicMock() psud.platform_chassis = MockChassis() psud.platform_chassis._psu_list = [mock_psu1] daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.fan_tbl = mock.MagicMock() expected_fvp = psud.swsscommon.FieldValuePairs([ (psud.FAN_INFO_PRESENCE_FIELD, "True"), (psud.FAN_INFO_STATUS_FIELD, "True"), (psud.FAN_INFO_DIRECTION_FIELD, mock_fan.get_direction()), (psud.FAN_INFO_SPEED_FIELD, str(mock_fan.get_speed())), (psud.FAN_INFO_TIMESTAMP_FIELD, fake_time.strftime('%Y%m%d %H:%M:%S')) ]) daemon_psud._update_psu_fan_data(mock_psu1, 1) assert daemon_psud.fan_tbl.set.call_count == 1 daemon_psud.fan_tbl.set.assert_called_with("PSU 1 Test Fan 1", expected_fvp) daemon_psud.fan_tbl.set.reset_mock()
def test_update_single_psu_data(self): psud._wrapper_get_psu_presence.return_value = True psud._wrapper_get_psu_status.return_value = True psu1 = MockPsu('PSU 1', 0, True, 'Fake Model', '12345678', '1234') psud.platform_chassis = MockChassis() psud.platform_chassis._psu_list.append(psu1) expected_fvp = psud.swsscommon.FieldValuePairs([ (psud.PSU_INFO_MODEL_FIELD, 'Fake Model'), (psud.PSU_INFO_SERIAL_FIELD, '12345678'), (psud.PSU_INFO_REV_FIELD, '1234'), (psud.PSU_INFO_TEMP_FIELD, '30.0'), (psud.PSU_INFO_TEMP_TH_FIELD, '50.0'), (psud.PSU_INFO_VOLTAGE_FIELD, '12.0'), (psud.PSU_INFO_VOLTAGE_MIN_TH_FIELD, '11.0'), (psud.PSU_INFO_VOLTAGE_MAX_TH_FIELD, '13.0'), (psud.PSU_INFO_CURRENT_FIELD, '8.0'), (psud.PSU_INFO_POWER_FIELD, '100.0'), (psud.PSU_INFO_FRU_FIELD, 'True'), ]) daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.psu_tbl = mock.MagicMock() daemon_psud._update_single_psu_data(1, psu1) daemon_psud.psu_tbl.set.assert_called_with( psud.PSU_INFO_KEY_TEMPLATE.format(1), expected_fvp)
def test_update_psu_entity_info(self): mock_psu1 = MockPsu("PSU 1", 0, True, True) mock_psu2 = MockPsu("PSU 2", 1, True, True) daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud._update_single_psu_entity_info = mock.MagicMock() # If psud.platform_chassis is None, _update_psu_entity_info() should do nothing psud.platform_chassis = None daemon_psud._update_psu_entity_info() assert daemon_psud._update_single_psu_entity_info.call_count == 0 psud.platform_chassis = MockChassis() psud.platform_chassis._psu_list = [mock_psu1] daemon_psud._update_psu_entity_info() assert daemon_psud._update_single_psu_entity_info.call_count == 1 daemon_psud._update_single_psu_entity_info.assert_called_with(1, mock_psu1) daemon_psud._update_single_psu_entity_info.reset_mock() psud.platform_chassis._psu_list = [mock_psu1, mock_psu2] daemon_psud._update_psu_entity_info() assert daemon_psud._update_single_psu_entity_info.call_count == 2 expected_calls = [mock.call(1, mock_psu1), mock.call(2, mock_psu2)] assert daemon_psud._update_single_psu_entity_info.mock_calls == expected_calls # Test behavior if _update_single_psu_entity_info raises an exception daemon_psud._update_single_psu_entity_info.reset_mock() daemon_psud._update_single_psu_entity_info.side_effect = Exception("Test message") daemon_psud.log_warning = mock.MagicMock() psud.platform_chassis._psu_list = [mock_psu1] daemon_psud._update_psu_entity_info() assert daemon_psud._update_single_psu_entity_info.call_count == 1 daemon_psud._update_single_psu_entity_info.assert_called_with(1, mock_psu1) assert daemon_psud.log_warning.call_count == 1 daemon_psud.log_warning.assert_called_with("Failed to update PSU data - Test message")
def test_update_psu_fan_led_status(self): mock_fan = MockFan("PSU 1 Test Fan 1", MockFan.FAN_DIRECTION_INTAKE) mock_psu = MockPsu("PSU 1", 0, True, True) mock_psu._fan_list = [mock_fan] mock_logger = mock.MagicMock() psud.platform_chassis = MockChassis() daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.fan_tbl = mock.MagicMock() expected_fvp = psud.swsscommon.FieldValuePairs([(psud.FAN_INFO_LED_STATUS_FIELD, MockFan.STATUS_LED_COLOR_OFF)]) daemon_psud._update_psu_fan_led_status(mock_psu, 1) assert daemon_psud.fan_tbl.set.call_count == 1 daemon_psud.fan_tbl.set.assert_called_with("PSU 1 Test Fan 1", expected_fvp) daemon_psud.fan_tbl.set.reset_mock() # Test Fan.get_status_led not implemented mock_fan.get_status_led = mock.Mock(side_effect=NotImplementedError) expected_fvp = psud.swsscommon.FieldValuePairs([(psud.FAN_INFO_LED_STATUS_FIELD, psud.NOT_AVAILABLE)]) daemon_psud._update_psu_fan_led_status(mock_psu, 1) assert daemon_psud.fan_tbl.set.call_count == 1 daemon_psud.fan_tbl.set.assert_called_with("PSU 1 Test Fan 1", expected_fvp) daemon_psud.fan_tbl.set.reset_mock() # Test Fan.get_name not implemented mock_fan.get_name = mock.Mock(side_effect=NotImplementedError) daemon_psud._update_psu_fan_led_status(mock_psu, 1) assert daemon_psud.fan_tbl.set.call_count == 1 daemon_psud.fan_tbl.set.assert_called_with("PSU 1 FAN 1", expected_fvp)
def test_update_psu_data(self): mock_psu1 = MockPsu("PSU 1", 0, True, True) mock_psu2 = MockPsu("PSU 2", 1, True, True) psud.platform_chassis = MockChassis() daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud._update_single_psu_data = mock.MagicMock() daemon_psud.log_warning = mock.MagicMock() # Test platform_chassis is None psud.platform_chassis = None daemon_psud.update_psu_data() assert daemon_psud._update_single_psu_data.call_count == 0 assert daemon_psud.log_warning.call_count == 0 # Test with mocked platform_chassis psud.platform_chassis = MockChassis() psud.platform_chassis._psu_list = [mock_psu1, mock_psu2] daemon_psud.update_psu_data() assert daemon_psud._update_single_psu_data.call_count == 2 expected_calls = [mock.call(1, mock_psu1), mock.call(2, mock_psu2)] assert daemon_psud._update_single_psu_data.mock_calls == expected_calls assert daemon_psud.log_warning.call_count == 0 daemon_psud._update_single_psu_data.reset_mock() # Test _update_single_psu_data() throws exception daemon_psud._update_single_psu_data.side_effect = Exception("Test message") daemon_psud.update_psu_data() assert daemon_psud._update_single_psu_data.call_count == 2 expected_calls = [mock.call(1, mock_psu1), mock.call(2, mock_psu2)] assert daemon_psud._update_single_psu_data.mock_calls == expected_calls assert daemon_psud.log_warning.call_count == 2 expected_calls = [mock.call("Failed to update PSU data - Test message")] * 2 assert daemon_psud.log_warning.mock_calls == expected_calls
def test_update_led_color(self): mock_psu = MockPsu("PSU 1", 0, True, True) mock_logger = mock.MagicMock() psu_status = psud.PsuStatus(mock_logger, mock_psu) daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.psu_tbl = mock.MagicMock() daemon_psud._update_psu_fan_led_status = mock.MagicMock() # If psud.platform_chassis is None, _update_psu_fan_led_status() should do nothing psud.platform_chassis = None daemon_psud._update_led_color() assert daemon_psud.psu_tbl.set.call_count == 0 assert daemon_psud._update_psu_fan_led_status.call_count == 0 psud.platform_chassis = MockChassis() daemon_psud.psu_status_dict[1] = psu_status expected_fvp = psud.swsscommon.FieldValuePairs([('led_status', MockPsu.STATUS_LED_COLOR_OFF)]) daemon_psud._update_led_color() assert daemon_psud.psu_tbl.set.call_count == 1 daemon_psud.psu_tbl.set.assert_called_with(psud.PSU_INFO_KEY_TEMPLATE.format(1), expected_fvp) assert daemon_psud._update_psu_fan_led_status.call_count == 1 daemon_psud._update_psu_fan_led_status.assert_called_with(mock_psu, 1) daemon_psud.psu_tbl.reset_mock() daemon_psud._update_psu_fan_led_status.reset_mock() mock_psu.set_status_led(MockPsu.STATUS_LED_COLOR_GREEN) expected_fvp = psud.swsscommon.FieldValuePairs([('led_status', MockPsu.STATUS_LED_COLOR_GREEN)]) daemon_psud._update_led_color() assert daemon_psud.psu_tbl.set.call_count == 1 daemon_psud.psu_tbl.set.assert_called_with(psud.PSU_INFO_KEY_TEMPLATE.format(1), expected_fvp) assert daemon_psud._update_psu_fan_led_status.call_count == 1 daemon_psud._update_psu_fan_led_status.assert_called_with(mock_psu, 1) daemon_psud.psu_tbl.reset_mock() daemon_psud._update_psu_fan_led_status.reset_mock() mock_psu.set_status_led(MockPsu.STATUS_LED_COLOR_RED) expected_fvp = psud.swsscommon.FieldValuePairs([('led_status', MockPsu.STATUS_LED_COLOR_RED)]) daemon_psud._update_led_color() assert daemon_psud.psu_tbl.set.call_count == 1 daemon_psud.psu_tbl.set.assert_called_with(psud.PSU_INFO_KEY_TEMPLATE.format(1), expected_fvp) assert daemon_psud._update_psu_fan_led_status.call_count == 1 daemon_psud._update_psu_fan_led_status.assert_called_with(mock_psu, 1) daemon_psud.psu_tbl.reset_mock() daemon_psud._update_psu_fan_led_status.reset_mock() # Test exception handling mock_psu.get_status_led = mock.Mock(side_effect=NotImplementedError) expected_fvp = psud.swsscommon.FieldValuePairs([('led_status', psud.NOT_AVAILABLE)]) daemon_psud._update_led_color() assert daemon_psud.psu_tbl.set.call_count == 1 daemon_psud.psu_tbl.set.assert_called_with(psud.PSU_INFO_KEY_TEMPLATE.format(1), expected_fvp) assert daemon_psud._update_psu_fan_led_status.call_count == 1 daemon_psud._update_psu_fan_led_status.assert_called_with(mock_psu, 1)
def test_run(self): psud.platform_chassis = MockChassis() daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud._update_psu_entity_info = mock.MagicMock() daemon_psud.update_psu_data = mock.MagicMock() daemon_psud._update_led_color = mock.MagicMock() daemon_psud.update_psu_chassis_info = mock.MagicMock() daemon_psud.run() assert daemon_psud.first_run is False
def test_set_psu_led(self): mock_logger = mock.MagicMock() mock_psu = MockPsu("PSU 1", 0, True, True) psu_status = psud.PsuStatus(mock_logger, mock_psu) daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) psu_status.presence = True psu_status.power_good = True psu_status.voltage_good = True psu_status.temperature_good = True daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_GREEN psu_status.presence = False daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_RED psu_status.presence = True daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_GREEN psu_status.power_good = False daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_RED psu_status.power_good = True daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_GREEN psu_status.voltage_good = False daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_RED psu_status.voltage_good = True daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_GREEN psu_status.temperature_good = False daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_RED psu_status.temperature_good = True daemon_psud._set_psu_led(mock_psu, psu_status) assert mock_psu.get_status_led() == mock_psu.STATUS_LED_COLOR_GREEN # Test set_status_led not implemented mock_psu.set_status_led = mock.MagicMock( side_effect=NotImplementedError) daemon_psud.log_warning = mock.MagicMock() daemon_psud._set_psu_led(mock_psu, psu_status) assert daemon_psud.log_warning.call_count == 1 daemon_psud.log_warning.assert_called_with( "set_status_led() not implemented")
def test_update_single_psu_entity_info(self): mock_psu1 = MockPsu("PSU 1", 0, True, True) expected_fvp = psud.swsscommon.FieldValuePairs( [('position_in_parent', '0'), ('parent_name', psud.CHASSIS_INFO_KEY), ]) daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.phy_entity_tbl = mock.MagicMock() daemon_psud._update_single_psu_entity_info(0, mock_psu1) daemon_psud.phy_entity_tbl.set.assert_called_with('PSU 0', expected_fvp)
def test_update_psu_chassis_info(self): daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) # If psud.platform_chassis is None, update_psu_chassis_info() should do nothing psud.platform_chassis = None daemon_psud.psu_chassis_info = None daemon_psud.update_psu_chassis_info() assert daemon_psud.psu_chassis_info is None # Now we mock platform_chassis, so that daemon_psud.psu_chassis_info should be instantiated and run_power_budget() should be called psud.platform_chassis = MockChassis() daemon_psud.update_psu_chassis_info() assert daemon_psud.psu_chassis_info is not None assert daemon_psud.psu_chassis_info.run_power_budget.call_count == 1
def test_signal_handler(self): daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud.stop.set = mock.MagicMock() daemon_psud.log_info = mock.MagicMock() daemon_psud.log_warning = mock.MagicMock() # Test SIGHUP daemon_psud.signal_handler(psud.signal.SIGHUP, None) assert daemon_psud.log_info.call_count == 1 daemon_psud.log_info.assert_called_with("Caught SIGHUP - ignoring...") assert daemon_psud.log_warning.call_count == 0 assert daemon_psud.stop.set.call_count == 0 # Test SIGINT daemon_psud.log_info.reset_mock() daemon_psud.log_warning.reset_mock() daemon_psud.stop.set.reset_mock() daemon_psud.signal_handler(psud.signal.SIGINT, None) assert daemon_psud.log_info.call_count == 1 daemon_psud.log_info.assert_called_with("Caught SIGINT - exiting...") assert daemon_psud.log_warning.call_count == 0 assert daemon_psud.stop.set.call_count == 1 # Test SIGTERM daemon_psud.log_info.reset_mock() daemon_psud.log_warning.reset_mock() daemon_psud.stop.set.reset_mock() daemon_psud.signal_handler(psud.signal.SIGTERM, None) assert daemon_psud.log_info.call_count == 1 daemon_psud.log_info.assert_called_with("Caught SIGTERM - exiting...") assert daemon_psud.log_warning.call_count == 0 assert daemon_psud.stop.set.call_count == 1 # Test an unhandled signal daemon_psud.log_info.reset_mock() daemon_psud.log_warning.reset_mock() daemon_psud.stop.set.reset_mock() daemon_psud.signal_handler(psud.signal.SIGUSR1, None) assert daemon_psud.log_warning.call_count == 1 daemon_psud.log_warning.assert_called_with( "Caught unhandled signal 'SIGUSR1'") assert daemon_psud.log_info.call_count == 0 assert daemon_psud.stop.set.call_count == 0
def test_update_psu_data(self): mock_psu1 = mock_platform.MockPsu(True, True, "PSU 1", 0) mock_psu2 = mock_platform.MockPsu(True, True, "PSU 2", 1) mock_psu_tbl = mock.MagicMock() daemon_psud = psud.DaemonPsud(SYSLOG_IDENTIFIER) daemon_psud._update_single_psu_data = mock.MagicMock() daemon_psud.log_warning = mock.MagicMock() # Test platform_chassis is None psud.platform_chassis = None daemon_psud.update_psu_data(mock_psu_tbl) assert daemon_psud._update_single_psu_data.call_count == 0 assert daemon_psud.log_warning.call_count == 0 # Test with mocked platform_chassis psud.platform_chassis = mock_platform.MockChassis() psud.platform_chassis.psu_list = [mock_psu1, mock_psu2] daemon_psud.update_psu_data(mock_psu_tbl) assert daemon_psud._update_single_psu_data.call_count == 2 daemon_psud._update_single_psu_data.assert_called_with( 2, mock_psu2, mock_psu_tbl) assert daemon_psud.log_warning.call_count == 0 daemon_psud.log_warning = mock.MagicMock() daemon_psud._update_single_psu_data.reset_mock() # Test _update_single_psu_data() throws exception daemon_psud._update_single_psu_data.side_effect = Exception( "Test message") daemon_psud.update_psu_data(mock_psu_tbl) assert daemon_psud._update_single_psu_data.call_count == 2 daemon_psud._update_single_psu_data.assert_called_with( 2, mock_psu2, mock_psu_tbl) assert daemon_psud.log_warning.call_count == 2 daemon_psud.log_warning.assert_called_with( "Failed to update PSU data - Test message")