1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 from elisa.core.tests.elisa_test_case import ElisaTestCase
17
18 from elisa.core.components.message import Message
19
20 from elisa.core import bus
26
31
34
36
41
45
47 """ Create a bus, send messages and start it. Check the
48 messages sent before startup are correctly dispatched.
49 """
50 global received_messages
51 received_messages = []
52 mybus = bus.Bus()
53
54 def on_message(message, sender):
55 global received_messages
56 received_messages.append(message)
57
58 mybus.register(on_message)
59
60 for i in range(5):
61 data = '%s. Hello you' % i
62 mybus.send_message(DataMessage(data), sender=self)
63
64 def done(result):
65 global received_messages
66 self.assertEqual(len(received_messages), 5)
67 mybus.unregister(on_message)
68
69 dfr = mybus.deferred_dispatch()
70 dfr.addCallback(done)
71 return dfr
72
74 """ Check a message receiver callback correctly gets called on
75 message bus dispatch.
76 """
77 global received_messages
78 received_messages = []
79
80 def on_message(message, sender):
81 global received_messages
82 received_messages.append(message)
83
84 self._bus.register(on_message)
85
86 def done(result):
87 global received_messages
88 self.assertEqual(len(received_messages), 1)
89
90 dfr = self._bus.send_message(DataMessage("data"), sender=self)
91 dfr.addCallback(done)
92 return dfr
93
95 """ Check a message receiver callback raising an exception
96 doesn't break the call chain of the other callbacks.
97 """
98 global dispatched
99 dispatched = False
100
101 def first_callback(message, sender):
102 raise Exception("I am a failed callback")
103
104 def second_callback(message, sender):
105 global dispatched
106 dispatched = True
107
108 self._bus.register(first_callback)
109 self._bus.register(second_callback)
110
111 def done(result):
112 global dispatched
113 self.assertEqual(dispatched, True)
114
115 def on_failure(failure):
116 self.fail("should not be reached")
117
118 dfr = self._bus.send_message(DataMessage("data"), sender=self)
119 dfr.addCallbacks(done, on_failure)
120 return dfr
121
123 """ Check the receiver callback is called only for some
124 Message types defined at callback registration.
125 """
126 global received_messages
127 received_messages = []
128
129 def on_message(message, sender):
130 global received_messages
131 received_messages.append(message)
132
133 self._bus.register(on_message, FooMessage)
134
135 def data_sent(result):
136 self.assertEqual(len(received_messages), 0)
137
138 def send_foo_message(result):
139 return self._bus.send_message(FooMessage("data"), sender=self)
140
141 def foo_sent(result):
142 self.assertEqual(len(received_messages), 1)
143
144 dfr = self._bus.send_message(DataMessage("data"), sender=self)
145 dfr.addCallback(data_sent)
146 dfr.addCallback(send_foo_message)
147 dfr.addCallback(foo_sent)
148 return dfr
149
151 """ Test messages dispatch to callbacks supporting multiple
152 Message types.
153 """
154 global received_messages
155 received_messages = []
156
157 def on_message(message, sender):
158 global received_messages
159 received_messages.append(message)
160
161 self._bus.register(on_message, DataMessage,FooMessage)
162
163 def data_sent(result):
164 self.assertEqual(len(received_messages), 1)
165
166 def send_foo_message(result):
167 msg = FooMessage("data")
168 return self._bus.send_message(msg, sender=self)
169
170 def foo_sent(result):
171 self.assertEqual(len(received_messages), 2)
172
173 def send_bar_message(result):
174 return self._bus.send_message(BarMessage(), sender=self)
175
176 def bar_sent(result):
177 self.assertEqual(len(received_messages), 2)
178
179 dfr = self._bus.send_message(DataMessage("data"), sender=self)
180 dfr.addCallback(data_sent)
181 dfr.addCallback(send_foo_message)
182 dfr.addCallback(foo_sent)
183 dfr.addCallback(send_bar_message)
184 dfr.addCallback(bar_sent)
185 return dfr
186
188 """ Check receiver callback registration and message dispatch
189 using the bus_listener function decorator.
190 """
191 global received_messages
192 received_messages = []
193
194 @bus.bus_listener(self._bus, FooMessage)
195 def on_message(message, sender):
196 global received_messages
197 received_messages.append(message)
198
199 def done(result):
200 self.assertEqual(len(received_messages), 1)
201
202 dfr = self._bus.send_message(FooMessage("data"), sender=self)
203 dfr.addCallback(done)
204 return dfr
205
207 """ Check that registering a new callback during dispatch of one
208 message doesn't affect current dispatching process.
209
210 See also: https://bugs.launchpad.net/elisa/+bug/251732
211 """
212 global second_callback_called
213 second_callback_called = False
214
215 class DataMessage(Message):
216 def __init__(self, register_new_cb):
217 self.register_new_cb = register_new_cb
218
219 def first_callback(message, sender):
220 if message.register_new_cb:
221 self._bus.register(second_callback)
222
223 def second_callback(message, sender):
224 global second_callback_called
225 second_callback_called = True
226
227 self._bus.register(first_callback)
228
229 def second_dispatch_done(result):
230 global second_callback_called
231 self.assertEqual(second_callback_called, True)
232
233 def first_dispatch_done(result):
234 global second_callback_called
235 self.assertEqual(second_callback_called, False)
236
237
238 dfr = self._bus.send_message(DataMessage(False), sender=self)
239 dfr.addCallback(second_dispatch_done)
240 return dfr
241
242
243 dfr = self._bus.send_message(DataMessage(True), sender=self)
244 dfr.addCallback(first_dispatch_done)
245 return dfr
246