eventmachine-maglev- 0.12.10 → 1.0.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/.gitignore +7 -0
  2. data/.yardopts +7 -0
  3. data/Gemfile +3 -0
  4. data/README.md +109 -0
  5. data/Rakefile +14 -368
  6. data/docs/DocumentationGuidesIndex.md +27 -0
  7. data/docs/GettingStarted.md +521 -0
  8. data/docs/old/DEFERRABLES +246 -0
  9. data/docs/{KEYBOARD → old/KEYBOARD} +15 -11
  10. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  11. data/docs/old/SMTP +4 -0
  12. data/docs/old/SPAWNED_PROCESSES +148 -0
  13. data/eventmachine.gemspec +20 -26
  14. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  15. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  16. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  17. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  18. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  19. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  20. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  21. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  22. data/examples/{ex_channel.rb → old/ex_channel.rb} +3 -3
  23. data/examples/old/ex_tick_loop_array.rb +15 -0
  24. data/examples/old/ex_tick_loop_counter.rb +32 -0
  25. data/ext/binder.cpp +0 -1
  26. data/ext/cmain.cpp +40 -29
  27. data/ext/ed.cpp +189 -134
  28. data/ext/ed.h +34 -40
  29. data/ext/em.cpp +388 -340
  30. data/ext/em.h +29 -32
  31. data/ext/eventmachine.h +7 -6
  32. data/ext/extconf.rb +57 -48
  33. data/ext/fastfilereader/extconf.rb +5 -3
  34. data/ext/fastfilereader/mapper.cpp +1 -1
  35. data/ext/fastfilereader/rubymain.cpp +0 -1
  36. data/ext/kb.cpp +1 -3
  37. data/ext/pipe.cpp +9 -11
  38. data/ext/project.h +12 -8
  39. data/ext/rubymain.cpp +158 -112
  40. data/java/src/com/rubyeventmachine/EmReactor.java +3 -2
  41. data/lib/em/buftok.rb +35 -63
  42. data/lib/em/callback.rb +43 -11
  43. data/lib/em/channel.rb +22 -15
  44. data/lib/em/completion.rb +303 -0
  45. data/lib/em/connection.rb +341 -208
  46. data/lib/em/deferrable/pool.rb +2 -0
  47. data/lib/em/deferrable.rb +20 -2
  48. data/lib/em/file_watch.rb +37 -18
  49. data/lib/em/iterator.rb +270 -0
  50. data/lib/em/pool.rb +146 -0
  51. data/lib/em/process_watch.rb +5 -4
  52. data/lib/em/processes.rb +8 -4
  53. data/lib/em/protocols/httpclient.rb +27 -11
  54. data/lib/em/protocols/httpclient2.rb +15 -5
  55. data/lib/em/protocols/line_protocol.rb +29 -0
  56. data/lib/em/protocols/memcache.rb +17 -9
  57. data/lib/em/protocols/object_protocol.rb +2 -1
  58. data/lib/em/protocols/postgres3.rb +2 -1
  59. data/lib/em/protocols/smtpclient.rb +19 -11
  60. data/lib/em/protocols/smtpserver.rb +101 -8
  61. data/lib/em/protocols/stomp.rb +9 -7
  62. data/lib/em/protocols/tcptest.rb +3 -2
  63. data/lib/em/protocols.rb +1 -1
  64. data/lib/{pr_eventmachine.rb → em/pure_ruby.rb} +188 -205
  65. data/lib/em/queue.rb +23 -13
  66. data/lib/em/resolver.rb +192 -0
  67. data/lib/em/spawnable.rb +9 -10
  68. data/lib/em/streamer.rb +34 -46
  69. data/lib/em/threaded_resource.rb +90 -0
  70. data/lib/em/tick_loop.rb +85 -0
  71. data/lib/em/timers.rb +8 -3
  72. data/lib/em/version.rb +1 -1
  73. data/lib/eventmachine.rb +582 -686
  74. data/lib/jeventmachine.rb +25 -3
  75. data/tasks/package.rake +98 -0
  76. data/tasks/test.rake +8 -0
  77. data/tests/em_test_helper.rb +64 -0
  78. data/tests/test_attach.rb +56 -56
  79. data/tests/test_basic.rb +111 -168
  80. data/tests/test_channel.rb +5 -6
  81. data/tests/test_completion.rb +177 -0
  82. data/tests/test_connection_count.rb +1 -3
  83. data/tests/test_defer.rb +3 -32
  84. data/tests/test_deferrable.rb +35 -0
  85. data/tests/test_epoll.rb +27 -57
  86. data/tests/test_error_handler.rb +10 -7
  87. data/tests/test_exc.rb +6 -33
  88. data/tests/test_file_watch.rb +51 -35
  89. data/tests/test_futures.rb +10 -38
  90. data/tests/test_get_sock_opt.rb +27 -20
  91. data/tests/test_handler_check.rb +1 -3
  92. data/tests/test_hc.rb +49 -112
  93. data/tests/test_httpclient.rb +34 -62
  94. data/tests/test_httpclient2.rb +14 -39
  95. data/tests/test_inactivity_timeout.rb +44 -40
  96. data/tests/test_kb.rb +26 -52
  97. data/tests/test_ltp.rb +27 -71
  98. data/tests/test_ltp2.rb +1 -30
  99. data/tests/test_next_tick.rb +2 -31
  100. data/tests/test_object_protocol.rb +8 -9
  101. data/tests/test_pause.rb +45 -37
  102. data/tests/test_pending_connect_timeout.rb +42 -38
  103. data/tests/test_pool.rb +128 -0
  104. data/tests/test_process_watch.rb +37 -37
  105. data/tests/test_processes.rb +92 -110
  106. data/tests/test_proxy_connection.rb +137 -61
  107. data/tests/test_pure.rb +30 -67
  108. data/tests/test_queue.rb +10 -4
  109. data/tests/test_resolver.rb +55 -0
  110. data/tests/test_running.rb +1 -29
  111. data/tests/test_sasl.rb +8 -33
  112. data/tests/test_send_file.rb +163 -188
  113. data/tests/test_servers.rb +12 -55
  114. data/tests/test_shutdown_hooks.rb +23 -0
  115. data/tests/test_smtpclient.rb +1 -29
  116. data/tests/test_smtpserver.rb +1 -29
  117. data/tests/test_spawn.rb +2 -31
  118. data/tests/test_ssl_args.rb +9 -10
  119. data/tests/test_ssl_methods.rb +1 -3
  120. data/tests/test_ssl_verify.rb +63 -63
  121. data/tests/test_threaded_resource.rb +53 -0
  122. data/tests/test_tick_loop.rb +59 -0
  123. data/tests/test_timers.rb +52 -91
  124. data/tests/test_ud.rb +1 -29
  125. data/tests/test_unbind_reason.rb +31 -0
  126. metadata +113 -70
  127. data/README +0 -82
  128. data/docs/DEFERRABLES +0 -133
  129. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -70
  130. data/docs/SMTP +0 -2
  131. data/docs/SPAWNED_PROCESSES +0 -89
  132. data/ext/cplusplus.cpp +0 -202
  133. data/ext/emwin.cpp +0 -300
  134. data/ext/emwin.h +0 -94
  135. data/ext/epoll.cpp +0 -26
  136. data/ext/epoll.h +0 -25
  137. data/ext/eventmachine_cpp.h +0 -96
  138. data/ext/files.cpp +0 -94
  139. data/ext/files.h +0 -65
  140. data/ext/sigs.cpp +0 -89
  141. data/ext/sigs.h +0 -32
  142. data/java/src/com/rubyeventmachine/application/Application.java +0 -194
  143. data/java/src/com/rubyeventmachine/application/Connection.java +0 -74
  144. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +0 -37
  145. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +0 -46
  146. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +0 -38
  147. data/java/src/com/rubyeventmachine/application/Timer.java +0 -54
  148. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +0 -109
  149. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +0 -148
  150. data/java/src/com/rubyeventmachine/tests/EMTest.java +0 -80
  151. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +0 -53
  152. data/java/src/com/rubyeventmachine/tests/TestServers.java +0 -75
  153. data/java/src/com/rubyeventmachine/tests/TestTimers.java +0 -90
  154. data/lib/evma/callback.rb +0 -32
  155. data/lib/evma/container.rb +0 -75
  156. data/lib/evma/factory.rb +0 -77
  157. data/lib/evma/protocol.rb +0 -87
  158. data/lib/evma/reactor.rb +0 -48
  159. data/lib/evma.rb +0 -32
  160. data/setup.rb +0 -1585
  161. data/tests/test_errors.rb +0 -82
  162. data/tests/testem.rb +0 -31
  163. data/web/whatis +0 -7
  164. /data/{docs/GNU → GNU} +0 -0
  165. /data/{docs/COPYING → LICENSE} +0 -0
  166. /data/docs/{ChangeLog → old/ChangeLog} +0 -0
  167. /data/docs/{EPOLL → old/EPOLL} +0 -0
  168. /data/docs/{INSTALL → old/INSTALL} +0 -0
  169. /data/docs/{LEGAL → old/LEGAL} +0 -0
  170. /data/docs/{PURE_RUBY → old/PURE_RUBY} +0 -0
  171. /data/docs/{RELEASE_NOTES → old/RELEASE_NOTES} +0 -0
  172. /data/docs/{TODO → old/TODO} +0 -0
  173. /data/examples/{ex_queue.rb → old/ex_queue.rb} +0 -0
  174. /data/examples/{helper.rb → old/helper.rb} +0 -0
