Index: tst_Alarm/test.py =================================================================== diff -u -r84797bef0eb4a0898718fde40d11e5f69d568c09 -rc70f4f767e0216fb82b0aa809d11bc86073a6e1e --- tst_Alarm/test.py (.../test.py) (revision 84797bef0eb4a0898718fde40d11e5f69d568c09) +++ tst_Alarm/test.py (.../test.py) (revision c70f4f767e0216fb82b0aa809d11bc86073a6e1e) @@ -8,43 +8,194 @@ # WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # file tst_Alarm -# date 2020/04/08 -# author Behrouz NematiPour +# date 2020/06/26 +# author Peter Lucia # import names import denaliMessages import utils from time import sleep +import os -def main(): - utils.tstStart() +HIGH = 3 +MED = 2 +LOW = 1 +NONE = 0 + +HIGH_PRIORITY_COLOR = "#c53b33" +MED_LOW_PRIORITY_COLOR = "#f5a623" + +class Alarms: + + # ALARM_ID = (priority, alarmID, escalates in, silent_espires_in, flags) +# ALARM_ID_NO_ALARM = (NONE, 0, 0, 0, 0) + ALARM_ID_SOFTWARE_FAULT = (HIGH, 1, 0, 0, 0) + ALARM_ID_STUCK_BUTTON_TEST_FAILED = (HIGH, 2, 0, 0, 0) + ALARM_ID_FPGA_POST_TEST_FAILED = (HIGH, 3, 0, 0, 0) + ALARM_ID_WATCHDOG_POST_TEST_FAILED = (HIGH, 4, 0, 0, 0) + ALARM_ID_UI_COMM_POST_FAILED = (HIGH, 5, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = (MED, 6, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_OFF_CHECK = (MED, 7, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = (MED, 8, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = (HIGH, 9, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = (MED, 10, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = (MED, 11, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = (MED, 12, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = (HIGH, 13, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = (MED, 14, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = (MED, 15, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = (MED, 16, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = (HIGH, 17, 0, 0, 0) + ALARM_ID_WATCHDOG_EXPIRED = (HIGH, 18, 0, 0, 0) + ALARM_ID_RTC_COMM_ERROR = (HIGH, 19, 0, 0, 0) + ALARM_ID_RTC_CONFIG_ERROR = (HIGH, 20, 0, 0, 0) + ALARM_ID_DG_COMM_TIMEOUT = (HIGH, 21, 0, 0, 0) + ALARM_ID_UI_COMM_TIMEOUT = (HIGH, 22, 0, 0, 0) + ALARM_ID_COMM_TOO_MANY_BAD_CRCS = (HIGH, 23, 0, 0, 0) + ALARM_ID_TREATMENT_STOPPED_BY_USER = (LOW, 24, 0, 0, 0) + ALARM_ID_BLOOD_SITTING_WARNING = (MED, 25, 0, 0, 0) + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = (MED, 26, 0, 0, 0) + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = (HIGH, 27, 0, 0, 0) + ALARM_ID_CAN_MESSAGE_NOT_ACKED = (HIGH, 28, 0, 0, 0) + ALARM_ID_OCCLUSION_BLOOD_PUMP = (HIGH, 29, 0, 0, 0) + ALARM_ID_OCCLUSION_DIAL_IN_PUMP = (HIGH, 30, 0, 0, 0) + ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = (HIGH, 31, 0, 0, 0) + ALARM_ID_ARTERIAL_PRESSURE_LOW = (HIGH, 32, 0, 0, 0) + ALARM_ID_ARTERIAL_PRESSURE_HIGH = (HIGH, 33, 0, 0, 0) + ALARM_ID_VENOUS_PRESSURE_LOW = (HIGH, 34, 0, 0, 0) + ALARM_ID_VENOUS_PRESSURE_HIGH = (HIGH, 35, 0, 0, 0) + ALARM_ID_UF_RATE_TOO_HIGH_ERROR = (HIGH, 36, 0, 0, 0) + ALARM_ID_UF_VOLUME_ACCURACY_ERROR = (HIGH, 37, 0, 0, 0) + ALARM_ID_RTC_BATTERY_LOW = (HIGH, 38, 0, 0, 0) + ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = (HIGH, 39, 0, 0, 0) + ALARM_ID_RTC_RAM_OPS_ERROR = (HIGH, 40, 0, 0, 0) + ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = (HIGH, 41, 0, 0, 0) + ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = (HIGH, 42, 0, 0, 0) + ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = (HIGH, 43, 0, 0, 0) + ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = (HIGH, 44, 0, 0, 0) + ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = (HIGH, 45, 0, 0, 0) + AlARM_ID_NVDATA_DISINFECTION_DATE_CRC_ERROR = (HIGH, 46, 0, 0, 0) + ALARM_ID_RO_PUMP_OUT_PRESSURE_OUT_OF_RANGE = (HIGH, 47, 0, 0, 0) + ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE = (HIGH, 48, 0, 0, 0) + ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT = (HIGH, 49, 0, 0, 0) + ALARM_ID_HD_COMM_TIMEOUT = (HIGH, 50, 0, 0, 0) + ALARM_ID_VALVE_CONTROL_FAILURE = (HIGH, 51, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = (HIGH, 52, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = (HIGH, 53, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = (HIGH, 54, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = (HIGH, 55, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = (HIGH, 56, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = (HIGH, 57, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = (HIGH, 58, 0, 0, 0) + ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE = (HIGH, 59, 0, 0, 0) + ALARM_ID_DOES_NOT_EXIST = (HIGH, 99, 0, 0, 0) + + +def test_alarms(alarms, alarm_list, skip_hd_timeout=True): + """ + Tests a list of alarm tuples. - startApplication("denaliSquish") - sleep(0.5) + @param alarms: Alarm class object + @param alarms_list: list of alarm tuples to test. + @param skip_timeout: whether to skip the hd comm timeout error, default = False + @return: None + """ + + for idx, (priority, alarm_id, escalates_in, silent_expires_in, flags) in enumerate(alarm_list): + if (alarm_list[idx] == alarms.ALARM_ID_HD_COMM_TIMEOUT) and skip_hd_timeout: + continue + test.log("Testing {0} = {1}".format(alarm_list[idx], alarm_id)) + color = HIGH_PRIORITY_COLOR if priority == HIGH else MED_LOW_PRIORITY_COLOR + denaliMessages.sendAlarm(priority, alarm_id, escalates_in, silent_expires_in, flags) + sleep(0.5) + if priority == HIGH: + test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, color) + sleep(0.5) + mouseClick(waitForObjectExists(names.o_dismiss_alarm)) + else: + mouseClick(waitForObjectExists(names.o_alarm_bar)) + sleep(0.5) + test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, color) + sleep(0.5) + mouseClick(waitForObjectExists(names.o_okay_alarm)) + sleep(0.5) + mouseClick(waitForObjectExists(names.o_alarm_bar)) + sleep(0.5) + mouseClick(waitForObjectExists(names.o_dismiss_alarm)) + + + + sleep(0.5) + denaliMessages.clear_all_alarms() + +def test_alarm_acknowledge(alarms): + """ + Exercises the acknowledge alarm functionality - high_priority_color = "#c53b33" - med_low_priority_color = "#f5a623" + @return: None + """ + test.log("Testing alarm acknowledgement") - denaliMessages.sendAlarm(3, 26, 2, 0, 0) - test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, high_priority_color) + denaliMessages.clear_all_alarms() sleep(0.5) - denaliMessages.sendAlarm(3, 26, 2, 0, 65535) - test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, high_priority_color) - sleep(0.5) - denaliMessages.sendAlarm(2, 2, 0, 10, 100) - test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, med_low_priority_color) + denaliMessages.sendAlarm(*alarms.ALARM_ID_SOFTWARE_FAULT) sleep(0.5) + test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, HIGH_PRIORITY_COLOR) + sleep(0.5) + mouseClick(waitForObjectExists(names.o_okay_alarm)) + sleep(0.5) + denaliMessages.clear_all_alarms() + sleep(0.5) + denaliMessages.sendAlarm(*alarms.ALARM_ID_SOFTWARE_FAULT) + sleep(0.5) + + +def get_alarm_list(alarms): + """ + Gets the alarm list - denaliMessages.sendAlarm(1, 3, 0, 0, 54) - test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, med_low_priority_color) + @return: The alarms (list of tuples) + """ + + alarm_list = [] + for attr in dir(alarms): + if not callable(getattr(alarms, attr)) and attr.startswith("ALARM_ID"): + alarm_list.append(getattr(alarms, attr)) + + return sorted(alarm_list, key = lambda val: val [1]) + + +def main(): + """ + Main function to test the alarms. + + @return: None + """ + utils.tstStart() + + startApplication("denaliSquish -q") sleep(0.5) + + alarms = Alarms() + alarm_list = get_alarm_list(alarms) + + test_alarms(alarms, alarm_list) + + # test the alarm acknowledgement + test_alarm_acknowledge(alarms) + + os.system("killall denaliSquish") + sleep(3) - denaliMessages.sendAlarm(1, 49, 2, 0, 0) - test.compare(waitForObjectExists(names.o_alarm_dialog).color.name, med_low_priority_color) + startApplication("denaliSquish") sleep(0.5) + alarm_list = [alarms.ALARM_ID_HD_COMM_TIMEOUT] + # test hd comm timeout since it was skipped in the last test + test_alarms(alarms, alarm_list, skip_hd_timeout = False) + utils.tstDone()