sensu-em 2.4.0-x86-mingw32
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 +7 -0
- data/.gitignore +21 -0
- data/.travis.yml +12 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +33 -0
- data/GNU +281 -0
- data/Gemfile +2 -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 +37 -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 +887 -0
- data/ext/ed.cpp +1992 -0
- data/ext/ed.h +424 -0
- data/ext/em.cpp +2352 -0
- data/ext/em.h +253 -0
- data/ext/eventmachine.h +128 -0
- data/ext/extconf.rb +179 -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 +161 -0
- data/ext/rubymain.cpp +1318 -0
- data/ext/ssl.cpp +476 -0
- data/ext/ssl.h +95 -0
- data/java/.classpath +6 -0
- data/java/.gitignore +1 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/DatagramPacket.java +13 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +531 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventCallback.java +7 -0
- data/java/src/com/rubyeventmachine/EventCode.java +26 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +130 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +179 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +405 -0
- data/java/src/com/rubyeventmachine/SslBox.java +311 -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 +716 -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 +231 -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 +643 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +205 -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 +209 -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 +1553 -0
- data/lib/fastfilereaderext.rb +2 -0
- data/lib/jeventmachine.rb +321 -0
- data/lib/rubyeventmachine.rb +2 -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/server.crt +36 -0
- data/tests/server.key +51 -0
- data/tests/test_attach.rb +150 -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 +53 -0
- data/tests/test_defer.rb +18 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +145 -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 +133 -0
- data/tests/test_idle_connection.rb +25 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_iterator.rb +97 -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 +102 -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_echo_data.rb +60 -0
- data/tests/test_ssl_methods.rb +56 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_stomp.rb +37 -0
- data/tests/test_system.rb +42 -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 +300 -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,133 @@
|
|
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
|
+
# This test fails under JRuby - but not if you use google.com instead of apple.com
|
117
|
+
# Since this client is deprecated, it's probably not worth investigating further
|
118
|
+
def test_https_get
|
119
|
+
d = nil
|
120
|
+
EM.run {
|
121
|
+
http = silent { EM::P::HttpClient2.connect :host => 'www.apple.com', :port => 443, :ssl => true }
|
122
|
+
d = http.get "/"
|
123
|
+
d.errback {
|
124
|
+
fail "Request failed"
|
125
|
+
}
|
126
|
+
d.callback {
|
127
|
+
EM.stop
|
128
|
+
}
|
129
|
+
}
|
130
|
+
assert_equal(200, d.status)
|
131
|
+
end if EM.ssl?
|
132
|
+
|
133
|
+
end
|
@@ -0,0 +1,25 @@
|
|
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
|
+
EM.next_tick{
|
13
|
+
$idle_time_after_send = conn.get_idle_time
|
14
|
+
conn.close_connection
|
15
|
+
EM.stop
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
assert_in_delta 3, $idle_time, 0.2
|
22
|
+
assert_in_delta 0, $idle_time_after_send, 0.1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
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
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'em_test_helper'
|
2
|
+
|
3
|
+
class TestIterator < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def get_time
|
6
|
+
EM.current_time.strftime('%H:%M:%S')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_default_concurrency
|
10
|
+
items = {}
|
11
|
+
list = 1..10
|
12
|
+
EM.run {
|
13
|
+
EM::Iterator.new(list).each( proc {|num,iter|
|
14
|
+
time = get_time
|
15
|
+
items[time] ||= []
|
16
|
+
items[time] << num
|
17
|
+
EM::Timer.new(1) {iter.next}
|
18
|
+
}, proc {EM.stop})
|
19
|
+
}
|
20
|
+
assert_equal(10, items.keys.size)
|
21
|
+
assert_equal((list).to_a, items.values.flatten)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_concurrency_bigger_than_list_size
|
25
|
+
items = {}
|
26
|
+
list = [1,2,3]
|
27
|
+
EM.run {
|
28
|
+
EM::Iterator.new(list,10).each(proc {|num,iter|
|
29
|
+
time = get_time
|
30
|
+
items[time] ||= []
|
31
|
+
items[time] << num
|
32
|
+
EM::Timer.new(1) {iter.next}
|
33
|
+
}, proc {EM.stop})
|
34
|
+
}
|
35
|
+
assert_equal(1, items.keys.size)
|
36
|
+
assert_equal((list).to_a, items.values.flatten)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def test_changing_concurrency_affects_active_iteration
|
41
|
+
items = {}
|
42
|
+
list = 1..25
|
43
|
+
EM.run {
|
44
|
+
i = EM::Iterator.new(list,5)
|
45
|
+
i.each(proc {|num,iter|
|
46
|
+
time = get_time
|
47
|
+
items[time] ||= []
|
48
|
+
items[time] << num
|
49
|
+
EM::Timer.new(1) {iter.next}
|
50
|
+
}, proc {EM.stop})
|
51
|
+
EM.add_timer(1){
|
52
|
+
i.concurrency = 1
|
53
|
+
}
|
54
|
+
EM.add_timer(3){
|
55
|
+
i.concurrency = 3
|
56
|
+
}
|
57
|
+
}
|
58
|
+
assert_equal(9, items.keys.size)
|
59
|
+
assert_equal((list).to_a, items.values.flatten)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_map
|
63
|
+
list = 100..150
|
64
|
+
EM.run {
|
65
|
+
EM::Iterator.new(list).map(proc{ |num,iter|
|
66
|
+
EM.add_timer(0.01){ iter.return(num) }
|
67
|
+
}, proc{ |results|
|
68
|
+
assert_equal((list).to_a.size, results.size)
|
69
|
+
EM.stop
|
70
|
+
})
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_inject
|
75
|
+
list = %w[ pwd uptime uname date ]
|
76
|
+
EM.run {
|
77
|
+
EM::Iterator.new(list, 2).inject({}, proc{ |hash,cmd,iter|
|
78
|
+
EM.system(cmd){ |output,status|
|
79
|
+
hash[cmd] = status.exitstatus == 0 ? output.strip : nil
|
80
|
+
iter.return(hash)
|
81
|
+
}
|
82
|
+
}, proc{ |results|
|
83
|
+
assert_equal(results.keys, list)
|
84
|
+
EM.stop
|
85
|
+
})
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_concurrency_is_0
|
90
|
+
EM.run {
|
91
|
+
assert_raise ArgumentError do
|
92
|
+
EM::Iterator.new(1..5,0)
|
93
|
+
end
|
94
|
+
EM.stop
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|