data/tests/test_basic.rb CHANGED
@@ -1,96 +1,51 @@
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'
1
+ require 'em_test_helper'
29
2
  require 'socket'
30
- require 'test/unit'
31
3
 
32
4
  class TestBasic < Test::Unit::TestCase
33
-
34
5
  def setup
35
- assert(!EM.reactor_running?)
6
+ @port = next_port
36
7
  end
37
8
 
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
9
+ def test_connection_class_cache
10
+ mod = Module.new
11
+ a, b = nil, nil
12
+ EM.run {
13
+ EM.start_server '127.0.0.1', @port, mod
14
+ a = EM.connect '127.0.0.1', @port, mod
15
+ b = EM.connect '127.0.0.1', @port, mod
16
+ EM.stop
17
+ }
18
+ assert_equal a.class, b.class
19
+ assert_kind_of EM::Connection, a
71
20
  end
72
21
 
73
22
  #-------------------------------------
74
23
 
75
24
 
76
25
  def test_em
77
- EventMachine.run {
78
- EventMachine.add_timer 0 do
79
- EventMachine.stop
80
- end
81
- }
26
+ assert_nothing_raised do
27
+ EM.run {
28
+ setup_timeout
29
+ EM.add_timer 0 do
30
+ EM.stop
31
+ end
32
+ }
33
+ end
82
34
  end
