eventmachine 0.12.10-x86-mswin32-60 → 1.0.0.beta.2-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +1 -0
  3. data/README +80 -81
  4. data/Rakefile +7 -370
  5. data/docs/COPYING +60 -60
  6. data/docs/ChangeLog +211 -211
  7. data/docs/DEFERRABLES +246 -133
  8. data/docs/EPOLL +141 -141
  9. data/docs/GNU +281 -281
  10. data/docs/INSTALL +13 -13
  11. data/docs/KEYBOARD +42 -38
  12. data/docs/LEGAL +25 -25
  13. data/docs/LIGHTWEIGHT_CONCURRENCY +130 -70
  14. data/docs/PURE_RUBY +75 -75
  15. data/docs/RELEASE_NOTES +94 -94
  16. data/docs/SMTP +4 -2
  17. data/docs/SPAWNED_PROCESSES +148 -89
  18. data/docs/TODO +8 -8
  19. data/eventmachine.gemspec +19 -26
  20. data/examples/ex_channel.rb +42 -42
  21. data/examples/ex_queue.rb +2 -2
  22. data/examples/ex_tick_loop_array.rb +15 -0
  23. data/examples/ex_tick_loop_counter.rb +32 -0
  24. data/examples/helper.rb +1 -1
  25. data/ext/binder.cpp +0 -1
  26. data/ext/cmain.cpp +36 -25
  27. data/ext/ed.cpp +104 -113
  28. data/ext/ed.h +24 -30
  29. data/ext/em.cpp +349 -283
  30. data/ext/em.h +25 -29
  31. data/ext/eventmachine.h +5 -4
  32. data/ext/extconf.rb +58 -49
  33. data/ext/fastfilereader/extconf.rb +5 -3
  34. data/ext/fastfilereader/mapper.cpp +214 -214
  35. data/ext/fastfilereader/mapper.h +59 -59
  36. data/ext/fastfilereader/rubymain.cpp +127 -127
  37. data/ext/kb.cpp +1 -3
  38. data/ext/page.cpp +107 -107
  39. data/ext/page.h +51 -51
  40. data/ext/pipe.cpp +9 -11
  41. data/ext/project.h +12 -8
  42. data/ext/rubymain.cpp +138 -104
  43. data/java/.classpath +8 -8
  44. data/java/.project +17 -17
  45. data/java/src/com/rubyeventmachine/EmReactor.java +1 -0
  46. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -40
  47. data/lib/em/buftok.rb +138 -138
  48. data/lib/em/callback.rb +25 -25
  49. data/lib/em/channel.rb +1 -1
  50. data/lib/em/connection.rb +6 -1
  51. data/lib/em/deferrable.rb +16 -2
  52. data/lib/em/file_watch.rb +53 -53
  53. data/lib/em/future.rb +61 -61
  54. data/lib/em/iterator.rb +270 -0
  55. data/lib/em/messages.rb +66 -66
  56. data/lib/em/process_watch.rb +43 -43
  57. data/lib/em/protocols.rb +1 -1
  58. data/lib/em/protocols/header_and_content.rb +138 -138
  59. data/lib/em/protocols/httpclient.rb +267 -262
  60. data/lib/em/protocols/line_protocol.rb +28 -0
  61. data/lib/em/protocols/memcache.rb +322 -322
  62. data/lib/em/protocols/postgres3.rb +247 -247
  63. data/lib/em/protocols/saslauth.rb +175 -175
  64. data/lib/em/protocols/smtpserver.rb +640 -547
  65. data/lib/em/protocols/stomp.rb +200 -200
  66. data/lib/em/protocols/tcptest.rb +52 -52
  67. data/lib/{pr_eventmachine.rb → em/pure_ruby.rb} +1013 -1022
  68. data/lib/em/queue.rb +1 -0
  69. data/lib/em/spawnable.rb +85 -85
  70. data/lib/em/streamer.rb +130 -130
  71. data/lib/em/tick_loop.rb +85 -0
  72. data/lib/em/timers.rb +2 -1
  73. data/lib/em/version.rb +1 -1
  74. data/lib/eventmachine.rb +40 -84
  75. data/lib/jeventmachine.rb +2 -1
  76. data/lib/rubyeventmachine.rb +2 -0
  77. data/setup.rb +1585 -1585
  78. data/tasks/doc.rake +30 -0
  79. data/tasks/package.rake +85 -0
  80. data/tasks/test.rake +6 -0
  81. data/tests/client.crt +31 -31
  82. data/tests/client.key +51 -51
  83. data/tests/test_attach.rb +13 -3
  84. data/tests/test_basic.rb +60 -95
  85. data/tests/test_channel.rb +3 -2
  86. data/tests/test_defer.rb +49 -47
  87. data/tests/test_deferrable.rb +35 -0
  88. data/tests/test_error_handler.rb +35 -35
  89. data/tests/test_errors.rb +82 -82
  90. data/tests/test_exc.rb +55 -55
  91. data/tests/test_file_watch.rb +49 -49
  92. data/tests/test_futures.rb +198 -198
  93. data/tests/test_handler_check.rb +36 -36
  94. data/tests/test_hc.rb +190 -218
  95. data/tests/test_httpclient.rb +227 -218
  96. data/tests/test_httpclient2.rb +3 -2
  97. data/tests/test_inactivity_timeout.rb +3 -3
  98. data/tests/test_kb.rb +60 -60
  99. data/tests/test_ltp.rb +13 -5
  100. data/tests/test_ltp2.rb +317 -317
  101. data/tests/test_next_tick.rb +1 -1
  102. data/tests/test_object_protocol.rb +36 -36
  103. data/tests/test_pending_connect_timeout.rb +2 -2
  104. data/tests/test_process_watch.rb +50 -48
  105. data/tests/test_proxy_connection.rb +52 -0
  106. data/tests/test_pure.rb +134 -125
  107. data/tests/test_queue.rb +44 -44
  108. data/tests/test_running.rb +42 -42
  109. data/tests/test_sasl.rb +72 -72
  110. data/tests/test_send_file.rb +251 -242
  111. data/tests/test_servers.rb +76 -76
  112. data/tests/test_smtpclient.rb +83 -83
  113. data/tests/test_smtpserver.rb +85 -85
  114. data/tests/test_spawn.rb +322 -322
  115. data/tests/test_ssl_methods.rb +49 -49
  116. data/tests/test_ssl_verify.rb +82 -82
  117. data/tests/test_tick_loop.rb +59 -0
  118. data/tests/test_timers.rb +13 -15
  119. data/tests/test_ud.rb +36 -36
  120. data/tests/testem.rb +31 -31
  121. metadata +66 -51
  122. data/ext/cplusplus.cpp +0 -202
  123. data/ext/emwin.cpp +0 -300
  124. data/ext/emwin.h +0 -94
  125. data/ext/epoll.cpp +0 -26
  126. data/ext/epoll.h +0 -25
  127. data/ext/eventmachine_cpp.h +0 -96
  128. data/ext/files.cpp +0 -94
  129. data/ext/files.h +0 -65
  130. data/ext/sigs.cpp +0 -89
  131. data/ext/sigs.h +0 -32
  132. data/java/src/com/rubyeventmachine/application/Application.java +0 -194
  133. data/java/src/com/rubyeventmachine/application/Connection.java +0 -74
  134. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +0 -37
  135. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +0 -46
  136. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +0 -38
  137. data/java/src/com/rubyeventmachine/application/Timer.java +0 -54
  138. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +0 -109
  139. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +0 -148
  140. data/java/src/com/rubyeventmachine/tests/EMTest.java +0 -80
  141. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +0 -53
  142. data/java/src/com/rubyeventmachine/tests/TestServers.java +0 -75
  143. data/java/src/com/rubyeventmachine/tests/TestTimers.java +0 -90
  144. data/lib/evma.rb +0 -32
  145. data/lib/evma/callback.rb +0 -32
  146. data/lib/evma/container.rb +0 -75
  147. data/lib/evma/factory.rb +0 -77
  148. data/lib/evma/protocol.rb +0 -87
  149. data/lib/evma/reactor.rb +0 -48
  150. data/web/whatis +0 -7
