17
18
from amqplib import client_0_8 as amqp
18
from fixtures import MonkeyPatch
19
from django.conf import settings
20
from maasserver.exceptions import NoRabbit
19
21
from maasserver.rabbit import (
26
28
from maasserver.testing.factory import factory
29
from maastesting.rabbit import (
27
33
from maastesting.testcase import TestCase
28
from rabbitfixture.server import RabbitServer
31
class RabbitTestCase(TestCase):
34
super(RabbitTestCase, self).setUp()
35
self.rabbit_server = self.useFixture(RabbitServer())
36
self.rabbit_env = self.rabbit_server.runner.environment
38
"maasserver.rabbit.connect", self.rabbit_env.get_connection)
39
self.useFixture(patch)
41
def get_command_output(self, command):
42
# Returns the output of the given rabbit command.
43
return self.rabbit_env.rabbitctl(str(command))[0]
46
class TestRabbitSession(RabbitTestCase):
48
def test_session_connection(self):
34
from testtools.testcase import ExpectedException
37
def run_rabbit_command(command):
38
"""Run a Rabbit command through rabbitctl, and return its output."""
39
if isinstance(command, unicode):
40
command = command.encode('ascii')
41
rabbit_env = get_rabbit().runner.environment
42
return rabbit_env.rabbitctl(command)[0]
45
class TestRabbitSession(TestCase):
48
def test_connection_gets_connection(self):
49
49
session = RabbitSession()
50
50
# Referencing the connection property causes a connection to be
54
54
# The same connection is returned every time.
55
55
self.assertIs(connection, session.connection)
57
def test_session_disconnect(self):
57
def test_connection_raises_NoRabbit_if_cannot_connect(self):
58
# Attempt to connect to a RabbitMQ on the local "discard"
59
# service. The connection will be refused.
60
self.patch(settings, 'RABBITMQ_HOST', 'localhost:9')
61
session = RabbitSession()
62
with ExpectedException(NoRabbit):
65
def test_connection_propagates_exceptions(self):
67
def fail(*args, **kwargs):
68
raise socket.error("Connection not refused, but failed anyway.")
70
self.patch(amqp, 'Connection', fail)
71
session = RabbitSession()
72
with ExpectedException(socket.error):
75
def test_disconnect(self):
58
76
session = RabbitSession()
59
77
session.disconnect()
60
78
self.assertIsNone(session._connection)
63
class TestRabbitMessaging(RabbitTestCase):
81
class TestRabbitMessaging(TestCase):
65
84
def test_messaging_getExchange(self):
66
85
exchange_name = factory.getRandomString()
67
86
messaging = RabbitMessaging(exchange_name)
70
89
self.assertEqual(messaging._session, exchange._session)
71
90
self.assertEqual(exchange_name, exchange.exchange_name)
73
93
def test_messaging_getQueue(self):
74
94
exchange_name = factory.getRandomString()
75
95
messaging = RabbitMessaging(exchange_name)
79
99
self.assertEqual(exchange_name, queue.exchange_name)
82
class TestRabbitBase(RabbitTestCase):
102
class TestRabbitBase(TestCase):
84
104
def test_rabbitbase_contains_session(self):
85
105
exchange_name = factory.getRandomString()
91
111
rabbitbase = RabbitBase(RabbitSession(), exchange_name)
92
112
self.assertEqual(exchange_name, rabbitbase.exchange_name)
94
115
def test_base_channel(self):
95
116
rabbitbase = RabbitBase(RabbitSession(), factory.getRandomString())
96
117
# Referencing the channel property causes an open channel to be
101
122
# The same channel is returned every time.
102
123
self.assertIs(channel, rabbitbase.channel)
104
126
def test_base_channel_creates_exchange(self):
105
127
exchange_name = factory.getRandomString()
106
128
rabbitbase = RabbitBase(RabbitSession(), exchange_name)
107
129
rabbitbase.channel
110
self.get_command_output('list_exchanges'))
113
class TestRabbitExchange(RabbitTestCase):
130
self.assertIn(exchange_name, run_rabbit_command('list_exchanges'))
133
class TestRabbitExchange(TestCase):
115
135
def basic_get(self, channel, queue_name, timeout):
116
136
endtime = time.time() + timeout
136
157
self.assertEqual(message_content, message.body)
139
class TestRabbitQueue(RabbitTestCase):
160
class TestRabbitQueue(TestCase):
141
163
def test_rabbit_queue_binds_queue(self):
142
164
exchange_name = factory.getRandomString()
143
165
message_content = factory.getRandomString()