amqp-spec 0.1.11 → 0.1.12
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +4 -0
- data/README.rdoc +51 -0
- data/VERSION +1 -1
- data/spec/rspec_amqp_spec.rb +2 -6
- data/spec/shared_examples.rb +1 -0
- metadata +3 -3
data/HISTORY
CHANGED
data/README.rdoc
CHANGED
@@ -152,6 +152,57 @@ when including AMQP::Spec, and same caution about using them applies.
|
|
152
152
|
|
153
153
|
...
|
154
154
|
|
155
|
+
==General notes
|
156
|
+
|
157
|
+
For a developer new to evented specs, it is not easy to internalize that the blocks given to asynchronous
|
158
|
+
methods are turned into real callbacks, intended to fire some time later. It is not easy to keep track of
|
159
|
+
the actual execution path of your code, when your blocks are supposed to fire and in what sequence.
|
160
|
+
Take the following spec as an example:
|
161
|
+
|
162
|
+
it 'receives published message' do
|
163
|
+
amqp do
|
164
|
+
q = MQ.queue('queue_name')
|
165
|
+
q.subscribe do |hdr, msg|
|
166
|
+
msg.should_not == 'data'
|
167
|
+
end
|
168
|
+
MQ.queue('queue_name').publish 'data'
|
169
|
+
q.unsubscribe; q.delete
|
170
|
+
done
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
Seems like a straightforward spec: you subscribe to a message queue, you set expectations inside
|
175
|
+
your subscribe block, then you publish into this queue, then you call done. What may be wrong with it?
|
176
|
+
Well, if you happen to use this spec against live AMQP broker, everything may be wrong.
|
177
|
+
First, communication delays. There is no guarantee that by the time you publish your message, the queue
|
178
|
+
have been either created or subscribed to. There is also no guarantee that your subscriber received
|
179
|
+
the message by the time you are unsubscribing and deleting your queue.
|
180
|
+
Second, sequence of your blocks. Remember, they are delayed callbacks! Don't just assume your previous
|
181
|
+
block is already executed when you start your new asynchronous action. In this spec, when done is called,
|
182
|
+
it stops everything before your subscribe callback even has a chance to fire. As a result, you'll get a
|
183
|
+
PASSING spec even though your expectation was never executed!
|
184
|
+
|
185
|
+
How to improve this spec? Allow some time for async actions to finish: either use EM timers or pass
|
186
|
+
:nowait=>false to your asynch calls to force them into synchronicity. Keep in mind the sequence in which
|
187
|
+
your callbacks are expected to fire - so place your done call at the end of subscribe block in this
|
188
|
+
example. If you want to be paranoid, you can set flags inside your callbacks and then check that they
|
189
|
+
actually fired at all AFTER your amqp/em block. Something like this will do the trick:
|
190
|
+
|
191
|
+
it 'receives published message' do
|
192
|
+
amqp do
|
193
|
+
q = MQ.queue('queue_name')
|
194
|
+
q.subscribe do |hdr, msg|
|
195
|
+
@subscribe_fired == true
|
196
|
+
msg.should == 'data'
|
197
|
+
done {q.unsubscribe; q.delete}
|
198
|
+
end
|
199
|
+
EM.add_timer(0.2) do
|
200
|
+
MQ.queue('queue_name').publish 'data'
|
201
|
+
end
|
202
|
+
end
|
203
|
+
@subscribe_fired.should be_true
|
204
|
+
end
|
205
|
+
|
155
206
|
==Limitations
|
156
207
|
|
157
208
|
AMQP-Spec can be currently used with rspec only. I suppose, there is nothing special in extending EM-Spec's
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.12
|
data/spec/rspec_amqp_spec.rb
CHANGED
@@ -12,10 +12,7 @@ def publish_and_consume_once(queue_name="test_sink", data="data")
|
|
12
12
|
q.subscribe do |hdr, msg|
|
13
13
|
hdr.should be_an MQ::Header
|
14
14
|
msg.should == data
|
15
|
-
|
16
|
-
q.unsubscribe; q.delete
|
17
|
-
done
|
18
|
-
}
|
15
|
+
done {q.unsubscribe; q.delete}
|
19
16
|
end
|
20
17
|
EM.add_timer(0.2) do
|
21
18
|
MQ.queue(queue_name).publish data
|
@@ -34,11 +31,10 @@ context 'Evented AMQP specs' do
|
|
34
31
|
p default_options
|
35
32
|
|
36
33
|
it_should_behave_like 'SpecHelper examples'
|
37
|
-
it_should_behave_like 'timeout examples'
|
38
34
|
|
39
35
|
context 'inside embedded context / example group' do
|
36
|
+
|
40
37
|
it_should_behave_like 'SpecHelper examples'
|
41
|
-
it_should_behave_like 'timeout examples'
|
42
38
|
end
|
43
39
|
end
|
44
40
|
|
data/spec/shared_examples.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amqp-spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 12
|
10
|
+
version: 0.1.12
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Arvicco
|