122 lines
3.1 KiB
Python
122 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from datetime import time
|
|
import eventlet
|
|
eventlet.monkey_patch()
|
|
|
|
from unittest import TestCase
|
|
|
|
import rpc
|
|
|
|
|
|
class TestTasks(TestCase):
|
|
|
|
def setUp(self):
|
|
self.conn = rpc.create_connection(True)
|
|
self.receiver = TestReceiver()
|
|
self.conn.create_consumer('test', self.receiver, False)
|
|
self.conn.consume_in_thread()
|
|
|
|
def tearDown(self):
|
|
self.conn.close()
|
|
|
|
def test_call_succeed(self):
|
|
value = 42
|
|
result = rpc.call('test', {"method": "echo", "args": {"value": value}})
|
|
self.assertEqual(value, result)
|
|
|
|
def test_reusing_connection(self):
|
|
"""Test that reusing a connection returns same one."""
|
|
conn_context = rpc.create_connection(new=False)
|
|
conn1 = conn_context.connection
|
|
conn_context.close()
|
|
conn_context = rpc.create_connection(new=False)
|
|
conn2 = conn_context.connection
|
|
conn_context.close()
|
|
self.assertEqual(conn1, conn2)
|
|
|
|
def test_topic_send_receive(self):
|
|
"""Test sending to a topic exchange/queue"""
|
|
|
|
conn = rpc.create_connection()
|
|
message = 'topic test message'
|
|
|
|
self.received_message = None
|
|
|
|
def _callback(message):
|
|
self.received_message = message
|
|
|
|
conn.declare_topic_consumer('a_topic', _callback)
|
|
conn.topic_send('a_topic', message)
|
|
conn.consume(limit=1)
|
|
conn.close()
|
|
|
|
self.assertEqual(self.received_message, message)
|
|
|
|
def test_rpc_topic_send_receive(self):
|
|
message = {"method": "hello", "args": {"value": 142}}
|
|
conn = rpc.create_connection()
|
|
|
|
def _callback(message):
|
|
self.received_message = message
|
|
|
|
conn.declare_topic_consumer('b_topic', _callback)
|
|
|
|
rpc.cast('b_topic', message)
|
|
|
|
conn.consume(limit=1)
|
|
conn.close()
|
|
|
|
self.assertEqual(self.received_message, message)
|
|
|
|
def test_direct_send_receive(self):
|
|
"""Test sending to a direct exchange/queue"""
|
|
conn = rpc.create_connection()
|
|
message = 'direct test message'
|
|
|
|
self.received_message = None
|
|
|
|
def _callback(message):
|
|
self.received_message = message
|
|
|
|
conn.declare_direct_consumer('a_direct', _callback)
|
|
conn.direct_send('a_direct', message)
|
|
conn.consume(limit=1)
|
|
conn.close()
|
|
|
|
self.assertEqual(self.received_message, message)
|
|
|
|
|
|
class TestReceiver(object):
|
|
"""Simple Proxy class so the consumer has methods to call.
|
|
|
|
Uses static methods because we aren't actually storing any state.
|
|
|
|
"""
|
|
|
|
@staticmethod
|
|
def echo(value):
|
|
"""Simply returns whatever value is sent in."""
|
|
return value
|
|
|
|
@staticmethod
|
|
def multicall_three_nones(value):
|
|
yield None
|
|
yield None
|
|
yield None
|
|
|
|
@staticmethod
|
|
def echo_three_times_yield(value):
|
|
yield value
|
|
yield value + 1
|
|
yield value + 2
|
|
|
|
@staticmethod
|
|
def fail(value):
|
|
"""Raises an exception with the value sent in."""
|
|
raise Exception(value)
|
|
|
|
@staticmethod
|
|
def block(value):
|
|
time.sleep(2)
|