eventmachine-eventmachine 0.12.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/Rakefile +169 -0
  2. data/docs/COPYING +60 -0
  3. data/docs/ChangeLog +183 -0
  4. data/docs/DEFERRABLES +138 -0
  5. data/docs/EPOLL +141 -0
  6. data/docs/GNU +281 -0
  7. data/docs/INSTALL +15 -0
  8. data/docs/KEYBOARD +38 -0
  9. data/docs/LEGAL +25 -0
  10. data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
  11. data/docs/PURE_RUBY +77 -0
  12. data/docs/README +74 -0
  13. data/docs/RELEASE_NOTES +96 -0
  14. data/docs/SMTP +9 -0
  15. data/docs/SPAWNED_PROCESSES +93 -0
  16. data/docs/TODO +10 -0
  17. data/ext/binder.cpp +126 -0
  18. data/ext/binder.h +48 -0
  19. data/ext/cmain.cpp +530 -0
  20. data/ext/cplusplus.cpp +172 -0
  21. data/ext/ed.cpp +1473 -0
  22. data/ext/ed.h +361 -0
  23. data/ext/em.cpp +1895 -0
  24. data/ext/em.h +170 -0
  25. data/ext/emwin.cpp +300 -0
  26. data/ext/emwin.h +94 -0
  27. data/ext/epoll.cpp +26 -0
  28. data/ext/epoll.h +25 -0
  29. data/ext/eventmachine.h +90 -0
  30. data/ext/eventmachine_cpp.h +94 -0
  31. data/ext/extconf.rb +150 -0
  32. data/ext/files.cpp +94 -0
  33. data/ext/files.h +65 -0
  34. data/ext/kb.cpp +368 -0
  35. data/ext/page.cpp +107 -0
  36. data/ext/page.h +51 -0
  37. data/ext/pipe.cpp +327 -0
  38. data/ext/project.h +119 -0
  39. data/ext/rubymain.cpp +683 -0
  40. data/ext/sigs.cpp +89 -0
  41. data/ext/sigs.h +32 -0
  42. data/ext/ssl.cpp +408 -0
  43. data/ext/ssl.h +86 -0
  44. data/java/src/com/rubyeventmachine/Application.java +196 -0
  45. data/java/src/com/rubyeventmachine/Connection.java +74 -0
  46. data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
  47. data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
  48. data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
  49. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  50. data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
  51. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
  52. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
  53. data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
  54. data/java/src/com/rubyeventmachine/Timer.java +54 -0
  55. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
  56. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
  57. data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  58. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  59. data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
  60. data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
  61. data/lib/em/deferrable.rb +208 -0
  62. data/lib/em/eventable.rb +39 -0
  63. data/lib/em/future.rb +62 -0
  64. data/lib/em/messages.rb +66 -0
  65. data/lib/em/processes.rb +68 -0
  66. data/lib/em/spawnable.rb +88 -0
  67. data/lib/em/streamer.rb +112 -0
  68. data/lib/eventmachine.rb +1763 -0
  69. data/lib/eventmachine_version.rb +31 -0
  70. data/lib/evma.rb +32 -0
  71. data/lib/evma/callback.rb +32 -0
  72. data/lib/evma/container.rb +75 -0
  73. data/lib/evma/factory.rb +77 -0
  74. data/lib/evma/protocol.rb +87 -0
  75. data/lib/evma/reactor.rb +48 -0
  76. data/lib/jeventmachine.rb +137 -0
  77. data/lib/pr_eventmachine.rb +1011 -0
  78. data/lib/protocols/buftok.rb +127 -0
  79. data/lib/protocols/header_and_content.rb +129 -0
  80. data/lib/protocols/httpcli2.rb +794 -0
  81. data/lib/protocols/httpclient.rb +270 -0
  82. data/lib/protocols/line_and_text.rb +122 -0
  83. data/lib/protocols/linetext2.rb +163 -0
  84. data/lib/protocols/postgres.rb +261 -0
  85. data/lib/protocols/saslauth.rb +179 -0
  86. data/lib/protocols/smtpclient.rb +308 -0
  87. data/lib/protocols/smtpserver.rb +556 -0
  88. data/lib/protocols/stomp.rb +130 -0
  89. data/lib/protocols/tcptest.rb +57 -0
  90. data/tasks/cpp.rake +77 -0
  91. data/tasks/project.rake +78 -0
  92. data/tasks/tests.rake +192 -0
  93. data/tests/test_attach.rb +66 -0
  94. data/tests/test_basic.rb +231 -0
  95. data/tests/test_defer.rb +47 -0
  96. data/tests/test_epoll.rb +161 -0
  97. data/tests/test_errors.rb +82 -0
  98. data/tests/test_eventables.rb +78 -0
  99. data/tests/test_exc.rb +58 -0
  100. data/tests/test_futures.rb +214 -0
  101. data/tests/test_hc.rb +218 -0
  102. data/tests/test_httpclient.rb +215 -0
  103. data/tests/test_httpclient2.rb +133 -0
  104. data/tests/test_kb.rb +61 -0
  105. data/tests/test_ltp.rb +192 -0
  106. data/tests/test_ltp2.rb +320 -0
  107. data/tests/test_next_tick.rb +102 -0
  108. data/tests/test_processes.rb +56 -0
  109. data/tests/test_pure.rb +129 -0
  110. data/tests/test_running.rb +47 -0
  111. data/tests/test_sasl.rb +74 -0
  112. data/tests/test_send_file.rb +245 -0
  113. data/tests/test_servers.rb +80 -0
  114. data/tests/test_smtpclient.rb +81 -0
  115. data/tests/test_smtpserver.rb +93 -0
  116. data/tests/test_spawn.rb +329 -0
  117. data/tests/test_ssl_args.rb +68 -0
  118. data/tests/test_timers.rb +146 -0
  119. data/tests/test_ud.rb +43 -0
  120. data/tests/testem.rb +31 -0
  121. metadata +197 -0
