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='???')
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)
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}")
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"
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"
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()
def test_close_protection(): """Cannot send messages to a closed mailbox""" mb = strax.Mailbox() mb.close() with pytest.raises(strax.MailBoxAlreadyClosed): mb.send(0)
def __missing__(self, key): res = self[key] = strax.Mailbox(name=key + '_mailbox') return res