示例#1
0
def test_received_msg_signal():
    """
    Test received messages trigger the received_msg signal.
    """
    my_port = DummyKISS()
    my_frame = AX25UnnumberedInformationFrame(destination='VK4BWI',
                                              source='VK4MSL',
                                              pid=0xf0,
                                              payload=b'testing')
    receive_future = Future()

    my_interface = AX25Interface(my_port)

    def _on_receive_match(interface, frame, **kwargs):
        try:
            eq_(len(kwargs), 0, msg='Too many arguments')
            assert_is(interface, my_interface, msg='Wrong interface')
            eq_(bytes(frame), bytes(my_frame), msg='Wrong frame')
            receive_future.set_result(None)
        except Exception as e:
            receive_future.set_exception(e)

    my_interface.received_msg.connect(_on_receive_match)

    # Pass in a message
    my_port.received.emit(frame=bytes(my_frame))

    yield from receive_future
示例#2
0
def test_transmit_drops_expired():
    """
    Test the interface drops expired messages.
    """
    my_port = DummyKISS()
    my_frame = AX25UnnumberedInformationFrame(destination='VK4BWI-4',
                                              source='VK4MSL',
                                              pid=0xf0,
                                              payload=b'testing')
    # This timestamp was a _long_ time ago!  1AM 1st January 1970
    my_frame.deadline = 3600
    transmit_future = Future()

    my_interface = AX25Interface(my_port)

    # Override clear to send expiry
    my_interface._cts_expiry = 0

    def _on_timeout():
        transmit_future.set_result(None)

    # The time before transmission
    time_before = time.monotonic()

    # Set a timeout
    get_event_loop().call_later(1.0, _on_timeout)

    # Send the message
    my_interface.transmit(my_frame)

    yield from transmit_future

    # Nothing should be sent!
    eq_(len(my_port.sent), 0)
示例#3
0
def test_unbind_notexist_call():
    """
    Test unbinding a receiver for a call that does not exist returns silently.
    """
    my_interface = AX25Interface(DummyKISS())
    my_receiver = lambda **k: None

    # This should generate no error
    my_interface.unbind(my_receiver, 'MYCALL', ssid=12)
示例#4
0
def test_transmit_handles_failure():
    """
    Test transmit failures don't kill the interface handling.
    """
    my_port = UnreliableDummyKISS()
    my_frame_1 = AX25UnnumberedInformationFrame(
            destination='VK4BWI-4',
            source='VK4MSL',
            pid=0xf0,
            payload=b'testing 1')
    my_frame_2 = AX25UnnumberedInformationFrame(
            destination='VK4BWI-4',
            source='VK4MSL',
            pid=0xf0,
            payload=b'testing 2')
    transmit_future = Future()

    my_interface = AX25Interface(my_port, cts_delay=0.250)

    # Override clear to send expiry
    my_interface._cts_expiry = 0

    def _on_transmit(interface, frame, **kwargs):
        try:
            eq_(len(kwargs), 0, msg='Too many arguments')
            assert_is(interface, my_interface, msg='Wrong interface')
            eq_(bytes(frame), bytes(my_frame_2), msg='Wrong frame')
            transmit_future.set_result(None)
        except Exception as e:
            transmit_future.set_exception(e)

    def _on_timeout():
        transmit_future.set_exception(AssertionError('Timed out'))

    # The time before transmission
    time_before = time.monotonic()

    # Set a timeout
    get_event_loop().call_later(2.0, _on_timeout)

    # Send the messages
    my_interface.transmit(my_frame_1, _on_transmit) # This will fail
    my_interface.transmit(my_frame_2, _on_transmit) # This will work

    yield from transmit_future

    eq_(len(my_port.sent), 1)
    (send_time, sent_frame) = my_port.sent.pop(0)

    eq_(bytes(sent_frame), bytes(my_frame_2))
    assert_less((time.monotonic() - send_time), 0.05)
    assert_greater_equal((send_time - time_before), 0.25)
