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
@@ -0,0 +1,128 @@
1
+ class TestPool < Test::Unit::TestCase
2
+ def pool
3
+ @pool ||= EM::Pool.new
4
+ end
5
+
6
+ def go
7
+ EM.run { yield }
8
+ end
9
+
10
+ def stop
11
+ EM.stop
12
+ end
13
+
14
+ def deferrable
15
+ @deferrable ||= EM::DefaultDeferrable.new
16
+ end
17
+
18
+ def test_supports_more_work_than_resources
19
+ ran = false
20
+ go do
21
+ pool.perform do
22
+ ran = true
23
+ deferrable
24
+ end
25
+ stop
26
+ end
27
+ assert_equal false, ran
28
+ go do
29
+ pool.add :resource
30
+ stop
31
+ end
32
+ assert_equal true, ran
33
+ end
34
+
35
+ def test_reques_resources_on_error
36
+ pooled_res, pooled_res2 = nil
37
+ pool.add :res
38
+ go do
39
+ pool.perform do |res|
40
+ pooled_res = res
41
+ deferrable
42
+ end
43
+ stop
44
+ end
45
+ deferrable.fail
46
+ go do
47
+ pool.perform do |res|
48
+ pooled_res2 = res
49
+ deferrable
50
+ end
51
+ stop
52
+ end
53
+ assert_equal :res, pooled_res
54
+ assert_equal pooled_res, pooled_res2
55
+ end
56
+
57
+ def test_supports_custom_error_handler
58
+ eres = nil
59
+ pool.on_error do |res|
60
+ eres = res
61
+ end
62
+ performs = []
63
+ pool.add :res
64
+ go do
65
+ pool.perform do |res|
66
+ performs << res
67
+ deferrable
68
+ end
69
+ pool.perform do |res|
70
+ performs << res
71
+ deferrable
72
+ end
73
+ deferrable.fail
74
+ stop
75
+ end
76
+ assert_equal :res, eres
77
+ # manual requeues required when error handler is installed:
78
+ assert_equal 1, performs.size
79
+ assert_equal :res, performs.first
80
+ end
81
+
82
+ def test_catches_successful_deferrables
83
+ performs = []
84
+ pool.add :res
85
+ go do
86
+ pool.perform { |res| performs << res; deferrable }
87
+ pool.perform { |res| performs << res; deferrable }
88
+ stop
89
+ end
90
+ assert_equal [:res], performs
91
+ deferrable.succeed
92
+ go { stop }
93
+ assert_equal [:res, :res], performs
94
+ end
95
+
96
+ def test_prunes_locked_and_removed_resources
97
+ performs = []
98
+ pool.add :res
99
+ deferrable.succeed
100
+ go do
101
+ pool.perform { |res| performs << res; pool.remove res; deferrable }
102
+ pool.perform { |res| performs << res; pool.remove res; deferrable }
103
+ stop
104
+ end
105
+ assert_equal [:res], performs
106
+ end
107
+
108
+ # Contents is only to be used for inspection of the pool!
109
+ def test_contents
110
+ pool.add :res
111
+ assert_equal [:res], pool.contents
112
+ # Assert that modifying the contents list does not affect the pools
113
+ # contents.
114
+ pool.contents.delete(:res)
115
+ assert_equal [:res], pool.contents
116
+ end
117
+
118
+ def test_num_waiting
119
+ pool.add :res
120
+ assert_equal 0, pool.num_waiting
121
+ pool.perform { |r| EM::DefaultDeferrable.new }
122
+ assert_equal 0, pool.num_waiting
123
+ 10.times { pool.perform { |r| EM::DefaultDeferrable.new } }
124
+ EM.run { EM.next_tick { EM.stop } }
125
+ assert_equal 10, pool.num_waiting
126
+ end
127
+
128
+ end
@@ -1,48 +1,48 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
1
+ require 'em_test_helper'
4
2
 
5
- class TestProcessWatch < Test::Unit::TestCase
6
- module ParentProcessWatcher
7
- def process_forked
8
- $forked = true
3
+ if EM.kqueue?
4
+ class TestProcessWatch < Test::Unit::TestCase
5
+ module ParentProcessWatcher
6
+ def process_forked
7
+ $forked = true
8
+ end
9
9
  end
10
- end
11
10
 
12
- module ChildProcessWatcher
13
- def process_exited
14
- $exited = true
15
- end
16
- def unbind
17
- $unbind = true
18
- EM.stop
11
+ module ChildProcessWatcher
12
+ def process_exited
13
+ $exited = true
14
+ end
15
+ def unbind
16
+ $unbind = true
17
+ EM.stop
18
+ end
19
19
  end
