wamp_client 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +464 -0
- data/Rakefile +3 -0
- data/circle.yml +3 -0
- data/lib/wamp_client/auth.rb +18 -0
- data/lib/wamp_client/check.rb +57 -0
- data/lib/wamp_client/connection.rb +194 -0
- data/lib/wamp_client/message.rb +1283 -0
- data/lib/wamp_client/serializer.rb +40 -0
- data/lib/wamp_client/session.rb +776 -0
- data/lib/wamp_client/transport.rb +129 -0
- data/lib/wamp_client/version.rb +3 -0
- data/lib/wamp_client.rb +7 -0
- data/scripts/gen_message.rb +537 -0
- data/spec/auth_spec.rb +18 -0
- data/spec/check_spec.rb +197 -0
- data/spec/message_spec.rb +1478 -0
- data/spec/session_spec.rb +1004 -0
- data/spec/spec_helper.rb +43 -0
- data/tasks/rspec.rake +3 -0
- data/wamp_client.gemspec +29 -0
- metadata +170 -0
@@ -0,0 +1,1004 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WampClient::Session do
|
4
|
+
let (:transport) { SpecHelper::TestTransport.new({}) }
|
5
|
+
let (:session) { WampClient::Session.new(transport) }
|
6
|
+
|
7
|
+
describe 'establishment' do
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
@join_count = 0
|
11
|
+
session.on_join do |details|
|
12
|
+
@join_count += 1
|
13
|
+
end
|
14
|
+
@leave_count = 0
|
15
|
+
session.on_leave do |reason, details|
|
16
|
+
@leave_count += 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'performs a tx-hello/rx-welcome' do
|
21
|
+
|
22
|
+
session.join('test')
|
23
|
+
|
24
|
+
# Check generated message
|
25
|
+
expect(transport.messages.count).to eq(1)
|
26
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::HELLO)
|
27
|
+
expect(transport.messages[0][1]).to eq('test') # Realm Test
|
28
|
+
expect(transport.messages[0][2][:roles]).not_to be_nil # Roles exists
|
29
|
+
|
30
|
+
# Check State
|
31
|
+
expect(session.id).to be_nil
|
32
|
+
expect(session.is_open?).to eq(false)
|
33
|
+
expect(session.realm).to eq('test')
|
34
|
+
expect(@join_count).to eq(0)
|
35
|
+
expect(@leave_count).to eq(0)
|
36
|
+
|
37
|
+
# Send welcome message
|
38
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
39
|
+
transport.receive_message(welcome.payload)
|
40
|
+
|
41
|
+
# Check new state of session
|
42
|
+
expect(session.id).to eq(1234)
|
43
|
+
expect(session.is_open?).to eq(true)
|
44
|
+
expect(session.realm).to eq('test')
|
45
|
+
expect(@join_count).to eq(1)
|
46
|
+
expect(@leave_count).to eq(0)
|
47
|
+
|
48
|
+
# Check Exception
|
49
|
+
expect { session.join('test') }.to raise_exception("Session must be closed to call 'join'")
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'performs a tx-hello/rx-abort' do
|
54
|
+
|
55
|
+
session.join('test')
|
56
|
+
|
57
|
+
# Send abort message
|
58
|
+
abort = WampClient::Message::Abort.new({}, 'test.reason')
|
59
|
+
transport.receive_message(abort.payload)
|
60
|
+
|
61
|
+
# Check new state of session
|
62
|
+
expect(session.id).to be_nil
|
63
|
+
expect(session.is_open?).to eq(false)
|
64
|
+
expect(@join_count).to eq(0)
|
65
|
+
expect(@leave_count).to eq(1)
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'performs a connect then client initiated goodbye' do
|
70
|
+
|
71
|
+
# Check Exception
|
72
|
+
expect { session.leave('felt.like.it') }.to raise_exception("Session must be opened to call 'leave'")
|
73
|
+
|
74
|
+
session.join('test')
|
75
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
76
|
+
transport.receive_message(welcome.payload)
|
77
|
+
|
78
|
+
# Leave the session
|
79
|
+
session.leave('felt.like.it')
|
80
|
+
|
81
|
+
# Check state
|
82
|
+
expect(transport.messages.count).to eq(2)
|
83
|
+
expect(session.id).to eq(1234)
|
84
|
+
expect(session.realm).to eq('test')
|
85
|
+
expect(session.is_open?).to eq(true)
|
86
|
+
expect(session._goodbye_sent).to eq(true)
|
87
|
+
expect(@leave_count).to eq(0)
|
88
|
+
|
89
|
+
# Send Goodbye response from server
|
90
|
+
goodbye = WampClient::Message::Goodbye.new({}, 'wamp.error.goodbye_and_out')
|
91
|
+
transport.receive_message(goodbye.payload)
|
92
|
+
|
93
|
+
# Check state
|
94
|
+
expect(transport.messages.count).to eq(2)
|
95
|
+
expect(session.id).to be_nil
|
96
|
+
expect(session.is_open?).to eq(false)
|
97
|
+
expect(session.realm).to be_nil
|
98
|
+
expect(session._goodbye_sent).to eq(false)
|
99
|
+
expect(@leave_count).to eq(1)
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'performs a connect then server initiated goodbye' do
|
104
|
+
|
105
|
+
session.join('test')
|
106
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
107
|
+
transport.receive_message(welcome.payload)
|
108
|
+
|
109
|
+
# Send Goodbye from server
|
110
|
+
goodbye = WampClient::Message::Goodbye.new({}, 'felt.like.it')
|
111
|
+
transport.receive_message(goodbye.payload)
|
112
|
+
|
113
|
+
# Check state
|
114
|
+
expect(transport.messages.count).to eq(2)
|
115
|
+
expect(transport.messages[1][0]).to eq(WampClient::Message::Types::GOODBYE)
|
116
|
+
expect(transport.messages[1][2]).to eq('wamp.error.goodbye_and_out') # Realm Test
|
117
|
+
expect(session.id).to be_nil
|
118
|
+
expect(session.is_open?).to eq(false)
|
119
|
+
expect(session.realm).to be_nil
|
120
|
+
expect(session._goodbye_sent).to eq(false)
|
121
|
+
expect(@leave_count).to eq(1)
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
describe 'subscribe' do
|
128
|
+
|
129
|
+
before(:each) do
|
130
|
+
# Check Exception
|
131
|
+
expect { session.subscribe('test.topic', nil, {test: 1}) }.to raise_exception("Session must be open to call 'subscribe'")
|
132
|
+
|
133
|
+
session.join('test')
|
134
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
135
|
+
transport.receive_message(welcome.payload)
|
136
|
+
transport.messages = []
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'adds subscribe request to queue' do
|
140
|
+
session.subscribe('test.topic', lambda {}, {test: 1})
|
141
|
+
|
142
|
+
expect(session._requests[:subscribe].count).to eq(1)
|
143
|
+
request_id = session._requests[:subscribe].keys.first
|
144
|
+
|
145
|
+
# Check the transport messages
|
146
|
+
expect(transport.messages.count).to eq(1)
|
147
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::SUBSCRIBE)
|
148
|
+
expect(transport.messages[0][1]).to eq(request_id)
|
149
|
+
expect(transport.messages[0][2]).to eq({test: 1})
|
150
|
+
expect(transport.messages[0][3]).to eq('test.topic')
|
151
|
+
|
152
|
+
# Check the request dictionary
|
153
|
+
expect(session._requests[:subscribe][request_id][:t]).to eq('test.topic')
|
154
|
+
expect(session._requests[:subscribe][request_id][:o]).to eq({test: 1})
|
155
|
+
|
156
|
+
# Check the subscriptions
|
157
|
+
expect(session._subscriptions.count).to eq(0)
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'confirms subscription' do
|
161
|
+
count = 0
|
162
|
+
session.subscribe('test.topic', lambda {}, {test: 1}) do |subscription, error, details|
|
163
|
+
count += 1
|
164
|
+
|
165
|
+
expect(subscription).not_to be_nil
|
166
|
+
expect(subscription.id).to eq(3456)
|
167
|
+
expect(error).to be_nil
|
168
|
+
expect(details).to eq({topic: 'test.topic', type: 'subscribe'})
|
169
|
+
end
|
170
|
+
|
171
|
+
request_id = session._requests[:subscribe].keys.first
|
172
|
+
|
173
|
+
expect(count).to eq(0)
|
174
|
+
|
175
|
+
# Generate server response
|
176
|
+
subscribed = WampClient::Message::Subscribed.new(request_id, 3456)
|
177
|
+
transport.receive_message(subscribed.payload)
|
178
|
+
|
179
|
+
expect(count).to eq(1)
|
180
|
+
|
181
|
+
# Check that the requests are empty
|
182
|
+
expect(session._requests[:subscribe].count).to eq(0)
|
183
|
+
|
184
|
+
# Check the subscriptions
|
185
|
+
expect(session._subscriptions.count).to eq(1)
|
186
|
+
expect(session._subscriptions[3456].topic).to eq('test.topic')
|
187
|
+
expect(session._subscriptions[3456].options).to eq({test: 1})
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'errors confirming a subscription' do
|
192
|
+
count = 0
|
193
|
+
session.subscribe('test.topic', lambda {}, {test: 1}) do |subscription, error, details|
|
194
|
+
count += 1
|
195
|
+
|
196
|
+
expect(subscription).to be_nil
|
197
|
+
expect(error[:error]).to eq('this.failed')
|
198
|
+
expect(details).to eq({fail: true, topic: 'test.topic', type: 'subscribe'})
|
199
|
+
end
|
200
|
+
|
201
|
+
request_id = session._requests[:subscribe].keys.first
|
202
|
+
|
203
|
+
# Generate server response
|
204
|
+
error = WampClient::Message::Error.new(WampClient::Message::Types::SUBSCRIBE,
|
205
|
+
request_id, {fail: true}, 'this.failed')
|
206
|
+
transport.receive_message(error.payload)
|
207
|
+
|
208
|
+
expect(count).to eq(1)
|
209
|
+
|
210
|
+
# Check that the requests are empty
|
211
|
+
expect(session._requests[:subscribe].count).to eq(0)
|
212
|
+
|
213
|
+
# Check the subscriptions
|
214
|
+
expect(session._subscriptions.count).to eq(0)
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'receives an event' do
|
218
|
+
|
219
|
+
count = 0
|
220
|
+
handler = lambda do |args, kwargs, details|
|
221
|
+
count += 1
|
222
|
+
|
223
|
+
expect(details).to eq({test:1, publication:7890})
|
224
|
+
expect(args).to eq([2])
|
225
|
+
expect(kwargs).to eq({param: 'value'})
|
226
|
+
end
|
227
|
+
|
228
|
+
session.subscribe('test.topic', handler, {test: 1})
|
229
|
+
request_id = session._requests[:subscribe].keys.first
|
230
|
+
|
231
|
+
expect(count).to eq(0)
|
232
|
+
|
233
|
+
# Generate server response
|
234
|
+
subscribed = WampClient::Message::Subscribed.new(request_id, 3456)
|
235
|
+
transport.receive_message(subscribed.payload)
|
236
|
+
|
237
|
+
expect(count).to eq(0)
|
238
|
+
|
239
|
+
# Generate server event
|
240
|
+
event = WampClient::Message::Event.new(3456, 7890, {test:1}, [2], {param: 'value'})
|
241
|
+
transport.receive_message(event.payload)
|
242
|
+
|
243
|
+
expect(count).to eq(1)
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
248
|
+
|
249
|
+
describe 'unsubscribe' do
|
250
|
+
|
251
|
+
before(:each) do
|
252
|
+
# Check Exception
|
253
|
+
expect { session.unsubscribe(nil) }.to raise_exception("Session must be open to call 'unsubscribe'")
|
254
|
+
|
255
|
+
session.join('test')
|
256
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
257
|
+
transport.receive_message(welcome.payload)
|
258
|
+
|
259
|
+
session.subscribe('test.topic', lambda {}, {test: 1}) do |subscription, error, details|
|
260
|
+
@subscription = subscription
|
261
|
+
end
|
262
|
+
|
263
|
+
# Get the request ID
|
264
|
+
@request_id = session._requests[:subscribe].keys.first
|
265
|
+
|
266
|
+
# Generate server response
|
267
|
+
subscribed = WampClient::Message::Subscribed.new(@request_id, 3456)
|
268
|
+
transport.receive_message(subscribed.payload)
|
269
|
+
|
270
|
+
transport.messages = []
|
271
|
+
end
|
272
|
+
|
273
|
+
it 'adds unsubscribe request to the queue' do
|
274
|
+
session.unsubscribe(@subscription)
|
275
|
+
|
276
|
+
@request_id = session._requests[:unsubscribe].keys.first
|
277
|
+
|
278
|
+
# Check the transport messages
|
279
|
+
expect(transport.messages.count).to eq(1)
|
280
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::UNSUBSCRIBE)
|
281
|
+
expect(transport.messages[0][1]).to eq(@request_id)
|
282
|
+
expect(transport.messages[0][2]).to eq(@subscription.id)
|
283
|
+
|
284
|
+
# Check the request dictionary
|
285
|
+
expect(session._requests[:unsubscribe][@request_id]).not_to be_nil
|
286
|
+
|
287
|
+
# Check the subscriptions
|
288
|
+
expect(session._subscriptions.count).to eq(1)
|
289
|
+
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'grants an unsubscription' do
|
293
|
+
|
294
|
+
count = 0
|
295
|
+
session.unsubscribe(@subscription) do |subscription, error, details|
|
296
|
+
count += 1
|
297
|
+
|
298
|
+
expect(subscription.id).to eq(@subscription.id)
|
299
|
+
expect(error).to be_nil
|
300
|
+
expect(details).to eq({topic: 'test.topic', type: 'unsubscribe'})
|
301
|
+
end
|
302
|
+
|
303
|
+
@request_id = session._requests[:unsubscribe].keys.first
|
304
|
+
|
305
|
+
expect(count).to eq(0)
|
306
|
+
|
307
|
+
# Generate Server Response
|
308
|
+
unsubscribed = WampClient::Message::Unsubscribed.new(@request_id)
|
309
|
+
transport.receive_message(unsubscribed.payload)
|
310
|
+
|
311
|
+
# Check the request dictionary
|
312
|
+
expect(session._requests[:unsubscribe].count).to eq(0)
|
313
|
+
|
314
|
+
# Check the subscriptions
|
315
|
+
expect(session._subscriptions.count).to eq(0)
|
316
|
+
|
317
|
+
end
|
318
|
+
|
319
|
+
it 'confirms an unsubscription' do
|
320
|
+
|
321
|
+
@subscription.unsubscribe
|
322
|
+
|
323
|
+
@request_id = session._requests[:unsubscribe].keys.first
|
324
|
+
|
325
|
+
# Generate Server Response
|
326
|
+
unsubscribed = WampClient::Message::Unsubscribed.new(@request_id)
|
327
|
+
transport.receive_message(unsubscribed.payload)
|
328
|
+
|
329
|
+
# Check the request dictionary
|
330
|
+
expect(session._requests[:unsubscribe].count).to eq(0)
|
331
|
+
|
332
|
+
# Check the subscriptions
|
333
|
+
expect(session._subscriptions.count).to eq(0)
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
it 'errors confirming an unsubscription' do
|
338
|
+
|
339
|
+
count = 0
|
340
|
+
session.unsubscribe(@subscription) do |subscription, error, details|
|
341
|
+
count += 1
|
342
|
+
|
343
|
+
expect(subscription).to be_nil
|
344
|
+
expect(error[:error]).to eq('this.failed')
|
345
|
+
expect(details).to eq({fail: true, topic: 'test.topic', type: 'unsubscribe'})
|
346
|
+
end
|
347
|
+
|
348
|
+
@request_id = session._requests[:unsubscribe].keys.first
|
349
|
+
|
350
|
+
expect(count).to eq(0)
|
351
|
+
|
352
|
+
# Generate Server Response
|
353
|
+
error = WampClient::Message::Error.new(WampClient::Message::Types::UNSUBSCRIBE,
|
354
|
+
@request_id, {fail: true}, 'this.failed')
|
355
|
+
transport.receive_message(error.payload)
|
356
|
+
|
357
|
+
expect(count).to eq(1)
|
358
|
+
|
359
|
+
# Check the request dictionary
|
360
|
+
expect(session._requests[:unsubscribe].count).to eq(0)
|
361
|
+
|
362
|
+
# Check the subscriptions
|
363
|
+
expect(session._subscriptions.count).to eq(1)
|
364
|
+
|
365
|
+
end
|
366
|
+
|
367
|
+
end
|
368
|
+
|
369
|
+
describe 'publish' do
|
370
|
+
|
371
|
+
before(:each) do
|
372
|
+
# Check Exception
|
373
|
+
expect { session.publish('test.topic') }.to raise_exception("Session must be open to call 'publish'")
|
374
|
+
|
375
|
+
session.join('test')
|
376
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
377
|
+
transport.receive_message(welcome.payload)
|
378
|
+
|
379
|
+
transport.messages = []
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'adds a publish to the publish request queue' do
|
383
|
+
session.publish('test.topic', nil, nil, {acknowledge:true})
|
384
|
+
|
385
|
+
@request_id = session._requests[:publish].keys.first
|
386
|
+
|
387
|
+
# Check the transport messages
|
388
|
+
expect(transport.messages.count).to eq(1)
|
389
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::PUBLISH)
|
390
|
+
expect(transport.messages[0][1]).to eq(@request_id)
|
391
|
+
expect(transport.messages[0][2]).to eq({acknowledge:true})
|
392
|
+
|
393
|
+
# Check the request dictionary
|
394
|
+
expect(session._requests[:publish][@request_id]).not_to be_nil
|
395
|
+
|
396
|
+
end
|
397
|
+
|
398
|
+
it 'publishes with no confirmation' do
|
399
|
+
|
400
|
+
expect(transport.messages.count).to eq(0)
|
401
|
+
|
402
|
+
session.publish('test.topic', nil, nil, {})
|
403
|
+
|
404
|
+
expect(transport.messages.count).to eq(1)
|
405
|
+
|
406
|
+
# Check the request dictionary
|
407
|
+
expect(session._requests[:publish].count).to eq(0)
|
408
|
+
|
409
|
+
end
|
410
|
+
|
411
|
+
it 'publishes with confirmation' do
|
412
|
+
|
413
|
+
expect(transport.messages.count).to eq(0)
|
414
|
+
|
415
|
+
count = 0
|
416
|
+
session.publish('test.topic', nil, nil, {acknowledge: true}) do |publication, error, details|
|
417
|
+
count += 1
|
418
|
+
|
419
|
+
expect(publication).not_to be_nil
|
420
|
+
expect(error).to be_nil
|
421
|
+
expect(details).to eq({topic: 'test.topic', type: 'publish', publication: 5678})
|
422
|
+
end
|
423
|
+
|
424
|
+
@request_id = session._requests[:publish].keys.first
|
425
|
+
|
426
|
+
expect(count).to eq(0)
|
427
|
+
|
428
|
+
# Generate Server Response
|
429
|
+
published = WampClient::Message::Published.new(@request_id, 5678)
|
430
|
+
transport.receive_message(published.payload)
|
431
|
+
|
432
|
+
# Check the request dictionary
|
433
|
+
expect(session._requests[:publish].count).to eq(0)
|
434
|
+
|
435
|
+
expect(count).to eq(1)
|
436
|
+
|
437
|
+
end
|
438
|
+
|
439
|
+
it 'errors confirming a publish' do
|
440
|
+
|
441
|
+
count = 0
|
442
|
+
session.publish('test.topic', nil, nil, {acknowledge: true}) do |publication, error, details|
|
443
|
+
count += 1
|
444
|
+
|
445
|
+
expect(publication).to be_nil
|
446
|
+
expect(error[:error]).to eq('this.failed')
|
447
|
+
expect(details).to eq({fail: true, topic: 'test.topic', type: 'publish'})
|
448
|
+
end
|
449
|
+
|
450
|
+
@request_id = session._requests[:publish].keys.first
|
451
|
+
|
452
|
+
expect(count).to eq(0)
|
453
|
+
|
454
|
+
# Generate Server Response
|
455
|
+
error = WampClient::Message::Error.new(WampClient::Message::Types::PUBLISH,
|
456
|
+
@request_id, {fail: true}, 'this.failed')
|
457
|
+
transport.receive_message(error.payload)
|
458
|
+
|
459
|
+
expect(count).to eq(1)
|
460
|
+
|
461
|
+
# Check the request dictionary
|
462
|
+
expect(session._requests[:publish].count).to eq(0)
|
463
|
+
|
464
|
+
end
|
465
|
+
|
466
|
+
end
|
467
|
+
|
468
|
+
describe 'register' do
|
469
|
+
|
470
|
+
before(:each) do
|
471
|
+
# Check Exception
|
472
|
+
expect { session.register('test.procedure', nil, {test: 1}) }.to raise_exception("Session must be open to call 'register'")
|
473
|
+
|
474
|
+
session.join('test')
|
475
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
476
|
+
transport.receive_message(welcome.payload)
|
477
|
+
transport.messages = []
|
478
|
+
end
|
479
|
+
|
480
|
+
it 'adds register request to queue' do
|
481
|
+
session.register('test.procedure', lambda {}, {test: 1})
|
482
|
+
|
483
|
+
expect(session._requests[:register].count).to eq(1)
|
484
|
+
request_id = session._requests[:register].keys.first
|
485
|
+
|
486
|
+
# Check the transport messages
|
487
|
+
expect(transport.messages.count).to eq(1)
|
488
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::REGISTER)
|
489
|
+
expect(transport.messages[0][1]).to eq(request_id)
|
490
|
+
expect(transport.messages[0][2]).to eq({test: 1})
|
491
|
+
expect(transport.messages[0][3]).to eq('test.procedure')
|
492
|
+
|
493
|
+
# Check the request dictionary
|
494
|
+
expect(session._requests[:register][request_id][:p]).to eq('test.procedure')
|
495
|
+
expect(session._requests[:register][request_id][:o]).to eq({test: 1})
|
496
|
+
|
497
|
+
# Check the subscriptions
|
498
|
+
expect(session._registrations.count).to eq(0)
|
499
|
+
end
|
500
|
+
|
501
|
+
it 'confirms register' do
|
502
|
+
count = 0
|
503
|
+
|
504
|
+
session.register('test.procedure', lambda {}, {test: 1}) do |registration, error, details|
|
505
|
+
count += 1
|
506
|
+
|
507
|
+
expect(registration).not_to be_nil
|
508
|
+
expect(registration.id).to eq(3456)
|
509
|
+
expect(error).to be_nil
|
510
|
+
expect(details).to eq({procedure: 'test.procedure', type: 'register'})
|
511
|
+
end
|
512
|
+
request_id = session._requests[:register].keys.first
|
513
|
+
|
514
|
+
expect(count).to eq(0)
|
515
|
+
|
516
|
+
# Generate server response
|
517
|
+
registered = WampClient::Message::Registered.new(request_id, 3456)
|
518
|
+
transport.receive_message(registered.payload)
|
519
|
+
|
520
|
+
expect(count).to eq(1)
|
521
|
+
|
522
|
+
# Check that the requests are empty
|
523
|
+
expect(session._requests[:register].count).to eq(0)
|
524
|
+
|
525
|
+
# Check the subscriptions
|
526
|
+
expect(session._registrations.count).to eq(1)
|
527
|
+
expect(session._registrations[3456].procedure).to eq('test.procedure')
|
528
|
+
expect(session._registrations[3456].options).to eq({test: 1})
|
529
|
+
|
530
|
+
end
|
531
|
+
|
532
|
+
it 'errors confirming a registration' do
|
533
|
+
count = 0
|
534
|
+
session.register('test.procedure', lambda {}, {test: 1}) do |registration, error, details|
|
535
|
+
count += 1
|
536
|
+
|
537
|
+
expect(registration).to be_nil
|
538
|
+
expect(error[:error]).to eq('this.failed')
|
539
|
+
expect(details).to eq({fail: true, procedure: 'test.procedure', type: 'register'})
|
540
|
+
end
|
541
|
+
|
542
|
+
request_id = session._requests[:register].keys.first
|
543
|
+
|
544
|
+
# Generate server response
|
545
|
+
error = WampClient::Message::Error.new(WampClient::Message::Types::REGISTER,
|
546
|
+
request_id, {fail: true}, 'this.failed')
|
547
|
+
transport.receive_message(error.payload)
|
548
|
+
|
549
|
+
expect(count).to eq(1)
|
550
|
+
|
551
|
+
# Check that the requests are empty
|
552
|
+
expect(session._requests[:register].count).to eq(0)
|
553
|
+
|
554
|
+
# Check the subscriptions
|
555
|
+
expect(session._registrations.count).to eq(0)
|
556
|
+
end
|
557
|
+
|
558
|
+
end
|
559
|
+
|
560
|
+
describe 'invocation' do
|
561
|
+
before(:each) do
|
562
|
+
# Check Exception
|
563
|
+
expect { session.register('test.procedure', nil, {test: 1}) }.to raise_exception("Session must be open to call 'register'")
|
564
|
+
|
565
|
+
session.join('test')
|
566
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
567
|
+
transport.receive_message(welcome.payload)
|
568
|
+
|
569
|
+
# Register
|
570
|
+
@response = 'response'
|
571
|
+
@throw_error = false
|
572
|
+
handler = lambda do |args, kwargs, details|
|
573
|
+
|
574
|
+
raise 'error' if @throw_error
|
575
|
+
|
576
|
+
@response
|
577
|
+
end
|
578
|
+
|
579
|
+
session.register('test.procedure', handler, {test: 1})
|
580
|
+
request_id = session._requests[:register].keys.first
|
581
|
+
|
582
|
+
# Generate server response
|
583
|
+
registered = WampClient::Message::Registered.new(request_id, 3456)
|
584
|
+
transport.receive_message(registered.payload)
|
585
|
+
|
586
|
+
transport.messages = []
|
587
|
+
end
|
588
|
+
|
589
|
+
it 'nil response' do
|
590
|
+
|
591
|
+
@response = nil
|
592
|
+
|
593
|
+
# Generate server event
|
594
|
+
invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
|
595
|
+
transport.receive_message(invocation.payload)
|
596
|
+
|
597
|
+
# Check and make sure yield message was sent
|
598
|
+
expect(transport.messages.count).to eq(1)
|
599
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::YIELD)
|
600
|
+
expect(transport.messages[0][1]).to eq(7890)
|
601
|
+
expect(transport.messages[0][2]).to eq({})
|
602
|
+
expect(transport.messages[0][3]).to be_nil
|
603
|
+
|
604
|
+
end
|
605
|
+
|
606
|
+
it 'normal response' do
|
607
|
+
|
608
|
+
@response = 'response'
|
609
|
+
|
610
|
+
# Generate server event
|
611
|
+
invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
|
612
|
+
transport.receive_message(invocation.payload)
|
613
|
+
|
614
|
+
# Check and make sure yield message was sent
|
615
|
+
expect(transport.messages.count).to eq(1)
|
616
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::YIELD)
|
617
|
+
expect(transport.messages[0][1]).to eq(7890)
|
618
|
+
expect(transport.messages[0][2]).to eq({})
|
619
|
+
expect(transport.messages[0][3]).to eq(['response'])
|
620
|
+
|
621
|
+
end
|
622
|
+
|
623
|
+
it 'call result response' do
|
624
|
+
|
625
|
+
@response = WampClient::CallResult.new(['test'], {test:1})
|
626
|
+
|
627
|
+
# Generate server event
|
628
|
+
invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
|
629
|
+
transport.receive_message(invocation.payload)
|
630
|
+
|
631
|
+
# Check and make sure yield message was sent
|
632
|
+
expect(transport.messages.count).to eq(1)
|
633
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::YIELD)
|
634
|
+
expect(transport.messages[0][1]).to eq(7890)
|
635
|
+
expect(transport.messages[0][2]).to eq({})
|
636
|
+
expect(transport.messages[0][3]).to eq(['test'])
|
637
|
+
expect(transport.messages[0][4]).to eq({test:1})
|
638
|
+
|
639
|
+
end
|
640
|
+
|
641
|
+
it 'call error response' do
|
642
|
+
|
643
|
+
@throw_error = true
|
644
|
+
|
645
|
+
# Generate server event
|
646
|
+
invocation = WampClient::Message::Invocation.new(7890, 3456, {test:1}, [2], {param: 'value'})
|
647
|
+
transport.receive_message(invocation.payload)
|
648
|
+
|
649
|
+
@throw_error = false
|
650
|
+
|
651
|
+
# Check and make sure yield message was sent
|
652
|
+
expect(transport.messages.count).to eq(1)
|
653
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::ERROR)
|
654
|
+
expect(transport.messages[0][1]).to eq(WampClient::Message::Types::INVOCATION)
|
655
|
+
expect(transport.messages[0][2]).to eq(7890)
|
656
|
+
expect(transport.messages[0][3]).to eq({})
|
657
|
+
expect(transport.messages[0][4]).to eq('wamp.error.runtime')
|
658
|
+
expect(transport.messages[0][5]).to eq(['error'])
|
659
|
+
|
660
|
+
end
|
661
|
+
end
|
662
|
+
|
663
|
+
describe 'unregister' do
|
664
|
+
|
665
|
+
before(:each) do
|
666
|
+
# Check Exception
|
667
|
+
expect { session.unregister(nil) }.to raise_exception("Session must be open to call 'unregister'")
|
668
|
+
|
669
|
+
session.join('test')
|
670
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
671
|
+
transport.receive_message(welcome.payload)
|
672
|
+
|
673
|
+
session.register('test.procedure', lambda {}, {test: 1}) do |registration, error, details|
|
674
|
+
@registration = registration
|
675
|
+
end
|
676
|
+
|
677
|
+
# Get the request ID
|
678
|
+
@request_id = session._requests[:register].keys.first
|
679
|
+
|
680
|
+
# Generate server response
|
681
|
+
registered = WampClient::Message::Registered.new(@request_id, 3456)
|
682
|
+
transport.receive_message(registered.payload)
|
683
|
+
|
684
|
+
transport.messages = []
|
685
|
+
end
|
686
|
+
|
687
|
+
it 'adds unregister request to the queue' do
|
688
|
+
session.unregister(@registration)
|
689
|
+
|
690
|
+
@request_id = session._requests[:unregister].keys.first
|
691
|
+
|
692
|
+
# Check the transport messages
|
693
|
+
expect(transport.messages.count).to eq(1)
|
694
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::UNREGISTER)
|
695
|
+
expect(transport.messages[0][1]).to eq(@request_id)
|
696
|
+
expect(transport.messages[0][2]).to eq(@registration.id)
|
697
|
+
|
698
|
+
# Check the request dictionary
|
699
|
+
expect(session._requests[:unregister][@request_id]).not_to be_nil
|
700
|
+
|
701
|
+
# Check the subscriptions
|
702
|
+
expect(session._registrations.count).to eq(1)
|
703
|
+
|
704
|
+
end
|
705
|
+
|
706
|
+
it 'grants an unregister' do
|
707
|
+
|
708
|
+
count = 0
|
709
|
+
session.unregister(@registration) do |registration, error, details|
|
710
|
+
count += 1
|
711
|
+
|
712
|
+
expect(registration.id).to eq(@registration.id)
|
713
|
+
expect(error).to be_nil
|
714
|
+
expect(details).to eq({procedure: 'test.procedure', type: 'unregister'})
|
715
|
+
end
|
716
|
+
|
717
|
+
@request_id = session._requests[:unregister].keys.first
|
718
|
+
|
719
|
+
expect(count).to eq(0)
|
720
|
+
|
721
|
+
# Generate Server Response
|
722
|
+
unregistered = WampClient::Message::Unregistered.new(@request_id)
|
723
|
+
transport.receive_message(unregistered.payload)
|
724
|
+
|
725
|
+
# Check the request dictionary
|
726
|
+
expect(session._requests[:unregister].count).to eq(0)
|
727
|
+
|
728
|
+
# Check the subscriptions
|
729
|
+
expect(session._registrations.count).to eq(0)
|
730
|
+
|
731
|
+
end
|
732
|
+
|
733
|
+
it 'confirms an unregister' do
|
734
|
+
|
735
|
+
@registration.unregister
|
736
|
+
|
737
|
+
@request_id = session._requests[:unregister].keys.first
|
738
|
+
|
739
|
+
# Generate Server Response
|
740
|
+
unregistered = WampClient::Message::Unregistered.new(@request_id)
|
741
|
+
transport.receive_message(unregistered.payload)
|
742
|
+
|
743
|
+
# Check the request dictionary
|
744
|
+
expect(session._requests[:unregister].count).to eq(0)
|
745
|
+
|
746
|
+
# Check the subscriptions
|
747
|
+
expect(session._registrations.count).to eq(0)
|
748
|
+
|
749
|
+
end
|
750
|
+
|
751
|
+
it 'errors confirming an unregister' do
|
752
|
+
|
753
|
+
count = 0
|
754
|
+
session.unregister(@registration) do |registration, error, details|
|
755
|
+
count += 1
|
756
|
+
|
757
|
+
expect(registration).to be_nil
|
758
|
+
expect(error[:error]).to eq('this.failed')
|
759
|
+
expect(details).to eq({fail: true, procedure:'test.procedure', type: 'unregister'})
|
760
|
+
end
|
761
|
+
|
762
|
+
@request_id = session._requests[:unregister].keys.first
|
763
|
+
|
764
|
+
expect(count).to eq(0)
|
765
|
+
|
766
|
+
# Generate Server Response
|
767
|
+
error = WampClient::Message::Error.new(WampClient::Message::Types::UNREGISTER,
|
768
|
+
@request_id, {fail: true}, 'this.failed')
|
769
|
+
transport.receive_message(error.payload)
|
770
|
+
|
771
|
+
expect(count).to eq(1)
|
772
|
+
|
773
|
+
# Check the request dictionary
|
774
|
+
expect(session._requests[:unregister].count).to eq(0)
|
775
|
+
|
776
|
+
# Check the subscriptions
|
777
|
+
expect(session._registrations.count).to eq(1)
|
778
|
+
|
779
|
+
end
|
780
|
+
|
781
|
+
end
|
782
|
+
|
783
|
+
describe 'call' do
|
784
|
+
|
785
|
+
before(:each) do
|
786
|
+
# Check Exception
|
787
|
+
expect { session.call('test.procedure') }.to raise_exception("Session must be open to call 'call'")
|
788
|
+
|
789
|
+
session.join('test')
|
790
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
791
|
+
transport.receive_message(welcome.payload)
|
792
|
+
|
793
|
+
transport.messages = []
|
794
|
+
end
|
795
|
+
|
796
|
+
it 'adds a call to the call request queue' do
|
797
|
+
session.call('test.procedure', nil, nil, {})
|
798
|
+
|
799
|
+
@request_id = session._requests[:call].keys.first
|
800
|
+
|
801
|
+
# Check the transport messages
|
802
|
+
expect(transport.messages.count).to eq(1)
|
803
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::CALL)
|
804
|
+
expect(transport.messages[0][1]).to eq(@request_id)
|
805
|
+
expect(transport.messages[0][2]).to eq({})
|
806
|
+
|
807
|
+
# Check the request dictionary
|
808
|
+
expect(session._requests[:call][@request_id]).not_to be_nil
|
809
|
+
|
810
|
+
end
|
811
|
+
|
812
|
+
it 'calls and gets result' do
|
813
|
+
|
814
|
+
expect(transport.messages.count).to eq(0)
|
815
|
+
|
816
|
+
count = 0
|
817
|
+
session.call('test.procedure') do |result, error, details|
|
818
|
+
count += 1
|
819
|
+
|
820
|
+
expect(result).not_to be_nil
|
821
|
+
expect(result.args).to eq(['test'])
|
822
|
+
expect(result.kwargs).to eq({test:true})
|
823
|
+
expect(error).to be_nil
|
824
|
+
expect(details).to eq({procedure: 'test.procedure', type: 'call'})
|
825
|
+
end
|
826
|
+
|
827
|
+
@request_id = session._requests[:call].keys.first
|
828
|
+
|
829
|
+
expect(count).to eq(0)
|
830
|
+
|
831
|
+
# Generate Server Response
|
832
|
+
result = WampClient::Message::Result.new(@request_id, {}, ['test'], {test:true})
|
833
|
+
transport.receive_message(result.payload)
|
834
|
+
|
835
|
+
# Check the request dictionary
|
836
|
+
expect(session._requests[:call].count).to eq(0)
|
837
|
+
|
838
|
+
expect(count).to eq(1)
|
839
|
+
|
840
|
+
end
|
841
|
+
|
842
|
+
it 'errors calling a procedure' do
|
843
|
+
|
844
|
+
count = 0
|
845
|
+
session.call('test.procedure', nil, nil, {acknowledge: true}) do |result, error, details|
|
846
|
+
count += 1
|
847
|
+
|
848
|
+
expect(result).to be_nil
|
849
|
+
expect(error[:error]).to eq('this.failed')
|
850
|
+
expect(details).to eq({fail: true, procedure: 'test.procedure', type: 'call'})
|
851
|
+
end
|
852
|
+
|
853
|
+
@request_id = session._requests[:call].keys.first
|
854
|
+
|
855
|
+
expect(count).to eq(0)
|
856
|
+
|
857
|
+
# Generate Server Response
|
858
|
+
error = WampClient::Message::Error.new(WampClient::Message::Types::CALL,
|
859
|
+
@request_id, {fail: true}, 'this.failed')
|
860
|
+
transport.receive_message(error.payload)
|
861
|
+
|
862
|
+
expect(count).to eq(1)
|
863
|
+
|
864
|
+
# Check the request dictionary
|
865
|
+
expect(session._requests[:call].count).to eq(0)
|
866
|
+
|
867
|
+
end
|
868
|
+
|
869
|
+
end
|
870
|
+
|
871
|
+
describe 'progressive_call_results' do
|
872
|
+
|
873
|
+
before(:each) do
|
874
|
+
session.join('test')
|
875
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
876
|
+
transport.receive_message(welcome.payload)
|
877
|
+
|
878
|
+
transport.messages = []
|
879
|
+
end
|
880
|
+
|
881
|
+
it 'caller ignores (should only get the first response' do
|
882
|
+
|
883
|
+
results = []
|
884
|
+
session.call('test.procedure', [], {}, {}) do |result, error, details|
|
885
|
+
results = results + result.args
|
886
|
+
end
|
887
|
+
|
888
|
+
@request_id = session._requests[:call].keys.first
|
889
|
+
|
890
|
+
# Send results
|
891
|
+
result = WampClient::Message::Result.new(@request_id, {progress:true}, ['test'])
|
892
|
+
transport.receive_message(result.payload)
|
893
|
+
transport.receive_message(result.payload)
|
894
|
+
transport.receive_message(result.payload)
|
895
|
+
transport.receive_message(result.payload)
|
896
|
+
|
897
|
+
# Send ending
|
898
|
+
result = WampClient::Message::Result.new(@request_id, {}, ['test'])
|
899
|
+
transport.receive_message(result.payload)
|
900
|
+
|
901
|
+
expect(results.count).to eq(1)
|
902
|
+
|
903
|
+
end
|
904
|
+
|
905
|
+
it 'caller support' do
|
906
|
+
|
907
|
+
results = []
|
908
|
+
session.call('test.procedure', [], {}, {receive_progress: true}) do |result, error, details|
|
909
|
+
results = results + result.args
|
910
|
+
end
|
911
|
+
|
912
|
+
@request_id = session._requests[:call].keys.first
|
913
|
+
|
914
|
+
# Send results
|
915
|
+
result = WampClient::Message::Result.new(@request_id, {progress:true}, ['test'])
|
916
|
+
transport.receive_message(result.payload)
|
917
|
+
transport.receive_message(result.payload)
|
918
|
+
transport.receive_message(result.payload)
|
919
|
+
transport.receive_message(result.payload)
|
920
|
+
|
921
|
+
# Send ending
|
922
|
+
result = WampClient::Message::Result.new(@request_id, {}, ['test'])
|
923
|
+
transport.receive_message(result.payload)
|
924
|
+
|
925
|
+
expect(results.count).to eq(5)
|
926
|
+
|
927
|
+
# Send More to ensure they are not appended
|
928
|
+
result = WampClient::Message::Result.new(@request_id, {progress:true}, ['test'])
|
929
|
+
transport.receive_message(result.payload)
|
930
|
+
transport.receive_message(result.payload)
|
931
|
+
transport.receive_message(result.payload)
|
932
|
+
transport.receive_message(result.payload)
|
933
|
+
|
934
|
+
# Ensure they were not appended
|
935
|
+
expect(results.count).to eq(5)
|
936
|
+
|
937
|
+
end
|
938
|
+
|
939
|
+
end
|
940
|
+
|
941
|
+
describe 'auth' do
|
942
|
+
|
943
|
+
let (:challenge) {"{ \"nonce\": \"LHRTC9zeOIrt_9U3\", \"authprovider\": \"userdb\", \"authid\": \"peter\", \"timestamp\": \"2014-06-22T16:36:25.448Z\", \"authrole\": \"user\", \"authmethod\": \"wampcra\", \"session\": 3251278072152162}"}
|
944
|
+
let (:secret) {'secret'}
|
945
|
+
|
946
|
+
before(:each) do
|
947
|
+
session.join('test')
|
948
|
+
transport.messages = []
|
949
|
+
|
950
|
+
session.on_challenge do |authmethod, extra|
|
951
|
+
expect(authmethod).to eq('wampcra')
|
952
|
+
WampClient::Auth::Cra.sign(secret, extra[:challenge])
|
953
|
+
end
|
954
|
+
end
|
955
|
+
|
956
|
+
it 'challenge => authenticate' do
|
957
|
+
|
958
|
+
# Send the challenge
|
959
|
+
challenge_msg = WampClient::Message::Challenge.new('wampcra', {challenge: challenge})
|
960
|
+
transport.receive_message(challenge_msg.payload)
|
961
|
+
|
962
|
+
# Check the transport messages
|
963
|
+
expect(transport.messages.count).to eq(1)
|
964
|
+
expect(transport.messages[0][0]).to eq(WampClient::Message::Types::AUTHENTICATE)
|
965
|
+
expect(transport.messages[0][1]).to eq('Pji30JC9tb/T9tbEwxw5i0RyRa5UVBxuoIVTgT7hnkE=')
|
966
|
+
expect(transport.messages[0][2]).to eq({})
|
967
|
+
|
968
|
+
end
|
969
|
+
|
970
|
+
it 'accepts a wampcra challenge' do
|
971
|
+
|
972
|
+
# Send the challenge
|
973
|
+
challenge_msg = WampClient::Message::Challenge.new('wampcra', {challenge: challenge})
|
974
|
+
transport.receive_message(challenge_msg.payload)
|
975
|
+
|
976
|
+
# Send welcome message
|
977
|
+
welcome = WampClient::Message::Welcome.new(1234, {})
|
978
|
+
transport.receive_message(welcome.payload)
|
979
|
+
|
980
|
+
# Check new state of session
|
981
|
+
expect(session.id).to eq(1234)
|
982
|
+
expect(transport.messages.count).to eq(1)
|
983
|
+
|
984
|
+
end
|
985
|
+
|
986
|
+
it 'rejects a wampcra challenge' do
|
987
|
+
|
988
|
+
# Send the challenge
|
989
|
+
challenge_msg = WampClient::Message::Challenge.new('wampcra', {challenge: challenge})
|
990
|
+
transport.receive_message(challenge_msg.payload)
|
991
|
+
|
992
|
+
# Send abort message
|
993
|
+
abort = WampClient::Message::Abort.new({}, 'test.reason')
|
994
|
+
transport.receive_message(abort.payload)
|
995
|
+
|
996
|
+
# Check new state of session
|
997
|
+
expect(session.id).to be_nil
|
998
|
+
expect(transport.messages.count).to eq(1)
|
999
|
+
|
1000
|
+
end
|
1001
|
+
|
1002
|
+
end
|
1003
|
+
|
1004
|
+
end
|