def test_main_loop_adds_pubsub_messages_to_event_queues(mp_fixture): """ PUBSUB messages should be added to event queues. """ mock_ctx = mock.MagicMock() event_q = MPQueue(ctx=mp_fixture) event_q.put(EventMessage("TEST", "PUBSUB", msg="1")) event_q.put(EventMessage("TEST", "PUBSUB", msg="2")) event_q.put(EventMessage("TEST", "PUBSUB", msg="3")) event_q.put(EventMessage("TEST", "END", msg="foo")) mock_ctx.event_queue = event_q # one processing loop before shutdown in set, at which point the loop # should exit with three messages still in the event queue mock_ctx.shutdown_event.is_set.return_value = False q1 = MPQueue(ctx=mp_fixture) q2 = MPQueue(ctx=mp_fixture) main_loop(mock_ctx, [q1, q2]) assert q1.safe_close() == 3 assert q2.safe_close() == 3 event_q.safe_close()
def test_main_loop_ends_on_fatal_message(mp_fixture): """ Main loop should terminate when fatal messsage is received. """ mock_ctx = mock.MagicMock() event_q = MPQueue(ctx=mp_fixture) event_q.put(EventMessage("TEST", "FATAL", msg="foo")) event_q.put(EventMessage("TEST", "END", msg="foo")) mock_ctx.event_queue = event_q mock_ctx.shutdown_event.is_set.return_value = False main_loop(mock_ctx, []) assert event_q.safe_close() == 1
def test_main_loop_ignores_and_logs_events_of_unknown_types(mp_fixture): """ Loop should log events it doesn't know how to handle. """ mock_ctx = mock.MagicMock() event_q = MPQueue(ctx=mp_fixture) event_q.put(EventMessage("TEST", "FOO", msg="1")) mock_ctx.event_queue = event_q # one processing loop before shutdown in set, at which point the loop # should exit with three messages still in the event queue mock_ctx.shutdown_event.is_set.side_effect = [False, True] main_loop(mock_ctx, []) event_q.safe_close() mock_ctx.log.assert_called_once() assert "Unknown Event" in mock_ctx.log.call_args[0][1]
def test_main_loop_ends_when_shutdown_event_is_set(mp_fixture): """ Main loop should terminate when shutdown event is set. """ mock_ctx = mock.MagicMock() event_q = MPQueue(ctx=mp_fixture) event_q.put(EventMessage("TEST", "PUBSUB", msg="foo")) event_q.put(EventMessage("TEST", "PUBSUB", msg="foo")) event_q.put(EventMessage("TEST", "PUBSUB", msg="foo")) event_q.put(EventMessage("TEST", "END", msg="foo")) mock_ctx.event_queue = event_q # one processing loop before shutdown in set, at which point the loop # should exit with two messages still in the event queue mock_ctx.shutdown_event.is_set.side_effect = [False, False, True] main_loop(mock_ctx, []) assert event_q.safe_close() == 2
def test_main_loop_checks_shutdown_event_after_every_queue_get(mp_fixture): """ Loop should regularly check shutdown event, """ mock_ctx = mock.MagicMock() event_q = MPQueue(ctx=mp_fixture) mock_ctx.event_queue.safe_get.side_effect = [ False, False, EventMessage("TEST", "END", msg="foo"), ] # loop won't exit as a result of shutdown_event being True mock_ctx.shutdown_event.is_set.side_effect = [ False, False, False, False, False ] main_loop(mock_ctx, []) assert event_q.safe_close() == 0 assert mock_ctx.shutdown_event.is_set.call_count == 3