ione 1.2.5 → 1.3.0.pre0
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 +5 -5
- data/lib/ione/future.rb +3 -5
- data/lib/ione/io/acceptor.rb +3 -1
- data/lib/ione/io/base_connection.rb +18 -4
- data/lib/ione/io/connection.rb +0 -1
- data/lib/ione/io/io_reactor.rb +28 -7
- data/lib/ione/io/ssl_connection.rb +0 -1
- data/lib/ione/version.rb +1 -1
- data/spec/integration/io_spec.rb +3 -3
- data/spec/integration/ssl_spec.rb +2 -7
- data/spec/ione/byte_buffer_spec.rb +38 -38
- data/spec/ione/future_spec.rb +65 -64
- data/spec/ione/heap_spec.rb +18 -18
- data/spec/ione/io/acceptor_spec.rb +5 -5
- data/spec/ione/io/connection_common.rb +15 -2
- data/spec/ione/io/io_reactor_spec.rb +197 -57
- data/spec/ione/io/ssl_acceptor_spec.rb +3 -3
- data/spec/ione/io/ssl_connection_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -4
- data/spec/support/fake_server.rb +0 -1
- data/spec/support/server_helper.rb +15 -0
- metadata +20 -16
@@ -7,7 +7,11 @@ module Ione
|
|
7
7
|
module Io
|
8
8
|
describe IoReactor do
|
9
9
|
let :reactor do
|
10
|
-
described_class.new(
|
10
|
+
described_class.new(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
let :options do
|
14
|
+
{selector: selector, clock: clock, drain_timeout: 3}
|
11
15
|
end
|
12
16
|
|
13
17
|
let! :selector do
|
@@ -37,7 +41,7 @@ module Ione
|
|
37
41
|
end
|
38
42
|
|
39
43
|
after do
|
40
|
-
reactor.stop if reactor.running?
|
44
|
+
reactor.stop.value if reactor.running?
|
41
45
|
end
|
42
46
|
end
|
43
47
|
|
@@ -77,15 +81,16 @@ module Ione
|
|
77
81
|
end
|
78
82
|
reactor.start.value
|
79
83
|
stopped_future = reactor.stop
|
80
|
-
restarted_future = reactor.start
|
81
84
|
sequence = []
|
82
85
|
stopped_future.on_complete { sequence << :stopped }
|
86
|
+
restarted_future = reactor.start
|
83
87
|
restarted_future.on_complete { sequence << :restarted }
|
84
88
|
barrier.push(nil)
|
85
89
|
stopped_future.value
|
86
90
|
restarted_future.value
|
91
|
+
await { sequence.size >= 2 }
|
87
92
|
begin
|
88
|
-
sequence.should
|
93
|
+
sequence.should == [:stopped, :restarted]
|
89
94
|
ensure
|
90
95
|
reactor.stop
|
91
96
|
barrier.push(nil) while reactor.running?
|
@@ -93,7 +98,6 @@ module Ione
|
|
93
98
|
end
|
94
99
|
|
95
100
|
it 'restarts the reactor even when restarted before a failed stop' do
|
96
|
-
pending 'This test is broken in JRuby' if RUBY_ENGINE == 'jruby'
|
97
101
|
barrier = Queue.new
|
98
102
|
selector.handler do
|
99
103
|
if barrier.pop == :fail
|
@@ -112,6 +116,7 @@ module Ione
|
|
112
116
|
barrier.push(:fail)
|
113
117
|
stopped_future.value rescue nil
|
114
118
|
restarted_future.value
|
119
|
+
await { crashed && restarted }
|
115
120
|
begin
|
116
121
|
crashed.should be_true
|
117
122
|
restarted.should be_true
|
@@ -136,6 +141,8 @@ module Ione
|
|
136
141
|
|
137
142
|
context 'when already started' do
|
138
143
|
it 'is not started again' do
|
144
|
+
calls = 0
|
145
|
+
lock = Mutex.new
|
139
146
|
ticks = Queue.new
|
140
147
|
barrier = Queue.new
|
141
148
|
selector.handler do
|
@@ -176,7 +183,7 @@ module Ione
|
|
176
183
|
reactor.should_not be_running
|
177
184
|
end
|
178
185
|
|
179
|
-
it 'keeps running until stop
|
186
|
+
it 'keeps running until stop completes' do
|
180
187
|
running_barrier = Queue.new
|
181
188
|
stop_barrier = Queue.new
|
182
189
|
selector.handler do
|
@@ -191,11 +198,125 @@ module Ione
|
|
191
198
|
stop_barrier.push(nil) until future.completed?
|
192
199
|
end
|
193
200
|
|
194
|
-
it '
|
201
|
+
it 'unblocks the reactor' do
|
202
|
+
running_barrier = Queue.new
|
203
|
+
selector.handler do |readables, writables, _, _|
|
204
|
+
running_barrier.push(nil)
|
205
|
+
IO.select(readables, writables, nil, 5)
|
206
|
+
end
|
195
207
|
reactor.start.value
|
196
|
-
|
197
|
-
reactor.stop
|
198
|
-
|
208
|
+
running_barrier.pop
|
209
|
+
stopped_future = reactor.stop
|
210
|
+
await { stopped_future.completed? }
|
211
|
+
stopped_future.should be_completed
|
212
|
+
stopped_future.value
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'drains all sockets' do
|
216
|
+
reactor.start.value
|
217
|
+
TCPServer.open(0) do |server|
|
218
|
+
lazy_socket = Thread.start { server.accept }
|
219
|
+
connection = reactor.connect(server.addr[3], server.addr[1], 5).value
|
220
|
+
writable = false
|
221
|
+
connection.stub(:stub_writable?) { writable }
|
222
|
+
class <<connection; alias_method :writable?, :stub_writable?; end
|
223
|
+
connection.write('12345678')
|
224
|
+
release_barrier = barrier = Queue.new
|
225
|
+
selector.handler do |readables, writables, _, _|
|
226
|
+
barrier.pop
|
227
|
+
[[], writables, []]
|
228
|
+
end
|
229
|
+
await { barrier.num_waiting > 0 }
|
230
|
+
barrier = []
|
231
|
+
release_barrier.push(nil)
|
232
|
+
connection.stub(:flush) do
|
233
|
+
writable = false
|
234
|
+
end
|
235
|
+
writable = true
|
236
|
+
reactor.stop.value
|
237
|
+
connection.should have_received(:flush)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'waits on drain to complete upto the specified drain timeout' do
|
242
|
+
time = time_increment = next_increment = 0
|
243
|
+
mutex = Mutex.new
|
244
|
+
clock.stub(:now) { mutex.synchronize { time } }
|
245
|
+
selector.handler do |_, writables, _, _|
|
246
|
+
mutex.synchronize do
|
247
|
+
time += time_increment
|
248
|
+
time_increment = next_increment
|
249
|
+
end
|
250
|
+
[[], writables, []]
|
251
|
+
end
|
252
|
+
reactor.start.value
|
253
|
+
TCPServer.open(0) do |server|
|
254
|
+
lazy_socket = Thread.start { server.accept }
|
255
|
+
connection = reactor.connect(server.addr[3], server.addr[1], 5).value
|
256
|
+
stopped_future = nil
|
257
|
+
mutex.synchronize do
|
258
|
+
connection.stub(:writable?).and_return(true)
|
259
|
+
connection.stub(:flush)
|
260
|
+
next_increment = 1
|
261
|
+
stopped_future = reactor.stop
|
262
|
+
end
|
263
|
+
expect { stopped_future.value }.to raise_error(ReactorError, /timeout/)
|
264
|
+
(time).should eq(3)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'waits on drain to complete upto five seconds by default' do
|
269
|
+
with_server do |host, port|
|
270
|
+
options.delete(:drain_timeout)
|
271
|
+
time = time_increment = next_increment = 0
|
272
|
+
mutex = Mutex.new
|
273
|
+
clock.stub(:now) { mutex.synchronize { time } }
|
274
|
+
selector.handler do |_, writables, _, _|
|
275
|
+
mutex.synchronize do
|
276
|
+
time += time_increment
|
277
|
+
time_increment = next_increment
|
278
|
+
end
|
279
|
+
[[], writables, []]
|
280
|
+
end
|
281
|
+
reactor.start.value
|
282
|
+
connection = reactor.connect(host, port, 5).value
|
283
|
+
stopped_future = nil
|
284
|
+
mutex.synchronize do
|
285
|
+
connection.stub(:writable?).and_return(true)
|
286
|
+
connection.stub(:flush)
|
287
|
+
next_increment = 1
|
288
|
+
stopped_future = reactor.stop
|
289
|
+
end
|
290
|
+
expect { stopped_future.value }.to raise_error(ReactorError, /timeout/)
|
291
|
+
time.should eq(5)
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'closes all sockets' do
|
296
|
+
with_server do |host, port|
|
297
|
+
reactor.start.value
|
298
|
+
connection = reactor.connect(host, port, 5).value
|
299
|
+
reactor.stop.value
|
300
|
+
connection.should be_closed
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
it 'closes all sockets even if drain fails' do
|
305
|
+
with_server do |host, port|
|
306
|
+
reactor.start.value
|
307
|
+
connection = reactor.connect(host, port, 5).value
|
308
|
+
Thread.pass
|
309
|
+
writable = false
|
310
|
+
connection.stub(:stub_writable?) { writable }
|
311
|
+
class <<connection; alias_method :writable?, :stub_writable?; end
|
312
|
+
connection.write('12345678')
|
313
|
+
Thread.pass
|
314
|
+
connection.stub(:flush).and_raise(StandardError, 'Boork')
|
315
|
+
writable = true
|
316
|
+
f = reactor.stop
|
317
|
+
expect { f.value }.to raise_error(StandardError, 'Boork')
|
318
|
+
connection.should be_closed
|
319
|
+
end
|
199
320
|
end
|
200
321
|
|
201
322
|
it 'cancels all active timers' do
|
@@ -237,7 +358,7 @@ module Ione
|
|
237
358
|
reactor.on_error { |e| error = e }
|
238
359
|
reactor.start
|
239
360
|
await { error }
|
240
|
-
error.message.should
|
361
|
+
error.message.should == 'Blurgh'
|
241
362
|
end
|
242
363
|
|
243
364
|
it 'calls the listener immediately when the reactor has already crashed' do
|
@@ -266,17 +387,18 @@ module Ione
|
|
266
387
|
reactor.on_error { calls << :post_started }
|
267
388
|
barrier.push(nil)
|
268
389
|
await { !reactor.running? }
|
390
|
+
await { calls.size >= 2 }
|
269
391
|
reactor.on_error { calls << :pre_restarted }
|
270
|
-
calls.should
|
392
|
+
calls.should == [
|
271
393
|
:pre_started,
|
272
394
|
:post_started,
|
273
395
|
:pre_restarted,
|
274
|
-
]
|
396
|
+
]
|
275
397
|
reactor.start
|
276
398
|
reactor.on_error { calls << :post_restarted }
|
277
399
|
barrier.push(nil)
|
278
400
|
await { !reactor.running? }
|
279
|
-
calls.should
|
401
|
+
calls.should == [
|
280
402
|
:pre_started,
|
281
403
|
:post_started,
|
282
404
|
:pre_restarted,
|
@@ -284,7 +406,7 @@ module Ione
|
|
284
406
|
:post_started,
|
285
407
|
:pre_restarted,
|
286
408
|
:post_restarted,
|
287
|
-
]
|
409
|
+
]
|
288
410
|
end
|
289
411
|
end
|
290
412
|
|
@@ -292,70 +414,90 @@ module Ione
|
|
292
414
|
include_context 'running_reactor'
|
293
415
|
|
294
416
|
it 'calls the given block with a connection' do
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
417
|
+
with_server do |host, port|
|
418
|
+
connection = nil
|
419
|
+
reactor.start.value
|
420
|
+
reactor.connect(host, port, 5) { |c| connection = c }.value
|
421
|
+
connection.should_not be_nil
|
422
|
+
end
|
299
423
|
end
|
300
424
|
|
301
425
|
it 'returns a future that resolves to what the given block returns' do
|
302
|
-
|
303
|
-
|
304
|
-
|
426
|
+
with_server do |host, port|
|
427
|
+
reactor.start.value
|
428
|
+
x = reactor.connect(host, port, 5) { :foo }.value
|
429
|
+
x.should == :foo
|
430
|
+
end
|
305
431
|
end
|
306
432
|
|
307
433
|
it 'defaults to 5 as the connection timeout' do
|
308
|
-
|
309
|
-
|
310
|
-
|
434
|
+
with_server do |host, port|
|
435
|
+
reactor.start.value
|
436
|
+
connection = reactor.connect(host, port).value
|
437
|
+
connection.connection_timeout.should == 5
|
438
|
+
end
|
311
439
|
end
|
312
440
|
|
313
441
|
it 'takes the connection timeout from the :timeout option' do
|
314
|
-
|
315
|
-
|
316
|
-
|
442
|
+
with_server do |host, port|
|
443
|
+
reactor.start.value
|
444
|
+
connection = reactor.connect(host, port, timeout: 9).value
|
445
|
+
connection.connection_timeout.should == 9
|
446
|
+
end
|
317
447
|
end
|
318
448
|
|
319
449
|
it 'returns the connection when no block is given' do
|
320
|
-
|
321
|
-
|
450
|
+
with_server do |host, port|
|
451
|
+
reactor.start.value
|
452
|
+
reactor.connect(host, port, 5).value.should be_a(Connection)
|
453
|
+
end
|
322
454
|
end
|
323
455
|
|
324
456
|
it 'creates a connection and passes it to the selector as a readable' do
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
457
|
+
with_server do |host, port|
|
458
|
+
reactor.start.value
|
459
|
+
connection = reactor.connect(host, port, 5).value
|
460
|
+
await { selector.last_arguments[0].length > 1 }
|
461
|
+
selector.last_arguments[0].should include(connection)
|
462
|
+
end
|
329
463
|
end
|
330
464
|
|
331
465
|
it 'upgrades the connection to SSL' do
|
332
|
-
|
333
|
-
|
334
|
-
|
466
|
+
with_server do |host, port|
|
467
|
+
reactor.start.value
|
468
|
+
connection = reactor.connect(host, port, ssl: true).value
|
469
|
+
connection.should be_a(SslConnection)
|
470
|
+
end
|
335
471
|
end
|
336
472
|
|
337
473
|
it 'passes an SSL context to the SSL connection' do
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
474
|
+
with_server do |host, port|
|
475
|
+
ssl_context = double(:ssl_context)
|
476
|
+
reactor.start.value
|
477
|
+
f = reactor.connect(host, port, ssl: ssl_context)
|
478
|
+
expect { f.value }.to raise_error
|
479
|
+
end
|
342
480
|
end
|
343
481
|
|
344
482
|
context 'when called before the reactor is started' do
|
345
483
|
it 'waits for the reactor to start' do
|
346
|
-
|
347
|
-
|
348
|
-
|
484
|
+
with_server do |host, port|
|
485
|
+
f = reactor.connect(host, port)
|
486
|
+
reactor.start.value
|
487
|
+
f.value
|
488
|
+
end
|
349
489
|
end
|
350
490
|
end
|
351
491
|
|
352
492
|
context 'when called after the reactor has stopped' do
|
353
493
|
it 'waits for the reactor to be restarted' do
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
494
|
+
with_server do |host, port|
|
495
|
+
reactor.start.value
|
496
|
+
reactor.stop.value
|
497
|
+
f = reactor.connect(host, port)
|
498
|
+
reactor.start.value
|
499
|
+
f.value
|
500
|
+
end
|
359
501
|
end
|
360
502
|
end
|
361
503
|
end
|
@@ -377,19 +519,19 @@ module Ione
|
|
377
519
|
it 'returns a future that resolves to what the given block returns' do
|
378
520
|
reactor.start.value
|
379
521
|
x = reactor.bind(ENV['SERVER_HOST'], port, 5) { |acceptor| :foo }.value
|
380
|
-
x.should
|
522
|
+
x.should == :foo
|
381
523
|
end
|
382
524
|
|
383
525
|
it 'defaults to a backlog of 5' do
|
384
526
|
reactor.start.value
|
385
527
|
acceptor = reactor.bind(ENV['SERVER_HOST'], port).value
|
386
|
-
acceptor.backlog.should
|
528
|
+
acceptor.backlog.should == 5
|
387
529
|
end
|
388
530
|
|
389
531
|
it 'takes the backlog from the :backlog option' do
|
390
532
|
reactor.start.value
|
391
533
|
acceptor = reactor.bind(ENV['SERVER_HOST'], port, backlog: 9).value
|
392
|
-
acceptor.backlog.should
|
534
|
+
acceptor.backlog.should == 9
|
393
535
|
end
|
394
536
|
|
395
537
|
it 'returns the acceptor when no block is given' do
|
@@ -442,12 +584,10 @@ module Ione
|
|
442
584
|
end
|
443
585
|
|
444
586
|
it 'returns a future that is resolved after the specified duration' do
|
445
|
-
start = Time.now
|
446
587
|
clock.stub(:now).and_return(1)
|
447
|
-
f = reactor.schedule_timer(
|
448
|
-
clock.stub(:now).and_return(
|
588
|
+
f = reactor.schedule_timer(0.1)
|
589
|
+
clock.stub(:now).and_return(1.1)
|
449
590
|
await { f.resolved? }
|
450
|
-
expect(Time.now - start).to be < 1
|
451
591
|
end
|
452
592
|
end
|
453
593
|
|
@@ -760,4 +900,4 @@ module IoReactorSpec
|
|
760
900
|
@body.call(*args)
|
761
901
|
end
|
762
902
|
end
|
763
|
-
end
|
903
|
+
end
|
@@ -7,7 +7,7 @@ module Ione
|
|
7
7
|
module Io
|
8
8
|
describe SslAcceptor do
|
9
9
|
let :acceptor do
|
10
|
-
described_class.new('example.com', 4321, 3, unblocker, reactor, ssl_context, socket_impl, ssl_socket_impl)
|
10
|
+
described_class.new('example.com', 4321, backlog = 3, unblocker, reactor, ssl_context, socket_impl, ssl_socket_impl)
|
11
11
|
end
|
12
12
|
|
13
13
|
let :unblocker do
|
@@ -80,8 +80,8 @@ module Ione
|
|
80
80
|
acceptor.bind
|
81
81
|
acceptor.read
|
82
82
|
accepted_handlers.should have(1).item
|
83
|
-
accepted_handlers.first.host.should
|
84
|
-
accepted_handlers.first.port.should
|
83
|
+
accepted_handlers.first.host.should == 'example.com'
|
84
|
+
accepted_handlers.first.port.should == 3333
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'returns the raw socket from #to_io' do
|
@@ -124,7 +124,7 @@ module Ione
|
|
124
124
|
end
|
125
125
|
handler.connect
|
126
126
|
handler.read
|
127
|
-
read_sizes.drop(1).should
|
127
|
+
read_sizes.drop(1).should == [read_sizes.first] * 3
|
128
128
|
end
|
129
129
|
else
|
130
130
|
it 'reads and initial chunk of data' do
|
@@ -134,7 +134,7 @@ module Ione
|
|
134
134
|
ssl_socket.stub(:read_nonblock).and_return('fooo')
|
135
135
|
handler.connect
|
136
136
|
handler.read
|
137
|
-
data.should
|
137
|
+
data.should == ['fooo']
|
138
138
|
end
|
139
139
|
|
140
140
|
it 'reads once, and then again with the value of #pending, until #pending returns zero' do
|
@@ -149,7 +149,7 @@ module Ione
|
|
149
149
|
end
|
150
150
|
handler.connect
|
151
151
|
handler.read
|
152
|
-
read_sizes.drop(1).should
|
152
|
+
read_sizes.drop(1).should == [3, 2, 1]
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
data/spec/spec_helper.rb
CHANGED
@@ -6,6 +6,7 @@ require 'bundler/setup'
|
|
6
6
|
|
7
7
|
require 'support/fake_server'
|
8
8
|
require 'support/await_helper'
|
9
|
+
require 'support/server_helper'
|
9
10
|
|
10
11
|
unless ENV['COVERAGE'] == 'no' || RUBY_ENGINE == 'rbx'
|
11
12
|
require 'coveralls'
|
@@ -23,8 +24,4 @@ unless ENV['COVERAGE'] == 'no' || RUBY_ENGINE == 'rbx'
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
|
-
RSpec.configure do |config|
|
27
|
-
config.warnings = true
|
28
|
-
end
|
29
|
-
|
30
27
|
require 'ione'
|
data/spec/support/fake_server.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module ServerHelper
|
4
|
+
def with_server
|
5
|
+
TCPServer.open(0) do |server|
|
6
|
+
thread = Thread.start { server.accept }
|
7
|
+
yield server.addr[3], server.addr[1]
|
8
|
+
thread.value
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
RSpec.configure do |c|
|
14
|
+
c.include(ServerHelper)
|
15
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ione
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0.pre0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Theo Hultberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Reactive programming framework for Ruby, painless evented IO, futures
|
14
14
|
and an efficient byte buffer
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- spec/spec_helper.rb
|
51
51
|
- spec/support/await_helper.rb
|
52
52
|
- spec/support/fake_server.rb
|
53
|
+
- spec/support/server_helper.rb
|
53
54
|
homepage: http://github.com/iconara/ione
|
54
55
|
licenses:
|
55
56
|
- Apache License 2.0
|
@@ -65,28 +66,31 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
65
66
|
version: 1.9.3
|
66
67
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
68
|
requirements:
|
68
|
-
- - "
|
69
|
+
- - ">"
|
69
70
|
- !ruby/object:Gem::Version
|
70
|
-
version:
|
71
|
+
version: 1.3.1
|
71
72
|
requirements: []
|
72
|
-
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.2.2
|
73
75
|
signing_key:
|
74
76
|
specification_version: 4
|
75
77
|
summary: Reactive programming framework for Ruby
|
76
78
|
test_files:
|
77
|
-
- spec/
|
78
|
-
- spec/
|
79
|
-
- spec/ione/
|
80
|
-
- spec/ione/
|
79
|
+
- spec/integration/io_spec.rb
|
80
|
+
- spec/integration/ssl_spec.rb
|
81
|
+
- spec/ione/byte_buffer_spec.rb
|
82
|
+
- spec/ione/future_spec.rb
|
83
|
+
- spec/ione/heap_spec.rb
|
81
84
|
- spec/ione/io/acceptor_spec.rb
|
85
|
+
- spec/ione/io/connection_common.rb
|
82
86
|
- spec/ione/io/connection_spec.rb
|
83
|
-
- spec/ione/io/ssl_connection_spec.rb
|
84
87
|
- spec/ione/io/io_reactor_spec.rb
|
85
|
-
- spec/ione/io/
|
86
|
-
- spec/ione/
|
87
|
-
- spec/ione/
|
88
|
-
- spec/ione/
|
89
|
-
- spec/
|
90
|
-
- spec/integration/io_spec.rb
|
88
|
+
- spec/ione/io/server_connection_spec.rb
|
89
|
+
- spec/ione/io/ssl_acceptor_spec.rb
|
90
|
+
- spec/ione/io/ssl_connection_spec.rb
|
91
|
+
- spec/ione/io/ssl_server_connection_spec.rb
|
92
|
+
- spec/spec_helper.rb
|
91
93
|
- spec/support/await_helper.rb
|
92
94
|
- spec/support/fake_server.rb
|
95
|
+
- spec/support/server_helper.rb
|
96
|
+
has_rdoc:
|