eventmachine 0.12.6 → 0.12.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/{docs/README → README} +21 -13
  2. data/Rakefile +14 -4
  3. data/docs/DEFERRABLES +0 -5
  4. data/docs/INSTALL +2 -4
  5. data/docs/LEGAL +1 -1
  6. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
  7. data/docs/PURE_RUBY +0 -2
  8. data/docs/RELEASE_NOTES +0 -2
  9. data/docs/SMTP +0 -7
  10. data/docs/SPAWNED_PROCESSES +0 -4
  11. data/docs/TODO +0 -2
  12. data/eventmachine.gemspec +17 -8
  13. data/examples/ex_channel.rb +43 -0
  14. data/examples/ex_queue.rb +2 -0
  15. data/examples/helper.rb +2 -0
  16. data/ext/cmain.cpp +119 -20
  17. data/ext/cplusplus.cpp +15 -6
  18. data/ext/ed.cpp +303 -93
  19. data/ext/ed.h +49 -22
  20. data/ext/em.cpp +368 -42
  21. data/ext/em.h +43 -6
  22. data/ext/eventmachine.h +21 -8
  23. data/ext/eventmachine_cpp.h +1 -0
  24. data/ext/extconf.rb +4 -0
  25. data/ext/kb.cpp +1 -2
  26. data/ext/pipe.cpp +1 -3
  27. data/ext/project.h +21 -0
  28. data/ext/rubymain.cpp +232 -32
  29. data/ext/ssl.cpp +38 -1
  30. data/ext/ssl.h +5 -1
  31. data/java/src/com/rubyeventmachine/Application.java +7 -3
  32. data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
  33. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
  34. data/lib/{protocols → em}/buftok.rb +16 -5
  35. data/lib/em/callback.rb +26 -0
  36. data/lib/em/channel.rb +57 -0
  37. data/lib/em/connection.rb +505 -0
  38. data/lib/em/deferrable.rb +144 -165
  39. data/lib/em/file_watch.rb +54 -0
  40. data/lib/em/future.rb +24 -25
  41. data/lib/em/messages.rb +1 -1
  42. data/lib/em/process_watch.rb +44 -0
  43. data/lib/em/processes.rb +58 -52
  44. data/lib/em/protocols.rb +35 -0
  45. data/lib/em/protocols/header_and_content.rb +138 -0
  46. data/lib/em/protocols/httpclient.rb +263 -0
  47. data/lib/em/protocols/httpclient2.rb +582 -0
  48. data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
  49. data/lib/em/protocols/linetext2.rb +160 -0
  50. data/lib/{protocols → em/protocols}/memcache.rb +37 -7
  51. data/lib/em/protocols/object_protocol.rb +39 -0
  52. data/lib/em/protocols/postgres3.rb +247 -0
  53. data/lib/em/protocols/saslauth.rb +175 -0
  54. data/lib/em/protocols/smtpclient.rb +331 -0
  55. data/lib/em/protocols/smtpserver.rb +547 -0
  56. data/lib/em/protocols/stomp.rb +200 -0
  57. data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
  58. data/lib/em/queue.rb +61 -0
  59. data/lib/em/spawnable.rb +53 -56
  60. data/lib/em/streamer.rb +92 -74
  61. data/lib/em/timers.rb +55 -0
  62. data/lib/em/version.rb +3 -0
  63. data/lib/eventmachine.rb +1008 -1298
  64. data/lib/evma.rb +1 -1
  65. data/lib/jeventmachine.rb +106 -101
  66. data/lib/pr_eventmachine.rb +47 -36
  67. data/tasks/project.rake +2 -1
  68. data/tests/client.crt +31 -0
  69. data/tests/client.key +51 -0
  70. data/tests/test_attach.rb +18 -0
  71. data/tests/test_basic.rb +108 -54
  72. data/tests/test_channel.rb +63 -0
  73. data/tests/test_connection_count.rb +2 -2
  74. data/tests/test_epoll.rb +109 -110
  75. data/tests/test_errors.rb +36 -36
  76. data/tests/test_exc.rb +22 -25
  77. data/tests/test_file_watch.rb +49 -0
  78. data/tests/test_futures.rb +77 -93
  79. data/tests/test_hc.rb +2 -2
  80. data/tests/test_httpclient.rb +55 -52
  81. data/tests/test_httpclient2.rb +110 -112
  82. data/tests/test_inactivity_timeout.rb +30 -0
  83. data/tests/test_kb.rb +8 -9
  84. data/tests/test_ltp2.rb +274 -277
  85. data/tests/test_next_tick.rb +91 -65
  86. data/tests/test_object_protocol.rb +37 -0
  87. data/tests/test_process_watch.rb +48 -0
  88. data/tests/test_processes.rb +56 -23
  89. data/tests/test_proxy_connection.rb +92 -0
  90. data/tests/test_pure.rb +1 -5
  91. data/tests/test_queue.rb +44 -0
  92. data/tests/test_running.rb +9 -14
  93. data/tests/test_sasl.rb +32 -34
  94. data/tests/test_send_file.rb +175 -176
  95. data/tests/test_servers.rb +37 -41
  96. data/tests/test_smtpserver.rb +47 -55
  97. data/tests/test_spawn.rb +284 -291
  98. data/tests/test_ssl_args.rb +1 -1
  99. data/tests/test_ssl_methods.rb +1 -1
  100. data/tests/test_ssl_verify.rb +82 -0
  101. data/tests/test_timers.rb +81 -88
  102. data/tests/test_ud.rb +0 -7
  103. data/tests/testem.rb +1 -1
  104. metadata +68 -39
  105. data/lib/em/eventable.rb +0 -39
  106. data/lib/eventmachine_version.rb +0 -31
  107. data/lib/protocols/header_and_content.rb +0 -129
  108. data/lib/protocols/httpcli2.rb +0 -803
  109. data/lib/protocols/httpclient.rb +0 -270
  110. data/lib/protocols/linetext2.rb +0 -161
  111. data/lib/protocols/postgres.rb +0 -261
  112. data/lib/protocols/saslauth.rb +0 -179
  113. data/lib/protocols/smtpclient.rb +0 -308
  114. data/lib/protocols/smtpserver.rb +0 -556
  115. data/lib/protocols/stomp.rb +0 -153
  116. data/tests/test_eventables.rb +0 -77
