eventmachine-eventmachine 0.12.7 → 0.12.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/header_and_content.rb +138 -0
  45. data/lib/em/protocols/httpclient.rb +263 -0
  46. data/lib/em/protocols/httpclient2.rb +582 -0
  47. data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
  48. data/lib/em/protocols/linetext2.rb +160 -0
  49. data/lib/{protocols → em/protocols}/memcache.rb +37 -7
  50. data/lib/em/protocols/object_protocol.rb +39 -0
  51. data/lib/em/protocols/postgres3.rb +247 -0
  52. data/lib/em/protocols/saslauth.rb +175 -0
  53. data/lib/em/protocols/smtpclient.rb +331 -0
  54. data/lib/em/protocols/smtpserver.rb +547 -0
  55. data/lib/em/protocols/stomp.rb +200 -0
  56. data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
  57. data/lib/em/protocols.rb +35 -0
  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 +53 -37
  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
@@ -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
-
@@ -29,52 +29,48 @@ require 'eventmachine'
29
29
  require 'socket'
30
30
  require 'test/unit'
31
31
 
32
-
33
32
  class TestServers < Test::Unit::TestCase
34
33
 
35
- Host = "127.0.0.1"
36
- Port = 9555
37
-
38
- module NetstatHelper
39
- GlobalUdp4Rexp = /udp.*\s+(?:\*|(?:0\.){3}0)[:.](\d+)\s/i
40
- GlobalTcp4Rexp = /tcp.*\s+(?:\*|(?:0\.){3}0)[:.](\d+)\s/i
41
- LocalUdpRexp = /udp.*\s+(?:127\.0\.0\.1|::1)[:.](\d+)\s/i
42
- LocalTcpRexp = /tcp.*\s+(?:127\.0\.0\.1|::1)[:.](\d+)\s/i
43
- def grep_netstat(pattern)
44
- `netstat -an`.scan(/^.*$/).grep(pattern)
34
+ Host = "127.0.0.1"
35
+ Port = 9555
36
+
37
+ module NetstatHelper
38
+ GlobalUdp4Rexp = /udp.*\s+(?:\*|(?:0\.){3}0)[:.](\d+)\s/i
39
+ GlobalTcp4Rexp = /tcp.*\s+(?:\*|(?:0\.){3}0)[:.](\d+)\s/i
40
+ LocalUdpRexp = /udp.*\s+(?:127\.0\.0\.1|::1)[:.](\d+)\s/i
41
+ LocalTcpRexp = /tcp.*\s+(?:127\.0\.0\.1|::1)[:.](\d+)\s/i
42
+ def grep_netstat(pattern)
43
+ `netstat -an`.scan(/^.*$/).grep(pattern)
45
44
  end
46
45
  end
47
- include NetstatHelper
46
+ include NetstatHelper
48
47
 