@@ -61,7 +61,7 @@ class TestNextTick < Test::Unit::TestCase
61
61
  def test_pre_run_queue
62
62
  x = false
63
63
  EM.next_tick { EM.stop; x = true }
64
- EM.run { EM.add_timer(0.2) { EM.stop } }
64
+ EM.run { EM.add_timer(0.01) { EM.stop } }
65
65
  assert x
66
66
  end
67
67
 
@@ -1,37 +1,37 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
4
-
5
- class TestObjectProtocol < Test::Unit::TestCase
6
- Host = "127.0.0.1"
7
- Port = 9550
8
-
9
- module Server
10
- include EM::P::ObjectProtocol
11
- def post_init
12
- send_object :hello=>'world'
13
- end
14
- def receive_object obj
15
- $server = obj
16
- EM.stop
17
- end
18
- end
19
-
20
- module Client
21
- include EM::P::ObjectProtocol
22
- def receive_object obj
23
- $client = obj
24
- send_object 'you_said'=>obj
25
- end
26
- end
27
-
28
- def test_send_receive
29
- EM.run{
30
- EM.start_server Host, Port, Server
31
- EM.connect Host, Port, Client
32
- }
33
-
34
- assert($client == {:hello=>'world'})
35
- assert($server == {'you_said'=>{:hello=>'world'}})
36
- end
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestObjectProtocol < Test::Unit::TestCase
6
+ Host = "127.0.0.1"
7
+ Port = 9550
8
+
9
+ module Server
10
+ include EM::P::ObjectProtocol
11
+ def post_init
12
+ send_object :hello=>'world'
13
+ end
14
+ def receive_object obj
15
+ $server = obj
16
+ EM.stop
17
+ end
18
+ end
19
+
20
+ module Client
21
+ include EM::P::ObjectProtocol
22
+ def receive_object obj
23
+ $client = obj
24
+ send_object 'you_said'=>obj
25
+ end
26
+ end
27
+
28
+ def test_send_receive
29
+ EM.run{
30
+ EM.start_server Host, Port, Server
31
+ EM.connect Host, Port, Client
32
+ }
33
+
34
+ assert($client == {:hello=>'world'})
35
+ assert($server == {'you_said'=>{:hello=>'world'}})
36
+ end
37
37
  end
