Example #1
0
def test_valid_msg_number():
    """Message numbers are non-negative integers"""
    mb = strax.Mailbox()
    with pytest.raises(strax.InvalidMessageNumber):
        mb.send(0, msg_number=-1)
    with pytest.raises(strax.InvalidMessageNumber):
        mb.send(0, msg_number='???')
Example #2
0
def mailbox_tester(messages,
                   numbers=None,
                   lazy=False,
                   reader_sleeps=0.,
                   max_messages=100,
                   expected_result=None,
                   timeout=SHORT_TIMEOUT,
                   result_timeout=LONG_TIMEOUT):
    if numbers is None:
        numbers = np.arange(len(messages))
    if expected_result is None:
        messages = np.asarray(messages)
        expected_result = messages[np.argsort(numbers)]

    mb = strax.Mailbox(max_messages=max_messages, timeout=timeout, lazy=lazy)

    n_readers = 2

    with concurrent.futures.ThreadPoolExecutor() as tp:
        futures = [
            tp.submit(reader,
                      source=mb.subscribe(),
                      reader_sleeps=reader_sleeps) for _ in range(n_readers)
        ]

        for i in range(len(messages)):
            mb.send(messages[i], msg_number=numbers[i])
            print(f"Sent message {i}. Now {len(mb._mailbox)} ms in mailbox.")

        mb.close()

        # Results must be equal
        for f in futures:
            np.testing.assert_equal(f.result(timeout=result_timeout),
                                    expected_result)
Example #3
0
def test_highlevel():
    """Test highlevel mailbox API"""
    for lazy in [False, True]:
        n_threads_start = len(threading.enumerate())
        print(f"Lazy mode: {lazy}")

        mb = strax.Mailbox(lazy=lazy)
        mb.add_sender(iter(list(range(10))))

        def test_reader(source):
            test_reader.got = r = []
            for s in source:
                r.append(s)

        mb.add_reader(test_reader)
        mb.start()
        time.sleep(SHORT_TIMEOUT)
        assert hasattr(test_reader, 'got')
        assert test_reader.got == list(range(10))
        mb.cleanup()
        threads = [
            f'{t.name} is dead: {True^t.is_alive()}'
            for t in threading.enumerate()
        ]
        assert len(threads) == n_threads_start, (
            f"Not all threads died. \n Threads running are:{threads}")
Example #4
0
def test_highlevel():
    """Test highlevel mailbox API"""
    mb = strax.Mailbox()
    mb.add_sender(range(10))

    def test_reader(source):
        test_reader.got = r = []
        for s in source:
            r.append(s)

    mb.add_reader(test_reader)
    mb.start()
    time.sleep(SHORT_TIMEOUT)
    assert hasattr(test_reader, 'got')
    assert test_reader.got == list(range(10))
    mb.cleanup()
    assert len(threading.enumerate()) == 1, "Not all threads died"
Example #5
0
def test_highlevel():
    """Test highlevel mailbox API"""
    for lazy in [False, True]:
        print(f"Lazy mode: {lazy}")

        mb = strax.Mailbox(lazy=lazy)
        mb.add_sender(iter(list(range(10))))

        def test_reader(source):
            test_reader.got = r = []
            for s in source:
                r.append(s)

        mb.add_reader(test_reader)
        mb.start()
        time.sleep(SHORT_TIMEOUT)
        assert hasattr(test_reader, 'got')
        assert test_reader.got == list(range(10))
        mb.cleanup()
        assert len(threading.enumerate()) == 1, "Not all threads died"
Example #6
0
def test_deadlock_regression():
    """A reader thread may start after the first message is processed"""
    mb = strax.Mailbox(timeout=SHORT_TIMEOUT)
    mb.send(0)

    readers = [
        threading.Thread(target=reader,
                         kwargs=dict(source=mb.subscribe(), name=str(i)))
        for i in range(2)
    ]
    readers[0].start()
    time.sleep(SHORT_TIMEOUT)

    readers[1].start()
    mb.send(1)
    mb.close()

    for t in readers:
        t.join(SHORT_TIMEOUT)
        assert not t.is_alive()
Example #7
0
def test_close_protection():
    """Cannot send messages to a closed mailbox"""
    mb = strax.Mailbox()
    mb.close()
    with pytest.raises(strax.MailBoxAlreadyClosed):
        mb.send(0)
Example #8
0
 def __missing__(self, key):
     res = self[key] = strax.Mailbox(name=key + '_mailbox')
     return res