49
- class TestStopServer < EM::Connection
50
- def initialize *args
51
- super
52
- end
53
- def post_init
54
- # TODO,sucks that this isn't OOPy enough.
55
- EM.stop_server @server_instance
56
- end
57
- end
58
-
59
- def run_test_stop_server
60
- EM.run {
61
- sig = EM.start_server(Host, Port)
62
- assert(grep_netstat(LocalTcpRexp).grep(%r(#{Port})).size >= 1, "Server didn't start")
63
- EM.stop_server sig
64
- # Give the server some time to shutdown.
65
- EM.add_timer(0.1) {
66
- assert(grep_netstat(LocalTcpRexp).grep(%r(#{Port})).empty?, "Servers didn't stop")
67
- EM.stop
68
- }
69
- }
70
- end
71
- def test_stop_server
72
- assert(grep_netstat(LocalTcpRexp).grep(Port).empty?, "Port already in use")
73
- 5.times {run_test_stop_server}
74
- assert(grep_netstat(LocalTcpRexp).grep(%r(#{Port})).empty?, "Servers didn't stop")
75
- end
48
+ class TestStopServer < EM::Connection
49
+ def initialize *args
50
+ super
51
+ end
52
+ def post_init
53
+ # TODO,sucks that this isn't OOPy enough.
54
+ EM.stop_server @server_instance
55
+ end
56
+ end
76
57
 
58
+ def run_test_stop_server
59
+ EM.run {
60
+ sig = EM.start_server(Host, Port)
61
+ assert(grep_netstat(LocalTcpRexp).grep(%r(#{Port})).size >= 1, "Server didn't start")
62
+ EM.stop_server sig
63
+ # Give the server some time to shutdown.
64
+ EM.add_timer(0.1) {
65
+ assert(grep_netstat(LocalTcpRexp).grep(%r(#{Port})).empty?, "Servers didn't stop")
66
+ EM.stop
67
+ }
68
+ }
69
+ end
70
+ def test_stop_server
71
+ assert(grep_netstat(LocalTcpRexp).grep(Port).empty?, "Port already in use")
72
+ 5.times {run_test_stop_server}
73
+ assert(grep_netstat(LocalTcpRexp).grep(%r(#{Port})).empty?, "Servers didn't stop")
74
+ end
77
75
 
78
76
  end
79
-
80
-
@@ -30,64 +30,56 @@ require 'test/unit'
30
30
 
31
31
  class TestSmtpServer < Test::Unit::TestCase
32
32
 
33
- # Don't test on port 25. It requires superuser and there's probably
34
- # a mail server already running there anyway.
35
- Localhost = "127.0.0.1"
36
- Localport = 25001
33
+ # Don't test on port 25. It requires superuser and there's probably
34
+ # a mail server already running there anyway.
35
+ Localhost = "127.0.0.1"
36
+ Localport = 25001
37
37
 
38
- # This class is an example of what you need to write in order
39
- # to implement a mail server. You override the methods you are
40
- # interested in. Some, but not all, of these are illustrated here.
41
- #
42
- class Mailserver < EM::Protocols::SmtpServer
38
+ # This class is an example of what you need to write in order
39
+ # to implement a mail server. You override the methods you are
40
+ # interested in. Some, but not all, of these are illustrated here.
41
+ #
42
+ class Mailserver < EM::Protocols::SmtpServer
43
43
 
44
- attr_reader :my_msg_body, :my_sender, :my_recipients
44
+ attr_reader :my_msg_body, :my_sender, :my_recipients
45
45
 
46
- def initialize *args
47
- super
48
- end
49
- def receive_sender sender
50
- @my_sender = sender
51
- #p sender
52
- true
53
- end
54
- def receive_recipient rcpt
55
- @my_recipients ||= []
56
- @my_recipients << rcpt
57
- true
58
- end
59
- def receive_data_chunk c
60
- @my_msg_body = c.last
61
- end
62
- def connection_ended
63
- EM.stop
64
- end
65
- end
46
+ def initialize *args
47
+ super
48
+ end
49
+ def receive_sender sender
50
+ @my_sender = sender
51
+ #p sender
52
+ true
53
+ end
54
+ def receive_recipient rcpt
55
+ @my_recipients ||= []
56
+ @my_recipients << rcpt
57
+ true
58
+ end
59
+ def receive_data_chunk c
60
+ @my_msg_body = c.last
61
+ end
62
+ def connection_ended
63
+ EM.stop
64
+ end
65
+ end
66
66
 
67
+ def test_mail
68
+ c = nil
69
+ EM.run {
70
+ EM.start_server( Localhost, Localport, Mailserver ) {|conn| c = conn}
71
+ EM::Timer.new(2) {EM.stop} # prevent hanging the test suite in case of error
72
+ EM::Protocols::SmtpClient.send :host=>Localhost,
73
+ :port=>Localport,
74
+ :domain=>"bogus",
75
+ :from=>"me@example.com",
76
+ :to=>"you@example.com",
77
+ :header=> {"Subject"=>"Email subject line", "Reply-to"=>"me@example.com"},
78
+ :body=>"Not much of interest here."
67
79
 
68
- def setup
69
- end
70
-
71
- def teardown
72
- end
73
-
74
- def test_mail
75
- c = nil
76
- EM.run {
77
- EM.start_server( Localhost, Localport, Mailserver ) {|conn| c = conn}
78
- EM::Timer.new(2) {EM.stop} # prevent hanging the test suite in case of error
79
- EM::Protocols::SmtpClient.send :host=>Localhost,
80
- :port=>Localport,
81
- :domain=>"bogus",
82
- :from=>"me@example.com",
83
- :to=>"you@example.com",
84
- :header=> {"Subject"=>"Email subject line", "Reply-to"=>"me@example.com"},
85
- :body=>"Not much of interest here."
86
-
87
- }
88
- assert_equal( "Not much of interest here.", c.my_msg_body )
89
- assert_equal( "<me@example.com>", c.my_sender )
90
- assert_equal( ["<you@example.com>"], c.my_recipients )
91
- end
80
+ }
81
+ assert_equal( "Not much of interest here.", c.my_msg_body )
82
+ assert_equal( "<me@example.com>", c.my_sender )
83
+ assert_equal( ["<you@example.com>"], c.my_recipients )
84
+ end
92
85
  end
93
-