83
35
 
84
36
  #-------------------------------------
85
37
 
86
38
  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
39
+ assert_nothing_raised do
40
+ EM.run {
41
+ setup_timeout
42
+ n = 0
43
+ EM.add_periodic_timer(0.1) {
44
+ n += 1
45
+ EM.stop if n == 2
46
+ }
92
47
  }
93
- }
48
+ end
94
49
  end
95
50
 
96
51
  #-------------------------------------
@@ -98,22 +53,24 @@ class TestBasic < Test::Unit::TestCase
98
53
  # This test once threw an already-running exception.
99
54
  module Trivial
100
55
  def post_init
101
- EventMachine.stop
56
+ EM.stop
102
57
  end
103
58
  end
104
59
 
105
60
  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
61
+ assert_nothing_raised do
62
+ EM.run {
63
+ setup_timeout
64
+ EM.start_server "127.0.0.1", @port, Trivial
65
+ EM.connect "127.0.0.1", @port
66
+ }
67
+ end
111
68
  end
112
69
 
113
70
  #--------------------------------------
114
71
 
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
72
+ # EM#run_block starts the reactor loop, runs the supplied block, and then STOPS
73
+ # the loop automatically. Contrast with EM#run, which keeps running the reactor
117
74
  # even after the supplied block completes.
118
75
  def test_run_block
119
76
  assert !EM.reactor_running?
@@ -123,20 +80,8 @@ class TestBasic < Test::Unit::TestCase
123
80
  assert !EM.reactor_running?
124
81
  end
125
82
 
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
83
  class UnbindError < EM::Connection
