class DAQmxTests(object): """ General tests for the DAQmx. """ def setUp(self): self.emulator, self._ioc = get_running_lewis_and_ioc( DEVICE_PREFIX, DEVICE_PREFIX) self.ca = ChannelAccess(device_prefix=DEVICE_PREFIX) def test_WHEN_emulator_disconnected_THEN_data_in_alarm_and_valid_on_reconnect( self): self.ca.assert_that_pv_alarm_is_not("DATA", ChannelAccess.Alarms.INVALID) self.emulator.disconnect_device() self.ca.assert_that_pv_alarm_is("DATA", ChannelAccess.Alarms.INVALID) # Check we don't get excessive numbers of messages if we stay disconnected for 15s (up to 15 messages seems # reasonable - 1 per second on average) with assert_log_messages(self._ioc, number_of_messages=15): sleep(15) # Double-check we are still in alarm self.ca.assert_that_pv_alarm_is("DATA", ChannelAccess.Alarms.INVALID) self.emulator.reconnect_device() self.ca.assert_that_pv_alarm_is_not("DATA", ChannelAccess.Alarms.INVALID, timeout=5) self.ca.assert_that_pv_value_is_changing("DATA", 1)
class SmrtmonTests(unittest.TestCase): def setUp(self): self._lewis, self._ioc = get_running_lewis_and_ioc( "smrtmon", IOC_PREFIX) self.ca = ChannelAccess(device_prefix=IOC_PREFIX) self._lewis.backdoor_run_function_on_device("reset_values") self.ca.assert_that_pv_alarm_is_not("STAT", ChannelAccess.Alarms.INVALID) @parameterized.expand(MAGNET_STATUS.items()) def test_WHEN_status_changes_THEN_magnetstatus_enum_is_updated( self, num, status): # Check when the STATUS value updates the MAGNETSTATUS enum is updated with the correct string self._lewis.backdoor_run_function_on_device(SET_STAT, [10, num]) self.ca.assert_that_pv_is(MAGNET_STATUS_PV_NAME, status) @parameterized.expand(enumerate(DEVICE_PVS + STAT_EXTRA_PVS)) def test_WHEN_stat_changes_THEN_pvs_change(self, num, pv): stat_value = 1.0 self._lewis.backdoor_run_function_on_device(SET_STAT, [num, stat_value]) self.ca.assert_that_pv_is(pv, stat_value) @parameterized.expand(enumerate(DEVICE_OPLM_PVS)) def test_WHEN_oplm_changes_THEN_pvs_change(self, num, pv): oplm_value = 1.0 self._lewis.backdoor_run_function_on_device(SET_OPLM, [num, oplm_value]) self.ca.assert_that_pv_is(pv, oplm_value) @parameterized.expand(enumerate(DEVICE_LIMS_PVS)) def test_WHEN_lims_changes_THEN_pvs_change(self, num, pv): lims_value = 1.0 self._lewis.backdoor_run_function_on_device(SET_LIMS, [num, lims_value]) self.ca.assert_that_pv_is(pv, lims_value) @parameterized.expand( enumerate(DEVICE_PVS + DEVICE_OPLM_PVS + DEVICE_LIMS_PVS + [MAGNET_STATUS_PV_NAME])) def test_WHEN_disconnected_THEN_in_alarm(self, _, pv): self._lewis.backdoor_set_on_device('connected', False) self.ca.assert_that_pv_alarm_is(pv, ChannelAccess.Alarms.INVALID) @parameterized.expand(enumerate(DEVICE_PVS)) def test_GIVEN_oplm_WHEN_stat_greater_than_oplm_THEN_minor_alarm( self, num, pv): oplm_value = 123 stat_value = 124 lims_value = 125 self._lewis.backdoor_run_function_on_device(SET_OPLM, [num, oplm_value]) self._lewis.backdoor_run_function_on_device(SET_LIMS, [num, lims_value]) self.ca.assert_that_pv_alarm_is(pv, ChannelAccess.Alarms.NONE) self._lewis.backdoor_run_function_on_device(SET_STAT, [num, stat_value]) self.ca.assert_that_pv_alarm_is(pv, ChannelAccess.Alarms.MINOR) @parameterized.expand(enumerate(DEVICE_PVS)) def test_GIVEN_lims_WHEN_stat_greater_than_lims_THEN_major_alarm( self, num, pv): oplm_value = 123 stat_value = 125 lims_value = 124 self._lewis.backdoor_run_function_on_device(SET_OPLM, [num, oplm_value]) self._lewis.backdoor_run_function_on_device(SET_LIMS, [num, lims_value]) self.ca.assert_that_pv_alarm_is(pv, ChannelAccess.Alarms.NONE) self._lewis.backdoor_run_function_on_device(SET_STAT, [num, stat_value]) self.ca.assert_that_pv_alarm_is(pv, ChannelAccess.Alarms.MAJOR) @parameterized.expand(MAGNET_STATUS.items()) def test_GIVEN_when_magnet_status_pv_changed_THEN_magnet_power_is_calculated_correctly( self, num, _): self._lewis.backdoor_run_function_on_device(SET_STAT, [10, num]) self.ca.assert_that_pv_is(MAGNET_POWER_ON_CALC, 1 if num > 0 else 0) @parameterized.expand(MAGNET_STATUS.items()) def test_GIVEN_when_magnet_status_pv_changed_THEN_magnet_power_on_pv_is_changed( self, num, _): self._lewis.backdoor_run_function_on_device(SET_STAT, [10, num]) self.ca.assert_that_pv_is(MAGNET_POWER_ON_PV, "ENERGISED" if num > 0 else "OFF")
class TiZrTests(unittest.TestCase): """ Tests for the TiZr cell monitoring logic. """ def setUp(self): self._ioc = IOCRegister.get_running(IOC_PREFIX) self.ca = ChannelAccess(default_timeout=20) for pv in [SIMPLE_VALUE_ONE, SIMPLE_VALUE_TWO]: self.ca.assert_that_pv_exists(pv) self.set_safe_values() self.ca.set_pv_value(MONITORING_ON_PV, "No") self.ca.assert_that_pv_is(MONITORING_ON_PV, "No") @contextmanager def monitoring_on(self): try: self.ca.set_pv_value(MONITORING_ON_PV, "Yes") self.ca.assert_that_pv_is(MONITORING_ON_PV, "Yes") yield finally: self.ca.set_pv_value(MONITORING_ON_PV, "No") self.ca.assert_that_pv_is(MONITORING_ON_PV, "No") def set_safe_values(self): self.ca.set_pv_value(SIMPLE_VALUE_ONE, IN_RANGE_PVONE_VAL) self.ca.set_pv_value(SIMPLE_VALUE_TWO, IN_RANGE_PVTWO_VAL) self.ca.set_pv_value(WARNING_PV, 0) def test_GIVEN_monitor_on_AND_PVONE_above_max_WHEN_PVTWO_goes_out_of_range_THEN_alarm_and_safe_value_written_to_PVONE( self): with self.monitoring_on(): self.ca.set_pv_value(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) self.ca.set_pv_value(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL) self.ca.assert_that_pv_is_not_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, SAFE_VALUE, tolerance=1e-4) self.ca.assert_that_pv_alarm_is(WARNING_PV, self.ca.Alarms.MAJOR) def test_GIVEN_monitor_off_AND_PVONE_above_max_WHEN_PVTWO_goes_out_of_range_THEN_no_alarm_and_no_safe_value_written_to_PVONE( self): self.ca.set_pv_value(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) self.ca.set_pv_value(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL) self.ca.assert_that_pv_is_not_number(SIMPLE_VALUE_ONE, SAFE_VALUE, tolerance=1e-4) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) self.ca.assert_that_pv_alarm_is_not(WARNING_PV, self.ca.Alarms.MAJOR) def test_GIVEN_monitor_on_AND_PVTWO_above_max_WHEN_PVONE_out_of_range_THEN_alarm_and_safe_value_written_to_PVONE( self): with self.monitoring_on(): self.ca.set_pv_value(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL, tolerance=1e-4) self.ca.set_pv_value(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL) self.ca.assert_that_pv_alarm_is(WARNING_PV, self.ca.Alarms.MAJOR) self.ca.assert_that_pv_is_not_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, SAFE_VALUE, tolerance=1e-4) def test_GIVEN_monitor_off_AND_PVTWO_above_max_WHEN_PVONE_out_of_range_THEN_no_alarm_and_no_safe_value_written_to_PVONE( self): self.ca.set_pv_value(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL, tolerance=1e-4) self.ca.set_pv_value(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL) self.ca.assert_that_pv_alarm_is_not(WARNING_PV, self.ca.Alarms.MAJOR) self.ca.assert_that_pv_is_not_number(SIMPLE_VALUE_ONE, SAFE_VALUE, tolerance=1e-4) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) def test_GIVEN_monitor_on_AND_PVONE_and_PVTWO_in_range_WHEN_in_range_value_written_THEN_no_alarm_and_value_written( self): with self.monitoring_on(): self.ca.set_pv_value(SIMPLE_VALUE_ONE, IN_RANGE_PVONE_VAL) self.ca.set_pv_value(SIMPLE_VALUE_TWO, IN_RANGE_PVTWO_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, IN_RANGE_PVONE_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_TWO, IN_RANGE_PVTWO_VAL) self.ca.assert_that_pv_alarm_is(WARNING_PV, self.ca.Alarms.NONE) self.ca.assert_that_pv_alarm_is(SIMPLE_VALUE_ONE, self.ca.Alarms.NONE) self.ca.assert_that_pv_alarm_is(SIMPLE_VALUE_TWO, self.ca.Alarms.NONE) @parameterized.expand( parameterized_list([(SIMPLE_VALUE_ONE, IN_RANGE_PVONE_VAL), (SIMPLE_VALUE_TWO, IN_RANGE_PVTWO_VAL)])) def test_GIVEN_monitor_on_AND_pvs_in_range_WHEN_one_goes_out_of_range_THEN_no_alarm_and_value_written( self, _, pv, in_range_value): with self.monitoring_on(): self.ca.set_pv_value(pv, in_range_value) self.ca.assert_that_pv_is_number(pv, in_range_value) self.ca.assert_that_pv_alarm_is(WARNING_PV, self.ca.Alarms.NONE) self.ca.assert_that_pv_alarm_is(pv, self.ca.Alarms.NONE) def test_GIVEN_monitor_on_AND_safe_value_is_out_of_range_WHEN_safe_value_set_THEN_alarm_persisted( self): macros = tizr_macros macros["SAFE_VALUE"] = OUT_OF_RANGE_PVONE_VAL macros["MONITORING_ON"] = "1" with self._ioc.start_with_macros(macros, "TIZRWARNING"): self.ca.assert_that_pv_is(MONITORING_ON_PV, "Yes") self.ca.set_pv_value(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_ONE, OUT_OF_RANGE_PVONE_VAL, tolerance=1e-4) self.ca.set_pv_value(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL) self.ca.assert_that_pv_is_number(SIMPLE_VALUE_TWO, OUT_OF_RANGE_PVTWO_VAL, tolerance=1e-4) self.ca.assert_that_pv_alarm_is(WARNING_PV, self.ca.Alarms.MAJOR) time.sleep(10) self.ca.assert_that_pv_alarm_is(WARNING_PV, self.ca.Alarms.MAJOR)