sensu-em 2.0.0-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.
Files changed (177) 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 +38 -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 +1988 -0
  43. data/ext/ed.h +422 -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 +468 -0
  59. data/ext/ssl.h +94 -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 +529 -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 +180 -0
  70. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +405 -0
  71. data/java/src/com/rubyeventmachine/SslBox.java +310 -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 +712 -0
  77. data/lib/em/deferrable/pool.rb +2 -0
  78. data/lib/em/deferrable.rb +210 -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/header_and_content.rb +138 -0
  87. data/lib/em/protocols/httpclient.rb +279 -0
  88. data/lib/em/protocols/httpclient2.rb +600 -0
  89. data/lib/em/protocols/line_and_text.rb +125 -0
  90. data/lib/em/protocols/line_protocol.rb +29 -0
  91. data/lib/em/protocols/linetext2.rb +161 -0
  92. data/lib/em/protocols/memcache.rb +331 -0
  93. data/lib/em/protocols/object_protocol.rb +46 -0
  94. data/lib/em/protocols/postgres3.rb +246 -0
  95. data/lib/em/protocols/saslauth.rb +175 -0
  96. data/lib/em/protocols/smtpclient.rb +365 -0
  97. data/lib/em/protocols/smtpserver.rb +643 -0
  98. data/lib/em/protocols/socks4.rb +66 -0
  99. data/lib/em/protocols/stomp.rb +205 -0
  100. data/lib/em/protocols/tcptest.rb +54 -0
  101. data/lib/em/protocols.rb +37 -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/jeventmachine.rb +321 -0
  113. data/lib/rubyeventmachine.jar +0 -0
  114. data/rakelib/cpp.rake_example +77 -0
  115. data/rakelib/package.rake +98 -0
  116. data/rakelib/test.rake +8 -0
  117. data/tests/client.crt +31 -0
  118. data/tests/client.key +51 -0
  119. data/tests/em_test_helper.rb +64 -0
  120. data/tests/server.crt +36 -0
  121. data/tests/server.key +51 -0
  122. data/tests/test_attach.rb +150 -0
  123. data/tests/test_basic.rb +294 -0
  124. data/tests/test_channel.rb +62 -0
  125. data/tests/test_completion.rb +177 -0
  126. data/tests/test_connection_count.rb +53 -0
  127. data/tests/test_defer.rb +18 -0
  128. data/tests/test_deferrable.rb +35 -0
  129. data/tests/test_epoll.rb +145 -0
  130. data/tests/test_error_handler.rb +38 -0
  131. data/tests/test_exc.rb +28 -0
  132. data/tests/test_file_watch.rb +65 -0
  133. data/tests/test_futures.rb +170 -0
  134. data/tests/test_get_sock_opt.rb +37 -0
  135. data/tests/test_handler_check.rb +35 -0
  136. data/tests/test_hc.rb +155 -0
  137. data/tests/test_httpclient.rb +190 -0
  138. data/tests/test_httpclient2.rb +133 -0
  139. data/tests/test_idle_connection.rb +25 -0
  140. data/tests/test_inactivity_timeout.rb +54 -0
  141. data/tests/test_iterator.rb +97 -0
  142. data/tests/test_kb.rb +34 -0
  143. data/tests/test_line_protocol.rb +33 -0
  144. data/tests/test_ltp.rb +138 -0
  145. data/tests/test_ltp2.rb +288 -0
  146. data/tests/test_next_tick.rb +104 -0
  147. data/tests/test_object_protocol.rb +36 -0
  148. data/tests/test_pause.rb +102 -0
  149. data/tests/test_pending_connect_timeout.rb +52 -0
  150. data/tests/test_pool.rb +194 -0
  151. data/tests/test_process_watch.rb +48 -0
  152. data/tests/test_processes.rb +128 -0
  153. data/tests/test_proxy_connection.rb +180 -0
  154. data/tests/test_pure.rb +88 -0
  155. data/tests/test_queue.rb +50 -0
  156. data/tests/test_resolver.rb +55 -0
  157. data/tests/test_running.rb +14 -0
  158. data/tests/test_sasl.rb +47 -0
  159. data/tests/test_send_file.rb +217 -0
  160. data/tests/test_servers.rb +33 -0
  161. data/tests/test_set_sock_opt.rb +37 -0
  162. data/tests/test_shutdown_hooks.rb +23 -0
  163. data/tests/test_smtpclient.rb +55 -0
  164. data/tests/test_smtpserver.rb +57 -0
  165. data/tests/test_spawn.rb +293 -0
  166. data/tests/test_ssl_args.rb +78 -0
  167. data/tests/test_ssl_echo_data.rb +60 -0
  168. data/tests/test_ssl_methods.rb +56 -0
  169. data/tests/test_ssl_verify.rb +82 -0
  170. data/tests/test_stomp.rb +37 -0
  171. data/tests/test_system.rb +42 -0
  172. data/tests/test_threaded_resource.rb +53 -0
  173. data/tests/test_tick_loop.rb +59 -0
  174. data/tests/test_timers.rb +123 -0
  175. data/tests/test_ud.rb +8 -0
  176. data/tests/test_unbind_reason.rb +48 -0
  177. metadata +297 -0