84
+ ERR = Class.new(StandardError)
140
85
  def initialize *args
141
86
  super
142
87
  end
@@ -144,60 +89,19 @@ class TestBasic < Test::Unit::TestCase
144
89
  close_connection_after_writing
145
90
  end
146
91
  def unbind
147
- raise "Blooey"
92
+ raise ERR
148
93
  end
149
94
  end
150
95
 
151
- def xxx_test_unbind_error
152
- assert_raises( RuntimeError ) {
96
+ def test_unbind_error
97
+ assert_raises( UnbindError::ERR ) {
153
98
  EM.run {
154
- EM.start_server TestHost, TestPort
155
- EM.connect TestHost, TestPort, UnbindError
99
+ EM.start_server "127.0.0.1", @port
100
+ EM.connect "127.0.0.1", @port, UnbindError
156
101
  }
157
102
  }
158
103
  end
159
104
 
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
105
  module BrsTestSrv
202
106
  def receive_data data
203
107
  $received << data
@@ -218,10 +122,10 @@ class TestBasic < Test::Unit::TestCase
218
122
  $received = ''
219
123
  $sent = (0..255).to_a.pack('C*')
220
124
  EM::run {
221
- EM::start_server TestHost, TestPort, BrsTestSrv
222
- EM::connect TestHost, TestPort, BrsTestCli
125
+ EM::start_server "127.0.0.1", @port, BrsTestSrv
126
+ EM::connect "127.0.0.1", @port, BrsTestCli
223
127
 
224
- EM::add_timer(0.5) { assert(false, 'test timed out'); EM.stop; Kernel.warn "test timed out!" }
128
+ setup_timeout
225
129
  }
226
130
  assert_equal($sent, $received)
227
131
  end
@@ -229,22 +133,27 @@ class TestBasic < Test::Unit::TestCase
229
133
  def test_bind_connect
230
134
  local_ip = UDPSocket.open {|s| s.connect('google.com', 80); s.addr.last }
231
135
 
232
- bind_port = rand(33333)+1025
136
+ bind_port = next_port
233
137
 
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
138
+ port, ip = nil
139
+ bound_server = Module.new do
140
+ define_method :post_init do
141
+ begin
142
+ port, ip = Socket.unpack_sockaddr_in(get_peername)
143
+ ensure
144
+ EM.stop
244
145
  end
245
- end)
246
- EM.bind_connect local_ip, bind_port, TestHost, TestPort
146
+ end
247
147
  end
148
+
149
+ EM.run do
150
+ setup_timeout
151
+ EM.start_server "127.0.0.1", @port, bound_server
152
+ EM.bind_connect local_ip, bind_port, "127.0.0.1", @port
153
+ end
154
+
155
+ assert_equal bind_port, port
156
+ assert_equal local_ip, ip
248
157
  end
249
158
 
250
159
  def test_reactor_thread?
@@ -264,21 +173,55 @@ class TestBasic < Test::Unit::TestCase
264
173
 
265
174
  def test_schedule_from_thread
266
175
  x = false
267
- assert !x
268
176
  EM.run do
269
177
  Thread.new { EM.schedule { x = true; EM.stop } }.join
270
178
  end
271
179
  assert x
272
180
  end
273
181
 
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)
182
+ if EM.respond_to? :set_heartbeat_interval
183
+ def test_set_heartbeat_interval
184
+ interval = 0.5
185
+ EM.run {
186
+ EM.set_heartbeat_interval interval
187
+ $interval = EM.get_heartbeat_interval
188
+ EM.stop
189
+ }
190
+ assert_equal(interval, $interval)
191
+ end
192
+ else
193
+ warn "EM.set_heartbeat_interval not implemented, skipping a test in #{__FILE__}"
194
+ end
195
+
196
+ module PostInitRaiser
197
+ ERR = Class.new(StandardError)
198
+ def post_init
199
+ raise ERR
200
+ end
201
+ end
202
+
203
+ def test_bubble_errors_from_post_init
204
+ assert_raises(PostInitRaiser::ERR) do
205
+ EM.run do
206
+ EM.start_server "127.0.0.1", @port
207
+ EM.connect "127.0.0.1", @port, PostInitRaiser
208
+ end
209
+ end
210
+ end
211
+
212
+ module InitializeRaiser
213
+ ERR = Class.new(StandardError)
214
+ def initialize
215
+ raise ERR
216
+ end
217
+ end
218
+
219
+ def test_bubble_errors_from_initialize
220
+ assert_raises(InitializeRaiser::ERR) do
221
+ EM.run do
222
+ EM.start_server "127.0.0.1", @port
223
+ EM.connect "127.0.0.1", @port, InitializeRaiser
224
+ end
225
+ end
282
226
  end
