import os import random import time import string import msgq def random_sock(): return ''.join(random.choices(string.ascii_uppercase + string.digits, k=10)) def random_bytes(length=1000): return bytes([random.randrange(0xFF) for _ in range(length)]) def zmq_sleep(t=1): if "ZMQ" in os.environ: time.sleep(t) class TestPubSubSockets: def setup_method(self): # ZMQ pub socket takes too long to die # sleep to prevent multiple publishers error between tests zmq_sleep() def test_pub_sub(self): sock = random_sock() pub_sock = msgq.pub_sock(sock) sub_sock = msgq.sub_sock(sock, conflate=False, timeout=None) zmq_sleep(3) for _ in range(1000): msg = random_bytes() pub_sock.send(msg) recvd = sub_sock.receive() assert msg == recvd def test_conflate(self): sock = random_sock() pub_sock = msgq.pub_sock(sock) for conflate in [True, False]: for _ in range(10): num_msgs = random.randint(3, 10) sub_sock = msgq.sub_sock(sock, conflate=conflate, timeout=None) zmq_sleep() sent_msgs = [] for __ in range(num_msgs): msg = random_bytes() pub_sock.send(msg) sent_msgs.append(msg) time.sleep(0.1) recvd_msgs = msgq.drain_sock_raw(sub_sock) if conflate: assert len(recvd_msgs) == 1 assert recvd_msgs[0] == sent_msgs[-1] else: assert len(recvd_msgs) == len(sent_msgs) for rec_msg, sent_msg in zip(recvd_msgs, sent_msgs): assert rec_msg == sent_msg def test_receive_timeout(self): sock = random_sock() for _ in range(10): timeout = random.randrange(200) sub_sock = msgq.sub_sock(sock, timeout=timeout) zmq_sleep() start_time = time.monotonic() recvd = sub_sock.receive() assert (time.monotonic() - start_time) < 0.2 assert recvd is None