eventmachine 1.0.0.beta.4 → 1.0.0.rc.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/README.md +1 -1
- data/Rakefile +11 -10
- data/eventmachine.gemspec +2 -2
- data/ext/cmain.cpp +38 -0
- data/ext/ed.cpp +18 -1
- data/ext/ed.h +5 -0
- data/ext/em.cpp +31 -8
- data/ext/em.h +3 -2
- data/ext/eventmachine.h +4 -0
- data/ext/extconf.rb +12 -3
- data/ext/fastfilereader/extconf.rb +10 -1
- data/ext/project.h +2 -1
- data/ext/rubymain.cpp +57 -7
- data/ext/ssl.cpp +4 -1
- data/java/src/com/rubyeventmachine/EmReactor.java +4 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +1 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +6 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +6 -0
- data/lib/em/connection.rb +11 -0
- data/lib/em/pool.rb +7 -2
- data/lib/em/protocols/smtpclient.rb +28 -28
- data/lib/em/threaded_resource.rb +1 -1
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +57 -11
- data/lib/jeventmachine.rb +5 -0
- data/{tasks → rakelib}/cpp.rake_example +0 -0
- data/{tasks → rakelib}/package.rake +0 -0
- data/{tasks → rakelib}/test.rake +0 -0
- data/tests/test_basic.rb +67 -0
- data/tests/test_idle_connection.rb +23 -0
- data/tests/test_pool.rb +67 -1
- data/tests/test_proxy_connection.rb +13 -1
- data/tests/test_unbind_reason.rb +19 -2
- metadata +12 -25
data/lib/jeventmachine.rb
CHANGED
@@ -203,6 +203,11 @@ module EventMachine
|
|
203
203
|
Socket.pack_sockaddr_in(*peer)
|
204
204
|
end
|
205
205
|
end
|
206
|
+
def self.get_sockname sig
|
207
|
+
if sockName = @em.getSockName(sig)
|
208
|
+
Socket.pack_sockaddr_in(*sockName)
|
209
|
+
end
|
210
|
+
end
|
206
211
|
# @private
|
207
212
|
def self.attach_fd fileno, watch_mode
|
208
213
|
# 3Aug09: We could pass in the actual SocketChannel, but then it would be modified (set as non-blocking), and
|
File without changes
|
File without changes
|
data/{tasks → rakelib}/test.rake
RENAMED
File without changes
|
data/tests/test_basic.rb
CHANGED
@@ -224,4 +224,71 @@ class TestBasic < Test::Unit::TestCase
|
|
224
224
|
end
|
225
225
|
end
|
226
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
|
227
294
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
|
3
|
+
class TestIdleConnection < Test::Unit::TestCase
|
4
|
+
if EM.respond_to?(:get_idle_time)
|
5
|
+
def test_idle_time
|
6
|
+
EM.run{
|
7
|
+
conn = EM.connect 'www.google.com', 80
|
8
|
+
EM.add_timer(3){
|
9
|
+
$idle_time = conn.get_idle_time
|
10
|
+
conn.send_data "GET / HTTP/1.0\r\n\r\n"
|
11
|
+
EM.next_tick{
|
12
|
+
$idle_time_after_send = conn.get_idle_time
|
13
|
+
conn.close_connection
|
14
|
+
EM.stop
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
assert_in_delta 3, $idle_time, 0.2
|
20
|
+
assert_equal 0, $idle_time_after_send
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/tests/test_pool.rb
CHANGED
@@ -115,6 +115,41 @@ class TestPool < Test::Unit::TestCase
|
|
115
115
|
assert_equal [:res], pool.contents
|
116
116
|
end
|
117
117
|
|
118
|
+
def test_contents_when_perform_errors_and_on_error_is_not_set
|
119
|
+
pool.add :res
|
120
|
+
assert_equal [:res], pool.contents
|
121
|
+
|
122
|
+
pool.perform do |r|
|
123
|
+
d = EM::DefaultDeferrable.new
|
124
|
+
d.fail
|
125
|
+
d
|
126
|
+
end
|
127
|
+
|
128
|
+
EM.run { EM.next_tick { EM.stop } }
|
129
|
+
|
130
|
+
assert_equal [:res], pool.contents
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_contents_when_perform_errors_and_on_error_is_set
|
134
|
+
pool.add :res
|
135
|
+
res = nil
|
136
|
+
pool.on_error do |r|
|
137
|
+
res = r
|
138
|
+
end
|
139
|
+
assert_equal [:res], pool.contents
|
140
|
+
|
141
|
+
pool.perform do |r|
|
142
|
+
d = EM::DefaultDeferrable.new
|
143
|
+
d.fail 'foo'
|
144
|
+
d
|
145
|
+
end
|
146
|
+
|
147
|
+
EM.run { EM.next_tick { EM.stop } }
|
148
|
+
|
149
|
+
assert_equal :res, res
|
150
|
+
assert_equal [], pool.contents
|
151
|
+
end
|
152
|
+
|
118
153
|
def test_num_waiting
|
119
154
|
pool.add :res
|
120
155
|
assert_equal 0, pool.num_waiting
|
@@ -125,4 +160,35 @@ class TestPool < Test::Unit::TestCase
|
|
125
160
|
assert_equal 10, pool.num_waiting
|
126
161
|
end
|
127
162
|
|
128
|
-
|
163
|
+
def test_exceptions_in_the_work_block_bubble_up_raise_and_fail_the_resource
|
164
|
+
pool.add :res
|
165
|
+
|
166
|
+
res = nil
|
167
|
+
pool.on_error { |r| res = r }
|
168
|
+
pool.perform { raise 'boom' }
|
169
|
+
|
170
|
+
assert_raises(RuntimeError) do
|
171
|
+
EM.run { EM.next_tick { EM.stop } }
|
172
|
+
end
|
173
|
+
|
174
|
+
assert_equal [], pool.contents
|
175
|
+
assert_equal :res, res
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_removed_list_does_not_leak_on_errors
|
179
|
+
pool.add :res
|
180
|
+
|
181
|
+
pool.on_error do |r|
|
182
|
+
# This is actually the wrong thing to do, and not required, but some users
|
183
|
+
# might do it. When they do, they would find that @removed would cause a
|
184
|
+
# slow leak.
|
185
|
+
pool.remove r
|
186
|
+
end
|
187
|
+
|
188
|
+
pool.perform { d = EM::DefaultDeferrable.new; d.fail; d }
|
189
|
+
|
190
|
+
EM.run { EM.next_tick { EM.stop } }
|
191
|
+
assert_equal [], pool.instance_variable_get(:@removed)
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
@@ -24,6 +24,7 @@ class TestProxyConnection < Test::Unit::TestCase
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def unbind
|
27
|
+
$proxied_bytes = self.get_proxied_bytes
|
27
28
|
@client.close_connection_after_writing
|
28
29
|
end
|
29
30
|
end
|
@@ -94,7 +95,7 @@ class TestProxyConnection < Test::Unit::TestCase
|
|
94
95
|
end
|
95
96
|
|
96
97
|
def receive_data(data)
|
97
|
-
EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
|
98
|
+
@proxy = EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
|
98
99
|
end
|
99
100
|
end
|
100
101
|
|
@@ -134,6 +135,17 @@ class TestProxyConnection < Test::Unit::TestCase
|
|
134
135
|
assert_equal("I know!", $client_data)
|
135
136
|
end
|
136
137
|
|
138
|
+
def test_proxied_bytes
|
139
|
+
EM.run {
|
140
|
+
EM.start_server("127.0.0.1", @port, Server)
|
141
|
+
EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
|
142
|
+
EM.connect("127.0.0.1", @proxy_port, Client)
|
143
|
+
}
|
144
|
+
|
145
|
+
assert_equal("I know!", $client_data)
|
146
|
+
assert_equal("I know!".bytesize, $proxied_bytes)
|
147
|
+
end
|
148
|
+
|
137
149
|
def test_partial_proxy_connection
|
138
150
|
EM.run {
|
139
151
|
EM.start_server("127.0.0.1", @port, Server)
|
data/tests/test_unbind_reason.rb
CHANGED
@@ -2,6 +2,15 @@ require 'em_test_helper'
|
|
2
2
|
require 'socket'
|
3
3
|
|
4
4
|
class TestUnbindReason < Test::Unit::TestCase
|
5
|
+
|
6
|
+
class StubConnection < EM::Connection
|
7
|
+
attr_reader :error
|
8
|
+
def unbind(reason = nil)
|
9
|
+
@error = reason
|
10
|
+
EM.stop
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
5
14
|
def test_connect_timeout
|
6
15
|
error = nil
|
7
16
|
EM.run {
|
@@ -13,7 +22,7 @@ class TestUnbindReason < Test::Unit::TestCase
|
|
13
22
|
}
|
14
23
|
conn.pending_connect_timeout = 0.1
|
15
24
|
}
|
16
|
-
assert_equal
|
25
|
+
assert_equal Errno::ETIMEDOUT, error
|
17
26
|
end
|
18
27
|
|
19
28
|
def test_connect_refused
|
@@ -26,6 +35,14 @@ class TestUnbindReason < Test::Unit::TestCase
|
|
26
35
|
end
|
27
36
|
}
|
28
37
|
}
|
29
|
-
assert_equal
|
38
|
+
assert_equal Errno::ECONNREFUSED, error
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_optional_argument
|
42
|
+
conn = nil
|
43
|
+
EM.run {
|
44
|
+
conn = EM.connect '127.0.0.1', 12388, StubConnection
|
45
|
+
}
|
46
|
+
assert_equal Errno::ECONNREFUSED, conn.error
|
30
47
|
end
|
31
48
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 2363070813
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
-
|
12
|
-
version: 1.0.0.
|
10
|
+
- rc
|
11
|
+
- 1
|
12
|
+
version: 1.0.0.rc.1
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Francis Cianfrocca
|
@@ -18,7 +18,7 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date:
|
21
|
+
date: 2012-06-18 00:00:00 -07:00
|
22
22
|
default_executable:
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
@@ -29,12 +29,12 @@ dependencies:
|
|
29
29
|
requirements:
|
30
30
|
- - "="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
hash:
|
32
|
+
hash: 17
|
33
33
|
segments:
|
34
34
|
- 0
|
35
35
|
- 7
|
36
|
-
-
|
37
|
-
version: 0.7.
|
36
|
+
- 9
|
37
|
+
version: 0.7.9
|
38
38
|
type: :development
|
39
39
|
version_requirements: *id001
|
40
40
|
- !ruby/object:Gem::Dependency
|
@@ -53,20 +53,6 @@ dependencies:
|
|
53
53
|
version: 0.7.2
|
54
54
|
type: :development
|
55
55
|
version_requirements: *id002
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: bluecloth
|
58
|
-
prerelease: false
|
59
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
|
-
requirements:
|
62
|
-
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
hash: 3
|
65
|
-
segments:
|
66
|
-
- 0
|
67
|
-
version: "0"
|
68
|
-
type: :development
|
69
|
-
version_requirements: *id003
|
70
56
|
description: |-
|
71
57
|
EventMachine implements a fast, single-threaded engine for arbitrary network
|
72
58
|
communications. It's extremely easy to use in Ruby. EventMachine wraps all
|
@@ -207,9 +193,9 @@ files:
|
|
207
193
|
- lib/em/version.rb
|
208
194
|
- lib/eventmachine.rb
|
209
195
|
- lib/jeventmachine.rb
|
210
|
-
-
|
211
|
-
-
|
212
|
-
-
|
196
|
+
- rakelib/cpp.rake_example
|
197
|
+
- rakelib/package.rake
|
198
|
+
- rakelib/test.rake
|
213
199
|
- tests/client.crt
|
214
200
|
- tests/client.key
|
215
201
|
- tests/em_test_helper.rb
|
@@ -230,6 +216,7 @@ files:
|
|
230
216
|
- tests/test_hc.rb
|
231
217
|
- tests/test_httpclient.rb
|
232
218
|
- tests/test_httpclient2.rb
|
219
|
+
- tests/test_idle_connection.rb
|
233
220
|
- tests/test_inactivity_timeout.rb
|
234
221
|
- tests/test_kb.rb
|
235
222
|
- tests/test_ltp.rb
|