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.
- data/{docs/README → README} +21 -13
- data/Rakefile +14 -4
- data/docs/DEFERRABLES +0 -5
- data/docs/INSTALL +2 -4
- data/docs/LEGAL +1 -1
- data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
- data/docs/PURE_RUBY +0 -2
- data/docs/RELEASE_NOTES +0 -2
- data/docs/SMTP +0 -7
- data/docs/SPAWNED_PROCESSES +0 -4
- data/docs/TODO +0 -2
- data/eventmachine.gemspec +17 -8
- data/examples/ex_channel.rb +43 -0
- data/examples/ex_queue.rb +2 -0
- data/examples/helper.rb +2 -0
- data/ext/cmain.cpp +119 -20
- data/ext/cplusplus.cpp +15 -6
- data/ext/ed.cpp +303 -93
- data/ext/ed.h +49 -22
- data/ext/em.cpp +368 -42
- data/ext/em.h +43 -6
- data/ext/eventmachine.h +21 -8
- data/ext/eventmachine_cpp.h +1 -0
- data/ext/extconf.rb +4 -0
- data/ext/kb.cpp +1 -2
- data/ext/pipe.cpp +1 -3
- data/ext/project.h +21 -0
- data/ext/rubymain.cpp +232 -32
- data/ext/ssl.cpp +38 -1
- data/ext/ssl.h +5 -1
- data/java/src/com/rubyeventmachine/Application.java +7 -3
- data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
- data/lib/{protocols → em}/buftok.rb +16 -5
- data/lib/em/callback.rb +26 -0
- data/lib/em/channel.rb +57 -0
- data/lib/em/connection.rb +505 -0
- data/lib/em/deferrable.rb +144 -165
- data/lib/em/file_watch.rb +54 -0
- data/lib/em/future.rb +24 -25
- data/lib/em/messages.rb +1 -1
- data/lib/em/process_watch.rb +44 -0
- data/lib/em/processes.rb +58 -52
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +263 -0
- data/lib/em/protocols/httpclient2.rb +582 -0
- data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
- data/lib/em/protocols/linetext2.rb +160 -0
- data/lib/{protocols → em/protocols}/memcache.rb +37 -7
- data/lib/em/protocols/object_protocol.rb +39 -0
- data/lib/em/protocols/postgres3.rb +247 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +331 -0
- data/lib/em/protocols/smtpserver.rb +547 -0
- data/lib/em/protocols/stomp.rb +200 -0
- data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
- data/lib/em/protocols.rb +35 -0
- data/lib/em/queue.rb +61 -0
- data/lib/em/spawnable.rb +53 -56
- data/lib/em/streamer.rb +92 -74
- data/lib/em/timers.rb +55 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1008 -1298
- data/lib/evma.rb +1 -1
- data/lib/jeventmachine.rb +106 -101
- data/lib/pr_eventmachine.rb +47 -36
- data/tasks/project.rake +2 -1
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/test_attach.rb +18 -0
- data/tests/test_basic.rb +108 -54
- data/tests/test_channel.rb +63 -0
- data/tests/test_connection_count.rb +2 -2
- data/tests/test_epoll.rb +109 -110
- data/tests/test_errors.rb +36 -36
- data/tests/test_exc.rb +22 -25
- data/tests/test_file_watch.rb +49 -0
- data/tests/test_futures.rb +77 -93
- data/tests/test_hc.rb +2 -2
- data/tests/test_httpclient.rb +55 -52
- data/tests/test_httpclient2.rb +110 -112
- data/tests/test_inactivity_timeout.rb +30 -0
- data/tests/test_kb.rb +8 -9
- data/tests/test_ltp2.rb +274 -277
- data/tests/test_next_tick.rb +91 -65
- data/tests/test_object_protocol.rb +37 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +56 -23
- data/tests/test_proxy_connection.rb +92 -0
- data/tests/test_pure.rb +1 -5
- data/tests/test_queue.rb +44 -0
- data/tests/test_running.rb +9 -14
- data/tests/test_sasl.rb +32 -34
- data/tests/test_send_file.rb +175 -176
- data/tests/test_servers.rb +37 -41
- data/tests/test_smtpserver.rb +47 -55
- data/tests/test_spawn.rb +284 -291
- data/tests/test_ssl_args.rb +1 -1
- data/tests/test_ssl_methods.rb +1 -1
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_timers.rb +81 -88
- data/tests/test_ud.rb +0 -7
- data/tests/testem.rb +1 -1
- metadata +53 -37
- data/lib/em/eventable.rb +0 -39
- data/lib/eventmachine_version.rb +0 -31
- data/lib/protocols/header_and_content.rb +0 -129
- data/lib/protocols/httpcli2.rb +0 -803
- data/lib/protocols/httpclient.rb +0 -270
- data/lib/protocols/linetext2.rb +0 -161
- data/lib/protocols/postgres.rb +0 -261
- data/lib/protocols/saslauth.rb +0 -179
- data/lib/protocols/smtpclient.rb +0 -308
- data/lib/protocols/smtpserver.rb +0 -556
- data/lib/protocols/stomp.rb +0 -153
- data/tests/test_eventables.rb +0 -77
data/tests/test_send_file.rb
CHANGED
|
@@ -31,16 +31,16 @@ require 'test/unit'
|
|
|
31
31
|
|
|
32
32
|
class TestSendFile < Test::Unit::TestCase
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
TestHost = "0.0.0.0"
|
|
56
|
+
TestPort = 9055
|
|
57
|
+
TestFilename = "./xxxxxx"
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
def setup
|
|
60
|
+
end
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
def teardown
|
|
63
|
+
File.unlink( TestFilename ) if File.exist?( TestFilename )
|
|
64
|
+
end
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
def test_send_file
|
|
67
|
+
File.open( TestFilename, "w" ) {|f|
|
|
68
|
+
f << ("A" * 5000)
|
|
69
|
+
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
data = ''
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
77
|
+
EM.connect TestHost, TestPort, TestClient do |c|
|
|
78
|
+
c.data_to { |d| data << d }
|
|
79
|
+
end
|
|
80
|
+
}
|
|
85
81
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
92
|
+
data = ''
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
ex_class = RUBY_PLATFORM == 'java' ? NativeException : RuntimeError
|
|
95
95
|
assert_raises( ex_class ) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
193
|
+
File.open( TestFilename, "w" ) {|f|
|
|
194
|
+
f << ("A" * 10000)
|
|
195
|
+
}
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
data = ''
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
207
|
+
assert_equal( "A" * 10000, data )
|
|
208
208
|
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
File.unlink TestFilename
|
|
210
|
+
end
|
|
211
211
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
def test_stream_large_chunked_file_data
|
|
213
|
+
begin
|
|
214
|
+
require 'fastfilereaderext'
|
|
215
215
|
rescue LoadError
|
|
216
216
|
return
|
|
217
217
|
end
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
data/tests/test_servers.rb
CHANGED
|
@@ -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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
46
|
+
include NetstatHelper
|
|
48
47
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
data/tests/test_smtpserver.rb
CHANGED
|
@@ -30,64 +30,56 @@ require 'test/unit'
|
|
|
30
30
|
|
|
31
31
|
class TestSmtpServer < Test::Unit::TestCase
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
44
|
+
attr_reader :my_msg_body, :my_sender, :my_recipients
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|