def test_default_handler(): ipc_name = 'smite-test-{}'.format(uuid.uuid1().hex) default_handler = lambda t: t servant = Servant() servant.set_default_handler(default_handler) servant.bind_ipc(ipc_name) servant.run(True) msg_num = 10 client = RClient('ipc://{}'.format(ipc_name)) for _ in range(msg_num): msg_txt = uuid.uuid1().hex random_msg_name = uuid.uuid1().hex rep = client.send(random_msg_name, msg_txt) assert rep == msg_txt assert servant.stats['summary']['exceptions'] == 0 assert servant.stats['summary']['malicious_messages'] == 0 assert servant.stats['summary']['received_messages'] == msg_num assert servant.stats['summary']['processed_messages'] == msg_num client.close() servant.stop()
def test_exception_response(): exc_message = 'This is dummy exception message' class DummyException(Exception): pass def raise_dummy_exc(): raise DummyException(exc_message) servant = Servant({'raise_dummy_exc': raise_dummy_exc}) servant.bind_tcp(HOST, PORT) servant.run(True) client = Client() client.connect(CONNECTION_URI) raised = False try: client.send('raise_dummy_exc') except MessageException, e: assert e.message == exc_message raised = True
def test_rclient(): ipc_name = 'smite-test-{}'.format(uuid.uuid1().hex) servant = Servant({'echo': lambda t: t}) servant.bind_ipc(ipc_name) servant.run(True) msg_num = 10 client = RClient('ipc://{}'.format(ipc_name)) for _ in range(msg_num): echo_txt = uuid.uuid1().hex rep = client.send('echo', echo_txt) assert rep == echo_txt assert servant.stats['summary']['exceptions'] == 0 assert servant.stats['summary']['malicious_messages'] == 0 assert servant.stats['summary']['received_messages'] == msg_num assert servant.stats['summary']['processed_messages'] == msg_num client.close() servant.stop()
def test_multiple_clients(): def short_echo(text): time.sleep(1) return text def long_echo(text): time.sleep(2) return text called = { 'extract_one': False, 'extract_two': False, 'process_one': False, 'process_two': False, } def extract_one(msg): called['extract_one'] = True # 'foo:bar:real_message' -> 'bar:real_message' return msg.split(':', 1)[1] def extract_two(msg): called['extract_two'] = True # 'bar:real_message' -> 'real_message' return msg.split('-', 1)[1] servant = Servant( {'short_echo': short_echo, 'long_echo': long_echo}, message_extractors=(extract_one, extract_two), ) servant.bind_tcp(HOST, PORT) servant.run(run_in_background=True) def process_one(msg): called['process_one'] = True return 'bar-{}'.format(msg) def process_two(msg): called['process_two'] = True return 'foo:{}'.format(msg) def send_msg(msg_name): client = Client(message_processors=(process_one, process_two)) client.connect(CONNECTION_URI) msg_txt = uuid.uuid4().hex res = client.send(msg_name, args=(msg_txt,)) assert res == msg_txt client.close() client_threads = [] # send short_echo thread = Thread(target=send_msg('short_echo')) client_threads.append(thread) thread.start() # send long_echo thread = Thread(target=send_msg('long_echo')) client_threads.append(thread) thread.start() # long echo takes 2 seconds time.sleep(2.5) assert servant.stats['summary']['received_messages'] == 2 assert servant.stats['summary']['processed_messages'] == 2 assert servant.stats['summary']['exceptions'] == 0 for was_called in called.values(): assert was_called servant.stop() for client_thread in client_threads: client_thread.join()