diff options
Diffstat (limited to 'test/webrick/test_httpserver.rb')
| -rw-r--r-- | test/webrick/test_httpserver.rb | 204 |
1 files changed, 26 insertions, 178 deletions
diff --git a/test/webrick/test_httpserver.rb b/test/webrick/test_httpserver.rb index 5cd4ba5866..e0c2ae33ad 100644 --- a/test/webrick/test_httpserver.rb +++ b/test/webrick/test_httpserver.rb @@ -4,16 +4,9 @@ require "webrick" require_relative "utils" class TestWEBrickHTTPServer < Test::Unit::TestCase - empty_log = Object.new - def empty_log.<<(str) - assert_equal('', str) - self - end - NoLog = WEBrick::Log.new(empty_log, WEBrick::BasicLog::WARN) - def test_mount httpd = WEBrick::HTTPServer.new( - :Logger => NoLog, + :Logger => WEBrick::Log.new(TestWEBrick::NullWriter), :DoNotListen=>true ) httpd.mount("/", :Root) @@ -24,50 +17,50 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase serv, opts, script_name, path_info = httpd.search_servlet("/") assert_equal(:Root, serv) assert_equal([], opts) - assert_equal("", script_name) - assert_equal("/", path_info) + assert_equal(script_name, "") + assert_equal(path_info, "/") serv, opts, script_name, path_info = httpd.search_servlet("/sub") assert_equal(:Root, serv) assert_equal([], opts) - assert_equal("", script_name) - assert_equal("/sub", path_info) + assert_equal(script_name, "") + assert_equal(path_info, "/sub") serv, opts, script_name, path_info = httpd.search_servlet("/sub/") assert_equal(:Root, serv) assert_equal([], opts) - assert_equal("", script_name) - assert_equal("/sub/", path_info) + assert_equal(script_name, "") + assert_equal(path_info, "/sub/") serv, opts, script_name, path_info = httpd.search_servlet("/foo") assert_equal(:Foo, serv) assert_equal([], opts) - assert_equal("/foo", script_name) - assert_equal("", path_info) + assert_equal(script_name, "/foo") + assert_equal(path_info, "") serv, opts, script_name, path_info = httpd.search_servlet("/foo/") assert_equal(:Foo, serv) assert_equal([], opts) - assert_equal("/foo", script_name) - assert_equal("/", path_info) + assert_equal(script_name, "/foo") + assert_equal(path_info, "/") serv, opts, script_name, path_info = httpd.search_servlet("/foo/sub") assert_equal(:Foo, serv) assert_equal([], opts) - assert_equal("/foo", script_name) - assert_equal("/sub", path_info) + assert_equal(script_name, "/foo") + assert_equal(path_info, "/sub") serv, opts, script_name, path_info = httpd.search_servlet("/foo/bar") assert_equal(:Bar, serv) assert_equal([:bar1], opts) - assert_equal("/foo/bar", script_name) - assert_equal("", path_info) + assert_equal(script_name, "/foo/bar") + assert_equal(path_info, "") serv, opts, script_name, path_info = httpd.search_servlet("/foo/bar/baz") assert_equal(:Baz, serv) assert_equal([:baz1, :baz2], opts) - assert_equal("/foo/bar/baz", script_name) - assert_equal("", path_info) + assert_equal(script_name, "/foo/bar/baz") + assert_equal(path_info, "") end class Req @@ -82,7 +75,7 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase def httpd(addr, port, host, ali) config ={ - :Logger => NoLog, + :Logger => WEBrick::Log.new(TestWEBrick::NullWriter), :DoNotListen => true, :BindAddress => addr, :Port => port, @@ -122,10 +115,10 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase host3 = httpd(addr1, port1, name2, alias1), host4 = httpd(addr1, port2, name1, nil), host5 = httpd(addr1, port2, name2, alias1), - httpd(addr1, port2, name3, alias2), + host6 = httpd(addr1, port2, name3, alias2), host7 = httpd(addr2, nil, name1, nil), host8 = httpd(addr2, nil, name2, alias1), - httpd(addr2, nil, name3, alias2), + host9 = httpd(addr2, nil, name3, alias2), host10 = httpd(local, nil, nil, nil), host11 = httpd(nil, port3, nil, nil), ].sort_by{ rand } @@ -230,26 +223,22 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase :StopCallback => Proc.new{ stopped += 1 }, :RequestCallback => Proc.new{|req, res| requested0 += 1 }, } - log_tester = lambda {|log, access_log| - assert(log.find {|s| %r{ERROR `/' not found\.} =~ s }) - assert_equal([], log.reject {|s| %r{ERROR `/' not found\.} =~ s }) - } - TestWEBrick.start_httpserver(config, log_tester){|server, addr, port, log| + TestWEBrick.start_httpserver(config){|server, addr, port, log| vhost_config = { :ServerName => "myhostname", :BindAddress => addr, :Port => port, :DoNotListen => true, - :Logger => NoLog, + :Logger => WEBrick::Log.new(TestWEBrick::NullWriter), :AccessLog => [], :RequestCallback => Proc.new{|req, res| requested1 += 1 }, } server.virtual_host(WEBrick::HTTPServer.new(vhost_config)) - Thread.pass while server.status != :Running - assert_equal(1, started, log.call) - assert_equal(0, stopped, log.call) - assert_equal(0, accepted, log.call) + true while server.status != :Running + assert_equal(started, 1, log.call) + assert_equal(stopped, 0, log.call) + assert_equal(accepted, 0, log.call) http = Net::HTTP.new(addr, port) req = Net::HTTP::Get.new("/") @@ -268,145 +257,4 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase assert_equal(started, 1) assert_equal(stopped, 1) end - - # This class is needed by test_response_io_with_chunked_set method - class EventManagerForChunkedResponseTest - def initialize - @listeners = [] - end - def add_listener( &block ) - @listeners << block - end - def raise_str_event( str ) - @listeners.each{ |e| e.call( :str, str ) } - end - def raise_close_event() - @listeners.each{ |e| e.call( :cls ) } - end - end - def test_response_io_with_chunked_set - evt_man = EventManagerForChunkedResponseTest.new - t = Thread.new do - begin - config = { - :ServerName => "localhost" - } - TestWEBrick.start_httpserver(config) do |server, addr, port, log| - body_strs = [ 'aaaaaa', 'bb', 'cccc' ] - server.mount_proc( "/", ->( req, res ){ - # Test for setting chunked... - res.chunked = true - r,w = IO.pipe - evt_man.add_listener do |type,str| - type == :cls ? ( w.close ) : ( w << str ) - end - res.body = r - } ) - Thread.pass while server.status != :Running - http = Net::HTTP.new(addr, port) - req = Net::HTTP::Get.new("/") - http.request(req) do |res| - i = 0 - evt_man.raise_str_event( body_strs[i] ) - res.read_body do |s| - assert_equal( body_strs[i], s ) - i += 1 - if i < body_strs.length - evt_man.raise_str_event( body_strs[i] ) - else - evt_man.raise_close_event() - end - end - assert_equal( body_strs.length, i ) - end - end - rescue => err - flunk( 'exception raised in thread: ' + err.to_s ) - end - end - if t.join( 3 ).nil? - evt_man.raise_close_event() - flunk( 'timeout' ) - if t.join( 1 ).nil? - Thread.kill t - end - end - end - - def test_response_io_without_chunked_set - config = { - :ServerName => "localhost" - } - log_tester = lambda {|log, access_log| - assert_equal(1, log.length) - assert_match(/WARN Could not determine content-length of response body./, log[0]) - } - TestWEBrick.start_httpserver(config, log_tester){|server, addr, port, log| - server.mount_proc("/", lambda { |req, res| - r,w = IO.pipe - # Test for not setting chunked... - # res.chunked = true - res.body = r - w << "foo" - w.close - }) - Thread.pass while server.status != :Running - http = Net::HTTP.new(addr, port) - req = Net::HTTP::Get.new("/") - req['Connection'] = 'Keep-Alive' - begin - timeout(2) do - http.request(req){|res| assert_equal("foo", res.body) } - end - rescue Timeout::Error - flunk('corrupted reponse') - end - } - end - - def test_request_handler_callback_is_deprecated - requested = 0 - config = { - :ServerName => "localhost", - :RequestHandler => Proc.new{|req, res| requested += 1 }, - } - log_tester = lambda {|log, access_log| - assert_equal(2, log.length) - assert_match(/WARN :RequestHandler is deprecated, please use :RequestCallback/, log[0]) - assert_match(%r{ERROR `/' not found\.}, log[1]) - } - TestWEBrick.start_httpserver(config, log_tester){|server, addr, port, log| - Thread.pass while server.status != :Running - - http = Net::HTTP.new(addr, port) - req = Net::HTTP::Get.new("/") - req["Host"] = "localhost:#{port}" - http.request(req){|res| assert_equal("404", res.code, log.call)} - assert_match(%r{:RequestHandler is deprecated, please use :RequestCallback$}, log.call, log.call) - } - assert_equal(1, requested) - end - - def test_shutdown_with_busy_keepalive_connection - requested = 0 - config = { - :ServerName => "localhost", - } - TestWEBrick.start_httpserver(config){|server, addr, port, log| - server.mount_proc("/", lambda {|req, res| res.body = "heffalump" }) - Thread.pass while server.status != :Running - - Net::HTTP.start(addr, port) do |http| - req = Net::HTTP::Get.new("/") - http.request(req){|res| assert_equal('Keep-Alive', res['Connection'], log.call) } - server.shutdown - begin - 10.times {|n| http.request(req); requested += 1 } - rescue - # Errno::ECONNREFUSED or similar - end - end - } - assert_equal(0, requested, "Server responded to #{requested} requests after shutdown") - end end |
