MattHulse-eventmachine 0.0.1

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 (156) hide show
  1. data/.gitignore +14 -0
  2. data/README +82 -0
  3. data/Rakefile +279 -0
  4. data/docs/COPYING +60 -0
  5. data/docs/ChangeLog +211 -0
  6. data/docs/DEFERRABLES +133 -0
  7. data/docs/EPOLL +141 -0
  8. data/docs/GNU +281 -0
  9. data/docs/INSTALL +13 -0
  10. data/docs/KEYBOARD +38 -0
  11. data/docs/LEGAL +25 -0
  12. data/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
  13. data/docs/PURE_RUBY +75 -0
  14. data/docs/RELEASE_NOTES +94 -0
  15. data/docs/SMTP +2 -0
  16. data/docs/SPAWNED_PROCESSES +89 -0
  17. data/docs/TODO +8 -0
  18. data/eventmachine.gemspec +41 -0
  19. data/examples/ex_channel.rb +43 -0
  20. data/examples/ex_queue.rb +2 -0
  21. data/examples/helper.rb +2 -0
  22. data/ext/binder.cpp +125 -0
  23. data/ext/binder.h +46 -0
  24. data/ext/cmain.cpp +821 -0
  25. data/ext/cplusplus.cpp +202 -0
  26. data/ext/ed.cpp +1868 -0
  27. data/ext/ed.h +416 -0
  28. data/ext/em.cpp +2270 -0
  29. data/ext/em.h +228 -0
  30. data/ext/emwin.cpp +300 -0
  31. data/ext/emwin.h +94 -0
  32. data/ext/epoll.cpp +26 -0
  33. data/ext/epoll.h +25 -0
  34. data/ext/eventmachine.h +122 -0
  35. data/ext/eventmachine_cpp.h +96 -0
  36. data/ext/extconf.rb +138 -0
  37. data/ext/fastfilereader/extconf.rb +84 -0
  38. data/ext/fastfilereader/mapper.cpp +214 -0
  39. data/ext/fastfilereader/mapper.h +59 -0
  40. data/ext/fastfilereader/rubymain.cpp +127 -0
  41. data/ext/files.cpp +94 -0
  42. data/ext/files.h +65 -0
  43. data/ext/kb.cpp +81 -0
  44. data/ext/page.cpp +107 -0
  45. data/ext/page.h +51 -0
  46. data/ext/pipe.cpp +349 -0
  47. data/ext/project.h +147 -0
  48. data/ext/rubymain.cpp +1152 -0
  49. data/ext/sigs.cpp +89 -0
  50. data/ext/sigs.h +32 -0
  51. data/ext/ssl.cpp +460 -0
  52. data/ext/ssl.h +94 -0
  53. data/java/.classpath +8 -0
  54. data/java/.project +17 -0
  55. data/java/src/com/rubyeventmachine/Application.java +192 -0
  56. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  57. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  58. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  59. data/java/src/com/rubyeventmachine/EmReactor.java +557 -0
  60. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  61. data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  62. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  63. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  64. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  65. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  66. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  67. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +146 -0
  68. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  69. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  70. data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
  71. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
  72. data/lib/em/buftok.rb +138 -0
  73. data/lib/em/callback.rb +26 -0
  74. data/lib/em/channel.rb +57 -0
  75. data/lib/em/connection.rb +564 -0
  76. data/lib/em/deferrable.rb +187 -0
  77. data/lib/em/file_watch.rb +54 -0
  78. data/lib/em/future.rb +61 -0
  79. data/lib/em/messages.rb +66 -0
  80. data/lib/em/process_watch.rb +44 -0
  81. data/lib/em/processes.rb +119 -0
  82. data/lib/em/protocols.rb +35 -0
  83. data/lib/em/protocols/header_and_content.rb +138 -0
  84. data/lib/em/protocols/httpclient.rb +263 -0
  85. data/lib/em/protocols/httpclient2.rb +582 -0
  86. data/lib/em/protocols/line_and_text.rb +126 -0
  87. data/lib/em/protocols/linetext2.rb +160 -0
  88. data/lib/em/protocols/memcache.rb +323 -0
  89. data/lib/em/protocols/object_protocol.rb +45 -0
  90. data/lib/em/protocols/postgres3.rb +247 -0
  91. data/lib/em/protocols/saslauth.rb +175 -0
  92. data/lib/em/protocols/smtpclient.rb +350 -0
  93. data/lib/em/protocols/smtpserver.rb +547 -0
  94. data/lib/em/protocols/stomp.rb +200 -0
  95. data/lib/em/protocols/tcptest.rb +53 -0
  96. data/lib/em/queue.rb +61 -0
  97. data/lib/em/spawnable.rb +85 -0
  98. data/lib/em/streamer.rb +130 -0
  99. data/lib/em/timers.rb +55 -0
  100. data/lib/em/version.rb +3 -0
  101. data/lib/eventmachine.rb +1698 -0
  102. data/lib/evma.rb +32 -0
  103. data/lib/evma/callback.rb +32 -0
  104. data/lib/evma/container.rb +75 -0
  105. data/lib/evma/factory.rb +77 -0
  106. data/lib/evma/protocol.rb +87 -0
  107. data/lib/evma/reactor.rb +48 -0
  108. data/lib/jeventmachine.rb +246 -0
  109. data/lib/pr_eventmachine.rb +1022 -0
  110. data/setup.rb +1585 -0
  111. data/tasks/cpp.rake +77 -0
  112. data/tasks/project.rake +79 -0
  113. data/tasks/tests.rake +193 -0
  114. data/tests/client.crt +31 -0
  115. data/tests/client.key +51 -0
  116. data/tests/test_attach.rb +126 -0
  117. data/tests/test_basic.rb +284 -0
  118. data/tests/test_channel.rb +63 -0
  119. data/tests/test_connection_count.rb +35 -0
  120. data/tests/test_defer.rb +47 -0
  121. data/tests/test_epoll.rb +160 -0
  122. data/tests/test_error_handler.rb +35 -0
  123. data/tests/test_errors.rb +82 -0
  124. data/tests/test_exc.rb +55 -0
  125. data/tests/test_file_watch.rb +49 -0
  126. data/tests/test_futures.rb +198 -0
  127. data/tests/test_handler_check.rb +37 -0
  128. data/tests/test_hc.rb +218 -0
  129. data/tests/test_httpclient.rb +218 -0
  130. data/tests/test_httpclient2.rb +153 -0
  131. data/tests/test_inactivity_timeout.rb +50 -0
  132. data/tests/test_kb.rb +60 -0
  133. data/tests/test_ltp.rb +182 -0
  134. data/tests/test_ltp2.rb +317 -0
  135. data/tests/test_next_tick.rb +133 -0
  136. data/tests/test_object_protocol.rb +37 -0
  137. data/tests/test_process_watch.rb +48 -0
  138. data/tests/test_processes.rb +128 -0
  139. data/tests/test_proxy_connection.rb +92 -0
  140. data/tests/test_pure.rb +125 -0
  141. data/tests/test_queue.rb +44 -0
  142. data/tests/test_running.rb +42 -0
  143. data/tests/test_sasl.rb +72 -0
  144. data/tests/test_send_file.rb +242 -0
  145. data/tests/test_servers.rb +76 -0
  146. data/tests/test_smtpclient.rb +83 -0
  147. data/tests/test_smtpserver.rb +85 -0
  148. data/tests/test_spawn.rb +322 -0
  149. data/tests/test_ssl_args.rb +68 -0
  150. data/tests/test_ssl_methods.rb +50 -0
  151. data/tests/test_ssl_verify.rb +82 -0
  152. data/tests/test_timers.rb +162 -0
  153. data/tests/test_ud.rb +36 -0
  154. data/tests/testem.rb +31 -0
  155. data/web/whatis +7 -0
  156. metadata +223 -0
