27
27
from nova import context
28
from nova import exception
29
from nova import flags
28
30
from nova import log as logging
29
31
from nova.rpc import amqp as rpc_amqp
30
32
from nova.rpc import common as rpc_common
33
from nova.rpc import dispatcher as rpc_dispatcher
31
34
from nova import test
34
38
LOG = logging.getLogger(__name__)
37
41
class BaseRpcTestCase(test.TestCase):
38
42
def setUp(self, supports_timeouts=True):
39
43
super(BaseRpcTestCase, self).setUp()
40
self.conn = self.rpc.create_connection(True)
41
self.receiver = TestReceiver()
42
self.conn.create_consumer('test', self.receiver, False)
43
self.conn.consume_in_thread()
44
self.supports_timeouts = supports_timeouts
44
45
self.context = context.get_admin_context()
45
self.supports_timeouts = supports_timeouts
47
self.conn = self.rpc.create_connection(FLAGS, True)
48
receiver = TestReceiver()
49
self.dispatcher = rpc_dispatcher.RpcDispatcher([receiver])
50
self.conn.create_consumer('test', self.dispatcher, False)
51
self.conn.consume_in_thread()
47
53
def tearDown(self):
49
56
super(BaseRpcTestCase, self).tearDown()
51
58
def test_call_succeed(self):
60
raise nose.SkipTest('rpc driver not available.')
53
result = self.rpc.call(self.context, 'test', {"method": "echo",
54
"args": {"value": value}})
63
result = self.rpc.call(FLAGS, self.context, 'test',
64
{"method": "echo", "args": {"value": value}})
55
65
self.assertEqual(value, result)
57
67
def test_call_succeed_despite_multiple_returns_yield(self):
69
raise nose.SkipTest('rpc driver not available.')
59
result = self.rpc.call(self.context, 'test',
72
result = self.rpc.call(FLAGS, self.context, 'test',
60
73
{"method": "echo_three_times_yield",
61
74
"args": {"value": value}})
62
75
self.assertEqual(value + 2, result)
64
77
def test_multicall_succeed_once(self):
79
raise nose.SkipTest('rpc driver not available.')
66
result = self.rpc.multicall(self.context,
82
result = self.rpc.multicall(FLAGS, self.context,
69
85
"args": {"value": value}})
73
89
self.assertEqual(value + i, x)
75
91
def test_multicall_three_nones(self):
93
raise nose.SkipTest('rpc driver not available.')
77
result = self.rpc.multicall(self.context,
96
result = self.rpc.multicall(FLAGS, self.context,
79
98
{"method": "multicall_three_nones",
80
99
"args": {"value": value}})
84
103
self.assertEqual(i, 2)
86
105
def test_multicall_succeed_three_times_yield(self):
107
raise nose.SkipTest('rpc driver not available.')
88
result = self.rpc.multicall(self.context,
110
result = self.rpc.multicall(FLAGS, self.context,
90
112
{"method": "echo_three_times_yield",
91
113
"args": {"value": value}})
93
115
self.assertEqual(value + i, x)
95
117
def test_context_passed(self):
119
raise nose.SkipTest('rpc driver not available.')
96
121
"""Makes sure a context is passed through rpc call."""
98
result = self.rpc.call(self.context,
123
result = self.rpc.call(FLAGS, self.context,
99
124
'test', {"method": "context",
100
125
"args": {"value": value}})
101
126
self.assertEqual(self.context.to_dict(), result)
103
def test_call_exception(self):
104
"""Test that exception gets passed back properly.
106
rpc.call returns a RemoteError object. The value of the
107
exception is converted to a string, so we convert it back
108
to an int in the test.
112
self.assertRaises(rpc_common.RemoteError,
117
"args": {"value": value}})
119
self.rpc.call(self.context,
122
"args": {"value": value}})
123
self.fail("should have thrown RemoteError")
124
except rpc_common.RemoteError as exc:
125
self.assertEqual(int(exc.value), value)
127
128
def test_nested_calls(self):
130
raise nose.SkipTest('rpc driver not available.')
128
132
"""Test that we can do an rpc.call inside another call."""
129
133
class Nested(object):
145
149
nested = Nested()
146
conn = self.rpc.create_connection(True)
147
conn.create_consumer('nested', nested, False)
150
dispatcher = rpc_dispatcher.RpcDispatcher([nested])
151
conn = self.rpc.create_connection(FLAGS, True)
152
conn.create_consumer('nested', dispatcher, False)
148
153
conn.consume_in_thread()
150
result = self.rpc.call(self.context,
155
result = self.rpc.call(FLAGS, self.context,
151
156
'nested', {"method": "echo",
152
157
"args": {"queue": "test",
153
158
"value": value}})
163
171
self.assertRaises(rpc_common.Timeout,
167
175
{"method": "block",
168
176
"args": {"value": value}}, timeout=1)
170
self.rpc.call(self.context,
178
self.rpc.call(FLAGS, self.context,
172
180
{"method": "block",
173
181
"args": {"value": value}},
192
203
self.stubs.Set(rpc_amqp, 'unpack_context', fake_unpack_context)
195
self.rpc.cast(self.context, 'test', {"method": "echo",
196
"args": {"value": value}})
206
self.rpc.cast(FLAGS, self.context, 'test',
207
{"method": "echo", "args": {"value": value}})
198
209
# Wait for the cast to complete.
199
210
for x in xrange(50):
208
219
self.stubs.Set(rpc_amqp, 'unpack_context', orig_unpack)
211
result = self.rpc.call(self.context, 'test',
222
result = self.rpc.call(FLAGS, self.context, 'test',
212
223
{"method": "echo",
213
224
"args": {"value": value}})
214
225
self.assertEqual(value, result)
249
259
def fail(context, value):
250
260
"""Raises an exception with the value sent in."""
251
raise Exception(value)
261
raise NotImplementedError(value)
264
def fail_converted(context, value):
265
"""Raises an exception with the value sent in."""
266
raise exception.ConvertedException(explanation=value)
254
269
def block(context, value):