eventmachine-le 1.1.0.beta.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.
- data/.gitignore +21 -0
- data/.yardopts +7 -0
- data/GNU +281 -0
- data/LICENSE +60 -0
- data/README.md +80 -0
- data/Rakefile +19 -0
- data/eventmachine-le.gemspec +42 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +841 -0
- data/ext/ed.cpp +1995 -0
- data/ext/ed.h +424 -0
- data/ext/em.cpp +2377 -0
- data/ext/em.h +243 -0
- data/ext/eventmachine.h +126 -0
- data/ext/extconf.rb +166 -0
- data/ext/fastfilereader/extconf.rb +94 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/kb.cpp +79 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +347 -0
- data/ext/project.h +155 -0
- data/ext/rubymain.cpp +1269 -0
- data/ext/ssl.cpp +468 -0
- data/ext/ssl.h +94 -0
- data/lib/em/buftok.rb +110 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +64 -0
- data/lib/em/completion.rb +304 -0
- data/lib/em/connection.rb +728 -0
- data/lib/em/deferrable.rb +210 -0
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/file_watch.rb +73 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/iterator.rb +313 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/pool.rb +151 -0
- data/lib/em/process_watch.rb +45 -0
- data/lib/em/processes.rb +123 -0
- data/lib/em/protocols.rb +37 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +279 -0
- data/lib/em/protocols/httpclient2.rb +600 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +29 -0
- data/lib/em/protocols/linetext2.rb +161 -0
- data/lib/em/protocols/memcache.rb +331 -0
- data/lib/em/protocols/object_protocol.rb +46 -0
- data/lib/em/protocols/postgres3.rb +246 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +365 -0
- data/lib/em/protocols/smtpserver.rb +663 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +202 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/queue.rb +71 -0
- data/lib/em/resolver.rb +195 -0
- data/lib/em/spawnable.rb +84 -0
- data/lib/em/streamer.rb +118 -0
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +106 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine-le.rb +10 -0
- data/lib/eventmachine.rb +1548 -0
- data/rakelib/cpp.rake_example +77 -0
- data/rakelib/package.rake +98 -0
- data/rakelib/test.rake +8 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/em_test_helper.rb +143 -0
- data/tests/test_attach.rb +148 -0
- data/tests/test_basic.rb +294 -0
- data/tests/test_channel.rb +62 -0
- data/tests/test_completion.rb +177 -0
- data/tests/test_connection_count.rb +33 -0
- data/tests/test_defer.rb +18 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +134 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +28 -0
- data/tests/test_file_watch.rb +65 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_get_sock_opt.rb +37 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +190 -0
- data/tests/test_httpclient2.rb +128 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_ipv4.rb +125 -0
- data/tests/test_ipv6.rb +131 -0
- data/tests/test_iterator.rb +110 -0
- data/tests/test_kb.rb +34 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +138 -0
- data/tests/test_ltp2.rb +288 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +78 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +196 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +133 -0
- data/tests/test_proxy_connection.rb +168 -0
- data/tests/test_pure.rb +88 -0
- data/tests/test_queue.rb +50 -0
- data/tests/test_resolver.rb +55 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +47 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +33 -0
- data/tests/test_set_sock_opt.rb +41 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +55 -0
- data/tests/test_smtpserver.rb +120 -0
- data/tests/test_spawn.rb +293 -0
- data/tests/test_ssl_args.rb +78 -0
- data/tests/test_ssl_methods.rb +48 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_threaded_resource.rb +55 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +180 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_udp46.rb +53 -0
- data/tests/test_unbind_reason.rb +48 -0
- metadata +390 -0
data/tests/test_basic.rb
ADDED
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
require 'socket'
|
|
3
|
+
|
|
4
|
+
class TestBasic < Test::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
@port = next_port
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def test_connection_class_cache
|
|
10
|
+
mod = Module.new
|
|
11
|
+
a, b = nil, nil
|
|
12
|
+
EM.run {
|
|
13
|
+
EM.start_server '127.0.0.1', @port, mod
|
|
14
|
+
a = EM.connect '127.0.0.1', @port, mod
|
|
15
|
+
b = EM.connect '127.0.0.1', @port, mod
|
|
16
|
+
EM.stop
|
|
17
|
+
}
|
|
18
|
+
assert_equal a.class, b.class
|
|
19
|
+
assert_kind_of EM::Connection, a
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
#-------------------------------------
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_em
|
|
26
|
+
assert_nothing_raised do
|
|
27
|
+
EM.run {
|
|
28
|
+
setup_timeout
|
|
29
|
+
EM.add_timer 0 do
|
|
30
|
+
EM.stop
|
|
31
|
+
end
|
|
32
|
+
}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#-------------------------------------
|
|
37
|
+
|
|
38
|
+
def test_timer
|
|
39
|
+
assert_nothing_raised do
|
|
40
|
+
EM.run {
|
|
41
|
+
setup_timeout
|
|
42
|
+
n = 0
|
|
43
|
+
EM.add_periodic_timer(0.1) {
|
|
44
|
+
n += 1
|
|
45
|
+
EM.stop if n == 2
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#-------------------------------------
|
|
52
|
+
|
|
53
|
+
# This test once threw an already-running exception.
|
|
54
|
+
module Trivial
|
|
55
|
+
def post_init
|
|
56
|
+
EM.stop
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_server
|
|
61
|
+
assert_nothing_raised do
|
|
62
|
+
EM.run {
|
|
63
|
+
setup_timeout
|
|
64
|
+
EM.start_server "127.0.0.1", @port, Trivial
|
|
65
|
+
EM.connect "127.0.0.1", @port
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#--------------------------------------
|
|
71
|
+
|
|
72
|
+
# EM#run_block starts the reactor loop, runs the supplied block, and then STOPS
|
|
73
|
+
# the loop automatically. Contrast with EM#run, which keeps running the reactor
|
|
74
|
+
# even after the supplied block completes.
|
|
75
|
+
def test_run_block
|
|
76
|
+
assert !EM.reactor_running?
|
|
77
|
+
a = nil
|
|
78
|
+
EM.run_block { a = "Worked" }
|
|
79
|
+
assert a
|
|
80
|
+
assert !EM.reactor_running?
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class UnbindError < EM::Connection
|
|
84
|
+
ERR = Class.new(StandardError)
|
|
85
|
+
def initialize *args
|
|
86
|
+
super
|
|
87
|
+
end
|
|
88
|
+
def connection_completed
|
|
89
|
+
close_connection_after_writing
|
|
90
|
+
end
|
|
91
|
+
def unbind
|
|
92
|
+
raise ERR
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_unbind_error
|
|
97
|
+
assert_raises( UnbindError::ERR ) {
|
|
98
|
+
EM.run {
|
|
99
|
+
EM.start_server "127.0.0.1", @port
|
|
100
|
+
EM.connect "127.0.0.1", @port, UnbindError
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
module BrsTestSrv
|
|
106
|
+
def receive_data data
|
|
107
|
+
$received << data
|
|
108
|
+
end
|
|
109
|
+
def unbind
|
|
110
|
+
EM.stop
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
module BrsTestCli
|
|
114
|
+
def post_init
|
|
115
|
+
send_data $sent
|
|
116
|
+
close_connection_after_writing
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# From ticket #50
|
|
121
|
+
def test_byte_range_send
|
|
122
|
+
$received = ''
|
|
123
|
+
$sent = (0..255).to_a.pack('C*')
|
|
124
|
+
EM::run {
|
|
125
|
+
EM::start_server "127.0.0.1", @port, BrsTestSrv
|
|
126
|
+
EM::connect "127.0.0.1", @port, BrsTestCli
|
|
127
|
+
|
|
128
|
+
setup_timeout
|
|
129
|
+
}
|
|
130
|
+
assert_equal($sent, $received)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_bind_connect
|
|
134
|
+
local_ip = UDPSocket.open {|s| s.connect('google.com', 80); s.addr.last }
|
|
135
|
+
|
|
136
|
+
bind_port = next_port
|
|
137
|
+
|
|
138
|
+
port, ip = nil
|
|
139
|
+
bound_server = Module.new do
|
|
140
|
+
define_method :post_init do
|
|
141
|
+
begin
|
|
142
|
+
port, ip = Socket.unpack_sockaddr_in(get_peername)
|
|
143
|
+
ensure
|
|
144
|
+
EM.stop
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
EM.run do
|
|
150
|
+
setup_timeout
|
|
151
|
+
EM.start_server "127.0.0.1", @port, bound_server
|
|
152
|
+
EM.bind_connect local_ip, bind_port, "127.0.0.1", @port
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
assert_equal bind_port, port
|
|
156
|
+
assert_equal local_ip, ip
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def test_reactor_thread?
|
|
160
|
+
assert !EM.reactor_thread?
|
|
161
|
+
EM.run { assert EM.reactor_thread?; EM.stop }
|
|
162
|
+
assert !EM.reactor_thread?
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def test_schedule_on_reactor_thread
|
|
166
|
+
x = false
|
|
167
|
+
EM.run do
|
|
168
|
+
EM.schedule { x = true }
|
|
169
|
+
EM.stop
|
|
170
|
+
end
|
|
171
|
+
assert x
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def test_schedule_from_thread
|
|
175
|
+
x = false
|
|
176
|
+
EM.run do
|
|
177
|
+
Thread.new { EM.schedule { x = true; EM.stop } }.join
|
|
178
|
+
end
|
|
179
|
+
assert x
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
if EM.respond_to? :set_heartbeat_interval
|
|
183
|
+
def test_set_heartbeat_interval
|
|
184
|
+
interval = 0.5
|
|
185
|
+
EM.run {
|
|
186
|
+
EM.set_heartbeat_interval interval
|
|
187
|
+
$interval = EM.get_heartbeat_interval
|
|
188
|
+
EM.stop
|
|
189
|
+
}
|
|
190
|
+
assert_equal(interval, $interval)
|
|
191
|
+
end
|
|
192
|
+
else
|
|
193
|
+
warn "EM.set_heartbeat_interval not implemented, skipping a test in #{__FILE__}"
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
module PostInitRaiser
|
|
197
|
+
ERR = Class.new(StandardError)
|
|
198
|
+
def post_init
|
|
199
|
+
raise ERR
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def test_bubble_errors_from_post_init
|
|
204
|
+
assert_raises(PostInitRaiser::ERR) do
|
|
205
|
+
EM.run do
|
|
206
|
+
EM.start_server "127.0.0.1", @port
|
|
207
|
+
EM.connect "127.0.0.1", @port, PostInitRaiser
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
module InitializeRaiser
|
|
213
|
+
ERR = Class.new(StandardError)
|
|
214
|
+
def initialize
|
|
215
|
+
raise ERR
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def test_bubble_errors_from_initialize
|
|
220
|
+
assert_raises(InitializeRaiser::ERR) do
|
|
221
|
+
EM.run do
|
|
222
|
+
EM.start_server "127.0.0.1", @port
|
|
223
|
+
EM.connect "127.0.0.1", @port, InitializeRaiser
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def test_schedule_close
|
|
229
|
+
localhost, port = '127.0.0.1', 9000
|
|
230
|
+
timer_ran = false
|
|
231
|
+
num_close_scheduled = nil
|
|
232
|
+
EM.run do
|
|
233
|
+
assert_equal 0, EM.num_close_scheduled
|
|
234
|
+
EM.add_timer(1) { timer_ran = true; EM.stop }
|
|
235
|
+
EM.start_server localhost, port do |s|
|
|
236
|
+
s.close_connection
|
|
237
|
+
num_close_scheduled = EM.num_close_scheduled
|
|
238
|
+
end
|
|
239
|
+
EM.connect localhost, port do |c|
|
|
240
|
+
def c.unbind
|
|
241
|
+
EM.stop
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
assert !timer_ran
|
|
246
|
+
assert_equal 1, num_close_scheduled
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def test_fork_safe
|
|
250
|
+
return unless cpid = fork { exit! } rescue false
|
|
251
|
+
|
|
252
|
+
read, write = IO.pipe
|
|
253
|
+
EM.run do
|
|
254
|
+
cpid = fork do
|
|
255
|
+
write.puts "forked"
|
|
256
|
+
EM.run do
|
|
257
|
+
EM.next_tick do
|
|
258
|
+
write.puts "EM ran"
|
|
259
|
+
exit!
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
EM.stop
|
|
264
|
+
end
|
|
265
|
+
Process.waitall
|
|
266
|
+
assert_equal "forked\n", read.readline
|
|
267
|
+
assert_equal "EM ran\n", read.readline
|
|
268
|
+
ensure
|
|
269
|
+
read.close rescue nil
|
|
270
|
+
write.close rescue nil
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def test_error_handler_idempotent # issue 185
|
|
274
|
+
errors = []
|
|
275
|
+
ticks = []
|
|
276
|
+
EM.error_handler do |e|
|
|
277
|
+
errors << e
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
EM.run do
|
|
281
|
+
EM.next_tick do
|
|
282
|
+
ticks << :first
|
|
283
|
+
raise
|
|
284
|
+
end
|
|
285
|
+
EM.next_tick do
|
|
286
|
+
ticks << :second
|
|
287
|
+
end
|
|
288
|
+
EM.add_timer(0.001) { EM.stop }
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
assert_equal 1, errors.size
|
|
292
|
+
assert_equal [:first, :second], ticks
|
|
293
|
+
end
|
|
294
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestEMChannel < Test::Unit::TestCase
|
|
4
|
+
def test_channel_subscribe
|
|
5
|
+
s = 0
|
|
6
|
+
EM.run do
|
|
7
|
+
c = EM::Channel.new
|
|
8
|
+
c.subscribe { |v| s = v; EM.stop }
|
|
9
|
+
c << 1
|
|
10
|
+
end
|
|
11
|
+
assert_equal 1, s
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_channel_unsubscribe
|
|
15
|
+
s = 0
|
|
16
|
+
EM.run do
|
|
17
|
+
c = EM::Channel.new
|
|
18
|
+
subscription = c.subscribe { |v| s = v }
|
|
19
|
+
c.unsubscribe(subscription)
|
|
20
|
+
c << 1
|
|
21
|
+
EM.next_tick { EM.stop }
|
|
22
|
+
end
|
|
23
|
+
assert_not_equal 1, s
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_channel_pop
|
|
27
|
+
s = 0
|
|
28
|
+
EM.run do
|
|
29
|
+
c = EM::Channel.new
|
|
30
|
+
c.pop{ |v| s = v }
|
|
31
|
+
c.push(1,2,3)
|
|
32
|
+
c << 4
|
|
33
|
+
c << 5
|
|
34
|
+
EM.next_tick { EM.stop }
|
|
35
|
+
end
|
|
36
|
+
assert_equal 1, s
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_channel_reactor_thread_push
|
|
40
|
+
out = []
|
|
41
|
+
c = EM::Channel.new
|
|
42
|
+
c.subscribe { |v| out << v }
|
|
43
|
+
Thread.new { c.push(1,2,3) }.join
|
|
44
|
+
assert out.empty?
|
|
45
|
+
|
|
46
|
+
EM.run { EM.next_tick { EM.stop } }
|
|
47
|
+
|
|
48
|
+
assert_equal [1,2,3], out
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_channel_reactor_thread_callback
|
|
52
|
+
out = []
|
|
53
|
+
c = EM::Channel.new
|
|
54
|
+
Thread.new { c.subscribe { |v| out << v } }.join
|
|
55
|
+
c.push(1,2,3)
|
|
56
|
+
assert out.empty?
|
|
57
|
+
|
|
58
|
+
EM.run { EM.next_tick { EM.stop } }
|
|
59
|
+
|
|
60
|
+
assert_equal [1,2,3], out
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestCompletion < Test::Unit::TestCase
|
|
4
|
+
def completion
|
|
5
|
+
@completion ||= EM::Completion.new
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def crank
|
|
9
|
+
# This is a slow solution, but this just executes the next tick queue
|
|
10
|
+
# once. It's the easiest way for now.
|
|
11
|
+
EM.run { EM.stop }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def results
|
|
15
|
+
@results ||= []
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_state
|
|
19
|
+
assert_equal :unknown, completion.state
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_succeed
|
|
23
|
+
completion.callback { |val| results << val }
|
|
24
|
+
completion.succeed :object
|
|
25
|
+
crank
|
|
26
|
+
assert_equal :succeeded, completion.state
|
|
27
|
+
assert_equal [:object], results
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_fail
|
|
31
|
+
completion.errback { |val| results << val }
|
|
32
|
+
completion.fail :object
|
|
33
|
+
crank
|
|
34
|
+
assert_equal :failed, completion.state
|
|
35
|
+
assert_equal [:object], results
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_callback
|
|
39
|
+
completion.callback { results << :callback }
|
|
40
|
+
completion.errback { results << :errback }
|
|
41
|
+
completion.succeed
|
|
42
|
+
crank
|
|
43
|
+
assert_equal [:callback], results
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_errback
|
|
47
|
+
completion.callback { results << :callback }
|
|
48
|
+
completion.errback { results << :errback }
|
|
49
|
+
completion.fail
|
|
50
|
+
crank
|
|
51
|
+
assert_equal [:errback], results
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_stateback
|
|
55
|
+
completion.stateback(:magic) { results << :stateback }
|
|
56
|
+
completion.change_state(:magic)
|
|
57
|
+
crank
|
|
58
|
+
assert_equal [:stateback], results
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_does_not_enqueue_when_completed
|
|
62
|
+
completion.callback { results << :callback }
|
|
63
|
+
completion.succeed
|
|
64
|
+
completion.errback { results << :errback }
|
|
65
|
+
completion.fail
|
|
66
|
+
crank
|
|
67
|
+
assert_equal [:callback], results
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_completed
|
|
71
|
+
assert_equal false, completion.completed?
|
|
72
|
+
completion.succeed
|
|
73
|
+
assert_equal true, completion.completed?
|
|
74
|
+
completion.fail
|
|
75
|
+
assert_equal true, completion.completed?
|
|
76
|
+
completion.change_state :magic
|
|
77
|
+
assert_equal false, completion.completed?
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_recursive_callbacks
|
|
81
|
+
completion.callback do |val|
|
|
82
|
+
results << val
|
|
83
|
+
completion.succeed :two
|
|
84
|
+
end
|
|
85
|
+
completion.callback do |val|
|
|
86
|
+
results << val
|
|
87
|
+
completion.succeed :three
|
|
88
|
+
end
|
|
89
|
+
completion.callback do |val|
|
|
90
|
+
results << val
|
|
91
|
+
end
|
|
92
|
+
completion.succeed :one
|
|
93
|
+
crank
|
|
94
|
+
assert_equal [:one, :two, :three], results
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_late_defined_callbacks
|
|
98
|
+
completion.callback { results << :one }
|
|
99
|
+
completion.succeed
|
|
100
|
+
crank
|
|
101
|
+
assert_equal [:one], results
|
|
102
|
+
completion.callback { results << :two }
|
|
103
|
+
crank
|
|
104
|
+
assert_equal [:one, :two], results
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_cleared_completions
|
|
108
|
+
completion.callback { results << :callback }
|
|
109
|
+
completion.errback { results << :errback }
|
|
110
|
+
|
|
111
|
+
completion.succeed
|
|
112
|
+
crank
|
|
113
|
+
completion.fail
|
|
114
|
+
crank
|
|
115
|
+
completion.succeed
|
|
116
|
+
crank
|
|
117
|
+
|
|
118
|
+
assert_equal [:callback], results
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_skip_completed_callbacks
|
|
122
|
+
completion.callback { results << :callback }
|
|
123
|
+
completion.succeed
|
|
124
|
+
crank
|
|
125
|
+
|
|
126
|
+
completion.errback { results << :errback }
|
|
127
|
+
completion.fail
|
|
128
|
+
crank
|
|
129
|
+
|
|
130
|
+
assert_equal [:callback], results
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_completions
|
|
134
|
+
completion.completion { results << :completion }
|
|
135
|
+
completion.succeed
|
|
136
|
+
crank
|
|
137
|
+
assert_equal [:completion], results
|
|
138
|
+
|
|
139
|
+
completion.change_state(:unknown)
|
|
140
|
+
results.clear
|
|
141
|
+
|
|
142
|
+
completion.completion { results << :completion }
|
|
143
|
+
completion.fail
|
|
144
|
+
crank
|
|
145
|
+
assert_equal [:completion], results
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_latent_completion
|
|
149
|
+
completion.completion { results << :completion }
|
|
150
|
+
completion.succeed
|
|
151
|
+
crank
|
|
152
|
+
completion.completion { results << :completion }
|
|
153
|
+
crank
|
|
154
|
+
assert_equal [:completion, :completion], results
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def test_timeout
|
|
158
|
+
args = [1, 2, 3]
|
|
159
|
+
EM.run do
|
|
160
|
+
completion.timeout(0.0001, *args)
|
|
161
|
+
completion.errback { |*errargs| results << errargs }
|
|
162
|
+
completion.completion { EM.stop }
|
|
163
|
+
EM.add_timer(0.1) { flunk 'test timed out' }
|
|
164
|
+
end
|
|
165
|
+
assert_equal [[1,2,3]], results
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def test_timeout_gets_cancelled
|
|
169
|
+
EM.run do
|
|
170
|
+
completion.timeout(0.0001, :timeout)
|
|
171
|
+
completion.errback { results << :errback }
|
|
172
|
+
completion.succeed
|
|
173
|
+
EM.add_timer(0.0002) { EM.stop }
|
|
174
|
+
end
|
|
175
|
+
assert_equal [], results
|
|
176
|
+
end
|
|
177
|
+
end
|