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.
Files changed (178) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.travis.yml +12 -0
  4. data/.yardopts +7 -0
  5. data/CHANGELOG.md +33 -0
  6. data/GNU +281 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE +60 -0
  9. data/README.md +109 -0
  10. data/Rakefile +20 -0
  11. data/docs/DocumentationGuidesIndex.md +27 -0
  12. data/docs/GettingStarted.md +521 -0
  13. data/docs/old/ChangeLog +211 -0
  14. data/docs/old/DEFERRABLES +246 -0
  15. data/docs/old/EPOLL +141 -0
  16. data/docs/old/INSTALL +13 -0
  17. data/docs/old/KEYBOARD +42 -0
  18. data/docs/old/LEGAL +25 -0
  19. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  20. data/docs/old/PURE_RUBY +75 -0
  21. data/docs/old/RELEASE_NOTES +94 -0
  22. data/docs/old/SMTP +4 -0
  23. data/docs/old/SPAWNED_PROCESSES +148 -0
  24. data/docs/old/TODO +8 -0
  25. data/eventmachine.gemspec +37 -0
  26. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  27. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  28. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  29. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  30. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  31. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  32. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  33. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  34. data/examples/old/ex_channel.rb +43 -0
  35. data/examples/old/ex_queue.rb +2 -0
  36. data/examples/old/ex_tick_loop_array.rb +15 -0
  37. data/examples/old/ex_tick_loop_counter.rb +32 -0
  38. data/examples/old/helper.rb +2 -0
  39. data/ext/binder.cpp +124 -0
  40. data/ext/binder.h +46 -0
  41. data/ext/cmain.cpp +887 -0
  42. data/ext/ed.cpp +1992 -0
  43. data/ext/ed.h +424 -0
  44. data/ext/em.cpp +2352 -0
  45. data/ext/em.h +253 -0
  46. data/ext/eventmachine.h +128 -0
  47. data/ext/extconf.rb +179 -0
  48. data/ext/fastfilereader/extconf.rb +103 -0
  49. data/ext/fastfilereader/mapper.cpp +214 -0
  50. data/ext/fastfilereader/mapper.h +59 -0
  51. data/ext/fastfilereader/rubymain.cpp +127 -0
  52. data/ext/kb.cpp +79 -0
  53. data/ext/page.cpp +107 -0
  54. data/ext/page.h +51 -0
  55. data/ext/pipe.cpp +347 -0
  56. data/ext/project.h +161 -0
  57. data/ext/rubymain.cpp +1318 -0
  58. data/ext/ssl.cpp +476 -0
  59. data/ext/ssl.h +95 -0
  60. data/java/.classpath +6 -0
  61. data/java/.gitignore +1 -0
  62. data/java/.project +17 -0
  63. data/java/src/com/rubyeventmachine/DatagramPacket.java +13 -0
  64. data/java/src/com/rubyeventmachine/EmReactor.java +531 -0
  65. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  66. data/java/src/com/rubyeventmachine/EventCallback.java +7 -0
  67. data/java/src/com/rubyeventmachine/EventCode.java +26 -0
  68. data/java/src/com/rubyeventmachine/EventableChannel.java +130 -0
  69. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +179 -0
  70. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +405 -0
  71. data/java/src/com/rubyeventmachine/SslBox.java +311 -0
  72. data/lib/em/buftok.rb +110 -0
  73. data/lib/em/callback.rb +58 -0
  74. data/lib/em/channel.rb +64 -0
  75. data/lib/em/completion.rb +304 -0
  76. data/lib/em/connection.rb +716 -0
  77. data/lib/em/deferrable.rb +210 -0
  78. data/lib/em/deferrable/pool.rb +2 -0
  79. data/lib/em/file_watch.rb +73 -0
  80. data/lib/em/future.rb +61 -0
  81. data/lib/em/iterator.rb +231 -0
  82. data/lib/em/messages.rb +66 -0
  83. data/lib/em/pool.rb +151 -0
  84. data/lib/em/process_watch.rb +45 -0
  85. data/lib/em/processes.rb +123 -0
  86. data/lib/em/protocols.rb +37 -0
  87. data/lib/em/protocols/header_and_content.rb +138 -0
  88. data/lib/em/protocols/httpclient.rb +279 -0
  89. data/lib/em/protocols/httpclient2.rb +600 -0
  90. data/lib/em/protocols/line_and_text.rb +125 -0
  91. data/lib/em/protocols/line_protocol.rb +29 -0
  92. data/lib/em/protocols/linetext2.rb +161 -0
  93. data/lib/em/protocols/memcache.rb +331 -0
  94. data/lib/em/protocols/object_protocol.rb +46 -0
  95. data/lib/em/protocols/postgres3.rb +246 -0
  96. data/lib/em/protocols/saslauth.rb +175 -0
  97. data/lib/em/protocols/smtpclient.rb +365 -0
  98. data/lib/em/protocols/smtpserver.rb +643 -0
  99. data/lib/em/protocols/socks4.rb +66 -0
  100. data/lib/em/protocols/stomp.rb +205 -0
  101. data/lib/em/protocols/tcptest.rb +54 -0
  102. data/lib/em/pure_ruby.rb +1017 -0
  103. data/lib/em/queue.rb +71 -0
  104. data/lib/em/resolver.rb +209 -0
  105. data/lib/em/spawnable.rb +84 -0
  106. data/lib/em/streamer.rb +118 -0
  107. data/lib/em/threaded_resource.rb +90 -0
  108. data/lib/em/tick_loop.rb +85 -0
  109. data/lib/em/timers.rb +61 -0
  110. data/lib/em/version.rb +3 -0
  111. data/lib/eventmachine.rb +1553 -0
  112. data/lib/fastfilereaderext.rb +2 -0
  113. data/lib/jeventmachine.rb +321 -0
  114. data/lib/rubyeventmachine.rb +2 -0
  115. data/rakelib/cpp.rake_example +77 -0
  116. data/rakelib/package.rake +98 -0
  117. data/rakelib/test.rake +8 -0
  118. data/tests/client.crt +31 -0
  119. data/tests/client.key +51 -0
  120. data/tests/em_test_helper.rb +64 -0
  121. data/tests/server.crt +36 -0
  122. data/tests/server.key +51 -0
  123. data/tests/test_attach.rb +150 -0
  124. data/tests/test_basic.rb +294 -0
  125. data/tests/test_channel.rb +62 -0
  126. data/tests/test_completion.rb +177 -0
  127. data/tests/test_connection_count.rb +53 -0
  128. data/tests/test_defer.rb +18 -0
  129. data/tests/test_deferrable.rb +35 -0
  130. data/tests/test_epoll.rb +145 -0
  131. data/tests/test_error_handler.rb +38 -0
  132. data/tests/test_exc.rb +28 -0
  133. data/tests/test_file_watch.rb +65 -0
  134. data/tests/test_futures.rb +170 -0
  135. data/tests/test_get_sock_opt.rb +37 -0
  136. data/tests/test_handler_check.rb +35 -0
  137. data/tests/test_hc.rb +155 -0
  138. data/tests/test_httpclient.rb +190 -0
  139. data/tests/test_httpclient2.rb +133 -0
  140. data/tests/test_idle_connection.rb +25 -0
  141. data/tests/test_inactivity_timeout.rb +54 -0
  142. data/tests/test_iterator.rb +97 -0
  143. data/tests/test_kb.rb +34 -0
  144. data/tests/test_line_protocol.rb +33 -0
  145. data/tests/test_ltp.rb +138 -0
  146. data/tests/test_ltp2.rb +288 -0
  147. data/tests/test_next_tick.rb +104 -0
  148. data/tests/test_object_protocol.rb +36 -0
  149. data/tests/test_pause.rb +102 -0
  150. data/tests/test_pending_connect_timeout.rb +52 -0
  151. data/tests/test_pool.rb +194 -0
  152. data/tests/test_process_watch.rb +48 -0
  153. data/tests/test_processes.rb +128 -0
  154. data/tests/test_proxy_connection.rb +180 -0
  155. data/tests/test_pure.rb +88 -0
  156. data/tests/test_queue.rb +50 -0
  157. data/tests/test_resolver.rb +55 -0
  158. data/tests/test_running.rb +14 -0
  159. data/tests/test_sasl.rb +47 -0
  160. data/tests/test_send_file.rb +217 -0
  161. data/tests/test_servers.rb +33 -0
  162. data/tests/test_set_sock_opt.rb +37 -0
  163. data/tests/test_shutdown_hooks.rb +23 -0
  164. data/tests/test_smtpclient.rb +55 -0
  165. data/tests/test_smtpserver.rb +57 -0
  166. data/tests/test_spawn.rb +293 -0
  167. data/tests/test_ssl_args.rb +78 -0
  168. data/tests/test_ssl_echo_data.rb +60 -0
  169. data/tests/test_ssl_methods.rb +56 -0
  170. data/tests/test_ssl_verify.rb +82 -0
  171. data/tests/test_stomp.rb +37 -0
  172. data/tests/test_system.rb +42 -0
  173. data/tests/test_threaded_resource.rb +53 -0
  174. data/tests/test_tick_loop.rb +59 -0
  175. data/tests/test_timers.rb +123 -0
  176. data/tests/test_ud.rb +8 -0
  177. data/tests/test_unbind_reason.rb +48 -0
  178. 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