示例#5
0
def test_receive_bind():
    """
    Test bind rejects non-strings as call-signs.
    """
    my_interface = AX25Interface(DummyKISS())
    try:
        my_interface.bind(callback=lambda *a, **kwa: None,
                          callsign=123456,
                          ssid=0,
                          regex=False)
        assert False, 'This should not have worked'
    except TypeError as e:
        eq_(str(e), 'callsign must be a string (use '\
                    'regex=True for regex)')
示例#6
0
def test_unbind_notexist_ssid():
    """
    Test unbinding a receiver for a SSID that does not exist returns silently.
    """
    my_port = DummyKISS()
    my_interface = AX25Interface(my_port)

    my_receiver = lambda **k: None

    # Inject a receiver
    my_interface._receiver_str = {'MYCALL': {12: [my_receiver]}}

    # This should generate no error
    my_interface.unbind(my_receiver, 'MYCALL', ssid=14)
示例#7
0
def test_unbind_str():
    """
    Test unbinding a string receiver removes the receiver and cleans up.
    """
    my_port = DummyKISS()
    my_interface = AX25Interface(my_port)

    my_receiver = lambda **k: None

    # Inject a receiver
    my_interface._receiver_str = {'MYCALL': {12: [my_receiver]}}
    my_interface.unbind(my_receiver, 'MYCALL', ssid=12)

    # This should now be empty
    eq_(len(my_interface._receiver_str), 0)
示例#8
0
def test_unbind_notexist_receiver():
    """
    Test unbinding a receiver that is not bound should not raise error.
    """
    my_port = DummyKISS()
    my_interface = AX25Interface(my_port)

    my_receiver1 = lambda **k: None
    my_receiver2 = lambda **k: None

    # Inject a receiver
    my_interface._receiver_str = {'MYCALL': {12: [my_receiver1]}}

    # This should generate no error
    my_interface.unbind(my_receiver2, 'MYCALL', ssid=12)
示例#9
0
def test_transmit_waits_if_cts_reset():
    """
    Test the interface waits if CTS timer is reset.
    """
    my_port = DummyKISS()
    my_frame = AX25UnnumberedInformationFrame(
            destination='VK4BWI-4',
            source='VK4MSL',
            pid=0xf0,
            payload=b'testing')
    transmit_future = Future()

    my_interface = AX25Interface(my_port, cts_delay=0.250)

    def _on_transmit(interface, frame, **kwargs):
        try:
            eq_(len(kwargs), 0, msg='Too many arguments')
            assert_is(interface, my_interface, msg='Wrong interface')
            eq_(bytes(frame), bytes(my_frame), msg='Wrong frame')
            transmit_future.set_result(None)
        except Exception as e:
            transmit_future.set_exception(e)

    def _on_timeout():
        transmit_future.set_exception(AssertionError('Timed out'))

    # The time before transmission
    time_before = time.monotonic()

    # Set a timeout
    get_event_loop().call_later(1.0, _on_timeout)

    # Send the message
    my_interface.transmit(my_frame, _on_transmit)

    # Whilst that is pending, call reset_cts, this should delay transmission
    my_interface._reset_cts()

    yield from transmit_future

    eq_(len(my_port.sent), 1)
    (send_time, sent_frame) = my_port.sent.pop(0)

    eq_(bytes(sent_frame), bytes(my_frame))
    assert_less((time.monotonic() - send_time), 0.05)
    assert_greater(send_time - time_before, 0.25)
    assert_less(send_time - time_before, 1.05)