@@ -0,0 +1,129 @@
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_raise( RuntimeError ) { run_exception }
68
+ end
69
+ def test_exception_2
70
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
71
+ assert_raise( ex_class ) { run_exception }
72
+ end
73
+
74
+
75
+
76
+ # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
77
+ # exception on certain kinds of TCP connect-errors.
78
+ # It's always been something of an open question whether EM should throw an exception
79
+ # in these cases but the defined answer has always been to catch it the unbind method.
80
+ # With a connect failure, the latter will always fire, but connection_completed will
81
+ # never fire. So even though the point is arguable, it's incorrect for the pure Ruby
82
+ # version to throw an exception.
83
+ module TestConnrefused
84
+ def unbind
85
+ EM.stop
86
+ end
87
+ def connection_completed
88
+ raise "should never get here"
89
+ end
90
+ end
91
+ def test_connrefused
92
+ EM.run {
93
+ EM.connect "0.0.0.0", 60001, TestConnrefused
94
+ }
95
+ end
96
+
97
+
98
+ # Make sure connection_completed gets called as expected with TCP clients. This is the
99
+ # opposite of test_connrefused.
100
+ # If the test fails, it will hang because EM.stop never gets called.
101
+ #
102
+ module TestConnaccepted
103
+ def connection_completed
104
+ EM.stop
105
+ end
106
+ end
107
+ def test_connaccepted
108
+ timeout = false
109
+ EM.run {
110
+ EM.start_server "0.0.0.0", 60002
111
+ EM.connect "0.0.0.0", 60002, TestConnaccepted
112
+ EM::Timer.new(1) {timeout = true; EM.stop}
113
+ }
114
+ assert_equal( false, timeout )
115
+ end
116
+
117
+
118
+
119
+ def test_reactor_running
120
+ a = false
121
+ EM.run {
122
+ a = EM.reactor_running?
123
+ EM.next_tick {EM.stop}
124
+ }
125
+ assert a
126
+ end
127
+
128
+
129
+ 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 TestRunning < Test::Unit::TestCase
32
+ def setup
33
+ end
34
+ def teardown
35
+ end
36
+
37
+ def test_running
38
+ assert_equal( false, EM::reactor_running? )
39
+ r = false
40
+ EM.run {
41
+ r = EM::reactor_running?
42
+ EM.stop
43
+ }
44
+ assert_equal( true, r )
45
+ end
46
+ end
47
+
@@ -0,0 +1,74 @@
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
+
32
+ class TestSASL < Test::Unit::TestCase
33
+
34
+ # SASL authentication is usually done with UNIX-domain sockets, but
35
+ # we'll use TCP so this test will work on Windows. As far as the
36
+ # protocol handlers are concerned, there's no difference.
37
+
38
+
39
+ Host,Port = "127.0.0.1",9560
40
+ TestUser,TestPsw = "someone", "password"
41
+
42
+ class SaslServer < EM::Connection
43
+ include EM::Protocols::SASLauth
44
+ def validate usr, psw, sys, realm
45
+ usr == TestUser and psw == TestPsw
46
+ end
47
+ end
48
+
49
+ class SaslClient < EM::Connection
50
+ include EM::Protocols::SASLauthclient
51
+ end
52
+
53
+ def test_sasl
54
+ resp = nil
55
+ EM.run {
56
+ EM.start_server( Host, Port, SaslServer )
57
+
58
+ c = EM.connect( Host, Port, SaslClient )
59
+ d = c.validate?( TestUser, TestPsw )
60
+ d.timeout 2
61
+ d.callback {
62
+ resp = true
63
+ EM.stop
64
+ }
65
+ d.errback {
66
+ resp = false
67
+ EM.stop
68
+ }
69
+ }
70
+ assert_equal( true, resp )
71
+ end
72
+
73
+ end
74
+
@@ -0,0 +1,245 @@
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 'socket'
30
+ require 'test/unit'
31
+
32
+ class TestSendFile < Test::Unit::TestCase
33
+
34
+ module TestModule
35
+ def post_init
36
+ send_file_data TestFilename
37
+ close_connection_after_writing
38
+ end
39
+ end
40
+
41
+ module TestClient
42
+ def data_to(&blk)
43
+ @data_to = blk
44
+ end
45
+
46
+ def receive_data(data)
47
+ @data_to.call(data) if @data_to
48
+ end
49
+
50
+ def unbind
51
+ EM.stop
52
+ end
53
+ end
54
+
55
+ TestHost = "0.0.0.0"
56
+ TestPort = 9055
57
+ TestFilename = "./xxxxxx"
58
+
59
+ def setup
60
+ end
61
+
62
+ def teardown
63
+ File.unlink( TestFilename ) if File.exist?( TestFilename )
64
+ end
65
+
66
+ def test_send_file
67
+ File.open( TestFilename, "w" ) {|f|
68
+ f << ("A" * 5000)
69
+ }
70
+
71
+ data = ''
72
+
73
+ EM.run {
74
+ EM.start_server TestHost, TestPort, TestModule
75
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
76
+
77
+ EM.connect TestHost, TestPort, TestClient do |c|
78
+ c.data_to { |d| data << d }
79
+ end
80
+ }
81
+
82
+ assert_equal( "A" * 5000, data )
83
+ File.unlink TestFilename
84
+ end
85
+
86
+ # EventMachine::Connection#send_file_data has a strict upper limit on the filesize it will work with.
87
+ def test_send_large_file
88
+ File.open( TestFilename, "w" ) {|f|
89
+ f << ("A" * 1000000)
90
+ }
91
+
92
+ data = ''
93
+
94
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
95
+ assert_raise( ex_class ) {
96
+ EM.run {
97
+ EM.start_server TestHost, TestPort, TestModule
98
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
99
+ EM.connect TestHost, TestPort, TestClient do |c|
100
+ c.data_to { |d| data << d }
101
+ end
102
+ }
103
+ }
104
+
105
+ File.unlink TestFilename
106
+ end
107
+
108
+
109
+ module StreamTestModule
110
+ def post_init
111
+ EM::Deferrable.future( stream_file_data(TestFilename)) {
112
+ close_connection_after_writing
113
+ }
114
+ end
115
+ end
116
+
117
+ module ChunkStreamTestModule
118
+ def post_init
119
+ EM::Deferrable.future( stream_file_data(TestFilename, :http_chunks=>true)) {
120
+ close_connection_after_writing
121
+ }
122
+ end
123
+ end
124
+
125
+ def test_stream_file_data
126
+ File.open( TestFilename, "w" ) {|f|
127
+ f << ("A" * 1000)
128
+ }
129
+
130
+ data = ''
131
+
132
+ EM.run {
133
+ EM.start_server TestHost, TestPort, StreamTestModule
134
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
135
+ EM.connect TestHost, TestPort, TestClient do |c|
136
+ c.data_to { |d| data << d }
137
+ end
138
+ }
139
+
140
+ assert_equal( "A" * 1000, data )
141
+
142
+ File.unlink TestFilename
143
+ end
144
+
145
+ def test_stream_chunked_file_data
146
+ File.open( TestFilename, "w" ) {|f|
147
+ f << ("A" * 1000)
148
+ }
149
+
150
+ data = ''
151
+
152
+ EM.run {
153
+ EM.start_server TestHost, TestPort, ChunkStreamTestModule
154
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
155
+ EM.connect TestHost, TestPort, TestClient do |c|
156
+ c.data_to { |d| data << d }
157
+ end
158
+ }
159
+
160
+ assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
161
+
162
+ File.unlink TestFilename
163
+ end
164
+
165
+ module BadFileTestModule
166
+ def post_init
167
+ de = stream_file_data( TestFilename+"..." )
168
+ de.errback {|msg|
169
+ send_data msg
170
+ close_connection_after_writing
171
+ }
172
+ end
173
+ end
174
+ def test_stream_bad_file
175
+ data = ''
176
+ EM.run {
177
+ EM.start_server TestHost, TestPort, BadFileTestModule
178
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
179
+ EM.connect TestHost, TestPort, TestClient do |c|
180
+ c.data_to { |d| data << d }
181
+ end
182
+ }
183
+
184
+ assert_equal( "file not found", data )
185
+ end
186
+
187
+ def test_stream_large_file_data
188
+ begin
189
+ require 'fastfilereaderext'
190
+ rescue LoadError
191
+ $stderr.puts "no fastfilereaderext, not running test_stream_large_file_data"
192
+ return
193
+ end
194
+ File.open( TestFilename, "w" ) {|f|
195
+ f << ("A" * 10000)
196
+ }
197
+
198
+ data = ''
199
+
200
+ EM.run {
201
+ EM.start_server TestHost, TestPort, StreamTestModule
202
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
203
+ EM.connect TestHost, TestPort, TestClient do |c|
204
+ c.data_to { |d| data << d }
205
+ end
206
+ }
207
+
208
+ assert_equal( "A" * 10000, data )
209
+
210
+ File.unlink TestFilename
211
+ end
212
+
213
+ def test_stream_large_chunked_file_data
214
+ begin
215
+ require 'fastfilereaderext'
216
+ rescue LoadError
217
+ $stderr.puts "no fastfilereaderext, not running test_stream_large_chunked_file_data"
218
+ return
219
+ end
220
+ File.open( TestFilename, "w" ) {|f|
221
+ f << ("A" * 100000)
222
+ }
223
+
224
+ data = ''
225
+
226
+ EM.run {
227
+ EM.start_server TestHost, TestPort, ChunkStreamTestModule
228
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
229
+ EM.connect TestHost, TestPort, TestClient do |c|
230
+ c.data_to { |d| data << d }
231
+ end
232
+ }
233
+
234
+ expected = [
235
+ "4000\r\n#{"A" * 16384}\r\n" * 6,
236
+ "6a0\r\n#{"A" * 0x6a0}\r\n",
237
+ "0\r\n\r\n"
238
+ ].join
239
+ assert_equal( expected, data )
240
+
241
+ File.unlink TestFilename
242
+ end
243
+
244
+ end
245
+