libc-eventmachine 0.12.5.42
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/Rakefile +195 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +138 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +15 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
- data/docs/PURE_RUBY +77 -0
- data/docs/README +74 -0
- data/docs/RELEASE_NOTES +96 -0
- data/docs/SMTP +9 -0
- data/docs/SPAWNED_PROCESSES +93 -0
- data/docs/TODO +10 -0
- data/ext/binder.cpp +126 -0
- data/ext/binder.h +48 -0
- data/ext/cmain.cpp +582 -0
- data/ext/cplusplus.cpp +177 -0
- data/ext/ed.cpp +1522 -0
- data/ext/ed.h +380 -0
- data/ext/em.cpp +1947 -0
- data/ext/em.h +186 -0
- data/ext/emwin.cpp +300 -0
- data/ext/emwin.h +94 -0
- data/ext/epoll.cpp +26 -0
- data/ext/epoll.h +25 -0
- data/ext/eventmachine.h +98 -0
- data/ext/eventmachine_cpp.h +96 -0
- data/ext/extconf.rb +129 -0
- data/ext/fastfilereader/extconf.rb +77 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +82 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +351 -0
- data/ext/project.h +119 -0
- data/ext/rubymain.cpp +858 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +423 -0
- data/ext/ssl.h +90 -0
- data/java/src/com/rubyeventmachine/Application.java +196 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/deferrable.rb +208 -0
- data/lib/em/eventable.rb +39 -0
- data/lib/em/future.rb +62 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/processes.rb +68 -0
- data/lib/em/spawnable.rb +88 -0
- data/lib/em/streamer.rb +112 -0
- data/lib/eventmachine.rb +1920 -0
- data/lib/eventmachine_version.rb +31 -0
- data/lib/evma/callback.rb +32 -0
- data/lib/evma/container.rb +75 -0
- data/lib/evma/factory.rb +77 -0
- data/lib/evma/protocol.rb +87 -0
- data/lib/evma/reactor.rb +48 -0
- data/lib/evma.rb +32 -0
- data/lib/jeventmachine.rb +140 -0
- data/lib/pr_eventmachine.rb +1017 -0
- data/lib/protocols/buftok.rb +127 -0
- data/lib/protocols/header_and_content.rb +129 -0
- data/lib/protocols/httpcli2.rb +803 -0
- data/lib/protocols/httpclient.rb +270 -0
- data/lib/protocols/line_and_text.rb +126 -0
- data/lib/protocols/linetext2.rb +161 -0
- data/lib/protocols/memcache.rb +293 -0
- data/lib/protocols/postgres.rb +261 -0
- data/lib/protocols/saslauth.rb +179 -0
- data/lib/protocols/smtpclient.rb +308 -0
- data/lib/protocols/smtpserver.rb +556 -0
- data/lib/protocols/stomp.rb +153 -0
- data/lib/protocols/tcptest.rb +57 -0
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +78 -0
- data/tasks/tests.rake +193 -0
- data/tests/test_attach.rb +83 -0
- data/tests/test_basic.rb +231 -0
- data/tests/test_bind.rb +73 -0
- data/tests/test_connection_count.rb +35 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +163 -0
- data/tests/test_error_handler.rb +32 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_eventables.rb +77 -0
- data/tests/test_exc.rb +58 -0
- data/tests/test_futures.rb +214 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +215 -0
- data/tests/test_httpclient2.rb +155 -0
- data/tests/test_kb.rb +61 -0
- data/tests/test_ltp.rb +188 -0
- data/tests/test_ltp2.rb +320 -0
- data/tests/test_next_tick.rb +109 -0
- data/tests/test_processes.rb +56 -0
- data/tests/test_pure.rb +129 -0
- data/tests/test_running.rb +47 -0
- data/tests/test_sasl.rb +74 -0
- data/tests/test_send_file.rb +243 -0
- data/tests/test_servers.rb +80 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +93 -0
- data/tests/test_spawn.rb +329 -0
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_timers.rb +148 -0
- data/tests/test_ud.rb +43 -0
- data/tests/testem.rb +31 -0
- metadata +230 -0
data/tests/test_sasl.rb
ADDED
|
@@ -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,243 @@
|
|
|
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_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'
|
|
190
|
+
rescue LoadError
|
|
191
|
+
return
|
|
192
|
+
end
|
|
193
|
+
File.open( TestFilename, "w" ) {|f|
|
|
194
|
+
f << ("A" * 10000)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
data = ''
|
|
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
|
+
}
|
|
206
|
+
|
|
207
|
+
assert_equal( "A" * 10000, data )
|
|
208
|
+
|
|
209
|
+
File.unlink TestFilename
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_stream_large_chunked_file_data
|
|
213
|
+
begin
|
|
214
|
+
require 'fastfilereaderext'
|
|
215
|
+
rescue LoadError
|
|
216
|
+
return
|
|
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
|
|
241
|
+
|
|
242
|
+
end
|
|
243
|
+
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
|
|
33
|
+
class TestServers < Test::Unit::TestCase
|
|
34
|
+
|
|
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)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
include NetstatHelper
|
|
48
|
+
|
|
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
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
|
|
@@ -0,0 +1,83 @@
|
|
|
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 TestSmtpClient < Test::Unit::TestCase
|
|
32
|
+
|
|
33
|
+
Localhost = "127.0.0.1"
|
|
34
|
+
Localport = 9801
|
|
35
|
+
|
|
36
|
+
def setup
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def teardown
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_a
|
|
43
|
+
# No real tests until we have a server implementation to test against.
|
|
44
|
+
# This is what the call looks like, though:
|
|
45
|
+
err = nil
|
|
46
|
+
EM.run {
|
|
47
|
+
d = EM::Protocols::SmtpClient.send :domain=>"example.com",
|
|
48
|
+
:host=>Localhost,
|
|
49
|
+
:port=>Localport, # optional, defaults 25
|
|
50
|
+
:starttls=>true,
|
|
51
|
+
:from=>"sender@example.com",
|
|
52
|
+
:to=> ["to_1@example.com", "to_2@example.com"],
|
|
53
|
+
:header=> {"Subject" => "This is a subject line"},
|
|
54
|
+
:body=> "This is the body of the email",
|
|
55
|
+
:verbose=>true
|
|
56
|
+
d.errback {|e|
|
|
57
|
+
err = e
|
|
58
|
+
EM.stop
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
assert(err)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_content
|
|
65
|
+
err = nil
|
|
66
|
+
EM.run {
|
|
67
|
+
d = EM::Protocols::SmtpClient.send :domain=>"example.com",
|
|
68
|
+
:host=>Localhost,
|
|
69
|
+
:port=>Localport, # optional, defaults 25
|
|
70
|
+
:starttls=>true,
|
|
71
|
+
:from=>"sender@example.com",
|
|
72
|
+
:to=> ["to_1@example.com", "to_2@example.com"],
|
|
73
|
+
:content => ["Subject: xxx\r\n\r\ndata\r\n.\r\n"],
|
|
74
|
+
:verbose=>true
|
|
75
|
+
d.errback {|e|
|
|
76
|
+
err = e
|
|
77
|
+
EM.stop
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
assert(err)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
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 TestSmtpServer < Test::Unit::TestCase
|
|
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
|
|
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
|
|
43
|
+
|
|
44
|
+
attr_reader :my_msg_body, :my_sender, :my_recipients
|
|
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
|
|
66
|
+
|
|
67
|
+
|
|
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
|
|
92
|
+
end
|
|
93
|
+
|