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
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestHttpClient < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
Localhost = "127.0.0.1"
|
|
6
|
+
Localport = 9801
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def teardown
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
#-------------------------------------
|
|
15
|
+
|
|
16
|
+
def test_http_client
|
|
17
|
+
ok = false
|
|
18
|
+
EM.run {
|
|
19
|
+
c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
|
|
20
|
+
c.callback {
|
|
21
|
+
ok = true
|
|
22
|
+
EM.stop
|
|
23
|
+
}
|
|
24
|
+
c.errback {EM.stop} # necessary, otherwise a failure blocks the test suite forever.
|
|
25
|
+
}
|
|
26
|
+
assert ok
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
#-------------------------------------
|
|
30
|
+
|
|
31
|
+
def test_http_client_1
|
|
32
|
+
ok = false
|
|
33
|
+
EM.run {
|
|
34
|
+
c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
|
|
35
|
+
c.callback {ok = true; EM.stop}
|
|
36
|
+
c.errback {EM.stop}
|
|
37
|
+
}
|
|
38
|
+
assert ok
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#-------------------------------------
|
|
42
|
+
|
|
43
|
+
def test_http_client_2
|
|
44
|
+
ok = false
|
|
45
|
+
EM.run {
|
|
46
|
+
c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
|
|
47
|
+
c.callback {|result|
|
|
48
|
+
ok = true;
|
|
49
|
+
EM.stop
|
|
50
|
+
}
|
|
51
|
+
c.errback {EM.stop}
|
|
52
|
+
}
|
|
53
|
+
assert ok
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
#-----------------------------------------
|
|
58
|
+
|
|
59
|
+
# Test a server that returns a page with a zero content-length.
|
|
60
|
+
# This caused an early version of the HTTP client not to generate a response,
|
|
61
|
+
# causing this test to hang. Observe, there was no problem with responses
|
|
62
|
+
# lacking a content-length, just when the content-length was zero.
|
|
63
|
+
#
|
|
64
|
+
class EmptyContent < EM::Connection
|
|
65
|
+
def initialize *args
|
|
66
|
+
super
|
|
67
|
+
end
|
|
68
|
+
def receive_data data
|
|
69
|
+
send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n"
|
|
70
|
+
close_connection_after_writing
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_http_empty_content
|
|
75
|
+
ok = false
|
|
76
|
+
EM.run {
|
|
77
|
+
EM.start_server "127.0.0.1", 9701, EmptyContent
|
|
78
|
+
c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => 9701 }
|
|
79
|
+
c.callback {|result|
|
|
80
|
+
ok = true
|
|
81
|
+
EM.stop
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
assert ok
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
#---------------------------------------
|
|
89
|
+
|
|
90
|
+
class PostContent < EM::P::LineAndTextProtocol
|
|
91
|
+
def initialize *args
|
|
92
|
+
super
|
|
93
|
+
@lines = []
|
|
94
|
+
end
|
|
95
|
+
def receive_line line
|
|
96
|
+
if line.length > 0
|
|
97
|
+
@lines << line
|
|
98
|
+
else
|
|
99
|
+
process_headers
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
def receive_binary_data data
|
|
103
|
+
@post_content = data
|
|
104
|
+
send_response
|
|
105
|
+
end
|
|
106
|
+
def process_headers
|
|
107
|
+
if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/
|
|
108
|
+
@uri = $1.dup
|
|
109
|
+
else
|
|
110
|
+
raise "bad request"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
@lines.each {|line|
|
|
114
|
+
if line =~ /\AContent-length:\s*(\d+)\Z/i
|
|
115
|
+
@content_length = $1.dup.to_i
|
|
116
|
+
elsif line =~ /\AContent-type:\s*(\d+)\Z/i
|
|
117
|
+
@content_type = $1.dup
|
|
118
|
+
end
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
raise "invalid content length" unless @content_length
|
|
122
|
+
set_binary_mode @content_length
|
|
123
|
+
end
|
|
124
|
+
def send_response
|
|
125
|
+
send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789"
|
|
126
|
+
close_connection_after_writing
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client
|
|
131
|
+
# is sending a 1.0 request. Gotta fix the client
|
|
132
|
+
def test_post
|
|
133
|
+
response = nil
|
|
134
|
+
EM.run {
|
|
135
|
+
EM.start_server Localhost, Localport, PostContent
|
|
136
|
+
setup_timeout(2)
|
|
137
|
+
c = silent { EM::P::HttpClient.request(
|
|
138
|
+
:host=>Localhost,
|
|
139
|
+
:port=>Localport,
|
|
140
|
+
:method=>:post,
|
|
141
|
+
:request=>"/aaa",
|
|
142
|
+
:content=>"XYZ",
|
|
143
|
+
:content_type=>"text/plain"
|
|
144
|
+
)}
|
|
145
|
+
c.callback {|r|
|
|
146
|
+
response = r
|
|
147
|
+
EM.stop
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
assert_equal( 200, response[:status] )
|
|
152
|
+
assert_equal( "0123456789", response[:content] )
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# TODO, need a more intelligent cookie tester.
|
|
157
|
+
# In fact, this whole test-harness needs a beefier server implementation.
|
|
158
|
+
def test_cookie
|
|
159
|
+
ok = false
|
|
160
|
+
EM.run {
|
|
161
|
+
c = silent { EM::Protocols::HttpClient.send :request, :host => "www.google.com", :port => 80, :cookie=>"aaa=bbb" }
|
|
162
|
+
c.callback {|result|
|
|
163
|
+
ok = true;
|
|
164
|
+
EM.stop
|
|
165
|
+
}
|
|
166
|
+
c.errback {EM.stop}
|
|
167
|
+
}
|
|
168
|
+
assert ok
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# We can tell the client to send an HTTP/1.0 request (default is 1.1).
|
|
172
|
+
# This is useful for suppressing chunked responses until those are working.
|
|
173
|
+
def test_version_1_0
|
|
174
|
+
ok = false
|
|
175
|
+
EM.run {
|
|
176
|
+
c = silent { EM::P::HttpClient.request(
|
|
177
|
+
:host => "www.google.com",
|
|
178
|
+
:port => 80,
|
|
179
|
+
:version => "1.0"
|
|
180
|
+
)}
|
|
181
|
+
c.callback {|result|
|
|
182
|
+
ok = true;
|
|
183
|
+
EM.stop
|
|
184
|
+
}
|
|
185
|
+
c.errback {EM.stop}
|
|
186
|
+
}
|
|
187
|
+
assert ok
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestHttpClient2 < Test::Unit::TestCase
|
|
4
|
+
Localhost = "127.0.0.1"
|
|
5
|
+
Localport = 9801
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def teardown
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestServer < EM::Connection
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# #connect returns an object which has made a connection to an HTTP server
|
|
18
|
+
# and exposes methods for making HTTP requests on that connection.
|
|
19
|
+
# #connect can take either a pair of parameters (a host and a port),
|
|
20
|
+
# or a single parameter which is a Hash.
|
|
21
|
+
#
|
|
22
|
+
def test_connect
|
|
23
|
+
EM.run {
|
|
24
|
+
EM.start_server Localhost, Localport, TestServer
|
|
25
|
+
silent do
|
|
26
|
+
EM::P::HttpClient2.connect Localhost, Localport
|
|
27
|
+
EM::P::HttpClient2.connect( :host=>Localhost, :port=>Localport )
|
|
28
|
+
end
|
|
29
|
+
EM.stop
|
|
30
|
+
}
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_bad_port
|
|
35
|
+
EM.run {
|
|
36
|
+
EM.start_server Localhost, Localport, TestServer
|
|
37
|
+
assert_raises( ArgumentError ) {
|
|
38
|
+
silent { EM::P::HttpClient2.connect Localhost, "xxx" }
|
|
39
|
+
}
|
|
40
|
+
EM.stop
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_bad_server
|
|
45
|
+
err = nil
|
|
46
|
+
EM.run {
|
|
47
|
+
http = silent { EM::P::HttpClient2.connect Localhost, 9999 }
|
|
48
|
+
d = http.get "/"
|
|
49
|
+
d.errback { err = true; d.internal_error; EM.stop }
|
|
50
|
+
}
|
|
51
|
+
assert(err)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_get
|
|
55
|
+
content = nil
|
|
56
|
+
EM.run {
|
|
57
|
+
http = silent { EM::P::HttpClient2.connect "google.com", 80 }
|
|
58
|
+
d = http.get "/"
|
|
59
|
+
d.callback {
|
|
60
|
+
content = d.content
|
|
61
|
+
EM.stop
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
assert(content)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Not a pipelined request because we wait for one response before we request the next.
|
|
68
|
+
# XXX this test is broken because it sends the second request to the first connection
|
|
69
|
+
# XXX right before the connection closes
|
|
70
|
+
def _test_get_multiple
|
|
71
|
+
content = nil
|
|
72
|
+
EM.run {
|
|
73
|
+
http = silent { EM::P::HttpClient2.connect "google.com", 80 }
|
|
74
|
+
d = http.get "/"
|
|
75
|
+
d.callback {
|
|
76
|
+
e = http.get "/"
|
|
77
|
+
e.callback {
|
|
78
|
+
content = e.content
|
|
79
|
+
EM.stop
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
assert(content)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_get_pipeline
|
|
87
|
+
headers, headers2 = nil, nil
|
|
88
|
+
EM.run {
|
|
89
|
+
http = silent { EM::P::HttpClient2.connect "google.com", 80 }
|
|
90
|
+
d = http.get("/")
|
|
91
|
+
d.callback {
|
|
92
|
+
headers = d.headers
|
|
93
|
+
}
|
|
94
|
+
e = http.get("/")
|
|
95
|
+
e.callback {
|
|
96
|
+
headers2 = e.headers
|
|
97
|
+
}
|
|
98
|
+
EM.tick_loop { EM.stop if headers && headers2 }
|
|
99
|
+
EM.add_timer(1) { EM.stop }
|
|
100
|
+
}
|
|
101
|
+
assert(headers)
|
|
102
|
+
assert(headers2)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_authheader
|
|
107
|
+
EM.run {
|
|
108
|
+
EM.start_server Localhost, Localport, TestServer
|
|
109
|
+
http = silent { EM::P::HttpClient2.connect Localhost, 18842 }
|
|
110
|
+
d = http.get :url=>"/", :authorization=>"Basic xxx"
|
|
111
|
+
d.callback {EM.stop}
|
|
112
|
+
d.errback {EM.stop}
|
|
113
|
+
}
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def test_https_get
|
|
117
|
+
d = nil
|
|
118
|
+
EM.run {
|
|
119
|
+
http = silent { EM::P::HttpClient2.connect :host => 'www.apple.com', :port => 443, :ssl => true }
|
|
120
|
+
d = http.get "/"
|
|
121
|
+
d.callback {
|
|
122
|
+
EM.stop
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
assert_equal(200, d.status)
|
|
126
|
+
end if EM.ssl?
|
|
127
|
+
|
|
128
|
+
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
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestInactivityTimeout < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
if EM.respond_to? :get_comm_inactivity_timeout
|
|
6
|
+
def test_default
|
|
7
|
+
EM.run {
|
|
8
|
+
c = EM.connect("127.0.0.1", 54321)
|
|
9
|
+
assert_equal 0.0, c.comm_inactivity_timeout
|
|
10
|
+
EM.stop
|
|
11
|
+
}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_set_and_get
|
|
15
|
+
EM.run {
|
|
16
|
+
c = EM.connect("127.0.0.1", 54321)
|
|
17
|
+
c.comm_inactivity_timeout = 2.5
|
|
18
|
+
assert_equal 2.5, c.comm_inactivity_timeout
|
|
19
|
+
EM.stop
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_for_real
|
|
24
|
+
start, finish = nil
|
|
25
|
+
|
|
26
|
+
timeout_handler = Module.new do
|
|
27
|
+
define_method :unbind do
|
|
28
|
+
finish = Time.now
|
|
29
|
+
EM.stop
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
EM.run {
|
|
34
|
+
setup_timeout
|
|
35
|
+
EM.heartbeat_interval = 0.01
|
|
36
|
+
EM.start_server("127.0.0.1", 12345)
|
|
37
|
+
EM.add_timer(0.01) {
|
|
38
|
+
start = Time.now
|
|
39
|
+
c = EM.connect("127.0.0.1", 12345, timeout_handler)
|
|
40
|
+
c.comm_inactivity_timeout = 0.02
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
assert_in_delta(0.02, (finish - start), 0.02)
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
warn "EM.comm_inactivity_timeout not implemented, skipping tests in #{__FILE__}"
|
|
48
|
+
|
|
49
|
+
# Because some rubies will complain if a TestCase class has no tests
|
|
50
|
+
def test_em_comm_inactivity_timeout_not_implemented
|
|
51
|
+
assert true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
data/tests/test_kb.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestKeyboardEvents < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
if !jruby?
|
|
6
|
+
module KbHandler
|
|
7
|
+
include EM::Protocols::LineText2
|
|
8
|
+
def receive_line d
|
|
9
|
+
EM::stop if d == "STOP"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# This test doesn't actually do anything useful but is here to
|
|
14
|
+
# illustrate the usage. If you removed the timer and ran this test
|
|
15
|
+
# by itself on a console, and then typed into the console, it would
|
|
16
|
+
# work.
|
|
17
|
+
# I don't know how to get the test harness to simulate actual keystrokes.
|
|
18
|
+
# When someone figures that out, then we can make this a real test.
|
|
19
|
+
#
|
|
20
|
+
def test_kb
|
|
21
|
+
EM.run {
|
|
22
|
+
EM.open_keyboard KbHandler
|
|
23
|
+
EM::Timer.new(1) { EM.stop }
|
|
24
|
+
} if $stdout.tty? # don't run the test unless it stands a chance of validity.
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
warn "EM.open_keyboard not implemented, skipping tests in #{__FILE__}"
|
|
28
|
+
|
|
29
|
+
# Because some rubies will complain if a TestCase class has no tests
|
|
30
|
+
def test_em_open_keyboard_unsupported
|
|
31
|
+
assert true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/tests/test_ltp.rb
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
require 'em_test_helper'
|
|
2
|
+
|
|
3
|
+
class TestLineAndTextProtocol < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
class SimpleLineTest < EM::P::LineAndTextProtocol
|
|
6
|
+
def receive_line line
|
|
7
|
+
@line_buffer << line
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module StopClient
|
|
12
|
+
def set_receive_data(&blk)
|
|
13
|
+
@rdb = blk
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def receive_data data
|
|
17
|
+
@rdb.call(data) if @rdb
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def unbind
|
|
21
|
+
EM.add_timer(0.1) { EM.stop }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def setup
|
|
26
|
+
@port = next_port
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_simple_lines
|
|
30
|
+
lines_received = []
|
|
31
|
+
EM.run {
|
|
32
|
+
EM.start_server( "127.0.0.1", @port, SimpleLineTest ) do |conn|
|
|
33
|
+
conn.instance_eval "@line_buffer = lines_received"
|
|
34
|
+
end
|
|
35
|
+
setup_timeout
|
|
36
|
+
|
|
37
|
+
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
38
|
+
c.send_data "aaa\nbbb\r\nccc\n"
|
|
39
|
+
c.close_connection_after_writing
|
|
40
|
+
end
|
|
41
|
+
}
|
|
42
|
+
assert_equal( %w(aaa bbb ccc), lines_received )
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
#--------------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
class SimpleLineTest < EM::P::LineAndTextProtocol
|
|
48
|
+
def receive_error text
|
|
49
|
+
@error_message << text
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_overlength_lines
|
|
54
|
+
lines_received = []
|
|
55
|
+
EM.run {
|
|
56
|
+
EM.start_server( "127.0.0.1", @port, SimpleLineTest ) do |conn|
|
|
57
|
+
conn.instance_eval "@error_message = lines_received"
|
|
58
|
+
end
|
|
59
|
+
setup_timeout
|
|
60
|
+
|
|
61
|
+
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
62
|
+
c.send_data "a" * (16*1024 + 1)
|
|
63
|
+
c.send_data "\n"
|
|
64
|
+
c.close_connection_after_writing
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
assert_equal( ["overlength line"], lines_received )
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
#--------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
class LineAndTextTest < EM::P::LineAndTextProtocol
|
|
75
|
+
def receive_line line
|
|
76
|
+
if line =~ /content-length:\s*(\d+)/i
|
|
77
|
+
@content_length = $1.to_i
|
|
78
|
+
elsif line.length == 0
|
|
79
|
+
set_binary_mode @content_length
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
def receive_binary_data text
|
|
83
|
+
send_data "received #{text.length} bytes"
|
|
84
|
+
close_connection_after_writing
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_lines_and_text
|
|
89
|
+
output = ''
|
|
90
|
+
EM.run {
|
|
91
|
+
EM.start_server( "127.0.0.1", @port, LineAndTextTest )
|
|
92
|
+
setup_timeout
|
|
93
|
+
|
|
94
|
+
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
95
|
+
c.set_receive_data { |data| output << data }
|
|
96
|
+
c.send_data "Content-length: 400\n"
|
|
97
|
+
c.send_data "\n"
|
|
98
|
+
c.send_data "A" * 400
|
|
99
|
+
EM.add_timer(0.1) { c.close_connection_after_writing }
|
|
100
|
+
end
|
|
101
|
+
}
|
|
102
|
+
assert_equal( "received 400 bytes", output )
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#--------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class BinaryTextTest < EM::P::LineAndTextProtocol
|
|
109
|
+
def receive_line line
|
|
110
|
+
if line =~ /content-length:\s*(\d+)/i
|
|
111
|
+
set_binary_mode $1.to_i
|
|
112
|
+
else
|
|
113
|
+
raise "protocol error"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
def receive_binary_data text
|
|
117
|
+
send_data "received #{text.length} bytes"
|
|
118
|
+
close_connection_after_writing
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def test_binary_text
|
|
123
|
+
output = ''
|
|
124
|
+
EM.run {
|
|
125
|
+
EM.start_server( "127.0.0.1", @port, BinaryTextTest )
|
|
126
|
+
setup_timeout
|
|
127
|
+
|
|
128
|
+
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
129
|
+
c.set_receive_data { |data| output << data }
|
|
130
|
+
c.send_data "Content-length: 10000\n"
|
|
131
|
+
c.send_data "A" * 10000
|
|
132
|
+
EM.add_timer(0.1) { c.close_connection_after_writing }
|
|
133
|
+
end
|
|
134
|
+
}
|
|
135
|
+
assert_equal( "received 10000 bytes", output )
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|