sonixlabs-eventmachine-java 1.0.0.rc.4-java
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 +22 -0
- data/.yardopts +7 -0
- data/GNU +281 -0
- data/Gemfile +3 -0
- data/LICENSE +60 -0
- data/README.md +109 -0
- data/Rakefile +20 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +521 -0
- data/docs/old/ChangeLog +211 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/old/EPOLL +141 -0
- data/docs/old/INSTALL +13 -0
- data/docs/old/KEYBOARD +42 -0
- data/docs/old/LEGAL +25 -0
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/PURE_RUBY +75 -0
- data/docs/old/RELEASE_NOTES +94 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/docs/old/TODO +8 -0
- data/eventmachine.gemspec +34 -0
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/old/ex_channel.rb +43 -0
- data/examples/old/ex_queue.rb +2 -0
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/examples/old/helper.rb +2 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +876 -0
- data/ext/ed.cpp +1973 -0
- data/ext/ed.h +422 -0
- data/ext/em.cpp +2353 -0
- data/ext/em.h +239 -0
- data/ext/eventmachine.h +127 -0
- data/ext/extconf.rb +176 -0
- data/ext/fastfilereader/extconf.rb +103 -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 +156 -0
- data/ext/rubymain.cpp +1297 -0
- data/ext/ssl.cpp +468 -0
- data/ext/ssl.h +94 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +588 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +70 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +195 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -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 +712 -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 +270 -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 +36 -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 +640 -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/pure_ruby.rb +1017 -0
- data/lib/em/queue.rb +71 -0
- data/lib/em/resolver.rb +192 -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 +61 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1532 -0
- data/lib/jeventmachine.rb +284 -0
- data/lib/sonixlabs-eventmachine-java.rb +1 -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 +64 -0
- data/tests/test_attach.rb +126 -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 +130 -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_idle_connection.rb +23 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_kb.rb +34 -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 +194 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +180 -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 +37 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +55 -0
- data/tests/test_smtpserver.rb +57 -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 +53 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +123 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +48 -0
- metadata +301 -0
data/rakelib/test.rake
ADDED
data/tests/client.crt
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV
|
|
3
|
+
BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL
|
|
4
|
+
EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy
|
|
5
|
+
MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2
|
|
6
|
+
ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl
|
|
7
|
+
bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF
|
|
8
|
+
AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b
|
|
9
|
+
+hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK
|
|
10
|
+
OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l
|
|
11
|
+
S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p
|
|
12
|
+
67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg
|
|
13
|
+
C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N
|
|
14
|
+
uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy
|
|
15
|
+
XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+
|
|
16
|
+
B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD
|
|
17
|
+
ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK
|
|
18
|
+
iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC
|
|
19
|
+
AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU
|
|
20
|
+
6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV
|
|
21
|
+
MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0
|
|
22
|
+
4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ
|
|
23
|
+
43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ
|
|
24
|
+
i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w
|
|
25
|
+
mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM
|
|
26
|
+
aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c
|
|
27
|
+
544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2
|
|
28
|
+
gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6
|
|
29
|
+
0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR
|
|
30
|
+
8bs/XQVNE/s=
|
|
31
|
+
-----END CERTIFICATE-----
|
data/tests/client.key
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2
|
+
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
|
|
51
|
+
-----END RSA PRIVATE KEY-----
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'eventmachine'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
require 'rbconfig'
|
|
4
|
+
require 'socket'
|
|
5
|
+
|
|
6
|
+
class Test::Unit::TestCase
|
|
7
|
+
class EMTestTimeout < StandardError ; end
|
|
8
|
+
|
|
9
|
+
def setup_timeout(timeout = TIMEOUT_INTERVAL)
|
|
10
|
+
EM.schedule {
|
|
11
|
+
EM.add_timer(timeout) {
|
|
12
|
+
raise EMTestTimeout, "Test was cancelled after #{timeout} seconds."
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def port_in_use?(port, host="127.0.0.1")
|
|
18
|
+
s = TCPSocket.new(host, port)
|
|
19
|
+
s.close
|
|
20
|
+
s
|
|
21
|
+
rescue Errno::ECONNREFUSED
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def next_port
|
|
26
|
+
@@port ||= 9000
|
|
27
|
+
begin
|
|
28
|
+
@@port += 1
|
|
29
|
+
end while port_in_use?(@@port)
|
|
30
|
+
|
|
31
|
+
@@port
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def exception_class
|
|
35
|
+
jruby? ? NativeException : RuntimeError
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
module PlatformHelper
|
|
39
|
+
# http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
|
|
40
|
+
def windows?
|
|
41
|
+
RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# http://stackoverflow.com/questions/1342535/how-can-i-tell-if-im-running-from-jruby-vs-ruby/1685970#1685970
|
|
45
|
+
def jruby?
|
|
46
|
+
defined? JRUBY_VERSION
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
include PlatformHelper
|
|
51
|
+
extend PlatformHelper
|
|
52
|
+
|
|
53
|
+
# Tests run significantly slower on windows. YMMV
|
|
54
|
+
TIMEOUT_INTERVAL = windows? ? 1 : 0.25
|
|
55
|
+
|
|
56
|
+
def silent
|
|
57
|
+
backup, $VERBOSE = $VERBOSE, nil
|
|
58
|
+
begin
|
|
59
|
+
yield
|
|
60
|
+
ensure
|
|
61
|
+
$VERBOSE = backup
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
require 'socket'
|
|
3
|
+
|
|
4
|
+
class TestAttach < Test::Unit::TestCase
|
|
5
|
+
class EchoServer < EM::Connection
|
|
6
|
+
def receive_data data
|
|
7
|
+
send_data data
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class EchoClient < EM::Connection
|
|
12
|
+
def initialize socket
|
|
13
|
+
self.notify_readable = true
|
|
14
|
+
@socket = socket
|
|
15
|
+
@socket.write("abc\n")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def notify_readable
|
|
19
|
+
$read = @socket.readline
|
|
20
|
+
$fd = detach
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def unbind
|
|
24
|
+
EM.next_tick do
|
|
25
|
+
@socket.write("def\n")
|
|
26
|
+
EM.add_timer(0.1) { EM.stop }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def setup
|
|
32
|
+
@port = next_port
|
|
33
|
+
$read, $r, $w, $fd = nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def teardown
|
|
37
|
+
[$r, $w].each do |io|
|
|
38
|
+
io.close rescue nil
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_attach
|
|
43
|
+
socket = nil
|
|
44
|
+
|
|
45
|
+
EM.run {
|
|
46
|
+
EM.start_server "127.0.0.1", @port, EchoServer
|
|
47
|
+
socket = TCPSocket.new "127.0.0.1", @port
|
|
48
|
+
EM.watch socket, EchoClient, socket
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
assert_equal $read, "abc\n"
|
|
52
|
+
unless jruby? # jruby filenos are not real
|
|
53
|
+
assert_equal $fd, socket.fileno
|
|
54
|
+
end
|
|
55
|
+
assert_equal false, socket.closed?
|
|
56
|
+
assert_equal socket.readline, "def\n"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
module PipeWatch
|
|
60
|
+
def notify_readable
|
|
61
|
+
$read = $r.readline
|
|
62
|
+
EM.stop
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_attach_pipe
|
|
67
|
+
EM.run{
|
|
68
|
+
$r, $w = IO.pipe
|
|
69
|
+
EM.watch $r, PipeWatch do |c|
|
|
70
|
+
c.notify_readable = true
|
|
71
|
+
end
|
|
72
|
+
$w.write("ghi\n")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
assert_equal $read, "ghi\n"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_set_readable
|
|
79
|
+
before, after = nil
|
|
80
|
+
|
|
81
|
+
EM.run{
|
|
82
|
+
$r, $w = IO.pipe
|
|
83
|
+
c = EM.watch $r, PipeWatch do |con|
|
|
84
|
+
con.notify_readable = false
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
EM.next_tick{
|
|
88
|
+
before = c.notify_readable?
|
|
89
|
+
c.notify_readable = true
|
|
90
|
+
after = c.notify_readable?
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
$w.write("jkl\n")
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
assert !before
|
|
97
|
+
assert after
|
|
98
|
+
assert_equal $read, "jkl\n"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_read_write_pipe
|
|
102
|
+
result = nil
|
|
103
|
+
|
|
104
|
+
pipe_reader = Module.new do
|
|
105
|
+
define_method :receive_data do |data|
|
|
106
|
+
result = data
|
|
107
|
+
EM.stop
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
r,w = IO.pipe
|
|
112
|
+
|
|
113
|
+
EM.run {
|
|
114
|
+
EM.attach r, pipe_reader
|
|
115
|
+
writer = EM.attach(w)
|
|
116
|
+
writer.send_data 'ghi'
|
|
117
|
+
|
|
118
|
+
# XXX: Process will hang in Windows without this line
|
|
119
|
+
writer.close_connection_after_writing
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
assert_equal "ghi", result
|
|
123
|
+
ensure
|
|
124
|
+
[r,w].each {|io| io.close rescue nil }
|
|
125
|
+
end
|
|
126
|
+
end
|
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
|