@@ -39,10 +39,10 @@ class TestPendingConnectTimeout < Test::Unit::TestCase
39
39
  EM.heartbeat_interval = 0.1
40
40
  $start = Time.now
41
41
  c = EM.connect("1.2.3.4", 54321, TimeoutHandler)
42
- c.pending_connect_timeout = 5
42
+ c.pending_connect_timeout = 0.2
43
43
  }
44
44
 
45
- assert_in_delta(5, (Time.now - $start), 0.3)
45
+ assert_in_delta(0.2, (Time.now - $start), 0.1)
46
46
  end
47
47
 
48
48
  end
@@ -1,48 +1,50 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
4
-
5
- class TestProcessWatch < Test::Unit::TestCase
6
- module ParentProcessWatcher
7
- def process_forked
8
- $forked = true
9
- end
10
- end
11
-
12
- module ChildProcessWatcher
13
- def process_exited
14
- $exited = true
15
- end
16
- def unbind
17
- $unbind = true
18
- EM.stop
19
- end
20
- end
21
-
22
- def setup
23
- EM.kqueue = true if EM.kqueue?
24
- end
25
-
26
- def teardown
27
- EM.kqueue = false if EM.kqueue?
28
- end
29
-
30
- def test_events
31
- EM.run{
32
- # watch ourselves for a fork notification
33
- EM.watch_process(Process.pid, ParentProcessWatcher)
34
- $fork_pid = fork{ sleep }
35
- child = EM.watch_process($fork_pid, ChildProcessWatcher)
36
- $pid = child.pid
37
-
38
- EM.add_timer(0.5){
39
- Process.kill('TERM', $fork_pid)
40
- }
41
- }
42
-
43
- assert_equal($pid, $fork_pid)
44
- assert($forked)
45
- assert($exited)
46
- assert($unbind)
47
- end
48
- end
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ if EM.kqueue?
6
+ class TestProcessWatch < Test::Unit::TestCase
7
+ module ParentProcessWatcher
8
+ def process_forked
9
+ $forked = true
10
+ end
11
+ end
12
+
13
+ module ChildProcessWatcher
14
+ def process_exited
15
+ $exited = true
16
+ end
17
+ def unbind
18
+ $unbind = true
19
+ EM.stop
20
+ end
21
+ end
22
+
23
+ def setup
24
+ EM.kqueue = true
25
+ end
26
+
27
+ def teardown
28
+ EM.kqueue = false
29
+ end
30
+
31
+ def test_events
32
+ EM.run{
33
+ # watch ourselves for a fork notification
34
+ EM.watch_process(Process.pid, ParentProcessWatcher)
35
+ $fork_pid = fork{ sleep }
36
+ child = EM.watch_process($fork_pid, ChildProcessWatcher)
37
+ $pid = child.pid
38
+
39
+ EM.add_timer(0.2){
40
+ Process.kill('TERM', $fork_pid)
41
+ }
42
+ }
43
+
44
+ assert_equal($pid, $fork_pid)
45
+ assert($forked)
46
+ assert($exited)
47
+ assert($unbind)
48
+ end
49
+ end
50
+ end
@@ -29,6 +29,40 @@ class TestProxyConnection < Test::Unit::TestCase
29
29
  end
