def test_read_event_returns_event_from_callback(self): attr = Attribute("device", "name") expected_evt = Mock(spec=tango.EventData) # Tango calls the supplied callback on a new thread, supplying an # EventData as argument def fake_subscribe(_, __, cb): # first event is current value sent on first subscription # this event should be ignored first_evt = Mock(spec=tango.EventData) t = threading.Thread(target=cb, args=(first_evt, )) t.start() t.join() t = threading.Thread(target=cb, args=(expected_evt, )) t.start() t.join() # fake event subscription ID return 1 with call_via_mocks() as (_, mock_proxy): mock_proxy.subscribe_event.side_effect = fake_subscribe executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) _ = executor.subscribe_event(attr) received_evt = executor.read_event(attr) assert received_evt == expected_evt
def test_device_proxy_is_created_for_initial_observer(self): attr = Attribute("device", "attribute") with call_via_mocks() as (mock_call, _): mgr = SubscriptionManager(proxy_factory=TangoDeviceProxyFactory()) mgr.register_observer(attr, Mock()) mock_call.assert_called_once_with("device")
def test_register_observer_adds_observer_to_appropriate_callback(self): attr = Attribute("device", "attribute") observer = Mock() with call_via_mocks(): mgr = SubscriptionManager(proxy_factory=TangoDeviceProxyFactory()) mgr.register_observer(attr, observer) assert observer in mgr._get_callback(attr)._observers
def test_existing_device_proxy_is_reused_for_subsequent_observers(self): with call_via_mocks() as (mock_call, _): mgr = SubscriptionManager(proxy_factory=TangoDeviceProxyFactory()) for _ in range(10): attr = Attribute("device", "attribute") mgr.register_observer(attr, Mock()) mock_call.assert_called_once_with("device")
def test_tango_device_proxy_creates_device_proxy_to_named_device(): """ Confirm that the TangoDeviceProxyFactory creates a DeviceProxy using the device name given as an argument. """ with patch("ska_oso_oet.command.tango") as mock_pytango: _ = TangoDeviceProxyFactory()("my device") mock_pytango.DeviceProxy.assert_called_once_with("my device")
def test_unregistering_does_not_create_a_new_subscription(self): attr = Attribute("device", "attribute") observer = Mock() with call_via_mocks() as (mock_call, _): mgr = SubscriptionManager(proxy_factory=TangoDeviceProxyFactory()) mgr.unregister_observer(attr, observer) assert not mock_call.called
def test_unsubscribe_all_releases_all_subscriptions(self): with call_via_mocks() as (_, mock_proxy): mgr = SubscriptionManager(proxy_factory=TangoDeviceProxyFactory()) for i in range(10): attr = Attribute("device", f"attr{i}") mgr.register_observer(attr, Mock()) mgr._unsubscribe_all() for i in range(10): mock_proxy.unsubscribe_event.assert_any_call(i)
def test_unsubscribe_keeps_tango_subscription(self): """ Check that the TangoExecutor.unsubscribe does not unsubscribe from Tango events. """ attr = Attribute("device", "name") with call_via_mocks() as (_, mock_proxy): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) pid = executor.subscribe_event(attr) executor.unsubscribe_event(attr, pid) assert not mock_proxy.unsubscribe_event.called
def test_read_uses_cached_deviceproxy(self): """ Check that the TangoExecutor uses cached DeviceProxy. """ attr = Attribute("device", "name") with call_via_mocks() as (mock_call, _): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) executor.read(attr) executor.read(attr) mock_call.assert_called_once_with("device")
def test_read_creates_proxy_to_specified_device(self): """ Check that the TangoExecutor creates a proxy to the device specified in the Attribute. """ attr = Attribute("device", "name") with call_via_mocks() as (mock_call, _): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) executor.read(attr) mock_call.assert_called_once_with("device")
def test_tango_executor_calls_subscribe_event_correctly(self): """ Check that the TangoExecutor correctly invokes subscribe event. :return: """ attr = Attribute("device", "name") with call_via_mocks() as (_, mock_proxy): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) response = executor.subscribe_event(attr) mock_proxy.subscribe_event.assert_called_once() assert response == -1
def test_only_one_device_proxy_per_device(self): """ Check that the TangoExecutor uses cached DeviceProxy. """ cmd = Command("device", "command") with call_via_mocks() as (mock_call, _): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) executor.execute(cmd) executor.execute(cmd) mock_call.assert_called_once_with("device")
def test_executor_creates_proxy_to_correct_device(self): """ Check that the TangoExecutor creates a proxy to the device specified in the Command. """ cmd = Command("device", "command") with call_via_mocks() as (mock_call, _): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) executor.execute(cmd) mock_call.assert_called_once_with("device")
def test_multiple_arg_commands_called_correctly(self): """ Check that the TangoExecutor correctly invokes device server commands that accept multiple arguments. :return: """ cmd = Command("device", "command", 1, 2, 3) with call_via_mocks() as (_, mock_proxy): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) executor.execute(cmd) mock_proxy.command_inout.assert_called_once_with("command", cmd_param=(1, 2, 3))
def test_single_arg_commands_called_correctly(self): """ Check that the TangoExecutor correctly invokes device server commands that require a scalar argument. """ cmd = Command("device", "command", 1) with call_via_mocks() as (_, mock_proxy): executor = TangoExecutor(proxy_factory=TangoDeviceProxyFactory()) executor.execute(cmd) # single-valued arg should be unpacked mock_proxy.command_inout.assert_called_once_with("command", cmd_param=1)