Permalink
Fetching contributors…
Cannot retrieve contributors at this time
156 lines (137 sloc) 4.09 KB
require 'em_test_helper'
class TestHeaderAndContentProtocol < Test::Unit::TestCase
class SimpleTest < EM::P::HeaderAndContentProtocol
attr_reader :first_header, :my_headers, :request
def receive_first_header_line hdr
@first_header ||= []
@first_header << hdr
end
def receive_headers hdrs
@my_headers ||= []
@my_headers << hdrs
end
def receive_request hdrs, content
@request ||= []
@request << [hdrs, content]
end
end
class StopOnUnbind < EM::Connection
def unbind
EM.add_timer(0.01) { EM.stop }
end
end
def setup
@port = next_port
end
def test_no_content
the_connection = nil
EM.run {
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
the_connection = conn
end
setup_timeout
EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
c.close_connection_after_writing
end
}
assert_equal( ["aaa"], the_connection.first_header )
assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
end
def test_content
the_connection = nil
content = "A" * 50
headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
EM.run {
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
the_connection = conn
end
setup_timeout
EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
headers.each { |h| c.send_data "#{h}\r\n" }
c.send_data "\n"
c.send_data content
c.close_connection_after_writing
end
}
assert_equal( ["aaa"], the_connection.first_header )
assert_equal( [headers], the_connection.my_headers )
assert_equal( [[headers, content]], the_connection.request )
end
def test_several_requests
the_connection = nil
content = "A" * 50
headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
EM.run {
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
the_connection = conn
end
setup_timeout
EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
5.times do
headers.each { |h| c.send_data "#{h}\r\n" }
c.send_data "\n"
c.send_data content
end
c.close_connection_after_writing
end
}
assert_equal( ["aaa"] * 5, the_connection.first_header )
assert_equal( [headers] * 5, the_connection.my_headers )
assert_equal( [[headers, content]] * 5, the_connection.request )
end
# def x_test_multiple_content_length_headers
# # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
# the_connection = nil
# content = "A" * 50
# headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
# EM.run {
# EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
# the_connection = conn
# end
# EM.add_timer(4) {raise "test timed out"}
# test_proc = proc {
# t = TCPSocket.new "127.0.0.1", @port
# headers.each {|h| t.write "#{h}\r\n" }
# t.write "\n"
# t.write content
# t.close
# }
# EM.defer test_proc, proc {
# EM.stop
# }
# }
# end
def test_interpret_headers
the_connection = nil
content = "A" * 50
headers = [
"GET / HTTP/1.0",
"Accept: aaa",
"User-Agent: bbb",
"Host: ccc",
"x-tempest-header:ddd"
]
EM.run {
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
the_connection = conn
end
setup_timeout
EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
headers.each { |h| c.send_data "#{h}\r\n" }
c.send_data "\n"
c.send_data content
c.close_connection_after_writing
end
}
hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
expect = {
:accept => "aaa",
:user_agent => "bbb",
:host => "ccc",
:x_tempest_header => "ddd"
}
assert_equal(expect, hsh)
end
end