@@ -67,12 +67,11 @@ class TestPure < Test::Unit::TestCase
67
67
  assert_raises( RuntimeError ) { run_exception }
68
68
  end
69
69
  def test_exception_2
70
- ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
70
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
71
71
  assert_raises( ex_class ) { run_exception }
72
72
  end
73
73
 
74
74
 
75
-
76
75
  # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
77
76
  # exception on certain kinds of TCP connect-errors.
78
77
  # It's always been something of an open question whether EM should throw an exception
@@ -114,8 +113,6 @@ class TestPure < Test::Unit::TestCase
114
113
  assert_equal( false, timeout )
115
114
  end
116
115
 
117
-
118
-
119
116
  def test_reactor_running
120
117
  a = false
121
118
  EM.run {
@@ -125,5 +122,4 @@ class TestPure < Test::Unit::TestCase
125
122
  assert a
126
123
  end
127
124
 
128
-
129
125
  end
@@ -0,0 +1,44 @@
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestEventMachineQueue < Test::Unit::TestCase
6
+ def test_queue_push
7
+ s = 0
8
+ EM.run do
9
+ q = EM::Queue.new
10
+ q.push(1)
11
+ EM.next_tick { s = q.size; EM.stop }
12
+ end
13
+ assert_equal 1, s
14
+ end
15
+
16
+ def test_queue_pop
17
+ x,y,z = nil
18
+ EM.run do
19
+ q = EM::Queue.new
20
+ q.push(1,2,3)
21
+ q.pop { |v| x = v }
22
+ q.pop { |v| y = v }
23
+ q.pop { |v| z = v; EM.stop }
24
+ end
25
+ assert_equal 1, x
26
+ assert_equal 2, y
27
+ assert_equal 3, z
28
+ end
29
+
30
+ def test_queue_reactor_thread
31
+ q = EM::Queue.new
32
+
33
+ Thread.new { q.push(1,2,3) }.join
34
+ assert q.empty?
35
+ EM.run { EM.next_tick { EM.stop } }
36
+ assert_equal 3, q.size
37
+
38
+ x = nil
39
+ Thread.new { q.pop { |v| x = v } }.join
40
+ assert_equal nil, x
41
+ EM.run { EM.next_tick { EM.stop } }
42
+ assert_equal 1, x
43
+ end
44
+ end
@@ -29,19 +29,14 @@ require 'eventmachine'
29
29
  require 'test/unit'
30
30
 
31
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
32
+ def test_running
33
+ assert_equal( false, EM::reactor_running? )
34
+ r = false
35
+ EM.run {
36
+ r = EM::reactor_running?
37
+ EM.stop
38
+ }
39
+ assert_equal( true, r )
40
+ end
46
41
  end
47
42
 
@@ -31,44 +31,42 @@ require 'test/unit'
31
31
 
32
32
  class TestSASL < Test::Unit::TestCase
33
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.
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
37
 
38
+ Host,Port = "127.0.0.1",9560
39
+ TestUser,TestPsw = "someone", "password"
38
40
 
39
- Host,Port = "127.0.0.1",9560
40
- TestUser,TestPsw = "someone", "password"
41
+ class SaslServer < EM::Connection
42
+ include EM::Protocols::SASLauth
43
+ def validate usr, psw, sys, realm
44
+ usr == TestUser and psw == TestPsw
45
+ end
46
+ end
41
47
 
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
+ class SaslClient < EM::Connection
49
+ include EM::Protocols::SASLauthclient
50
+ end
48
51
 
49
- class SaslClient < EM::Connection
50
- include EM::Protocols::SASLauthclient
51
- end
52
+ def test_sasl
53
+ resp = nil
54
+ EM.run {
55
+ EM.start_server( Host, Port, SaslServer )
52
56
 
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
57
+ c = EM.connect( Host, Port, SaslClient )
58
+ d = c.validate?( TestUser, TestPsw )
59
+ d.timeout 2
60
+ d.callback {
61
+ resp = true
62
+ EM.stop
63
+ }
64
+ d.errback {
65
+ resp = false
66
+ EM.stop
67
+ }
68
+ }
69
+ assert_equal( true, resp )
70
+ end
72
71
 
73
72
  end
74
-
@@ -31,16 +31,16 @@ require 'test/unit'
31
31
 
32
32
  class TestSendFile < Test::Unit::TestCase
33
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
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
44
  end
45
45
 
46
46
  def receive_data(data)
@@ -52,192 +52,191 @@ class TestSendFile < Test::Unit::TestCase
52
52
  end
53
53
  end
54
54
 
55
- TestHost = "0.0.0.0"
56
- TestPort = 9055
57
- TestFilename = "./xxxxxx"
55
+ TestHost = "0.0.0.0"
56
+ TestPort = 9055
57
+ TestFilename = "./xxxxxx"
58
58
 
59
- def setup
60
- end
59
+ def setup
60
+ end
61
61
 
62
- def teardown
63
- File.unlink( TestFilename ) if File.exist?( TestFilename )
64
- end
62
+ def teardown
63
+ File.unlink( TestFilename ) if File.exist?( TestFilename )
64
+ end
65
65
 
66
- def test_send_file
67
- File.open( TestFilename, "w" ) {|f|
68
- f << ("A" * 5000)
69
- }
66
+ def test_send_file
67
+ File.open( TestFilename, "w" ) {|f|
68
+ f << ("A" * 5000)
69
+ }
70
70
 
71
- data = ''
71
+ data = ''
72
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
- }
73
+ EM.run {
74
+ EM.start_server TestHost, TestPort, TestModule
75
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
81
76
 
82
- assert_equal( "A" * 5000, data )
83
- File.unlink TestFilename
84
- end
77
+ EM.connect TestHost, TestPort, TestClient do |c|
78
+ c.data_to { |d| data << d }
79
+ end
80
+ }
85
81
 
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
- }
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
91
 