20
- end
21
20
 
22
- def setup
23
- EM.kqueue = true if EM.kqueue?
24
- end
21
+ def setup
22
+ EM.kqueue = true
23
+ end
25
24
 
26
- def teardown
27
- EM.kqueue = false if EM.kqueue?
28
- end
25
+ def teardown
26
+ EM.kqueue = false
27
+ end
29
28
 
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
29
+ def test_events
30
+ EM.run{
31
+ # watch ourselves for a fork notification
32
+ EM.watch_process(Process.pid, ParentProcessWatcher)
33
+ $fork_pid = fork{ sleep }
34
+ child = EM.watch_process($fork_pid, ChildProcessWatcher)
35
+ $pid = child.pid
37
36
 
38
- EM.add_timer(0.5){
39
- Process.kill('TERM', $fork_pid)
37
+ EM.add_timer(0.2){
38
+ Process.kill('TERM', $fork_pid)
39
+ }
40
40
  }
41
- }
42
41
 
43
- assert_equal($pid, $fork_pid)
44
- assert($forked)
45
- assert($exited)
46
- assert($unbind)
42
+ assert_equal($pid, $fork_pid)
43
+ assert($forked)
44
+ assert($exited)
45
+ assert($unbind)
46
+ end
47
47
  end
48
- end
48
+ end
@@ -1,128 +1,110 @@
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'
1
+ require 'em_test_helper'
30
2
 
31
3
  class TestProcesses < Test::Unit::TestCase
32
4
 
