smparkes-eventmachine 0.12.10
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/.gitignore +15 -0
- data/README +81 -0
- data/Rakefile +374 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +133 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +13 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
- data/docs/PURE_RUBY +75 -0
- data/docs/RELEASE_NOTES +94 -0
- data/docs/SMTP +2 -0
- data/docs/SPAWNED_PROCESSES +89 -0
- data/docs/TODO +8 -0
- data/eventmachine.gemspec +40 -0
- data/examples/ex_channel.rb +43 -0
- data/examples/ex_queue.rb +2 -0
- data/examples/helper.rb +2 -0
- data/ext/binder.cpp +125 -0
- data/ext/binder.h +46 -0
- data/ext/cmain.cpp +827 -0
- data/ext/cplusplus.cpp +202 -0
- data/ext/ed.cpp +1901 -0
- data/ext/ed.h +424 -0
- data/ext/em.cpp +2288 -0
- data/ext/em.h +229 -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 +122 -0
- data/ext/eventmachine_cpp.h +96 -0
- data/ext/extconf.rb +150 -0
- data/ext/fastfilereader/extconf.rb +85 -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 +81 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +349 -0
- data/ext/project.h +156 -0
- data/ext/rubymain.cpp +1194 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +460 -0
- data/ext/ssl.h +94 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +570 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
- data/java/src/com/rubyeventmachine/application/Application.java +194 -0
- data/java/src/com/rubyeventmachine/application/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/application/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +109 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +148 -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 +75 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +90 -0
- data/lib/em/buftok.rb +138 -0
- data/lib/em/callback.rb +26 -0
- data/lib/em/channel.rb +57 -0
- data/lib/em/connection.rb +564 -0
- data/lib/em/deferrable.rb +192 -0
- data/lib/em/file_watch.rb +54 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/process_watch.rb +44 -0
- data/lib/em/processes.rb +119 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +263 -0
- data/lib/em/protocols/httpclient2.rb +590 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/linetext2.rb +161 -0
- data/lib/em/protocols/memcache.rb +323 -0
- data/lib/em/protocols/object_protocol.rb +45 -0
- data/lib/em/protocols/postgres3.rb +247 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +357 -0
- data/lib/em/protocols/smtpserver.rb +547 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +200 -0
- data/lib/em/protocols/tcptest.rb +53 -0
- data/lib/em/protocols.rb +36 -0
- data/lib/em/queue.rb +61 -0
- data/lib/em/spawnable.rb +85 -0
- data/lib/em/streamer.rb +130 -0
- data/lib/em/timers.rb +56 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1592 -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 +257 -0
- data/lib/pr_eventmachine.rb +1022 -0
- data/setup.rb +1585 -0
- data/tasks/cpp.rake_example +77 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/test_attach.rb +126 -0
- data/tests/test_basic.rb +284 -0
- data/tests/test_channel.rb +63 -0
- data/tests/test_connection_count.rb +35 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +160 -0
- data/tests/test_error_handler.rb +35 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_exc.rb +55 -0
- data/tests/test_file_watch.rb +49 -0
- data/tests/test_futures.rb +198 -0
- data/tests/test_get_sock_opt.rb +30 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +218 -0
- data/tests/test_httpclient2.rb +153 -0
- data/tests/test_inactivity_timeout.rb +50 -0
- data/tests/test_kb.rb +60 -0
- data/tests/test_ltp.rb +182 -0
- data/tests/test_ltp2.rb +317 -0
- data/tests/test_next_tick.rb +133 -0
- data/tests/test_object_protocol.rb +37 -0
- data/tests/test_pause.rb +70 -0
- data/tests/test_pending_connect_timeout.rb +48 -0
- data/tests/test_process_watch.rb +48 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +92 -0
- data/tests/test_pure.rb +125 -0
- data/tests/test_queue.rb +44 -0
- data/tests/test_running.rb +42 -0
- data/tests/test_sasl.rb +72 -0
- data/tests/test_send_file.rb +242 -0
- data/tests/test_servers.rb +76 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +85 -0
- data/tests/test_spawn.rb +322 -0
- data/tests/test_ssl_args.rb +79 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_ssl_verify.rb +82 -0
- data/tests/test_timers.rb +162 -0
- data/tests/test_ud.rb +36 -0
- data/tests/testem.rb +31 -0
- data/web/whatis +7 -0
- metadata +237 -0
data/tests/test_hc.rb
ADDED
@@ -0,0 +1,218 @@
|
|
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 TestHeaderAndContentProtocol < Test::Unit::TestCase
|
32
|
+
|
33
|
+
TestHost = "127.0.0.1"
|
34
|
+
TestPort = 8905
|
35
|
+
|
36
|
+
class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
|
37
|
+
attr_reader :first_header, :my_headers, :request
|
38
|
+
|
39
|
+
def receive_first_header_line hdr
|
40
|
+
@first_header ||= []
|
41
|
+
@first_header << hdr
|
42
|
+
end
|
43
|
+
def receive_headers hdrs
|
44
|
+
@my_headers ||= []
|
45
|
+
@my_headers << hdrs
|
46
|
+
end
|
47
|
+
def receive_request hdrs, content
|
48
|
+
@request ||= []
|
49
|
+
@request << [hdrs, content]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_no_content
|
54
|
+
the_connection = nil
|
55
|
+
EventMachine.run {
|
56
|
+
EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
|
57
|
+
the_connection = conn
|
58
|
+
end
|
59
|
+
EventMachine.add_timer(4) {raise "test timed out"}
|
60
|
+
|
61
|
+
client = Module.new do
|
62
|
+
def unbind
|
63
|
+
EM.add_timer(0.1) { EM.stop }
|
64
|
+
end
|
65
|
+
|
66
|
+
def post_init
|
67
|
+
send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
|
68
|
+
close_connection_after_writing
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
EventMachine.connect( TestHost, TestPort, client )
|
73
|
+
}
|
74
|
+
assert_equal( ["aaa"], the_connection.first_header )
|
75
|
+
assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
|
76
|
+
assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_content
|
80
|
+
the_connection = nil
|
81
|
+
content = "A" * 50
|
82
|
+
headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
|
83
|
+
EventMachine.run {
|
84
|
+
EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
|
85
|
+
the_connection = conn
|
86
|
+
end
|
87
|
+
EventMachine.add_timer(4) { assert(false, 'test timeout'); EM.stop }
|
88
|
+
|
89
|
+
client = Module.new do
|
90
|
+
define_method(:headers) { headers }
|
91
|
+
define_method(:content) { content }
|
92
|
+
|
93
|
+
def unbind
|
94
|
+
EM.add_timer(0.1) { EM.stop }
|
95
|
+
end
|
96
|
+
|
97
|
+
def post_init
|
98
|
+
headers.each { |h| send_data "#{h}\r\n" }
|
99
|
+
send_data "\n"
|
100
|
+
send_data content
|
101
|
+
close_connection_after_writing
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
EventMachine.connect( TestHost, TestPort, client )
|
106
|
+
|
107
|
+
}
|
108
|
+
assert_equal( ["aaa"], the_connection.first_header )
|
109
|
+
assert_equal( [headers], the_connection.my_headers )
|
110
|
+
assert_equal( [[headers, content]], the_connection.request )
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_several_requests
|
114
|
+
the_connection = nil
|
115
|
+
content = "A" * 50
|
116
|
+
headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
|
117
|
+
EventMachine.run {
|
118
|
+
EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
|
119
|
+
the_connection = conn
|
120
|
+
end
|
121
|
+
EventMachine.add_timer(4) { assert(false, 'test timeout'); EM.stop }
|
122
|
+
|
123
|
+
client = Module.new do
|
124
|
+
define_method(:headers) { headers }
|
125
|
+
define_method(:content) { content }
|
126
|
+
|
127
|
+
def unbind
|
128
|
+
EM.add_timer(0.1) { EM.stop }
|
129
|
+
end
|
130
|
+
|
131
|
+
def post_init
|
132
|
+
5.times do
|
133
|
+
headers.each { |h| send_data "#{h}\r\n" }
|
134
|
+
send_data "\n"
|
135
|
+
send_data content
|
136
|
+
end
|
137
|
+
close_connection_after_writing
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
EventMachine.connect( TestHost, TestPort, client )
|
142
|
+
}
|
143
|
+
assert_equal( ["aaa"] * 5, the_connection.first_header )
|
144
|
+
assert_equal( [headers] * 5, the_connection.my_headers )
|
145
|
+
assert_equal( [[headers, content]] * 5, the_connection.request )
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
# def x_test_multiple_content_length_headers
|
150
|
+
# # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
|
151
|
+
# the_connection = nil
|
152
|
+
# content = "A" * 50
|
153
|
+
# headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
|
154
|
+
# EventMachine.run {
|
155
|
+
# EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
|
156
|
+
# the_connection = conn
|
157
|
+
# end
|
158
|
+
# EventMachine.add_timer(4) {raise "test timed out"}
|
159
|
+
# test_proc = proc {
|
160
|
+
# t = TCPSocket.new TestHost, TestPort
|
161
|
+
# headers.each {|h| t.write "#{h}\r\n" }
|
162
|
+
# t.write "\n"
|
163
|
+
# t.write content
|
164
|
+
# t.close
|
165
|
+
# }
|
166
|
+
# EventMachine.defer test_proc, proc {
|
167
|
+
# EventMachine.stop
|
168
|
+
# }
|
169
|
+
# }
|
170
|
+
# end
|
171
|
+
|
172
|
+
def test_interpret_headers
|
173
|
+
the_connection = nil
|
174
|
+
content = "A" * 50
|
175
|
+
headers = [
|
176
|
+
"GET / HTTP/1.0",
|
177
|
+
"Accept: aaa",
|
178
|
+
"User-Agent: bbb",
|
179
|
+
"Host: ccc",
|
180
|
+
"x-tempest-header:ddd"
|
181
|
+
]
|
182
|
+
|
183
|
+
EventMachine.run {
|
184
|
+
EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
|
185
|
+
the_connection = conn
|
186
|
+
end
|
187
|
+
EventMachine.add_timer(4) {raise "test timed out"}
|
188
|
+
|
189
|
+
client = Module.new do
|
190
|
+
define_method(:headers) { headers }
|
191
|
+
define_method(:content) { content }
|
192
|
+
|
193
|
+
def unbind
|
194
|
+
EM.add_timer(0.1) { EM.stop }
|
195
|
+
end
|
196
|
+
|
197
|
+
def post_init
|
198
|
+
headers.each { |h| send_data "#{h}\r\n" }
|
199
|
+
send_data "\n"
|
200
|
+
send_data content
|
201
|
+
close_connection_after_writing
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
EventMachine.connect( TestHost, TestPort, client )
|
206
|
+
}
|
207
|
+
|
208
|
+
hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
|
209
|
+
expect = {
|
210
|
+
:accept => "aaa",
|
211
|
+
:user_agent => "bbb",
|
212
|
+
:host => "ccc",
|
213
|
+
:x_tempest_header => "ddd"
|
214
|
+
}
|
215
|
+
assert_equal(expect, hsh)
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
@@ -0,0 +1,218 @@
|
|
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 TestHttpClient < 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
|
+
#-------------------------------------
|
43
|
+
|
44
|
+
def test_http_client
|
45
|
+
ok = false
|
46
|
+
EventMachine.run {
|
47
|
+
c = EventMachine::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80
|
48
|
+
c.callback {
|
49
|
+
ok = true
|
50
|
+
EventMachine.stop
|
51
|
+
}
|
52
|
+
c.errback {EventMachine.stop} # necessary, otherwise a failure blocks the test suite forever.
|
53
|
+
}
|
54
|
+
assert ok
|
55
|
+
end
|
56
|
+
|
57
|
+
#-------------------------------------
|
58
|
+
|
59
|
+
def test_http_client_1
|
60
|
+
ok = false
|
61
|
+
EventMachine.run {
|
62
|
+
c = EventMachine::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80
|
63
|
+
c.callback {ok = true; EventMachine.stop}
|
64
|
+
c.errback {EventMachine.stop}
|
65
|
+
}
|
66
|
+
assert ok
|
67
|
+
end
|
68
|
+
|
69
|
+
#-------------------------------------
|
70
|
+
|
71
|
+
def test_http_client_2
|
72
|
+
ok = false
|
73
|
+
EventMachine.run {
|
74
|
+
c = EventMachine::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80
|
75
|
+
c.callback {|result|
|
76
|
+
ok = true;
|
77
|
+
EventMachine.stop
|
78
|
+
}
|
79
|
+
c.errback {EventMachine.stop}
|
80
|
+
}
|
81
|
+
assert ok
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
#-----------------------------------------
|
86
|
+
|
87
|
+
# Test a server that returns a page with a zero content-length.
|
88
|
+
# This caused an early version of the HTTP client not to generate a response,
|
89
|
+
# causing this test to hang. Observe, there was no problem with responses
|
90
|
+
# lacking a content-length, just when the content-length was zero.
|
91
|
+
#
|
92
|
+
class EmptyContent < EventMachine::Connection
|
93
|
+
def initialize *args
|
94
|
+
super
|
95
|
+
end
|
96
|
+
def receive_data data
|
97
|
+
send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n"
|
98
|
+
close_connection_after_writing
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_http_empty_content
|
103
|
+
ok = false
|
104
|
+
EventMachine.run {
|
105
|
+
EventMachine.start_server "127.0.0.1", 9701, EmptyContent
|
106
|
+
c = EventMachine::Protocols::HttpClient.send :request, :host => "127.0.0.1", :port => 9701
|
107
|
+
c.callback {|result|
|
108
|
+
ok = true
|
109
|
+
EventMachine.stop
|
110
|
+
}
|
111
|
+
}
|
112
|
+
assert ok
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
#---------------------------------------
|
117
|
+
|
118
|
+
class PostContent < EventMachine::Protocols::LineAndTextProtocol
|
119
|
+
def initialize *args
|
120
|
+
super
|
121
|
+
@lines = []
|
122
|
+
end
|
123
|
+
def receive_line line
|
124
|
+
if line.length > 0
|
125
|
+
@lines << line
|
126
|
+
else
|
127
|
+
process_headers
|
128
|
+
end
|
129
|
+
end
|
130
|
+
def receive_binary_data data
|
131
|
+
@post_content = data
|
132
|
+
send_response
|
133
|
+
end
|
134
|
+
def process_headers
|
135
|
+
if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/
|
136
|
+
@uri = $1.dup
|
137
|
+
else
|
138
|
+
raise "bad request"
|
139
|
+
end
|
140
|
+
|
141
|
+
@lines.each {|line|
|
142
|
+
if line =~ /\AContent-length:\s*(\d+)\Z/i
|
143
|
+
@content_length = $1.dup.to_i
|
144
|
+
elsif line =~ /\AContent-type:\s*(\d+)\Z/i
|
145
|
+
@content_type = $1.dup
|
146
|
+
end
|
147
|
+
}
|
148
|
+
|
149
|
+
raise "invalid content length" unless @content_length
|
150
|
+
set_binary_mode @content_length
|
151
|
+
end
|
152
|
+
def send_response
|
153
|
+
send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789"
|
154
|
+
close_connection_after_writing
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client
|
159
|
+
# is sending a 1.0 request. Gotta fix the client
|
160
|
+
def test_post
|
161
|
+
response = nil
|
162
|
+
EventMachine.run {
|
163
|
+
EventMachine.start_server Localhost, Localport, PostContent
|
164
|
+
EventMachine.add_timer(2) {raise "timed out"}
|
165
|
+
c = EventMachine::Protocols::HttpClient.request(
|
166
|
+
:host=>Localhost,
|
167
|
+
:port=>Localport,
|
168
|
+
:method=>:post,
|
169
|
+
:request=>"/aaa",
|
170
|
+
:content=>"XYZ",
|
171
|
+
:content_type=>"text/plain"
|
172
|
+
)
|
173
|
+
c.callback {|r|
|
174
|
+
response = r
|
175
|
+
EventMachine.stop
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
assert_equal( 200, response[:status] )
|
180
|
+
assert_equal( "0123456789", response[:content] )
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
# TODO, need a more intelligent cookie tester.
|
185
|
+
# In fact, this whole test-harness needs a beefier server implementation.
|
186
|
+
def test_cookie
|
187
|
+
ok = false
|
188
|
+
EM.run {
|
189
|
+
c = EM::Protocols::HttpClient.send :request, :host => "www.bayshorenetworks.com", :port => 80, :cookie=>"aaa=bbb"
|
190
|
+
c.callback {|result|
|
191
|
+
ok = true;
|
192
|
+
EventMachine.stop
|
193
|
+
}
|
194
|
+
c.errback {EventMachine.stop}
|
195
|
+
}
|
196
|
+
assert ok
|
197
|
+
end
|
198
|
+
|
199
|
+
# We can tell the client to send an HTTP/1.0 request (default is 1.1).
|
200
|
+
# This is useful for suppressing chunked responses until those are working.
|
201
|
+
def test_version_1_0
|
202
|
+
ok = false
|
203
|
+
EM.run {
|
204
|
+
c = EM::P::HttpClient.request(
|
205
|
+
:host => "www.bayshorenetworks.com",
|
206
|
+
:port => 80,
|
207
|
+
:version => "1.0"
|
208
|
+
)
|
209
|
+
c.callback {|result|
|
210
|
+
ok = true;
|
211
|
+
EventMachine.stop
|
212
|
+
}
|
213
|
+
c.errback {EventMachine.stop}
|
214
|
+
}
|
215
|
+
assert ok
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
@@ -0,0 +1,153 @@
|
|
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 TestHttpClient2 < Test::Unit::TestCase
|
32
|
+
Localhost = "127.0.0.1"
|
33
|
+
Localport = 9801
|
34
|
+
|
35
|
+
def setup
|
36
|
+
end
|
37
|
+
|
38
|
+
def teardown
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
class TestServer < EM::Connection
|
43
|
+
end
|
44
|
+
|
45
|
+
# #connect returns an object which has made a connection to an HTTP server
|
46
|
+
# and exposes methods for making HTTP requests on that connection.
|
47
|
+
# #connect can take either a pair of parameters (a host and a port),
|
48
|
+
# or a single parameter which is a Hash.
|
49
|
+
#
|
50
|
+
def test_connect
|
51
|
+
EM.run {
|
52
|
+
EM.start_server Localhost, Localport, TestServer
|
53
|
+
http1 = EM::P::HttpClient2.connect Localhost, Localport
|
54
|
+
http2 = EM::P::HttpClient2.connect( :host=>Localhost, :port=>Localport )
|
55
|
+
EM.stop
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
def test_bad_port
|
61
|
+
EM.run {
|
62
|
+
EM.start_server Localhost, Localport, TestServer
|
63
|
+
assert_raises( ArgumentError ) {
|
64
|
+
EM::P::HttpClient2.connect Localhost, "xxx"
|
65
|
+
}
|
66
|
+
EM.stop
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_bad_server
|
71
|
+
err = nil
|
72
|
+
EM.run {
|
73
|
+
http = EM::P::HttpClient2.connect Localhost, 9999
|
74
|
+
d = http.get "/"
|
75
|
+
d.errback { err = true; d.internal_error; EM.stop }
|
76
|
+
}
|
77
|
+
assert(err)
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_get
|
81
|
+
content = nil
|
82
|
+
EM.run {
|
83
|
+
http = EM::P::HttpClient2.connect "google.com", 80
|
84
|
+
d = http.get "/"
|
85
|
+
d.callback {
|
86
|
+
content = d.content
|
87
|
+
EM.stop
|
88
|
+
}
|
89
|
+
}
|
90
|
+
assert(content)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Not a pipelined request because we wait for one response before we request the next.
|
94
|
+
# XXX this test is broken because it sends the second request to the first connection
|
95
|
+
# XXX right before the connection closes
|
96
|
+
def _test_get_multiple
|
97
|
+
content = nil
|
98
|
+
EM.run {
|
99
|
+
http = EM::P::HttpClient2.connect "google.com", 80
|
100
|
+
d = http.get "/"
|
101
|
+
d.callback {
|
102
|
+
e = http.get "/"
|
103
|
+
e.callback {
|
104
|
+
content = e.content
|
105
|
+
EM.stop
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}
|
109
|
+
assert(content)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_get_pipeline
|
113
|
+
headers, headers2 = nil, nil
|
114
|
+
EM.run {
|
115
|
+
http = EM::P::HttpClient2.connect "google.com", 80
|
116
|
+
d = http.get("/")
|
117
|
+
d.callback {
|
118
|
+
headers = d.headers
|
119
|
+
}
|
120
|
+
e = http.get("/")
|
121
|
+
e.callback {
|
122
|
+
headers2 = e.headers
|
123
|
+
}
|
124
|
+
EM::Timer.new(1) {EM.stop}
|
125
|
+
}
|
126
|
+
assert(headers)
|
127
|
+
assert(headers2)
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
def test_authheader
|
132
|
+
EM.run {
|
133
|
+
EM.start_server Localhost, Localport, TestServer
|
134
|
+
http = EM::P::HttpClient2.connect Localhost, 18842
|
135
|
+
d = http.get :url=>"/", :authorization=>"Basic xxx"
|
136
|
+
d.callback {EM.stop}
|
137
|
+
d.errback {EM.stop}
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_https_get
|
142
|
+
d = nil
|
143
|
+
EM.run {
|
144
|
+
http = EM::P::HttpClient2.connect :host => 'www.amazon.com', :port => 443, :ssl => true
|
145
|
+
d = http.get "/"
|
146
|
+
d.callback {
|
147
|
+
EM.stop
|
148
|
+
}
|
149
|
+
}
|
150
|
+
assert_equal(200, d.status)
|
151
|
+
end if EM.ssl?
|
152
|
+
|
153
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
$:.unshift "../lib"
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestInactivityTimeout < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_default
|
8
|
+
$timeout = nil
|
9
|
+
EM.run {
|
10
|
+
c = EM.connect("127.0.0.1", 54321)
|
11
|
+
$timeout = c.comm_inactivity_timeout
|
12
|
+
EM.stop
|
13
|
+
}
|
14
|
+
|
15
|
+
assert_equal(0.0, $timeout)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_set_and_get
|
19
|
+
$timeout = nil
|
20
|
+
EM.run {
|
21
|
+
c = EM.connect("127.0.0.1", 54321)
|
22
|
+
c.comm_inactivity_timeout = 2.5
|
23
|
+
$timeout = c.comm_inactivity_timeout
|
24
|
+
EM.stop
|
25
|
+
}
|
26
|
+
|
27
|
+
assert_equal(2.5, $timeout)
|
28
|
+
end
|
29
|
+
|
30
|
+
module TimeoutHandler
|
31
|
+
def unbind
|
32
|
+
EM.stop
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_for_real
|
37
|
+
EM.run {
|
38
|
+
EM.heartbeat_interval = 0.1
|
39
|
+
EM.start_server("127.0.0.1", 12345)
|
40
|
+
EM.add_timer(0.2) {
|
41
|
+
$start = Time.now
|
42
|
+
c = EM.connect("127.0.0.1", 12345, TimeoutHandler)
|
43
|
+
c.comm_inactivity_timeout = 2.5
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
assert_in_delta(2.5, (Time.now - $start), 0.3)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/tests/test_kb.rb
ADDED
@@ -0,0 +1,60 @@
|
|
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 TestKeyboardEvents < Test::Unit::TestCase
|
32
|
+
|
33
|
+
def setup
|
34
|
+
end
|
35
|
+
|
36
|
+
def teardown
|
37
|
+
end
|
38
|
+
|
39
|
+
module KbHandler
|
40
|
+
include EM::Protocols::LineText2
|
41
|
+
def receive_line d
|
42
|
+
EM::stop if d == "STOP"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# This test doesn't actually do anything useful but is here to
|
47
|
+
# illustrate the usage. If you removed the timer and ran this test
|
48
|
+
# by itself on a console, and then typed into the console, it would
|
49
|
+
# work.
|
50
|
+
# I don't know how to get the test harness to simulate actual keystrokes.
|
51
|
+
# When someone figures that out, then we can make this a real test.
|
52
|
+
#
|
53
|
+
def test_kb
|
54
|
+
EM.run {
|
55
|
+
EM.open_keyboard KbHandler
|
56
|
+
EM::Timer.new(1) { EM.stop }
|
57
|
+
} if $stdout.tty? # don't run the test unless it stands a chance of validity.
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|