283
227
  end
284
-
@@ -1,8 +1,6 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
1
+ require 'em_test_helper'
4
2
 
5
- class TestEventMachineChannel < Test::Unit::TestCase
3
+ class TestEMChannel < Test::Unit::TestCase
6
4
  def test_channel_subscribe
7
5
  s = 0
8
6
  EM.run do
@@ -30,8 +28,9 @@ class TestEventMachineChannel < Test::Unit::TestCase
30
28
  EM.run do
31
29
  c = EM::Channel.new
32
30
  c.pop{ |v| s = v }
33
- c << 1
34
- c << 2
31
+ c.push(1,2,3)
32
+ c << 4
33
+ c << 5
35
34
  EM.next_tick { EM.stop }
36
35
  end
37
36
  assert_equal 1, s
@@ -0,0 +1,177 @@
1
+ require 'em/completion'
2
+
3
+ class TestCompletion < Test::Unit::TestCase
4
+ def completion
5
+ @completion ||= EM::Completion.new
6
+ end
7
+
8
+ def crank
9
+ # This is a slow solution, but this just executes the next tick queue
10
+ # once. It's the easiest way for now.
11
+ EM.run { EM.stop }
12
+ end
13
+
14
+ def results
15
+ @results ||= []
16
+ end
17
+
18
+ def test_state
19
+ assert_equal :unknown, completion.state
20
+ end
21
+
22
+ def test_succeed
23
+ completion.callback { |val| results << val }
24
+ completion.succeed :object
25
+ crank
26
+ assert_equal :succeeded, completion.state
27
+ assert_equal [:object], results
28
+ end
29
+
30
+ def test_fail
31
+ completion.errback { |val| results << val }
32
+ completion.fail :object
33
+ crank
34
+ assert_equal :failed, completion.state
35
+ assert_equal [:object], results
36
+ end
37
+
38
+ def test_callback
39
+ completion.callback { results << :callback }
40
+ completion.errback { results << :errback }
41
+ completion.succeed
42
+ crank
43
+ assert_equal [:callback], results
44
+ end
45
+
46
+ def test_errback
47
+ completion.callback { results << :callback }
48
+ completion.errback { results << :errback }
49
+ completion.fail
50
+ crank
51
+ assert_equal [:errback], results
52
+ end
53
+
54
+ def test_stateback
55
+ completion.stateback(:magic) { results << :stateback }
56
+ completion.change_state(:magic)
57
+ crank
58
+ assert_equal [:stateback], results
59
+ end
60
+
61
+ def test_does_not_enqueue_when_completed
62
+ completion.callback { results << :callback }
63
+ completion.succeed
64
+ completion.errback { results << :errback }
65
+ completion.fail
66
+ crank
67
+ assert_equal [:callback], results
68
+ end
69
+
70
+ def test_completed
71
+ assert_equal false, completion.completed?
72
+ completion.succeed
73
+ assert_equal true, completion.completed?
74
+ completion.fail
75
+ assert_equal true, completion.completed?
76
+ completion.change_state :magic
77
+ assert_equal false, completion.completed?
78
+ end
79
+
80
+ def test_recursive_callbacks
81
+ completion.callback do |val|
82
+ results << val
83
+ completion.succeed :two
84
+ end
85
+ completion.callback do |val|
86
+ results << val
87
+ completion.succeed :three
88
+ end
89
+ completion.callback do |val|
90
+ results << val
91
+ end
92
+ completion.succeed :one
93
+ crank
94
+ assert_equal [:one, :two, :three], results
95
+ end
96
+
97
+ def test_late_defined_callbacks
98
+ completion.callback { results << :one }
99
+ completion.succeed
100
+ crank
101
+ assert_equal [:one], results
102
+ completion.callback { results << :two }
103
+ crank
104
+ assert_equal [:one, :two], results
105
+ end
106
+
107
+ def test_cleared_completions
108
+ completion.callback { results << :callback }
109
+ completion.errback { results << :errback }
110
+
111
+ completion.succeed
112
+ crank
113
+ completion.fail
114
+ crank
115
+ completion.succeed
116
+ crank
117
+
118
+ assert_equal [:callback], results
119
+ end
120
+
121
+ def test_skip_completed_callbacks
122
+ completion.callback { results << :callback }
123
+ completion.succeed
124
+ crank
125
+
126
+ completion.errback { results << :errback }
127
+ completion.fail
128
+ crank
129
+
130
+ assert_equal [:callback], results
131
+ end
132
+
133
+ def test_completions
134
+ completion.completion { results << :completion }
135
+ completion.succeed
136
+ crank
137
+ assert_equal [:completion], results
138
+
139
+ completion.change_state(:unknown)
140
+ results.clear
141
+
142
+ completion.completion { results << :completion }
143
+ completion.fail
144
+ crank
145
+ assert_equal [:completion], results
146
+ end
147
+
148
+ def test_latent_completion
149
+ completion.completion { results << :completion }
150
+ completion.succeed
151
+ crank
152
+ completion.completion { results << :completion }
153
+ crank
154
+ assert_equal [:completion, :completion], results
155
+ end
156
+
157
+ def test_timeout
158
+ args = [1, 2, 3]
159
+ EM.run do
160
+ completion.timeout(0.0001, *args)
161
+ completion.errback { |*errargs| results << errargs }
162
+ completion.completion { EM.stop }
163
+ EM.add_timer(0.1) { flunk 'test timed out' }
164
+ end
165
+ assert_equal [[1,2,3]], results
166
+ end
167
+
168
+ def test_timeout_gets_cancelled
169
+ EM.run do
170
+ completion.timeout(0.0001, :timeout)
171
+ completion.errback { results << :errback }
172
+ completion.succeed
173
+ EM.add_timer(0.0002) { EM.stop }
174
+ end
175
+ assert_equal [], results
176
+ end
177
+ end
@@ -1,6 +1,4 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
1
+ require 'em_test_helper'
4
2
 