33
- # EM::DeferrableChildProcess is a sugaring of a common use-case
34
- # involving EM::popen.
35
- # Call the #open method on EM::DeferrableChildProcess, passing
36
- # a command-string. #open immediately returns an EM::Deferrable
37
- # object. It also schedules the forking of a child process, which
38
- # will execute the command passed to #open.
39
- # When the forked child terminates, the Deferrable will be signalled
40
- # and execute its callbacks, passing the data that the child process
41
- # wrote to stdout.
42
- #
43
- def test_deferrable_child_process
44
- ls = ""
45
- EM.run {
46
- d = EM::DeferrableChildProcess.open( "ls -ltr" )
47
- d.callback {|data_from_child|
48
- ls = data_from_child
49
- EM.stop
5
+ if !windows? && !jruby?
6
+
7
+ # EM::DeferrableChildProcess is a sugaring of a common use-case
8
+ # involving EM::popen.
9
+ # Call the #open method on EM::DeferrableChildProcess, passing
10
+ # a command-string. #open immediately returns an EM::Deferrable
11
+ # object. It also schedules the forking of a child process, which
12
+ # will execute the command passed to #open.
13
+ # When the forked child terminates, the Deferrable will be signalled
14
+ # and execute its callbacks, passing the data that the child process
15
+ # wrote to stdout.
16
+ #
17
+ def test_deferrable_child_process
18
+ ls = ""
19
+ EM.run {
20
+ d = EM::DeferrableChildProcess.open( "ls -ltr" )
21
+ d.callback {|data_from_child|
22
+ ls = data_from_child
23
+ EM.stop
24
+ }
50
25
  }
51
- }
52
- assert( ls.length > 0)
53
- end
26
+ assert( ls.length > 0)
27
+ end
54
28
 
55
- def setup
56
- $out = nil
57
- $status = nil
58
- end
29
+ def setup
30
+ $out = nil
31
+ $status = nil
32
+ end
59
33
 
60
- def test_em_system
61
- EM.run{
62
- EM.system('ls'){ |out,status| $out, $status = out, status; EM.stop }
63
- }
34
+ def test_em_system
35
+ EM.run{
36
+ EM.system('ls'){ |out,status| $out, $status = out, status; EM.stop }
37
+ }
64
38
 
65
- assert( $out.length > 0 )
66
- assert_equal($status.exitstatus, 0)
67
- assert_equal($status.class, Process::Status)
68
- end
39
+ assert( $out.length > 0 )
40
+ assert_equal($status.exitstatus, 0)
41
+ assert_equal($status.class, Process::Status)
42
+ end
69
43
 
70
- def test_em_system_pid
71
- $pids = []
44
+ def test_em_system_pid
45
+ $pids = []
72
46
 
73
- EM.run{
74
- $pids << EM.system('echo hi', proc{ |out,status|$pids << status.pid; EM.stop })
75
- }
47
+ EM.run{
48
+ $pids << EM.system('echo hi', proc{ |out,status|$pids << status.pid; EM.stop })
49
+ }
76
50
 
77
- assert_equal $pids[0], $pids[1]
78
- end
51
+ assert_equal $pids[0], $pids[1]
52
+ end
53
+
54
+ def test_em_system_with_proc
55
+ EM.run{
56
+ EM.system('ls', proc{ |out,status| $out, $status = out, status; EM.stop })
57
+ }
79
58
 
80
- def test_em_system_with_proc
81
- EM.run{
82
- EM.system('ls', proc{ |out,status| $out, $status = out, status; EM.stop })
83
- }
59
+ assert( $out.length > 0 )
60
+ assert_equal($status.exitstatus, 0)
61
+ assert_equal($status.class, Process::Status)
62
+ end
63
+
64
+ def test_em_system_with_two_procs
65
+ EM.run{
66
+ EM.system('sh', proc{ |process|
67
+ process.send_data("echo hello\n")
68
+ process.send_data("exit\n")
69
+ }, proc{ |out,status|
70
+ $out = out
71
+ $status = status
72
+ EM.stop
73
+ })
74
+ }
84
75
 
85
- assert( $out.length > 0 )
86
- assert_equal($status.exitstatus, 0)
87
- assert_equal($status.class, Process::Status)
88
- end
76
+ assert_equal("hello\n", $out)
77
+ end
78
+
79
+ def test_em_system_cmd_arguments
80
+ EM.run{
81
+ EM.system('echo', '1', '2', 'version', proc{ |process|
82
+ }, proc{ |out,status|
83
+ $out = out
84
+ $status = status
85
+ EM.stop
86
+ })
87
+ }
89
88
 
90
- def test_em_system_with_two_procs
91
- EM.run{
92
- EM.system('sh', proc{ |process|
93
- process.send_data("echo hello\n")
94
- process.send_data("exit\n")
95
- }, proc{ |out,status|
96
- $out = out
97
- $status = status
98
- EM.stop
99
- })
100
- }
101
-
102
- assert_equal("hello\n", $out)
103
- end
89
+ assert_match(/1 2 version/i, $out)
90
+ end
104
91
 
105
- def test_em_system_cmd_arguments
106
- EM.run{
107
- EM.system('sh', '--version', proc{ |process|
108
- }, proc{ |out,status|
109
- $out = out
110
- $status = status
111
- EM.stop
112
- })
113
- }
114
-
115
- assert_match(/version/i, $out)
116
- end
92
+ def test_em_system_spaced_arguments
93
+ EM.run{
94
+ EM.system('ruby', '-e', 'puts "hello"', proc{ |out,status|
95
+ $out = out
96
+ EM.stop
97
+ })
98
+ }
117
99
 
118
- def test_em_system_spaced_arguments
119
- EM.run{
120
- EM.system('ruby', '-e', 'puts "hello"', proc{ |out,status|
121
- $out = out
122
- EM.stop
123
- })
124
- }
100
+ assert_equal("hello\n", $out)
101
+ end
102
+ else
103
+ warn "EM.popen not implemented, skipping tests in #{__FILE__}"
125
104
 
126
- assert_equal("hello\n", $out)
105
+ # Because some rubies will complain if a TestCase class has no tests
106
+ def test_em_popen_unsupported
107
+ assert true
108
+ end
127
109
  end
128
110
  end
@@ -1,92 +1,168 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
1
+ require 'em_test_helper'
4
2
 
5
3
  class TestProxyConnection < Test::Unit::TestCase
6
4
 
7
- module ProxyConnection
8
- def initialize(client, request)
9
- @client, @request = client, request
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
+ @client.close_connection_after_writing
28
+ end
10
29
  end
11
30
 
12
- def post_init
13
- EM::enable_proxy(self, @client)
31
+ module PartialProxyConnection
32
+ def initialize(client, request, length)
33
+ @client, @request, @length = client, request, length
34
+ end
35
+
36
+ def post_init
37
+ EM::enable_proxy(self, @client, 0, @length)
38
+ end
39
+
40
+ def receive_data(data)
41
+ $unproxied_data = data
42
+ @client.send_data(data)
43
+ end
44
+
45
+ def connection_completed
46
+ EM.next_tick {
47
+ send_data @request
48
+ }
49
+ end
50
+
51
+ def proxy_target_unbound
52
+ $unbound_early = true
53
+ EM.stop
54
+ end
55
+
56
+ def proxy_completed
57
+ $proxy_completed = true
58
+ end
59
+
60
+ def unbind
61
+ @client.close_connection_after_writing
62
+ end
14
63
  end
15
64
 
16
- def connection_completed
17
- EM.next_tick {
18
- send_data @request
19
- }
20
- end
65
+ module Client
66
+ def connection_completed
67
+ send_data "EM rocks!"
68
+ end
69
+
70
+ def receive_data(data)
71
+ $client_data = data
72
+ end
21
73
 
22
- def proxy_target_unbound
23
- $unbound_early = true
24
- EM.stop
74
+ def unbind
75
+ EM.stop
76
+ end
25
77
  end
26
78
 
27
- def unbind
28
- @client.close_connection_after_writing
79
+ module Client2
80
+ include Client
81
+ def unbind; end
29
82
  end
30
- end
31
83
 
32
- module Client
33
- def connection_completed
34
- send_data "EventMachine rocks!"
84
+ module Server
85
+ def receive_data(data)
86
+ send_data "I know!" if data == "EM rocks!"
87
+ close_connection_after_writing
88
+ end
35
89
  end
36
90
 
37
- def receive_data(data)
38
- $client_data = data
91
+ module ProxyServer
92
+ def initialize port
93
+ @port = port
94
+ end
95
+
96
+ def receive_data(data)
97
+ EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
98
+ end
39
99
  end
40
100
 
41
- def unbind
42
- EM.stop
101
+ module PartialProxyServer
102
+ def initialize port
103
+ @port = port
104
+ end
105
+
106
+ def receive_data(data)
107
+ EM.connect("127.0.0.1", @port, PartialProxyConnection, self, data, 1)
108
+ end
43
109
  end
44
- end
45
110
 
46
- module Client2
47
- include Client
48
- def unbind; end
49
- end
111
+ module EarlyClosingProxy
112
+ def initialize port
113
+ @port = port
114
+ end
50
115
 
51
- module Server
52
- def receive_data(data)
53
- send_data "I know!" if data == "EventMachine rocks!"
54
- close_connection_after_writing
116
+ def receive_data(data)
117
+ EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
118
+ close_connection
119
+ end
55
120
  end
56
- end
57
121
 
58
- module ProxyServer
59
- def receive_data(data)
60
- EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
122
+ def setup
123
+ @port = next_port
124
+ @proxy_port = next_port
61
125
  end
62
- end
63
126
 
64
- module EarlyClosingProxy
65
- def receive_data(data)
66
- EM.connect("127.0.0.1", 54321, ProxyConnection, self, data)
67
- close_connection
127
+ def test_proxy_connection
128
+ EM.run {
129
+ EM.start_server("127.0.0.1", @port, Server)
130
+ EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
131
+ EM.connect("127.0.0.1", @proxy_port, Client)
132
+ }
133
+
134
+ assert_equal("I know!", $client_data)
68
135
  end
69
- end
70
136
 
71
- def test_proxy_connection
72
- EM.run {
73
- EM.start_server("127.0.0.1", 54321, Server)
74
- EM.start_server("127.0.0.1", 12345, ProxyServer)
75
- EM.connect("127.0.0.1", 12345, Client)
76
- }
137
+ def test_partial_proxy_connection
138
+ EM.run {
139
+ EM.start_server("127.0.0.1", @port, Server)
140
+ EM.start_server("127.0.0.1", @proxy_port, PartialProxyServer, @port)
141
+ EM.connect("127.0.0.1", @proxy_port, Client)
142
+ }
77
143
 
78
- assert_equal("I know!", $client_data)
79
- end
144
+ assert_equal("I know!", $client_data)
145
+ assert_equal(" know!", $unproxied_data)
146
+ assert($proxy_completed)
147
+ end
80
148
 
81
- def test_early_close
82
- $client_data = nil
83
- EM.run {
84
- EM.start_server("127.0.0.1", 54321, Server)
85
- EM.start_server("127.0.0.1", 12345, EarlyClosingProxy)
86
- EM.connect("127.0.0.1", 12345, Client2)
87
- }
149
+ def test_early_close
150
+ $client_data = nil
151
+ EM.run {
152
+ EM.start_server("127.0.0.1", @port, Server)
153
+ EM.start_server("127.0.0.1", @proxy_port, EarlyClosingProxy, @port)
154
+ EM.connect("127.0.0.1", @proxy_port, Client2)
155
+ }
88
156
 
89
- assert($unbound_early)
157
+ assert($unbound_early)
158
+ end
159
+ else
160
+ warn "EM.start_proxy not implemented, skipping tests in #{__FILE__}"
161
+
162
+ # Because some rubies will complain if a TestCase class has no tests
163
+ def test_em_start_proxy_not_implemented
164
+ assert !EM.respond_to?(:start_proxy)
165
+ end
90
166
  end
91
167
 
92
168
  end