def test_mpqueue_get(): Q = MPQueue() item = Q.safe_get(None) assert item is None Q.put("ITEM1") Q.put("ITEM2") assert Q.safe_get(0.02) == "ITEM1" assert Q.safe_get(0.02) == "ITEM2" assert Q.safe_get(0.02) is None assert Q.safe_get(None) is None num_left = Q.safe_close() assert num_left == 0
def test_proc_worker_run(caplog): class ProcWorkerTest(ProcWorker): def init_args(self, args): self.args = args def main_func(self): self.log(logging.INFO, f"MAIN_FUNC: {self.args}") self.shutdown_event.set() startup_evt = mp.Event() shutdown_evt = mp.Event() event_q = MPQueue() caplog.set_level(logging.INFO) pw = ProcWorkerTest("TEST", startup_evt, shutdown_evt, event_q, "ARG1", "ARG2") assert not startup_evt.is_set() assert not shutdown_evt.is_set() pw.run() assert startup_evt.is_set() assert shutdown_evt.is_set() item = event_q.safe_get() assert item assert item.msg_src == "TEST" assert item.msg_type == "SHUTDOWN" assert item.msg == "Normal" assert f"MAIN_FUNC: ('ARG1', 'ARG2')" in caplog.text
def test_proc_full_stop(caplog): shutdown_evt = mp.Event() event_q = MPQueue() caplog.set_level(logging.INFO) proc = Proc("TEST", TimerProcWorkerTest, shutdown_evt, event_q) for idx in range(4): item = event_q.safe_get(1.0) assert item, f"idx: {idx}" assert item.startswith(f"TIMER {idx + 1} [") item = event_q.safe_get(1.0) assert item.msg_src == "TEST" assert item.msg_type == "SHUTDOWN" assert item.msg == "Normal" proc.full_stop(wait_time=0.5) assert not proc.proc.is_alive()
def messages(self) -> Generator[Message, None, None]: """ A generator of Message objects created from received pubsub events """ q = MPQueue() def add_to_q(topic: pub.Topic = pub.AUTO_TOPIC, **kwargs): kwargs["topic"] = topic.name other = {} if "request_id" in kwargs: other["id"] = kwargs["request_id"] del kwargs["request_id"] msg = Message(kwargs, **other) q.put(msg) pub.subscribe(add_to_q, pub.ALL_TOPICS) while True: msg = q.safe_get(timeout=0.1) if msg is not None: yield msg
def test_proc_worker_exception(caplog): class ProcWorkerException(ProcWorker): def main_func(self): raise NameError("Because this doesn't happen often") startup_evt = mp.Event() shutdown_evt = mp.Event() event_q = MPQueue() caplog.set_level(logging.INFO) with pytest.raises(SystemExit): proc_worker_wrapper(ProcWorkerException, "TEST", startup_evt, shutdown_evt, event_q) assert startup_evt.is_set() assert not shutdown_evt.is_set() item = event_q.safe_get() assert item assert item.msg_src == "TEST" assert item.msg_type == "FATAL" assert item.msg == "Because this doesn't happen often" assert f"Exception Shutdown" in caplog.text