proxy.py/tests/core/test_event_dispatcher.py

115 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
"""
proxy.py
~~~~~~~~
⚡⚡⚡ Fast, Lightweight, Pluggable, TLS interception capable proxy server focused on
Network monitoring, controls & Application development, testing, debugging.
:copyright: (c) 2013-present by Abhinav Singh and contributors.
:license: BSD, see LICENSE for more details.
"""
import os
import queue
import threading
import multiprocessing
from multiprocessing import connection
import unittest
from unittest import mock
from proxy.core.event import EventQueue, EventDispatcher, eventNames
class TestEventDispatcher(unittest.TestCase):
def setUp(self) -> None:
self.dispatcher_shutdown = threading.Event()
self.manager = multiprocessing.Manager()
self.event_queue = EventQueue(self.manager.Queue())
self.dispatcher = EventDispatcher(
shutdown=self.dispatcher_shutdown,
event_queue=self.event_queue,
)
def tearDown(self) -> None:
self.dispatcher_shutdown.set()
self.manager.shutdown()
def test_empties_queue(self) -> None:
self.event_queue.publish(
request_id='1234',
event_name=eventNames.WORK_STARTED,
event_payload={'hello': 'events'},
publisher_id=self.__class__.__name__,
)
self.dispatcher.run_once()
with self.assertRaises(queue.Empty):
self.dispatcher.run_once()
@mock.patch('time.time')
def subscribe(self, mock_time: mock.Mock) -> connection.Connection:
mock_time.return_value = 1234567
relay_recv, relay_send = multiprocessing.Pipe()
self.event_queue.subscribe(sub_id='1234', channel=relay_send)
# consume the subscribe event
self.dispatcher.run_once()
# assert subscribed ack
self.assertEqual(
relay_recv.recv(), {
'event_name': eventNames.SUBSCRIBED,
},
)
# publish event
self.event_queue.publish(
request_id='1234',
event_name=eventNames.WORK_STARTED,
event_payload={'hello': 'events'},
publisher_id=self.__class__.__name__,
)
# consume
self.dispatcher.run_once()
# assert recv
r = relay_recv.recv()
print(r)
self.assertEqual(
r, {
'request_id': '1234',
'process_id': os.getpid(),
'thread_id': threading.get_ident(),
'event_timestamp': 1234567,
'event_name': eventNames.WORK_STARTED,
'event_payload': {'hello': 'events'},
'publisher_id': self.__class__.__name__,
},
)
return relay_recv
def test_subscribe(self) -> None:
self.subscribe()
def test_unsubscribe(self) -> None:
relay_recv = self.subscribe()
self.event_queue.unsubscribe('1234')
self.dispatcher.run_once()
# assert unsubscribe ack
self.assertEqual(
relay_recv.recv(), {
'event_name': eventNames.UNSUBSCRIBED,
},
)
self.event_queue.publish(
request_id='1234',
event_name=eventNames.WORK_STARTED,
event_payload={'hello': 'events'},
publisher_id=self.__class__.__name__,
)
self.dispatcher.run_once()
with self.assertRaises(EOFError):
relay_recv.recv()
# def test_unsubscribe_on_broken_pipe_error(self) -> None:
# pass
# def test_run(self) -> None:
# pass