@@ -0,0 +1,180 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestProxyConnection < Test::Unit::TestCase
4
+
5
+ if EM.respond_to?(:start_proxy)
6
+ module ProxyConnection
7
+ def initialize(client, request)
8
+ @client, @request = client, request
9
+ end
10
+
11
+ def post_init
12
+ EM::enable_proxy(self, @client)
13
+ end
14
+
15
+ def connection_completed
16
+ EM.next_tick {
17
+ send_data @request
18
+ }
19
+ end
20
+
21
+ def proxy_target_unbound
22
+ $unbound_early = true
23
+ EM.stop
24
+ end
25
+
26
+ def unbind
27
+ $proxied_bytes = self.get_proxied_bytes
28
+ @client.close_connection_after_writing
29
+ end
30
+ end
31
+
32
+ module PartialProxyConnection
33
+ def initialize(client, request, length)
34
+ @client, @request, @length = client, request, length
35
+ end
36
+
37
+ def post_init
38
+ EM::enable_proxy(self, @client, 0, @length)
39
+ end
40
+
41
+ def receive_data(data)
42
+ $unproxied_data = data
43
+ @client.send_data(data)
44
+ end
45
+
46
+ def connection_completed
47
+ EM.next_tick {
48
+ send_data @request
49
+ }
50
+ end
51
+
52
+ def proxy_target_unbound
53
+ $unbound_early = true
54
+ EM.stop
55
+ end
56
+
57
+ def proxy_completed
58
+ $proxy_completed = true
59
+ end
60
+
61
+ def unbind
62
+ @client.close_connection_after_writing
63
+ end
64
+ end
65
+
66
+ module Client
67
+ def connection_completed
68
+ send_data "EM rocks!"
69
+ end
70
+
71
+ def receive_data(data)
72
+ $client_data = data
73
+ end
74
+
75
+ def unbind
76
+ EM.stop
77
+ end
78
+ end
79
+
80
+ module Client2
81
+ include Client
82
+ def unbind; end
83
+ end
84
+
85
+ module Server
86
+ def receive_data(data)
87
+ send_data "I know!" if data == "EM rocks!"
88
+ close_connection_after_writing
89
+ end
90
+ end
91
+
92
+ module ProxyServer
93
+ def initialize port
94
+ @port = port
95
+ end
96
+
97
+ def receive_data(data)
98
+ @proxy = EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
99
+ end
100
+ end
101
+
102
+ module PartialProxyServer
103
+ def initialize port
104
+ @port = port
105
+ end
106
+
107
+ def receive_data(data)
108
+ EM.connect("127.0.0.1", @port, PartialProxyConnection, self, data, 1)
109
+ end
110
+ end
111
+
112
+ module EarlyClosingProxy
113
+ def initialize port
114
+ @port = port
115
+ end
116
+
117
+ def receive_data(data)
118
+ EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
119
+ close_connection
120
+ end
121
+ end
122
+
123
+ def setup
124
+ @port = next_port
125
+ @proxy_port = next_port
126
+ end
127
+
128
+ def test_proxy_connection
129
+ EM.run {
130
+ EM.start_server("127.0.0.1", @port, Server)
131
+ EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
132
+ EM.connect("127.0.0.1", @proxy_port, Client)
133
+ }
134
+
135
+ assert_equal("I know!", $client_data)
136
+ end
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
+
149
+ def test_partial_proxy_connection
150
+ EM.run {
151
+ EM.start_server("127.0.0.1", @port, Server)
152
+ EM.start_server("127.0.0.1", @proxy_port, PartialProxyServer, @port)
153
+ EM.connect("127.0.0.1", @proxy_port, Client)
154
+ }
155
+
156
+ assert_equal("I know!", $client_data)
157
+ assert_equal(" know!", $unproxied_data)
158
+ assert($proxy_completed)
159
+ end
160
+
161
+ def test_early_close
162
+ $client_data = nil
163
+ EM.run {
164
+ EM.start_server("127.0.0.1", @port, Server)
165
+ EM.start_server("127.0.0.1", @proxy_port, EarlyClosingProxy, @port)
166
+ EM.connect("127.0.0.1", @proxy_port, Client2)
167
+ }
168
+
169
+ assert($unbound_early)
170
+ end
171
+ else
172
+ warn "EM.start_proxy not implemented, skipping tests in #{__FILE__}"
173
+
174
+ # Because some rubies will complain if a TestCase class has no tests
175
+ def test_em_start_proxy_not_implemented
176
+ assert !EM.respond_to?(:start_proxy)
177
+ end
178
+ end
179
+
180
+ end
@@ -0,0 +1,88 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestPure < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @port = next_port
7
+ end
8
+
9
+ # These tests are intended to exercise problems that come up in the
10
+ # pure-Ruby implementation. However, we DON'T constrain them such that
11
+ # they only run in pure-Ruby. These tests need to work identically in
12
+ # any implementation.
13
+
14
+ #-------------------------------------
15
+
16
+ # The EM reactor needs to run down open connections and release other resources
17
+ # when it stops running. Make sure this happens even if user code throws a Ruby
18
+ # exception.
19
+ # If exception handling is incorrect, the second test will fail with a no-bind error
20
+ # because the TCP server opened in the first test will not have been closed.
21
+
22
+ def test_exception_handling_releases_resources
23
+ exception = Class.new(StandardError)
24
+
25
+ 2.times do
26
+ assert_raises(exception) do
27
+ EM.run do
28
+ EM.start_server "127.0.0.1", @port
29
+ raise exception
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
36
+ # exception on certain kinds of TCP connect-errors.
37
+ # It's always been something of an open question whether EM should throw an exception
38
+ # in these cases but the defined answer has always been to catch it the unbind method.
39
+ # With a connect failure, the latter will always fire, but connection_completed will
40
+ # never fire. So even though the point is arguable, it's incorrect for the pure Ruby
41
+ # version to throw an exception.
42
+ module TestConnrefused
43
+ def unbind
44
+ EM.stop
45
+ end
46
+ def connection_completed
47
+ raise "should never get here"
48
+ end
49
+ end
50
+
51
+ def test_connrefused
52
+ assert_nothing_raised do
53
+ EM.run {
54
+ setup_timeout(2)
55
+ EM.connect "127.0.0.1", @port, TestConnrefused
56
+ }
57
+ end
58
+ end
59
+
60
+ # Make sure connection_completed gets called as expected with TCP clients. This is the
61
+ # opposite of test_connrefused.
62
+ # If the test fails, it will hang because EM.stop never gets called.
63
+ #
64
+ module TestConnaccepted
65
+ def connection_completed
66
+ EM.stop
67
+ end
68
+ end
69
+ def test_connaccepted
70
+ assert_nothing_raised do
71
+ EM.run {
72
+ EM.start_server "127.0.0.1", @port
73
+ EM.connect "127.0.0.1", @port, TestConnaccepted
74
+ setup_timeout(1)
75
+ }
76
+ end
77
+ end
78
+
79
+ def test_reactor_running
80
+ a = false
81
+ EM.run {
82
+ a = EM.reactor_running?
83
+ EM.next_tick {EM.stop}
84
+ }
85
+ assert a
86
+ end
87
+
88
+ end
@@ -0,0 +1,50 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestEMQueue < Test::Unit::TestCase
4
+ def test_queue_push
5
+ s = 0
6
+ EM.run do
7
+ q = EM::Queue.new
8
+ q.push(1)
9
+ EM.next_tick { s = q.size; EM.stop }
10
+ end
11
+ assert_equal 1, s
12
+ end
13
+
14
+ def test_queue_pop
15
+ x,y,z = nil
16
+ EM.run do
17
+ q = EM::Queue.new
18
+ q.push(1,2,3)
19
+ q.pop { |v| x = v }
20
+ q.pop { |v| y = v }
21
+ q.pop { |v| z = v; EM.stop }
22
+ end
23
+ assert_equal 1, x
24
+ assert_equal 2, y
25
+ assert_equal 3, z
26
+ end
27
+
28
+ def test_queue_reactor_thread
29
+ q = EM::Queue.new
30
+
31
+ Thread.new { q.push(1,2,3) }.join
32
+ assert q.empty?
33
+ EM.run { EM.next_tick { EM.stop } }
34
+ assert_equal 3, q.size
35
+
36
+ x = nil
37
+ Thread.new { q.pop { |v| x = v } }.join
38
+ assert_equal nil, x
39
+ EM.run { EM.next_tick { EM.stop } }
40
+ assert_equal 1, x
41
+ end
42
+
43
+ def test_num_waiting
44
+ q = EM::Queue.new
45
+ many = 3
46
+ many.times { q.pop {} }
47
+ EM.run { EM.next_tick { EM.stop } }
48
+ assert_equal many, q.num_waiting
49
+ end
50
+ end
@@ -0,0 +1,55 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestResolver < Test::Unit::TestCase
4
+ def test_a
5
+ EM.run {
6
+ d = EM::DNS::Resolver.resolve "google.com"
7
+ d.errback { assert false }
8
+ d.callback { |r|
9
+ assert r
10
+ EM.stop
11
+ }
12
+ }
13
+ end
14
+
15
+ def test_bad_host
16
+ EM.run {
17
+ d = EM::DNS::Resolver.resolve "asdfasasdf"
18
+ d.callback { assert false }
19
+ d.errback { assert true; EM.stop }
20
+ }
21
+ end
22
+
23
+ def test_garbage
24
+ assert_raises( ArgumentError ) {
25
+ EM.run {
26
+ EM::DNS::Resolver.resolve 123
27
+ }
28
+ }
29
+ end
30
+
31
+ def test_a_pair
32
+ EM.run {
33
+ d = EM::DNS::Resolver.resolve "google.com"
34
+ d.errback { assert false }
35
+ d.callback { |r|
36
+ assert_equal(Array, r.class)
37
+ assert r.size > 1
38
+ EM.stop
39
+ }
40
+ }
41
+ end
42
+
43
+ def test_localhost
44
+ EM.run {
45
+ d = EM::DNS::Resolver.resolve "localhost"
46
+ d.errback { assert false }
47
+ d.callback { |r|
48
+ assert_equal("127.0.0.1", r.first)
49
+ assert_equal(Array, r.class)
50
+
51
+ EM.stop
52
+ }
53
+ }
54
+ end
55
+ end
@@ -0,0 +1,14 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestRunning < Test::Unit::TestCase
4
+ def test_running
5
+ assert_equal( false, EM::reactor_running? )
6
+ r = false
7
+ EM.run {
8
+ r = EM::reactor_running?
9
+ EM.stop
10
+ }
11
+ assert_equal( true, r )
12
+ end
13
+ end
14
+
@@ -0,0 +1,47 @@
1
+ require 'em_test_helper'
2
+
3
+
4
+ class TestSASL < Test::Unit::TestCase
5
+
6
+ # SASL authentication is usually done with UNIX-domain sockets, but
7
+ # we'll use TCP so this test will work on Windows. As far as the
8
+ # protocol handlers are concerned, there's no difference.
9
+
10
+ TestUser,TestPsw = "someone", "password"
11
+
12
+ class SaslServer < EM::Connection
13
+ include EM::Protocols::SASLauth
14
+ def validate usr, psw, sys, realm
15
+ usr == TestUser and psw == TestPsw
16
+ end
17
+ end
18
+
19
+ class SaslClient < EM::Connection
20
+ include EM::Protocols::SASLauthclient
21
+ end
22
+
23
+ def setup
24
+ @port = next_port
25
+ end
26
+
27
+ def test_sasl
28
+ resp = nil
29
+ EM.run {
30
+ EM.start_server( "127.0.0.1", @port, SaslServer )
31
+
32
+ c = EM.connect( "127.0.0.1", @port, SaslClient )
33
+ d = c.validate?( TestUser, TestPsw )
34
+ d.timeout 1
35
+ d.callback {
36
+ resp = true
37
+ EM.stop
38
+ }
39
+ d.errback {
40
+ resp = false
41
+ EM.stop
42
+ }
43
+ }
44
+ assert_equal( true, resp )
45
+ end
46
+
47
+ end
@@ -0,0 +1,217 @@
1
+ require 'em_test_helper'
2
+ require 'tempfile'
3
+
4
+ class TestSendFile < Test::Unit::TestCase
5
+
6
+ if EM.respond_to?(:send_file_data)
7
+ module TestModule
8
+ def initialize filename
9
+ @filename = filename
10
+ end
11
+
12
+ def post_init
13
+ send_file_data @filename
14
+ close_connection_after_writing
15
+ end
16
+ end
17
+
18
+ module TestClient
19
+ def data_to(&blk)
20
+ @data_to = blk
21
+ end
22
+
23
+ def receive_data(data)
24
+ @data_to.call(data) if @data_to
25
+ end
26
+
27
+ def unbind
28
+ EM.stop
29
+ end
30
+ end
31
+
32
+ def setup
33
+ @file = Tempfile.new("em_test_file")
34
+ @filename = @file.path
35
+ @port = next_port
36
+ end
37
+
38
+ def test_send_file
39
+ File.open( @filename, "w" ) {|f|
40
+ f << ("A" * 5000)
41
+ }
42
+
43
+ data = ''
44
+
45
+ EM.run {
46
+ EM.start_server "127.0.0.1", @port, TestModule, @filename
47
+ setup_timeout
48
+
49
+ EM.connect "127.0.0.1", @port, TestClient do |c|
50
+ c.data_to { |d| data << d }
51
+ end
52
+ }
53
+
54
+ assert_equal( "A" * 5000, data )
55
+ end
56
+
57
+ # EM::Connection#send_file_data has a strict upper limit on the filesize it will work with.
58
+ def test_send_large_file
59
+ File.open( @filename, "w" ) {|f|
60
+ f << ("A" * 1000000)
61
+ }
62
+
63
+ data = ''
64
+
65
+ assert_raises(RuntimeError) {
66
+ EM.run {
67
+ EM.start_server "127.0.0.1", @port, TestModule, @filename
68
+ setup_timeout
69
+ EM.connect "127.0.0.1", @port, TestClient do |c|
70
+ c.data_to { |d| data << d }
71
+ end
72
+ }
73
+ }
74
+ end
75
+
76
+ module StreamTestModule
77
+ def initialize filename
78
+ @filename = filename
79
+ end
80
+
81
+ def post_init
82
+ EM::Deferrable.future( stream_file_data(@filename)) {
83
+ close_connection_after_writing
84
+ }
85
+ end
86
+ end
87
+
88
+ module ChunkStreamTestModule
89
+ def initialize filename
90
+ @filename = filename
91
+ end
92
+
93
+ def post_init
94
+ EM::Deferrable.future( stream_file_data(@filename, :http_chunks=>true)) {
95
+ close_connection_after_writing
96
+ }
97
+ end
98
+ end
99
+
100
+ def test_stream_file_data
101
+ File.open( @filename, "w" ) {|f|
102
+ f << ("A" * 1000)
103
+ }
104
+
105
+ data = ''
106
+
107
+ EM.run {
108
+ EM.start_server "127.0.0.1", @port, StreamTestModule, @filename
109
+ setup_timeout
110
+ EM.connect "127.0.0.1", @port, TestClient do |c|
111
+ c.data_to { |d| data << d }
112
+ end
113
+ }
114
+
115
+ assert_equal( "A" * 1000, data )
116
+ end
117
+
118
+ def test_stream_chunked_file_data
119
+ File.open( @filename, "w" ) {|f|
120
+ f << ("A" * 1000)
121
+ }
122
+
123
+ data = ''
124
+
125
+ EM.run {
126
+ EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename
127
+ setup_timeout
128
+ EM.connect "127.0.0.1", @port, TestClient do |c|
129
+ c.data_to { |d| data << d }
130
+ end
131
+ }
132
+
133
+ assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
134
+ end
135
+
136
+ module BadFileTestModule
137
+ def initialize filename
138
+ @filename = filename
139
+ end
140
+
141
+ def post_init
142
+ de = stream_file_data( @filename+".wrong" )
143
+ de.errback {|msg|
144
+ send_data msg
145
+ close_connection_after_writing
146
+ }
147
+ end
148
+ end
149
+ def test_stream_bad_file
150
+ data = ''
151
+ EM.run {
152
+ EM.start_server "127.0.0.1", @port, BadFileTestModule, @filename
153
+ setup_timeout(5)
154
+ EM.connect "127.0.0.1", @port, TestClient do |c|
155
+ c.data_to { |d| data << d }
156
+ end
157
+ }
158
+
159
+ assert_equal( "file not found", data )
160
+ end
161
+ else
162
+ warn "EM.send_file_data not implemented, skipping tests in #{__FILE__}"
163
+
164
+ # Because some rubies will complain if a TestCase class has no tests
165
+ def test_em_send_file_data_not_implemented
166
+ assert !EM.respond_to?(:send_file_data)
167
+ end
168
+ end
169
+
170
+ begin
171
+ require 'fastfilereaderext'
172
+
173
+ def test_stream_large_file_data
174
+ File.open( @filename, "w" ) {|f|
175
+ f << ("A" * 10000)
176
+ }
177
+
178
+ data = ''
179
+
180
+ EM.run {
181
+ EM.start_server "127.0.0.1", @port, StreamTestModule, @filename
182
+ setup_timeout
183
+ EM.connect "127.0.0.1", @port, TestClient do |c|
184
+ c.data_to { |d| data << d }
185
+ end
186
+ }
187
+
188
+ assert_equal( "A" * 10000, data )
189
+ end
190
+
191
+ def test_stream_large_chunked_file_data
192
+ File.open( @filename, "w" ) {|f|
193
+ f << ("A" * 100000)
194
+ }
195
+
196
+ data = ''
197
+
198
+ EM.run {
199
+ EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename
200
+ setup_timeout
201
+ EM.connect "127.0.0.1", @port, TestClient do |c|
202
+ c.data_to { |d| data << d }
203
+ end
204
+ }
205
+
206
+ expected = [
207
+ "4000\r\n#{"A" * 16384}\r\n" * 6,
208
+ "6a0\r\n#{"A" * 0x6a0}\r\n",
209
+ "0\r\n\r\n"
210
+ ].join
211
+ assert_equal( expected, data )
212
+ end
213
+ rescue LoadError
214
+ warn "require 'fastfilereaderext' failed, skipping tests in #{__FILE__}"
215
+ end
216
+
217
+ end
@@ -0,0 +1,33 @@
1
+ require 'em_test_helper'
2
+ require 'socket'
3
+
4
+ class TestServers < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @port = next_port
8
+ end
9
+
10
+ def server_alive?
11
+ port_in_use?(@port)
12
+ end
13
+
14
+ def run_test_stop_server
15
+ EM.run {
16
+ sig = EM.start_server("127.0.0.1", @port)
17
+ assert server_alive?, "Server didn't start"
18
+ EM.stop_server sig
19
+ # Give the server some time to shutdown.
20
+ EM.add_timer(0.1) {
21
+ assert !server_alive?, "Server didn't stop"
22
+ EM.stop
23
+ }
24
+ }
25
+ end
26
+
27
+ def test_stop_server
28
+ assert !server_alive?, "Port already in use"
29
+ 2.times { run_test_stop_server }
30
+ assert !server_alive?, "Servers didn't stop"
31
+ end
32
+
33
+ end