@@ -0,0 +1,284 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ $:.unshift File.expand_path(File.dirname(__FILE__) + "/../lib")
28
+ require 'eventmachine'
29
+ require 'socket'
30
+ require 'test/unit'
31
+
32
+ class TestBasic < Test::Unit::TestCase
33
+
34
+ def setup
35
+ assert(!EM.reactor_running?)
36
+ end
37
+
38
+ def teardown
39
+ assert(!EM.reactor_running?)
40
+ end
41
+
42
+ #-------------------------------------
43
+
44
+ def test_libtype
45
+ lt = EventMachine.library_type
46
+ em_lib = (ENV["EVENTMACHINE_LIBRARY"] || $eventmachine_library || :xxx).to_sym
47
+
48
+ # Running from test runner, under jruby.
49
+ if RUBY_PLATFORM == 'java'
50
+ unless em_lib == :pure_ruby
51
+ assert_equal( :java, lt )
52
+ return
53
+ end
54
+ end
55
+
56
+ case em_lib
57
+ when :pure_ruby
58
+ assert_equal( :pure_ruby, lt )
59
+ when :extension
60
+ assert_equal( :extension, lt )
61
+ when :java
62
+ assert_equal( :java, lt )
63
+ else
64
+ # Running from jruby as a standalone test.
65
+ if RUBY_PLATFORM == 'java'
66
+ assert_equal( :java, lt )
67
+ else
68
+ assert_equal( :extension, lt )
69
+ end
70
+ end
71
+ end
72
+
73
+ #-------------------------------------
74
+
75
+
76
+ def test_em
77
+ EventMachine.run {
78
+ EventMachine.add_timer 0 do
79
+ EventMachine.stop
80
+ end
81
+ }
82
+ end
83
+
84
+ #-------------------------------------
85
+
86
+ def test_timer
87
+ n = 0
88
+ EventMachine.run {
89
+ EventMachine.add_periodic_timer(0.1) {
90
+ n += 1
91
+ EventMachine.stop if n == 2
92
+ }
93
+ }
94
+ end
95
+
96
+ #-------------------------------------
97
+
98
+ # This test once threw an already-running exception.
99
+ module Trivial
100
+ def post_init
101
+ EventMachine.stop
102
+ end
103
+ end
104
+
105
+ def test_server
106
+ EventMachine.run {
107
+ EventMachine.start_server "localhost", 9000, Trivial
108
+ EventMachine.connect "localhost", 9000
109
+ }
110
+ assert( true ) # make sure it halts
111
+ end
112
+
113
+ #--------------------------------------
114
+
115
+ # EventMachine#run_block starts the reactor loop, runs the supplied block, and then STOPS
116
+ # the loop automatically. Contrast with EventMachine#run, which keeps running the reactor
117
+ # even after the supplied block completes.
118
+ def test_run_block
119
+ assert !EM.reactor_running?
120
+ a = nil
121
+ EM.run_block { a = "Worked" }
122
+ assert a
123
+ assert !EM.reactor_running?
124
+ end
125
+
126
+
127
+ #--------------------------------------
128
+
129
+ # TODO! This is an unfinished edge case.
130
+ # EM mishandles uncaught Ruby exceptions that fire from within #unbind handlers.
131
+ # A uncaught Ruby exception results in a call to EM::release_machine (which is in an ensure
132
+ # block in EM::run). But if EM is processing an unbind request, the release_machine call
133
+ # will cause a segmentation fault.
134
+ #
135
+
136
+ TestHost = "127.0.0.1"
137
+ TestPort = 9070
138
+
139
+ class UnbindError < EM::Connection
140
+ def initialize *args
141
+ super
142
+ end
143
+ def connection_completed
144
+ close_connection_after_writing
145
+ end
146
+ def unbind
147
+ raise "Blooey"
148
+ end
149
+ end
150
+
151
+ def xxx_test_unbind_error
152
+ assert_raises( RuntimeError ) {
153
+ EM.run {
154
+ EM.start_server TestHost, TestPort
155
+ EM.connect TestHost, TestPort, UnbindError
156
+ }
157
+ }
158
+ end
159
+
160
+ #------------------------------------
161
+ #
162
+ # TODO. This is an unfinished bug fix.
163
+ # This case was originally reported by Dan Aquino. If you throw a Ruby exception
164
+ # in a post_init handler, it gets rethrown as a confusing reactor exception.
165
+ # The problem is in eventmachine.rb, which calls post_init within the private
166
+ # initialize method of the EM::Connection class. This happens in both the EM::connect
167
+ # method and in the code that responds to connection-accepted events.
168
+ # What happens is that we instantiate the new connection object, which calls
169
+ # initialize, and then after initialize returns, we stick the new connection object
170
+ # into EM's @conns hashtable.
171
+ # But the problem is that Connection::initialize calls #post_init before it returns,
172
+ # and this may be user-written code that may throw an uncaught Ruby exception.
173
+ # If that happens, the reactor will abort, and it will then try to run down open
174
+ # connections. Because @conns never got a chance to properly reflect the new connection
175
+ # (because initialize never returned), we throw a ConnectionNotBound error
176
+ # (eventmachine.rb line 1080).
177
+ # When the bug is fixed, activate this test case.
178
+ #
179
+
180
+ class PostInitError < EM::Connection
181
+ def post_init
182
+ aaa bbb # should produce a Ruby exception
183
+ end
184
+ end
185
+ # This test causes issues, the machine becomes unreleasable after
186
+ # release_machine suffers an exception in event_callback.
187
+ def xxx_test_post_init_error
188
+ assert_raises( EventMachine::ConnectionNotBound ) {
189
+ EM.run {
190
+ EM::Timer.new(1) {EM.stop}
191
+ EM.start_server TestHost, TestPort
192
+ EM.connect TestHost, TestPort, PostInitError
193
+ }
194
+ }
195
+ EM.run {
196
+ EM.stop
197
+ }
198
+ assert !EM.reactor_running?
199
+ end
200
+
201
+ module BrsTestSrv
202
+ def receive_data data
203
+ $received << data
204
+ end
205
+ def unbind
206
+ EM.stop
207
+ end
208
+ end
209
+ module BrsTestCli
210
+ def post_init
211
+ send_data $sent
212
+ close_connection_after_writing
213
+ end
214
+ end
215
+
216
+ # From ticket #50
217
+ def test_byte_range_send
218
+ $received = ''
219
+ $sent = (0..255).to_a.pack('C*')
220
+ EM::run {
221
+ EM::start_server TestHost, TestPort, BrsTestSrv
222
+ EM::connect TestHost, TestPort, BrsTestCli
223
+
224
+ EM::add_timer(0.5) { assert(false, 'test timed out'); EM.stop; Kernel.warn "test timed out!" }
225
+ }
226
+ assert_equal($sent, $received)
227
+ end
228
+
229
+ def test_bind_connect
230
+ local_ip = UDPSocket.open {|s| s.connect('google.com', 80); s.addr.last }
231
+
232
+ bind_port = rand(33333)+1025
233
+
234
+ test = self
235
+ EM.run do
236
+ EM.start_server(TestHost, TestPort, Module.new do
237
+ define_method :post_init do
238
+ begin
239
+ test.assert_equal bind_port, Socket.unpack_sockaddr_in(get_peername).first
240
+ test.assert_equal local_ip, Socket.unpack_sockaddr_in(get_peername).last
241
+ ensure
242
+ EM.stop_event_loop
243
+ end
244
+ end
245
+ end)
246
+ EM.bind_connect local_ip, bind_port, TestHost, TestPort
247
+ end
248
+ end
249
+
250
+ def test_reactor_thread?
251
+ assert !EM.reactor_thread?
252
+ EM.run { assert EM.reactor_thread?; EM.stop }
253
+ assert !EM.reactor_thread?
254
+ end
255
+
256
+ def test_schedule_on_reactor_thread
257
+ x = false
258
+ EM.run do
259
+ EM.schedule { x = true }
260
+ EM.stop
261
+ end
262
+ assert x
263
+ end
264
+
265
+ def test_schedule_from_thread
266
+ x = false
267
+ assert !x
268
+ EM.run do
269
+ Thread.new { EM.schedule { x = true; EM.stop } }.join
270
+ end
271
+ assert x
272
+ end
273
+
274
+ def test_set_heartbeat_interval
275
+ interval = 0.5
276
+ EM.run {
277
+ EM.set_heartbeat_interval interval
278
+ $interval = EM.get_heartbeat_interval
279
+ EM.stop
280
+ }
281
+ assert_equal(interval, $interval)
282
+ end
283
+ end
284
+
@@ -0,0 +1,63 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestEventMachineChannel < Test::Unit::TestCase
6
+ def test_channel_subscribe
7
+ s = 0
8
+ EM.run do
9
+ c = EM::Channel.new
10
+ c.subscribe { |v| s = v; EM.stop }
11
+ c << 1
12
+ end
13
+ assert_equal 1, s
14
+ end
15
+
16
+ def test_channel_unsubscribe
17
+ s = 0
18
+ EM.run do
19
+ c = EM::Channel.new
20
+ subscription = c.subscribe { |v| s = v }
21
+ c.unsubscribe(subscription)
22
+ c << 1
23
+ EM.next_tick { EM.stop }
24
+ end
25
+ assert_not_equal 1, s
26
+ end
27
+
28
+ def test_channel_pop
29
+ s = 0
30
+ EM.run do
31
+ c = EM::Channel.new
32
+ c.pop{ |v| s = v }
33
+ c << 1
34
+ c << 2
35
+ EM.next_tick { EM.stop }
36
+ end
37
+ assert_equal 1, s
38
+ end
39
+
40
+ def test_channel_reactor_thread_push
41
+ out = []
42
+ c = EM::Channel.new
43
+ c.subscribe { |v| out << v }
44
+ Thread.new { c.push(1,2,3) }.join
45
+ assert out.empty?
46
+
47
+ EM.run { EM.next_tick { EM.stop } }
48
+
49
+ assert_equal [1,2,3], out
50
+ end
51
+
52
+ def test_channel_reactor_thread_callback
53
+ out = []
54
+ c = EM::Channel.new
55
+ Thread.new { c.subscribe { |v| out << v } }.join
56
+ c.push(1,2,3)
57
+ assert out.empty?
58
+
59
+ EM.run { EM.next_tick { EM.stop } }
60
+
61
+ assert_equal [1,2,3], out
62
+ end
63
+ end
@@ -0,0 +1,35 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestConnectionCount < Test::Unit::TestCase
6
+ def test_idle_connection_count
7
+ EM.run {
8
+ $count = EM.connection_count
9
+ EM.stop_event_loop
10
+ }
11
+
12
+ assert_equal(0, $count)
13
+ end
14
+
15
+ module Client
16
+ def connection_completed
17
+ $client_conns += 1
18
+ EM.stop if $client_conns == 3
19
+ end
20
+ end
21
+
22
+ def test_with_some_connections
23
+ EM.run {
24
+ $client_conns = 0
25
+ $initial_conns = EM.connection_count
26
+ EM.start_server("127.0.0.1", 9999)
27
+ $server_conns = EM.connection_count
28
+ 3.times { EM.connect("127.0.0.1", 9999, Client) }
29
+ }
30
+
31
+ assert_equal(0, $initial_conns)
32
+ assert_equal(1, $server_conns)
33
+ assert_equal(4, $client_conns + $server_conns)
34
+ end
35
+ end
@@ -0,0 +1,47 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ $:.unshift "../lib"
28
+ require 'eventmachine'
29
+ require 'test/unit'
30
+
31
+ class TestDeferUsage < Test::Unit::TestCase
32
+
33
+ def test_defers
34
+ n = 0
35
+ n_times = 20
36
+ EM.run {
37
+ n_times.times {
38
+ work_proc = proc { n += 1 }
39
+ callback = proc { EM.stop if n == n_times }
40
+ EM.defer work_proc, callback
41
+ }
42
+ }
43
+ assert_equal( n, n_times )
44
+ end unless RUBY_VERSION >= '1.9.0'
45
+
46
+ end
47
+
@@ -0,0 +1,160 @@
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+ # TODO, and I know this doesn't belong here, but if a datagram calls
27
+ # send_data outside of a receive_data, there is no return address, and
28
+ # the result is a very confusing error message.
29
+ #
30
+
31
+ require 'eventmachine'
32
+ require 'test/unit'
33
+
34
+
35
+ class TestEpoll < Test::Unit::TestCase
36
+
37
+ module TestEchoServer
38
+ def receive_data data
39
+ send_data data
40
+ close_connection_after_writing
41
+ end
42
+ end
43
+
44
+ module TestEchoClient
45
+ def connection_completed
46
+ send_data "ABCDE"
47
+ $max += 1
48
+ end
49
+ def receive_data data
50
+ raise "bad response" unless data == "ABCDE"
51
+ end
52
+ def unbind
53
+ $n -= 1
54
+ EM.stop if $n == 0
55
+ end
56
+ end
57
+
58
+
59
+ # We can set the rlimit/nofile of a process but we can only set it
60
+ # higher if we're running as root.
61
+ # On most systems, the default value is 1024.
62
+ # Java doesn't (currently) implement this.
63
+ def test_rlimit
64
+ unless RUBY_PLATFORM =~ /java/ or EM.set_descriptor_table_size >= 1024
65
+ a = EM.set_descriptor_table_size
66
+ assert( a <= 1024 )
67
+ a = EM.set_descriptor_table_size( 1024 )
68
+ assert( a == 1024 )
69
+ end
70
+ end
71
+
72
+ # Run a high-volume version of this test by kicking the number of connections
73
+ # up past 512. (Each connection uses two sockets, a client and a server.)
74
+ # (Will require running the test as root)
75
+ # This test exercises TCP clients and servers.
76
+ #
77
+ # XXX this test causes all sort of weird issues on OSX (when run as part of the suite)
78
+ def _test_descriptors
79
+ EM.epoll
80
+ s = EM.set_descriptor_table_size 60000
81
+ EM.run {
82
+ EM.start_server "127.0.0.1", 9800, TestEchoServer
83
+ $n = 0
84
+ $max = 0
85
+ 100.times {
86
+ EM.connect("127.0.0.1", 9800, TestEchoClient) {$n += 1}
87
+ }
88
+ }
89
+ assert_equal(0, $n)
90
+ assert_equal(100, $max)
91
+ end
92
+
93
+ def test_defer
94
+ n = 0
95
+ work_proc = proc {n += 1}
96
+ callback_proc = proc {EM.stop}
97
+ EM.run {
98
+ EM.defer work_proc, callback_proc
99
+ }
100
+ assert_equal( 1, n )
101
+ end unless RUBY_VERSION >= '1.9.0'
102
+
103
+
104
+ module TestDatagramServer
105
+ def receive_data dgm
106
+ $in = dgm
107
+ send_data "abcdefghij"
108
+ end
109
+ end
110
+ module TestDatagramClient
111
+ def post_init
112
+ send_datagram "1234567890", "127.0.0.1", 9500
113
+ end
114
+ def receive_data dgm
115
+ $out = dgm
116
+ EM.stop
117
+ end
118
+ end
119
+
120
+ def test_datagrams
121
+ $in = $out = ""
122
+ EM.run {
123
+ EM.open_datagram_socket "127.0.0.1", 9500, TestDatagramServer
124
+ EM.open_datagram_socket "127.0.0.1", 0, TestDatagramClient
125
+ }
126
+ assert_equal( "1234567890", $in )
127
+ assert_equal( "abcdefghij", $out )
128
+ end
129
+
130
+ # XXX this test fails randomly..
131
+ def _test_unix_domain
132
+ fn = "/tmp/xxx.chain"
133
+ EM.epoll
134
+ s = EM.set_descriptor_table_size 60000
135
+ EM.run {
136
+ # The pure-Ruby version won't let us open the socket if the node already exists.
137
+ # Not sure, that actually may be correct and the compiled version is wrong.
138
+ # Pure Ruby also oddly won't let us make that many connections. This test used
139
+ # to run 100 times. Not sure where that lower connection-limit is coming from in
140
+ # pure Ruby.
141
+ # Let's not sweat the Unix-ness of the filename, since this test can't possibly
142
+ # work on Windows anyway.
143
+ #
144
+ File.unlink(fn) if File.exist?(fn)
145
+ EM.start_unix_domain_server fn, TestEchoServer
146
+ $n = 0
147
+ $max = 0
148
+ 50.times {
149
+ EM.connect_unix_domain(fn, TestEchoClient) {$n += 1}
150
+ }
151
+ EM::add_timer(1) { $stderr.puts("test_unix_domain timed out!"); EM::stop }
152
+ }
153
+ assert_equal(0, $n)
154
+ assert_equal(50, $max)
155
+ ensure
156
+ File.unlink(fn) if File.exist?(fn)
157
+ end
158
+
159
+ end
160
+