libuv 2.0.12 → 3.0.0
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 +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])
|