5
3
  class TestConnectionCount < Test::Unit::TestCase
6
4
  def test_idle_connection_count
data/tests/test_defer.rb CHANGED
@@ -1,34 +1,6 @@
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
- #
1
+ require 'em_test_helper'
26
2
 
27
- $:.unshift "../lib"
28
- require 'eventmachine'
29
- require 'test/unit'
30
-
31
- class TestDeferUsage < Test::Unit::TestCase
3
+ class TestDefer < Test::Unit::TestCase
32
4
 
33
5
  def test_defers
34
6
  n = 0
@@ -41,7 +13,6 @@ class TestDeferUsage < Test::Unit::TestCase
41
13
  }
42
14
  }
43
15
  assert_equal( n, n_times )
44
- end unless RUBY_VERSION >= '1.9.0'
16
+ end
45
17
 
46
18
  end
47
-
@@ -0,0 +1,35 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestDeferrable < Test::Unit::TestCase
4
+ class Later
5
+ include EM::Deferrable
6
+ end
7
+
8
+ def test_timeout_without_args
9
+ assert_nothing_raised do
10
+ EM.run {
11
+ df = Later.new
12
+ df.timeout(0)
13
+ df.errback { EM.stop }
14
+ EM.add_timer(0.01) { flunk "Deferrable was not timed out." }
15
+ }
16
+ end
17
+ end
18
+
19
+ def test_timeout_with_args
20
+ args = nil
21
+
22
+ EM.run {
23
+ df = Later.new
24
+ df.timeout(0, :timeout, :foo)
25
+ df.errback do |type, name|
26
+ args = [type, name]
27
+ EM.stop
28
+ end
29
+
30
+ EM.add_timer(0.01) { flunk "Deferrable was not timed out." }
31
+ }
32
+
33
+ assert_equal [:timeout, :foo], args
34
+ end
35
+ end