Beispiel #1
0
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")
Beispiel #3
0
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)