30
30
  end
31
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
+
32
66
  module Client
33
67
  def connection_completed
34
68
  send_data "EventMachine rocks!"
@@ -61,6 +95,12 @@ class TestProxyConnection < Test::Unit::TestCase
61
95
  end
62
96
  end
63
97
 
98
+ module PartialProxyServer
99
+ def receive_data(data)
100
+ EM.connect("127.0.0.1", 54321, PartialProxyConnection, self, data, 1)
101
+ end
102
+ end
103
+
64
104
  module EarlyClosingProxy
65
105
  def receive_data(data)
66
106
  EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
@@ -78,6 +118,18 @@ class TestProxyConnection < Test::Unit::TestCase
78
118
  assert_equal("I know!", $client_data)
79
119
  end
80
120
 
121
+ def test_partial_proxy_connection
122
+ EM.run {
123
+ EM.start_server("127.0.0.1", 54321, Server)
124
+ EM.start_server("127.0.0.1", 12345, PartialProxyServer)
125
+ EM.connect("127.0.0.1", 12345, Client)
126
+ }
127
+
128
+ assert_equal("I know!", $client_data)
129
+ assert_equal(" know!", $unproxied_data)
130
+ assert($proxy_completed)
131
+ end
132
+
81
133
  def test_early_close
82
134
  $client_data = nil