92
- data = ''
92
+ data = ''
93
93
 
94
- ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
94
+ ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
95
95
  assert_raises( 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'
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
190
  rescue LoadError
191
191
  return
192
192
  end
193
- File.open( TestFilename, "w" ) {|f|
194
- f << ("A" * 10000)
195
- }
193
+ File.open( TestFilename, "w" ) {|f|
194
+ f << ("A" * 10000)
195
+ }
196
196
 
197
- data = ''
197
+ data = ''
198
198
 
199
- EM.run {
200
- EM.start_server TestHost, TestPort, StreamTestModule
201
- EM.add_timer(2) {EM.stop} # avoid hanging in case of error
202
- EM.connect TestHost, TestPort, TestClient do |c|
203
- c.data_to { |d| data << d }
204
- end
205
- }
199
+ EM.run {
200
+ EM.start_server TestHost, TestPort, StreamTestModule
201
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
202
+ EM.connect TestHost, TestPort, TestClient do |c|
203
+ c.data_to { |d| data << d }
204
+ end
205
+ }
206
206
 
207
- assert_equal( "A" * 10000, data )
207
+ assert_equal( "A" * 10000, data )
208
208
 
209
- File.unlink TestFilename
210
- end
209
+ File.unlink TestFilename
210
+ end
211
211
 
212
- def test_stream_large_chunked_file_data
213
- begin
214
- require 'fastfilereaderext'
212
+ def test_stream_large_chunked_file_data
213
+ begin
214
+ require 'fastfilereaderext'
215
215
  rescue LoadError
216
216
  return
217
217
  end
218
- File.open( TestFilename, "w" ) {|f|
219
- f << ("A" * 100000)
220
- }
221
-
222
- data = ''
223
-
224
- EM.run {
225
- EM.start_server TestHost, TestPort, ChunkStreamTestModule
226
- EM.add_timer(2) {EM.stop} # avoid hanging in case of error
227
- EM.connect TestHost, TestPort, TestClient do |c|
228
- c.data_to { |d| data << d }
229
- end
230
- }
231
-
232
- expected = [
233
- "4000\r\n#{"A" * 16384}\r\n" * 6,
234
- "6a0\r\n#{"A" * 0x6a0}\r\n",
235
- "0\r\n\r\n"
236
- ].join
237
- assert_equal( expected, data )
238
-
239
- File.unlink TestFilename
240
- end
218
+ File.open( TestFilename, "w" ) {|f|
219
+ f << ("A" * 100000)
220
+ }
221
+
222
+ data = ''
223
+
224
+ EM.run {
225
+ EM.start_server TestHost, TestPort, ChunkStreamTestModule
226
+ EM.add_timer(2) {EM.stop} # avoid hanging in case of error
227
+ EM.connect TestHost, TestPort, TestClient do |c|
228
+ c.data_to { |d| data << d }
229
+ end
230
+ }
231
+
232
+ expected = [
233
+ "4000\r\n#{"A" * 16384}\r\n" * 6,
234
+ "6a0\r\n#{"A" * 0x6a0}\r\n",
235
+ "0\r\n\r\n"
236
+ ].join
237
+ assert_equal( expected, data )
238
+
239
+ File.unlink TestFilename
240
+ end
241
241
 
242
242
  end
243
-