libuv 2.0.12 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +67 -34
- data/lib/libuv.rb +30 -5
- data/lib/libuv/async.rb +16 -10
- data/lib/libuv/check.rb +19 -12
- data/lib/libuv/coroutines.rb +39 -12
- data/lib/libuv/dns.rb +25 -18
- data/lib/libuv/error.rb +2 -0
- data/lib/libuv/ext/ext.rb +28 -36
- data/lib/libuv/ext/platform/darwin_x64.rb +2 -0
- data/lib/libuv/ext/platform/unix.rb +2 -0
- data/lib/libuv/ext/platform/windows.rb +2 -0
- data/lib/libuv/ext/tasks.rb +2 -0
- data/lib/libuv/ext/tasks/mac.rb +2 -0
- data/lib/libuv/ext/tasks/unix.rb +2 -0
- data/lib/libuv/ext/tasks/win.rb +2 -0
- data/lib/libuv/ext/types.rb +2 -1
- data/lib/libuv/file.rb +67 -50
- data/lib/libuv/filesystem.rb +63 -61
- data/lib/libuv/fs_event.rb +7 -4
- data/lib/libuv/handle.rb +30 -14
- data/lib/libuv/idle.rb +17 -10
- data/lib/libuv/mixins/accessors.rb +41 -0
- data/lib/libuv/mixins/assertions.rb +3 -1
- data/lib/libuv/mixins/fs_checks.rb +29 -6
- data/lib/libuv/mixins/listener.rb +4 -2
- data/lib/libuv/mixins/net.rb +4 -2
- data/lib/libuv/mixins/resource.rb +5 -3
- data/lib/libuv/mixins/stream.rb +128 -35
- data/lib/libuv/pipe.rb +54 -27
- data/lib/libuv/prepare.rb +19 -12
- data/lib/libuv/q.rb +109 -101
- data/lib/libuv/{loop.rb → reactor.rb} +163 -85
- data/lib/libuv/signal.rb +13 -5
- data/lib/libuv/tcp.rb +109 -63
- data/lib/libuv/timer.rb +44 -24
- data/lib/libuv/tty.rb +8 -3
- data/lib/libuv/udp.rb +49 -22
- data/lib/libuv/version.rb +3 -1
- data/lib/libuv/work.rb +14 -10
- data/libuv.gemspec +11 -9
- data/spec/async_spec.rb +13 -13
- data/spec/coroutines_spec.rb +20 -50
- data/spec/defer_spec.rb +182 -311
- data/spec/dns_spec.rb +51 -41
- data/spec/dsl_spec.rb +43 -0
- data/spec/filesystem_spec.rb +65 -87
- data/spec/idle_spec.rb +19 -33
- data/spec/pipe_spec.rb +25 -32
- data/spec/tcp_spec.rb +116 -53
- data/spec/timer_spec.rb +3 -3
- data/spec/udp_spec.rb +16 -17
- data/spec/zen_spec.rb +2 -3
- metadata +37 -30
data/spec/defer_spec.rb
CHANGED
@@ -4,12 +4,12 @@ require 'libuv'
|
|
4
4
|
describe Libuv::Q do
|
5
5
|
|
6
6
|
before :each do
|
7
|
-
@
|
8
|
-
@deferred = @
|
7
|
+
@reactor = Libuv::Reactor.default
|
8
|
+
@deferred = @reactor.defer
|
9
9
|
@promise = @deferred.promise
|
10
10
|
@log = []
|
11
11
|
@default_fail = proc { |reason|
|
12
|
-
@
|
12
|
+
@reactor.stop
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
@@ -18,16 +18,12 @@ describe Libuv::Q do
|
|
18
18
|
|
19
19
|
|
20
20
|
it "should call the callback in the next turn" do
|
21
|
-
@
|
21
|
+
@reactor.run {
|
22
22
|
@promise.then nil, @default_fail do |result|
|
23
23
|
@log << result
|
24
24
|
end
|
25
25
|
|
26
26
|
@deferred.resolve(:foo)
|
27
|
-
|
28
|
-
@loop.next_tick do
|
29
|
-
@loop.stop
|
30
|
-
end
|
31
27
|
}
|
32
28
|
|
33
29
|
expect(@log).to eq([:foo])
|
@@ -36,7 +32,7 @@ describe Libuv::Q do
|
|
36
32
|
|
37
33
|
|
38
34
|
it "should be able to resolve the callback after it has already been resolved" do
|
39
|
-
@
|
35
|
+
@reactor.run {
|
40
36
|
@promise.then nil, @default_fail do |result|
|
41
37
|
@log << result
|
42
38
|
@promise.then nil, @default_fail do |result|
|
@@ -45,12 +41,6 @@ describe Libuv::Q do
|
|
45
41
|
end
|
46
42
|
|
47
43
|
@deferred.resolve(:foo)
|
48
|
-
|
49
|
-
@loop.next_tick do
|
50
|
-
@loop.next_tick do
|
51
|
-
@loop.stop
|
52
|
-
end
|
53
|
-
end
|
54
44
|
}
|
55
45
|
expect(@log).to eq([:foo, :foo])
|
56
46
|
end
|
@@ -58,7 +48,7 @@ describe Libuv::Q do
|
|
58
48
|
|
59
49
|
|
60
50
|
it "should fulfill success callbacks in the registration order" do
|
61
|
-
@
|
51
|
+
@reactor.run {
|
62
52
|
@promise.then nil, @default_fail do |result|
|
63
53
|
@log << :first
|
64
54
|
end
|
@@ -68,17 +58,13 @@ describe Libuv::Q do
|
|
68
58
|
end
|
69
59
|
|
70
60
|
@deferred.resolve(:foo)
|
71
|
-
|
72
|
-
@loop.next_tick do
|
73
|
-
@loop.stop
|
74
|
-
end
|
75
61
|
}
|
76
62
|
expect(@log).to eq([:first, :second])
|
77
63
|
end
|
78
64
|
|
79
65
|
|
80
66
|
it "should do nothing if a promise was previously resolved" do
|
81
|
-
@
|
67
|
+
@reactor.run {
|
82
68
|
@promise.then nil, @default_fail do |result|
|
83
69
|
@log << result
|
84
70
|
expect(@log).to eq([:foo])
|
@@ -87,30 +73,17 @@ describe Libuv::Q do
|
|
87
73
|
|
88
74
|
@deferred.resolve(:foo)
|
89
75
|
@deferred.reject(:baz)
|
90
|
-
|
91
|
-
#
|
92
|
-
# 4 ticks should detect any errors
|
93
|
-
#
|
94
|
-
@loop.next_tick do
|
95
|
-
@loop.next_tick do
|
96
|
-
@loop.next_tick do
|
97
|
-
@loop.next_tick do
|
98
|
-
@loop.stop
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
76
|
}
|
104
77
|
expect(@log).to eq([:foo])
|
105
78
|
end
|
106
79
|
|
107
80
|
|
108
81
|
it "should allow deferred resolution with a new promise" do
|
109
|
-
deferred2 = @
|
110
|
-
@
|
82
|
+
deferred2 = @reactor.defer
|
83
|
+
@reactor.run {
|
111
84
|
@promise.then nil, @default_fail do |result|
|
112
85
|
@log << result
|
113
|
-
@
|
86
|
+
@reactor.stop
|
114
87
|
end
|
115
88
|
|
116
89
|
@deferred.resolve(deferred2.promise)
|
@@ -121,7 +94,7 @@ describe Libuv::Q do
|
|
121
94
|
|
122
95
|
|
123
96
|
it "should not break if a callbacks registers another callback" do
|
124
|
-
@
|
97
|
+
@reactor.run {
|
125
98
|
@promise.then nil, @default_fail do |result|
|
126
99
|
@log << :outer
|
127
100
|
@promise.then nil, @default_fail do |result|
|
@@ -130,12 +103,6 @@ describe Libuv::Q do
|
|
130
103
|
end
|
131
104
|
|
132
105
|
@deferred.resolve(:foo)
|
133
|
-
|
134
|
-
@loop.next_tick do
|
135
|
-
@loop.next_tick do
|
136
|
-
@loop.stop
|
137
|
-
end
|
138
|
-
end
|
139
106
|
}
|
140
107
|
|
141
108
|
expect(@log).to eq([:outer, :inner])
|
@@ -144,9 +111,9 @@ describe Libuv::Q do
|
|
144
111
|
|
145
112
|
|
146
113
|
it "can modify the result of a promise before returning" do
|
147
|
-
@
|
114
|
+
@reactor.run {
|
148
115
|
proc { |name|
|
149
|
-
@
|
116
|
+
@reactor.work { @deferred.resolve("Hello #{name}") }
|
150
117
|
@promise.then nil, @default_fail do |result|
|
151
118
|
@log << result
|
152
119
|
result += "?"
|
@@ -154,7 +121,7 @@ describe Libuv::Q do
|
|
154
121
|
end
|
155
122
|
}.call('Robin Hood').then nil, @default_fail do |greeting|
|
156
123
|
@log << greeting
|
157
|
-
@
|
124
|
+
@reactor.stop
|
158
125
|
end
|
159
126
|
}
|
160
127
|
|
@@ -167,7 +134,7 @@ describe Libuv::Q do
|
|
167
134
|
describe 'reject' do
|
168
135
|
|
169
136
|
it "should reject the promise and execute all error callbacks" do
|
170
|
-
@
|
137
|
+
@reactor.run {
|
171
138
|
@promise.then(@default_fail, proc {|result|
|
172
139
|
@log << :first
|
173
140
|
})
|
@@ -176,17 +143,13 @@ describe Libuv::Q do
|
|
176
143
|
})
|
177
144
|
|
178
145
|
@deferred.reject(:foo)
|
179
|
-
|
180
|
-
@loop.next_tick do
|
181
|
-
@loop.stop
|
182
|
-
end
|
183
146
|
}
|
184
147
|
expect(@log).to eq([:first, :second])
|
185
148
|
end
|
186
149
|
|
187
150
|
|
188
151
|
it "should do nothing if a promise was previously rejected" do
|
189
|
-
@
|
152
|
+
@reactor.run {
|
190
153
|
@promise.then(@default_fail, proc {|result|
|
191
154
|
@log << result
|
192
155
|
@deferred.resolve(:bar)
|
@@ -194,33 +157,20 @@ describe Libuv::Q do
|
|
194
157
|
|
195
158
|
@deferred.reject(:baz)
|
196
159
|
@deferred.resolve(:foo)
|
197
|
-
|
198
|
-
#
|
199
|
-
# 4 ticks should detect any errors
|
200
|
-
#
|
201
|
-
@loop.next_tick do
|
202
|
-
@loop.next_tick do
|
203
|
-
@loop.next_tick do
|
204
|
-
@loop.next_tick do
|
205
|
-
@loop.stop
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
160
|
}
|
211
161
|
expect(@log).to eq([:baz])
|
212
162
|
end
|
213
163
|
|
214
164
|
|
215
165
|
it "should not defer rejection with a new promise" do
|
216
|
-
deferred2 = @
|
217
|
-
@
|
166
|
+
deferred2 = @reactor.defer
|
167
|
+
@reactor.run {
|
218
168
|
@promise.then(@default_fail, @default_fail)
|
219
169
|
begin
|
220
170
|
@deferred.reject(deferred2.promise)
|
221
171
|
rescue => e
|
222
172
|
@log << e.is_a?(ArgumentError)
|
223
|
-
@
|
173
|
+
@reactor.stop
|
224
174
|
end
|
225
175
|
}
|
226
176
|
|
@@ -232,7 +182,7 @@ describe Libuv::Q do
|
|
232
182
|
|
233
183
|
describe 'notify' do
|
234
184
|
it "should execute all progress callbacks in the registration order" do
|
235
|
-
@
|
185
|
+
@reactor.run {
|
236
186
|
@promise.progress do |update|
|
237
187
|
@log << :first
|
238
188
|
end
|
@@ -242,17 +192,13 @@ describe Libuv::Q do
|
|
242
192
|
end
|
243
193
|
|
244
194
|
@deferred.notify(:foo)
|
245
|
-
|
246
|
-
@loop.next_tick do
|
247
|
-
@loop.stop
|
248
|
-
end
|
249
195
|
}
|
250
196
|
|
251
197
|
expect(@log).to eq([:first, :second])
|
252
198
|
end
|
253
199
|
|
254
200
|
it "should do nothing if a promise was previously resolved" do
|
255
|
-
@
|
201
|
+
@reactor.run {
|
256
202
|
|
257
203
|
@promise.progress do |update|
|
258
204
|
@log << update
|
@@ -260,48 +206,19 @@ describe Libuv::Q do
|
|
260
206
|
|
261
207
|
@deferred.resolve(:foo)
|
262
208
|
@deferred.notify(:baz)
|
263
|
-
|
264
|
-
|
265
|
-
#
|
266
|
-
# 4 ticks should detect any errors
|
267
|
-
#
|
268
|
-
@loop.next_tick do
|
269
|
-
@loop.next_tick do
|
270
|
-
@loop.next_tick do
|
271
|
-
@loop.next_tick do
|
272
|
-
@loop.stop
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|
276
|
-
end
|
277
209
|
}
|
278
210
|
|
279
211
|
expect(@log).to eq([])
|
280
212
|
end
|
281
213
|
|
282
214
|
it "should do nothing if a promise was previously rejected" do
|
283
|
-
@
|
215
|
+
@reactor.run {
|
284
216
|
|
285
217
|
@promise.progress do |update|
|
286
218
|
@log << update
|
287
219
|
end
|
288
220
|
@deferred.reject(:foo)
|
289
221
|
@deferred.notify(:baz)
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
#
|
294
|
-
# 4 ticks should detect any errors
|
295
|
-
#
|
296
|
-
@loop.next_tick do
|
297
|
-
@loop.next_tick do
|
298
|
-
@loop.next_tick do
|
299
|
-
@loop.next_tick do
|
300
|
-
@loop.stop
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|
304
|
-
end
|
305
222
|
}
|
306
223
|
|
307
224
|
expect(@log).to eq([])
|
@@ -309,17 +226,13 @@ describe Libuv::Q do
|
|
309
226
|
|
310
227
|
|
311
228
|
it "should not apply any special treatment to promises passed to notify" do
|
312
|
-
@
|
313
|
-
deferred2 = @
|
229
|
+
@reactor.run {
|
230
|
+
deferred2 = @reactor.defer
|
314
231
|
|
315
232
|
@promise.progress do |update|
|
316
233
|
@log << update.is_a?(::Libuv::Q::Promise)
|
317
234
|
end
|
318
235
|
@deferred.notify(deferred2.promise)
|
319
|
-
|
320
|
-
@loop.next_tick do
|
321
|
-
@loop.stop
|
322
|
-
end
|
323
236
|
}
|
324
237
|
|
325
238
|
expect(@log).to eq([true])
|
@@ -327,7 +240,7 @@ describe Libuv::Q do
|
|
327
240
|
|
328
241
|
|
329
242
|
it "should call the progress callbacks in the next turn" do
|
330
|
-
@
|
243
|
+
@reactor.run {
|
331
244
|
@promise.progress do |update|
|
332
245
|
@log << :first
|
333
246
|
end
|
@@ -339,14 +252,13 @@ describe Libuv::Q do
|
|
339
252
|
@deferred.notify(:foo)
|
340
253
|
|
341
254
|
@log << @log.length # Has notify run in this tick
|
342
|
-
@loop.stop # Stop will run through the next tick before stopping
|
343
255
|
}
|
344
256
|
|
345
257
|
expect(@log).to eq([0, :first, :second])
|
346
258
|
end
|
347
259
|
|
348
260
|
it "should ignore notifications sent out in the same turn before listener registration" do
|
349
|
-
@
|
261
|
+
@reactor.run {
|
350
262
|
@deferred.notify(:foo)
|
351
263
|
|
352
264
|
@promise.progress do |update|
|
@@ -356,10 +268,6 @@ describe Libuv::Q do
|
|
356
268
|
@promise.progress do |update|
|
357
269
|
@log << :second
|
358
270
|
end
|
359
|
-
|
360
|
-
@loop.next_tick do
|
361
|
-
@loop.stop
|
362
|
-
end
|
363
271
|
}
|
364
272
|
|
365
273
|
expect(@log).to eq([])
|
@@ -368,20 +276,16 @@ describe Libuv::Q do
|
|
368
276
|
|
369
277
|
|
370
278
|
describe Libuv::Q::Promise do
|
371
|
-
|
279
|
+
|
372
280
|
describe 'then' do
|
373
281
|
|
374
282
|
it "should allow registration of a success callback without an errback and resolve" do
|
375
|
-
@
|
283
|
+
@reactor.run {
|
376
284
|
@promise.then do |result|
|
377
285
|
@log << result
|
378
286
|
end
|
379
287
|
|
380
288
|
@deferred.resolve(:foo)
|
381
|
-
|
382
|
-
@loop.next_tick do
|
383
|
-
@loop.stop
|
384
|
-
end
|
385
289
|
}
|
386
290
|
|
387
291
|
expect(@log).to eq([:foo])
|
@@ -389,16 +293,12 @@ describe Libuv::Q do
|
|
389
293
|
|
390
294
|
|
391
295
|
it "should allow registration of a success callback without an errback and reject" do
|
392
|
-
@
|
296
|
+
@reactor.run {
|
393
297
|
@promise.then do |result|
|
394
298
|
@log << result
|
395
299
|
end
|
396
300
|
|
397
301
|
@deferred.reject(:foo)
|
398
|
-
|
399
|
-
@loop.next_tick do
|
400
|
-
@loop.stop
|
401
|
-
end
|
402
302
|
}
|
403
303
|
|
404
304
|
expect(@log).to eq([])
|
@@ -406,16 +306,12 @@ describe Libuv::Q do
|
|
406
306
|
|
407
307
|
|
408
308
|
it "should allow registration of an errback without a success callback and reject" do
|
409
|
-
@
|
309
|
+
@reactor.run {
|
410
310
|
@promise.catch(proc {|reason|
|
411
311
|
@log << reason
|
412
312
|
})
|
413
313
|
|
414
314
|
@deferred.reject(:foo)
|
415
|
-
|
416
|
-
@loop.next_tick do
|
417
|
-
@loop.stop
|
418
|
-
end
|
419
315
|
}
|
420
316
|
|
421
317
|
expect(@log).to eq([:foo])
|
@@ -423,16 +319,12 @@ describe Libuv::Q do
|
|
423
319
|
|
424
320
|
|
425
321
|
it "should allow registration of an errback without a success callback and resolve" do
|
426
|
-
@
|
322
|
+
@reactor.run {
|
427
323
|
@promise.catch(proc {|reason|
|
428
324
|
@log << reason
|
429
325
|
})
|
430
326
|
|
431
327
|
@deferred.resolve(:foo)
|
432
|
-
|
433
|
-
@loop.next_tick do
|
434
|
-
@loop.stop
|
435
|
-
end
|
436
328
|
}
|
437
329
|
|
438
330
|
expect(@log).to eq([])
|
@@ -440,7 +332,7 @@ describe Libuv::Q do
|
|
440
332
|
|
441
333
|
|
442
334
|
it "should resolve all callbacks with the original value" do
|
443
|
-
@
|
335
|
+
@reactor.run {
|
444
336
|
@promise.then nil, @default_fail do |result|
|
445
337
|
@log << result
|
446
338
|
:alt1
|
@@ -451,7 +343,7 @@ describe Libuv::Q do
|
|
451
343
|
end
|
452
344
|
@promise.then nil, @default_fail do |result|
|
453
345
|
@log << result
|
454
|
-
Libuv::Q.reject(@
|
346
|
+
Libuv::Q.reject(@reactor, 'some reason')
|
455
347
|
end
|
456
348
|
@promise.then nil, @default_fail do |result|
|
457
349
|
@log << result
|
@@ -459,10 +351,6 @@ describe Libuv::Q do
|
|
459
351
|
end
|
460
352
|
|
461
353
|
@deferred.resolve(:foo)
|
462
|
-
|
463
|
-
@loop.next_tick do
|
464
|
-
@loop.stop
|
465
|
-
end
|
466
354
|
}
|
467
355
|
|
468
356
|
expect(@log).to eq([:foo, :foo, :foo, :foo])
|
@@ -470,7 +358,7 @@ describe Libuv::Q do
|
|
470
358
|
|
471
359
|
|
472
360
|
it "should notify all callbacks with the original value" do
|
473
|
-
@
|
361
|
+
@reactor.run { |reactor_promise|
|
474
362
|
@promise.progress do |result|
|
475
363
|
@log << result
|
476
364
|
:alt1
|
@@ -481,7 +369,7 @@ describe Libuv::Q do
|
|
481
369
|
end
|
482
370
|
@promise.progress do |result|
|
483
371
|
@log << result
|
484
|
-
Libuv::Q.reject(@
|
372
|
+
Libuv::Q.reject(@reactor, 'some reason')
|
485
373
|
end
|
486
374
|
@promise.progress do |result|
|
487
375
|
@log << result
|
@@ -490,18 +378,6 @@ describe Libuv::Q do
|
|
490
378
|
|
491
379
|
|
492
380
|
@deferred.notify(:foo)
|
493
|
-
|
494
|
-
@loop.next_tick do
|
495
|
-
@loop.next_tick do
|
496
|
-
@loop.next_tick do
|
497
|
-
@loop.next_tick do
|
498
|
-
@loop.next_tick do
|
499
|
-
@loop.stop
|
500
|
-
end
|
501
|
-
end
|
502
|
-
end
|
503
|
-
end
|
504
|
-
end
|
505
381
|
}
|
506
382
|
|
507
383
|
expect(@log).to eq([:foo, :foo, :foo, :foo])
|
@@ -509,7 +385,7 @@ describe Libuv::Q do
|
|
509
385
|
|
510
386
|
|
511
387
|
it "should reject all callbacks with the original reason" do
|
512
|
-
@
|
388
|
+
@reactor.run {
|
513
389
|
@promise.then(@default_fail, proc {|result|
|
514
390
|
@log << result
|
515
391
|
:alt1
|
@@ -520,7 +396,7 @@ describe Libuv::Q do
|
|
520
396
|
})
|
521
397
|
@promise.then(@default_fail, proc {|result|
|
522
398
|
@log << result
|
523
|
-
Libuv::Q.reject(@
|
399
|
+
Libuv::Q.reject(@reactor, 'some reason')
|
524
400
|
})
|
525
401
|
@promise.then(@default_fail, proc {|result|
|
526
402
|
@log << result
|
@@ -528,10 +404,6 @@ describe Libuv::Q do
|
|
528
404
|
})
|
529
405
|
|
530
406
|
@deferred.reject(:foo)
|
531
|
-
|
532
|
-
@loop.next_tick do
|
533
|
-
@loop.stop
|
534
|
-
end
|
535
407
|
}
|
536
408
|
|
537
409
|
expect(@log).to eq([:foo, :foo, :foo, :foo])
|
@@ -539,7 +411,7 @@ describe Libuv::Q do
|
|
539
411
|
|
540
412
|
|
541
413
|
it "should propagate resolution and rejection between dependent promises" do
|
542
|
-
@
|
414
|
+
@reactor.run {
|
543
415
|
@promise.then(proc { |result|
|
544
416
|
@log << result
|
545
417
|
:bar
|
@@ -557,20 +429,6 @@ describe Libuv::Q do
|
|
557
429
|
}, @default_fail)
|
558
430
|
|
559
431
|
@deferred.resolve(:foo)
|
560
|
-
|
561
|
-
@loop.next_tick do
|
562
|
-
@loop.next_tick do
|
563
|
-
@loop.next_tick do
|
564
|
-
@loop.next_tick do
|
565
|
-
@loop.next_tick do
|
566
|
-
@loop.next_tick do # extra tick?
|
567
|
-
@loop.stop
|
568
|
-
end
|
569
|
-
end
|
570
|
-
end
|
571
|
-
end
|
572
|
-
end
|
573
|
-
end
|
574
432
|
}
|
575
433
|
|
576
434
|
expect(@log).to eq([:foo, :bar, 'baz', 'bob', :done])
|
@@ -578,8 +436,8 @@ describe Libuv::Q do
|
|
578
436
|
|
579
437
|
|
580
438
|
it "should propagate notification between dependent promises" do
|
581
|
-
@
|
582
|
-
|
439
|
+
@reactor.run { |reactor|
|
440
|
+
reactor.notifier do |type, id, error|
|
583
441
|
@log << id
|
584
442
|
end
|
585
443
|
|
@@ -603,20 +461,6 @@ describe Libuv::Q do
|
|
603
461
|
|
604
462
|
|
605
463
|
@deferred.notify(:foo)
|
606
|
-
|
607
|
-
@loop.next_tick do
|
608
|
-
@loop.next_tick do
|
609
|
-
@loop.next_tick do
|
610
|
-
@loop.next_tick do
|
611
|
-
@loop.next_tick do
|
612
|
-
@loop.next_tick do # extra tick?
|
613
|
-
@loop.stop
|
614
|
-
end
|
615
|
-
end
|
616
|
-
end
|
617
|
-
end
|
618
|
-
end
|
619
|
-
end
|
620
464
|
}
|
621
465
|
|
622
466
|
expect(@log).to eq([:foo, :bar, :bar, :bar, :done])
|
@@ -624,9 +468,9 @@ describe Libuv::Q do
|
|
624
468
|
|
625
469
|
|
626
470
|
it "should stop notification propagation in case of error" do
|
627
|
-
@
|
628
|
-
|
629
|
-
@log <<
|
471
|
+
@reactor.run { |reactor|
|
472
|
+
reactor.notifier do |error, context|
|
473
|
+
@log << context
|
630
474
|
end
|
631
475
|
|
632
476
|
|
@@ -650,34 +494,22 @@ describe Libuv::Q do
|
|
650
494
|
|
651
495
|
|
652
496
|
@deferred.notify(:foo)
|
653
|
-
|
654
|
-
@loop.next_tick do
|
655
|
-
@loop.next_tick do
|
656
|
-
@loop.next_tick do
|
657
|
-
@loop.next_tick do
|
658
|
-
@loop.next_tick do
|
659
|
-
@loop.stop
|
660
|
-
end
|
661
|
-
end
|
662
|
-
end
|
663
|
-
end
|
664
|
-
end
|
665
497
|
}
|
666
498
|
|
667
|
-
expect(@log).to eq([:foo, :bar,
|
499
|
+
expect(@log).to eq([:foo, :bar, "performing promise progress callback"])
|
668
500
|
end
|
669
501
|
|
670
502
|
|
671
503
|
it "should call error callback in the next turn even if promise is already rejected" do
|
672
|
-
@
|
504
|
+
@reactor.run {
|
673
505
|
@deferred.reject(:foo)
|
674
506
|
|
675
507
|
@promise.catch(proc {|reason|
|
676
508
|
@log << reason
|
677
509
|
})
|
678
510
|
|
679
|
-
@
|
680
|
-
@
|
511
|
+
@reactor.next_tick do
|
512
|
+
@reactor.stop
|
681
513
|
end
|
682
514
|
}
|
683
515
|
|
@@ -693,23 +525,19 @@ describe Libuv::Q do
|
|
693
525
|
describe 'when the promise is fulfilled' do
|
694
526
|
|
695
527
|
it "should call the callback" do
|
696
|
-
@
|
528
|
+
@reactor.run {
|
697
529
|
@promise.finally do
|
698
530
|
@log << :finally
|
699
531
|
end
|
700
532
|
|
701
533
|
@deferred.resolve(:foo)
|
702
|
-
|
703
|
-
@loop.next_tick do
|
704
|
-
@loop.stop
|
705
|
-
end
|
706
534
|
}
|
707
535
|
|
708
536
|
expect(@log).to eq([:finally])
|
709
537
|
end
|
710
538
|
|
711
539
|
it "should fulfill with the original value" do
|
712
|
-
@
|
540
|
+
@reactor.run {
|
713
541
|
@promise.finally(proc {
|
714
542
|
@log << :finally
|
715
543
|
:finally
|
@@ -719,19 +547,13 @@ describe Libuv::Q do
|
|
719
547
|
|
720
548
|
|
721
549
|
@deferred.resolve(:foo)
|
722
|
-
|
723
|
-
@loop.next_tick do
|
724
|
-
@loop.next_tick do
|
725
|
-
@loop.stop
|
726
|
-
end
|
727
|
-
end
|
728
550
|
}
|
729
551
|
|
730
552
|
expect(@log).to eq([:finally, :foo])
|
731
553
|
end
|
732
554
|
|
733
555
|
it "should fulfill with the original value (larger test)" do
|
734
|
-
@
|
556
|
+
@reactor.run {
|
735
557
|
@promise.then(proc { |result|
|
736
558
|
@log << result
|
737
559
|
result
|
@@ -754,25 +576,6 @@ describe Libuv::Q do
|
|
754
576
|
|
755
577
|
|
756
578
|
@deferred.resolve(:foo)
|
757
|
-
|
758
|
-
|
759
|
-
@loop.next_tick do
|
760
|
-
@loop.next_tick do
|
761
|
-
@loop.next_tick do
|
762
|
-
@loop.next_tick do
|
763
|
-
@loop.next_tick do
|
764
|
-
@loop.next_tick do
|
765
|
-
@loop.next_tick do
|
766
|
-
@loop.next_tick do
|
767
|
-
@loop.stop
|
768
|
-
end
|
769
|
-
end
|
770
|
-
end
|
771
|
-
end
|
772
|
-
end
|
773
|
-
end
|
774
|
-
end
|
775
|
-
end
|
776
579
|
}
|
777
580
|
|
778
581
|
expect(@log).to eq([:foo, :finally, :foo, :change, :finally, :change])
|
@@ -780,7 +583,7 @@ describe Libuv::Q do
|
|
780
583
|
|
781
584
|
describe "when the callback throws an exception" do
|
782
585
|
it "should reject with this new exception" do
|
783
|
-
@
|
586
|
+
@reactor.run {
|
784
587
|
@promise.finally(proc {
|
785
588
|
@log << :finally
|
786
589
|
raise 'error'
|
@@ -789,12 +592,6 @@ describe Libuv::Q do
|
|
789
592
|
end
|
790
593
|
|
791
594
|
@deferred.resolve(:foo)
|
792
|
-
|
793
|
-
@loop.next_tick do
|
794
|
-
@loop.next_tick do
|
795
|
-
@loop.stop
|
796
|
-
end
|
797
|
-
end
|
798
595
|
}
|
799
596
|
|
800
597
|
expect(@log).to eq([:finally, true])
|
@@ -803,8 +600,8 @@ describe Libuv::Q do
|
|
803
600
|
|
804
601
|
describe "when the callback returns a promise" do
|
805
602
|
it "should fulfill with the original reason after that promise resolves" do
|
806
|
-
@
|
807
|
-
deferred2 = @
|
603
|
+
@reactor.run {
|
604
|
+
deferred2 = @reactor.defer
|
808
605
|
|
809
606
|
@promise.finally(proc {
|
810
607
|
@log << :finally
|
@@ -815,17 +612,12 @@ describe Libuv::Q do
|
|
815
612
|
|
816
613
|
@deferred.resolve(:foo)
|
817
614
|
|
818
|
-
@
|
819
|
-
@
|
820
|
-
@
|
821
|
-
@
|
615
|
+
@reactor.next_tick do
|
616
|
+
@reactor.next_tick do
|
617
|
+
@reactor.next_tick do
|
618
|
+
@reactor.next_tick do
|
822
619
|
@log << :resolving
|
823
620
|
deferred2.resolve('working')
|
824
|
-
@loop.next_tick do
|
825
|
-
@loop.next_tick do
|
826
|
-
@loop.stop
|
827
|
-
end
|
828
|
-
end
|
829
621
|
end
|
830
622
|
end
|
831
623
|
end
|
@@ -837,8 +629,8 @@ describe Libuv::Q do
|
|
837
629
|
|
838
630
|
|
839
631
|
it "should reject with the new reason when it is rejected" do
|
840
|
-
@
|
841
|
-
deferred2 = @
|
632
|
+
@reactor.run {
|
633
|
+
deferred2 = @reactor.defer
|
842
634
|
|
843
635
|
@promise.finally(proc {
|
844
636
|
@log << :finally
|
@@ -849,17 +641,12 @@ describe Libuv::Q do
|
|
849
641
|
|
850
642
|
@deferred.resolve(:foo)
|
851
643
|
|
852
|
-
@
|
853
|
-
@
|
854
|
-
@
|
855
|
-
@
|
644
|
+
@reactor.next_tick do
|
645
|
+
@reactor.next_tick do
|
646
|
+
@reactor.next_tick do
|
647
|
+
@reactor.next_tick do
|
856
648
|
@log << :rejecting
|
857
649
|
deferred2.reject(:rejected)
|
858
|
-
@loop.next_tick do
|
859
|
-
@loop.next_tick do
|
860
|
-
@loop.stop
|
861
|
-
end
|
862
|
-
end
|
863
650
|
end
|
864
651
|
end
|
865
652
|
end
|
@@ -873,6 +660,104 @@ describe Libuv::Q do
|
|
873
660
|
end
|
874
661
|
|
875
662
|
end
|
663
|
+
|
664
|
+
|
665
|
+
describe 'value' do
|
666
|
+
it "should resolve a promise value as a future" do
|
667
|
+
@reactor.run {
|
668
|
+
@reactor.next_tick do
|
669
|
+
@deferred.resolve(:foo)
|
670
|
+
end
|
671
|
+
@log << @deferred.promise.value
|
672
|
+
}
|
673
|
+
|
674
|
+
expect(@log).to eq([:foo])
|
675
|
+
end
|
676
|
+
|
677
|
+
it "should reject a promise value as a future" do
|
678
|
+
@reactor.run {
|
679
|
+
@reactor.next_tick do
|
680
|
+
@deferred.reject(:foo)
|
681
|
+
end
|
682
|
+
|
683
|
+
begin
|
684
|
+
@deferred.promise.value
|
685
|
+
@log << 'should raise exception'
|
686
|
+
rescue => e
|
687
|
+
expect(e.class).to eq(CoroutineRejection)
|
688
|
+
@log << e.value
|
689
|
+
end
|
690
|
+
}
|
691
|
+
|
692
|
+
expect(@log).to eq([:foo])
|
693
|
+
end
|
694
|
+
|
695
|
+
it "should resolve a deferred value as a future" do
|
696
|
+
@reactor.run {
|
697
|
+
@reactor.next_tick do
|
698
|
+
@deferred.resolve(:foo)
|
699
|
+
end
|
700
|
+
@log << @deferred.value
|
701
|
+
}
|
702
|
+
|
703
|
+
expect(@log).to eq([:foo])
|
704
|
+
end
|
705
|
+
|
706
|
+
it "should reject a deferred value as a future" do
|
707
|
+
@reactor.run {
|
708
|
+
@reactor.next_tick do
|
709
|
+
@deferred.reject(:foo)
|
710
|
+
end
|
711
|
+
|
712
|
+
begin
|
713
|
+
@deferred.value
|
714
|
+
@log << 'should raise exception'
|
715
|
+
rescue => e
|
716
|
+
expect(e.class).to eq(CoroutineRejection)
|
717
|
+
@log << e.value
|
718
|
+
end
|
719
|
+
}
|
720
|
+
|
721
|
+
expect(@log).to eq([:foo])
|
722
|
+
end
|
723
|
+
|
724
|
+
it "should reject with message when rejection was a string" do
|
725
|
+
@reactor.run {
|
726
|
+
@reactor.next_tick do
|
727
|
+
@deferred.reject('foo')
|
728
|
+
end
|
729
|
+
|
730
|
+
begin
|
731
|
+
@deferred.value
|
732
|
+
@log << 'should raise exception'
|
733
|
+
rescue => e
|
734
|
+
expect(e.class).to eq(CoroutineRejection)
|
735
|
+
@log << e.message
|
736
|
+
@log << e.value
|
737
|
+
end
|
738
|
+
}
|
739
|
+
|
740
|
+
expect(@log).to eq(['foo', 'foo'])
|
741
|
+
end
|
742
|
+
|
743
|
+
it "should pass through exceptions without modification" do
|
744
|
+
@reactor.run {
|
745
|
+
@reactor.next_tick do
|
746
|
+
@deferred.reject(RuntimeError.new('fail'))
|
747
|
+
end
|
748
|
+
|
749
|
+
begin
|
750
|
+
@deferred.value
|
751
|
+
@log << 'should raise exception'
|
752
|
+
rescue => e
|
753
|
+
expect(e.class).to eq(RuntimeError)
|
754
|
+
@log << e.message
|
755
|
+
end
|
756
|
+
}
|
757
|
+
|
758
|
+
expect(@log).to eq(['fail'])
|
759
|
+
end
|
760
|
+
end
|
876
761
|
|
877
762
|
end
|
878
763
|
|
@@ -881,18 +766,14 @@ describe Libuv::Q do
|
|
881
766
|
describe 'reject' do
|
882
767
|
|
883
768
|
it "should package a string into a rejected promise" do
|
884
|
-
@
|
885
|
-
rejectedPromise = Libuv::Q.reject(@
|
769
|
+
@reactor.run {
|
770
|
+
rejectedPromise = Libuv::Q.reject(@reactor, 'not gonna happen')
|
886
771
|
|
887
772
|
@promise.then(@default_fail, proc {|reason|
|
888
773
|
@log << reason
|
889
774
|
})
|
890
775
|
|
891
776
|
@deferred.resolve(rejectedPromise)
|
892
|
-
|
893
|
-
@loop.next_tick do
|
894
|
-
@loop.stop
|
895
|
-
end
|
896
777
|
}
|
897
778
|
|
898
779
|
expect(@log).to eq(['not gonna happen'])
|
@@ -900,20 +781,14 @@ describe Libuv::Q do
|
|
900
781
|
|
901
782
|
|
902
783
|
it "should return a promise that forwards callbacks if the callbacks are missing" do
|
903
|
-
@
|
904
|
-
rejectedPromise = Libuv::Q.reject(@
|
784
|
+
@reactor.run {
|
785
|
+
rejectedPromise = Libuv::Q.reject(@reactor, 'not gonna happen')
|
905
786
|
|
906
787
|
@promise.then(@default_fail, proc {|reason|
|
907
788
|
@log << reason
|
908
789
|
})
|
909
790
|
|
910
791
|
@deferred.resolve(rejectedPromise.then())
|
911
|
-
|
912
|
-
@loop.next_tick do
|
913
|
-
@loop.next_tick do
|
914
|
-
@loop.stop
|
915
|
-
end
|
916
|
-
end
|
917
792
|
}
|
918
793
|
|
919
794
|
expect(@log).to eq(['not gonna happen'])
|
@@ -926,32 +801,28 @@ describe Libuv::Q do
|
|
926
801
|
describe 'all' do
|
927
802
|
|
928
803
|
it "should resolve all of nothing" do
|
929
|
-
@
|
930
|
-
Libuv::Q.all(@
|
804
|
+
@reactor.run {
|
805
|
+
Libuv::Q.all(@reactor).then nil, @default_fail do |result|
|
931
806
|
@log << result
|
932
807
|
end
|
933
|
-
|
934
|
-
@loop.next_tick do
|
935
|
-
@loop.stop
|
936
|
-
end
|
937
808
|
}
|
938
809
|
|
939
810
|
expect(@log).to eq([[]])
|
940
811
|
end
|
941
812
|
|
942
813
|
it "should take an array of promises and return a promise for an array of results" do
|
943
|
-
@
|
944
|
-
deferred1 = @
|
945
|
-
deferred2 = @
|
814
|
+
@reactor.run {
|
815
|
+
deferred1 = @reactor.defer
|
816
|
+
deferred2 = @reactor.defer
|
946
817
|
|
947
|
-
Libuv::Q.all(@
|
818
|
+
Libuv::Q.all(@reactor, @promise, deferred1.promise, deferred2.promise).then nil, @default_fail do |result|
|
948
819
|
@log = result
|
949
|
-
@
|
820
|
+
@reactor.stop
|
950
821
|
end
|
951
822
|
|
952
|
-
@
|
953
|
-
@
|
954
|
-
@
|
823
|
+
@reactor.work { @deferred.resolve(:foo) }
|
824
|
+
@reactor.work { deferred2.resolve(:baz) }
|
825
|
+
@reactor.work { deferred1.resolve(:bar) }
|
955
826
|
}
|
956
827
|
|
957
828
|
expect(@log).to eq([:foo, :bar, :baz])
|
@@ -959,17 +830,17 @@ describe Libuv::Q do
|
|
959
830
|
|
960
831
|
|
961
832
|
it "should reject the derived promise if at least one of the promises in the array is rejected" do
|
962
|
-
@
|
963
|
-
deferred1 = @
|
964
|
-
deferred2 = @
|
833
|
+
@reactor.run {
|
834
|
+
deferred1 = @reactor.defer
|
835
|
+
deferred2 = @reactor.defer
|
965
836
|
|
966
|
-
Libuv::Q.all(@
|
837
|
+
Libuv::Q.all(@reactor, @promise, deferred1.promise, deferred2.promise).then(@default_fail, proc {|reason|
|
967
838
|
@log << reason
|
968
|
-
@
|
839
|
+
@reactor.stop
|
969
840
|
})
|
970
841
|
|
971
|
-
@
|
972
|
-
@
|
842
|
+
@reactor.work { @deferred.resolve(:foo) }
|
843
|
+
@reactor.work { deferred2.reject(:baz) }
|
973
844
|
}
|
974
845
|
|
975
846
|
expect(@log).to eq([:baz])
|