83
135
  EM.run {
@@ -1,125 +1,134 @@
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 TestPure < Test::Unit::TestCase
32
-
33
-
34
- Host,Port = "0.0.0.0", 9060
35
-
36
-
37
- # These tests are intended to exercise problems that come up in the
38
- # pure-Ruby implementation. However, we DON'T constrain them such that
39
- # they only run in pure-Ruby. These tests need to work identically in
40
- # any implementation.
41
-
42
- def setup
43
- end
44
-
45
- def teardown
46
- end
47
-
48
- #-------------------------------------
49
-
50
- # The EM reactor needs to run down open connections and release other resources
51
- # when it stops running. Make sure this happens even if user code throws a Ruby
52
- # exception.
53
- # One way to see this is to run identical tests that open a TCP server and throw
54
- # an exception. (We do this twice because an exception aborts a test. We make the
55
- # two tests identical except for the method name because we can't predict the order
56
- # in which the test harness will run them.)
57
- # If exception handling is incorrect, the second test will fail with a no-bind error
58
- # because the TCP server opened in the first test will not have been closed.
59
- #
60
- def run_exception
61
- EM.run {
62
- EM.start_server Host, Port
63
- raise "an exception"
64
- }
65
- end
66
- def test_exception_1
67
- assert_raises( RuntimeError ) { run_exception }
68
- end
69
- def test_exception_2
70
- ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
71
- assert_raises( ex_class ) { run_exception }
72
- end
73
-
74
-
75
- # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
76
- # exception on certain kinds of TCP connect-errors.
77
- # It's always been something of an open question whether EM should throw an exception
78
- # in these cases but the defined answer has always been to catch it the unbind method.
79
- # With a connect failure, the latter will always fire, but connection_completed will
80
- # never fire. So even though the point is arguable, it's incorrect for the pure Ruby
81
- # version to throw an exception.
82
- module TestConnrefused
83
- def unbind
84
- EM.stop
85
- end
86
- def connection_completed
87
- raise "should never get here"
88
- end
89
- end
90
- def test_connrefused
91
- EM.run {
92
- EM.connect "0.0.0.0", 60001, TestConnrefused
93
- }
94
- end
95
-
96
-
97
- # Make sure connection_completed gets called as expected with TCP clients. This is the
98
- # opposite of test_connrefused.
99
- # If the test fails, it will hang because EM.stop never gets called.
100
- #
101
- module TestConnaccepted
102
- def connection_completed
103
- EM.stop
104
- end
105
- end
106
- def test_connaccepted
107
- timeout = false
108
- EM.run {
109
- EM.start_server "0.0.0.0", 60002
110
- EM.connect "0.0.0.0", 60002, TestConnaccepted
111
- EM::Timer.new(1) {timeout = true; EM.stop}
112
- }
113
- assert_equal( false, timeout )
114
- end
115
-
116
- def test_reactor_running
117
- a = false
118
- EM.run {
119
- a = EM.reactor_running?
120
- EM.next_tick {EM.stop}
121
- }
122
- assert a
123
- end
124
-
125
- end
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 TestPure < Test::Unit::TestCase
32
+
33
+
34
+ Host,Port = "0.0.0.0", 9060
35
+
36
+
37
+ # These tests are intended to exercise problems that come up in the
38
+ # pure-Ruby implementation. However, we DON'T constrain them such that
39
+ # they only run in pure-Ruby. These tests need to work identically in
40
+ # any implementation.
41
+
42
+ def setup
43
+ end
44
+
45
+ def teardown
46
+ end
47
+
48
+ #-------------------------------------
49
+
50
+ # The EM reactor needs to run down open connections and release other resources
51
+ # when it stops running. Make sure this happens even if user code throws a Ruby
52
+ # exception.
53
+ # One way to see this is to run identical tests that open a TCP server and throw
54
+ # an exception. (We do this twice because an exception aborts a test. We make the
55
+ # two tests identical except for the method name because we can't predict the order
56
+ # in which the test harness will run them.)
57
+ # If exception handling is incorrect, the second test will fail with a no-bind error
58
+ # because the TCP server opened in the first test will not have been closed.
59
+ #
60
+ def run_exception
61
+ EM.run {
62
+ EM.start_server Host, Port
63
+ raise "an exception"
64
+ }
65
+ end
66
+ def test_exception_1
67
+ assert_raises( RuntimeError ) { run_exception }
68
+ end
69
+ def test_exception_2
70
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
71
+ assert_raises( ex_class ) { run_exception }
72
+ end
73
+
74
+
75
+ # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
76
+ # exception on certain kinds of TCP connect-errors.
77
+ # It's always been something of an open question whether EM should throw an exception
78
+ # in these cases but the defined answer has always been to catch it the unbind method.
79
+ # With a connect failure, the latter will always fire, but connection_completed will
80
+ # never fire. So even though the point is arguable, it's incorrect for the pure Ruby
81
+ # version to throw an exception.
82
+ module TestConnrefused
83
+ def unbind
84
+ EM.stop
85
+ end
86
+ def connection_completed
87
+ raise "should never get here"
88
+ end
89
+ end
90
+ def test_connrefused
91
+ EM.run {
92
+ EM.connect "0.0.0.0", 60001, TestConnrefused
93
+ }
94
+ end
95
+
96
+
97
+ # Make sure connection_completed gets called as expected with TCP clients. This is the
98
+ # opposite of test_connrefused.
99
+ # If the test fails, it will hang because EM.stop never gets called.
100
+ #
101
+ module TestConnaccepted
102
+ def connection_completed
103
+ EM.stop
104
+ end
105
+ end
106
+ def test_connaccepted
107
+ timeout = false
108
+ EM.run {
109
+ EM.start_server "0.0.0.0", 60002
110
+ EM.connect "0.0.0.0", 60002, TestConnaccepted
111
+ setup_timeout(1)
112
+ }
113
+ assert_equal( false, timeout )
114
+ end
115
+
116
+ def setup_timeout(timeout = 4)
117
+ EM.schedule {
118
+ start_time = EM.current_time
119
+ EM.add_periodic_timer(0.01) {
120
+ raise "timeout" if EM.current_time - start_time >= timeout
121
+ }
122
+ }
123
+ end
124
+
125
+ def test_reactor_running
126
+ a = false
127
+ EM.run {
128
+ a = EM.reactor_running?
129
+ EM.next_tick {EM.stop}
130
+ }
131
+ assert a
132
+ end
133
+
134
+ end