示例#10
0
def test_transmit_sends_if_not_expired():
    """
    Test the interface sends frame if not expired.
    """
    my_port = DummyKISS()
    my_frame = AX25UnnumberedInformationFrame(
            destination='VK4BWI-4',
            source='VK4MSL',
            pid=0xf0,
            payload=b'testing')
    my_frame.deadline = time.time() + 3600.0
    transmit_future = Future()

    my_interface = AX25Interface(my_port)

    # Override clear to send expiry
    my_interface._cts_expiry = 0

    def _on_transmit(interface, frame, **kwargs):
        try:
            eq_(len(kwargs), 0, msg='Too many arguments')
            assert_is(interface, my_interface, msg='Wrong interface')
            eq_(bytes(frame), bytes(my_frame), msg='Wrong frame')
            transmit_future.set_result(None)
        except Exception as e:
            transmit_future.set_exception(e)

    def _on_timeout():
        transmit_future.set_exception(AssertionError('Timed out'))

    # The time before transmission
    time_before = time.monotonic()

    # Set a timeout
    get_event_loop().call_later(1.0, _on_timeout)

    # Send the message
    my_interface.transmit(my_frame, _on_transmit)

    yield from transmit_future

    eq_(len(my_port.sent), 1)
    (send_time, sent_frame) = my_port.sent.pop(0)

    eq_(bytes(sent_frame), bytes(my_frame))
    assert_less((time.monotonic() - send_time), 0.05)
    assert_less((send_time - time_before), 0.05)
示例#11
0
def test_receive_re_filter():
    """
    Test matching messages can trigger regex filters (without SSID).
    """
    my_port = DummyKISS()
    unmatched_filter_received = []
    my_frame = AX25UnnumberedInformationFrame(destination='VK4BWI-4',
                                              source='VK4MSL',
                                              pid=0xf0,
                                              payload=b'testing')
    receive_future = Future()

    my_interface = AX25Interface(my_port)

    def _on_receive_match(interface, frame, match, **kwargs):
        try:
            eq_(len(kwargs), 0, msg='Too many arguments')
            assert_is(interface, my_interface, msg='Wrong interface')
            eq_(bytes(frame), bytes(my_frame), msg='Wrong frame')
            receive_future.set_result(None)
        except Exception as e:
            receive_future.set_exception(e)

    def _on_receive_nomatch(**kwargs):
        unmatched_filter_received.append(kwargs)

    def _on_timeout():
        receive_future.set_exception(AssertionError('Timed out'))

    # This should match
    my_interface.bind(_on_receive_match, r'^VK4[BR]WI$', ssid=None, regex=True)

    # This should not match
    my_interface.bind(_on_receive_nomatch,
                      r'^VK4[AZ]WI$',
                      ssid=None,
                      regex=True)

    # Set a timeout
    get_event_loop().call_later(1.0, _on_timeout)

    # Pass in a message
    my_port.received.emit(frame=bytes(my_frame))

    yield from receive_future
    eq_(len(unmatched_filter_received), 0)
示例#12
0
def test_reception_resets_cts():
    """
    Check the clear-to-send expiry is updated with received traffic.
    """
    my_port = DummyKISS()
    my_frame = AX25UnnumberedInformationFrame(destination='VK4BWI',
                                              source='VK4MSL',
                                              pid=0xf0,
                                              payload=b'testing')

    my_interface = AX25Interface(my_port)
    cts_before = my_interface._cts_expiry

    # Pass in a message
    my_port.received.emit(frame=bytes(my_frame))
    cts_after = my_interface._cts_expiry

    assert_less(cts_before, cts_after)
    assert_greater(cts_after, time.monotonic())
示例#13
0
def test_unbind_re():
    """
    Test unbinding a regex receiver removes the receiver and cleans up.
    """
    my_port = DummyKISS()
    my_interface = AX25Interface(my_port)

    my_receiver = lambda **k: None

    # Inject a receiver
    my_interface._receiver_re = {
        r'^MY': (re.compile(r'^MY'), {
            12: [my_receiver]
        })
    }
    my_interface.unbind(my_receiver, r'^MY', ssid=12, regex=True)

    # This should now be empty
    eq_(len(my_interface._receiver_re), 0)
示例#14
0
def test_transmit_cancel():
    """
    Test that pending messages can be cancelled.
    """
    my_port = DummyKISS()
    my_frame = AX25UnnumberedInformationFrame(destination='VK4BWI-4',
                                              source='VK4MSL',
                                              pid=0xf0,
                                              payload=b'testing')

    my_interface = AX25Interface(my_port)

    # Send the message
    my_interface.transmit(my_frame)

    # Cancel it!
    my_interface.cancel_transmit(my_frame)

    # Wait a second
    yield from sleep(1)

    # Nothing should have been sent.
    eq_(len(my_port.sent), 0)