diff options
Diffstat (limited to 'test/test_ws.rb')
-rw-r--r-- | test/test_ws.rb | 104 |
1 files changed, 86 insertions, 18 deletions
diff --git a/test/test_ws.rb b/test/test_ws.rb index 47060fb..daf78d6 100644 --- a/test/test_ws.rb +++ b/test/test_ws.rb @@ -21,31 +21,99 @@ require 'net/http' require 'mongrel' require 'timeout' -include Mongrel; + class TestHandler < Mongrel::HttpHandler - attr_reader :ran_test - - def process(request, response) - @ran_test = true - response.socket.write("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello!\n") - end + attr_reader :ran_test + + def process(request, response) + @ran_test = true + response.socket.write("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello!\n") + end +end + +def hit(uris) + uris.each do |u| + res = Net::HTTP.get(URI.parse(u)) + assert res != nil, "Didn't get a response: #{u}" + end end - -class WSTest < Test::Unit::TestCase +class WebServerTest < Test::Unit::TestCase - def test_simple_server - h = HttpServer.new("127.0.0.1", 9998) - tester = TestHandler.new - h.register("/test", tester) - h.run + def setup + @request = "GET / HTTP/1.1\r\nHost: www.zedshaw.com\r\nContent-Type: text/plain\r\n\r\n" + # we set num_processors=1 so that we can test the reaping code + @server = HttpServer.new("127.0.0.1", 9998,num_processors=1) + @tester = TestHandler.new + @server.register("/test", @tester) + @server.run + end - sleep(3) - res = Net::HTTP.get(URI.parse('http://localhost:9998/test')) - assert res != nil, "Didn't get a response" - assert tester.ran_test, "Handler didn't really run" + def teardown + @server.stop + end + + def test_simple_server + hit(['http://localhost:9998/test']) + assert @tester.ran_test, "Handler didn't really run" + end + + + def do_test(st, chunk, close_after=nil) + s = TCPSocket.new("127.0.0.1", 9998); + req = StringIO.new(st) + nout = 0 + + while data = req.read(chunk) + nout += s.write(data) + s.flush + sleep 0.2 + if close_after and nout > close_after + s.close_write + sleep 1 + end end + s.close + end + + def test_trickle_attack + do_test(@request, 3) + end + + def test_close_client + assert_raises IOError do + do_test(@request, 10, 20) + end + end + + def test_bad_client + do_test("GET /test HTTP/BAD", 3) + end + + def test_header_is_too_long + long = "GET /test HTTP/1.1\r\n" + ("X-Big: stuff\r\n" * 15000) + "\r\n" + assert_raises Errno::ECONNRESET, Errno::EPIPE do + do_test(long, long.length/2) + end + end + + def test_num_processors_overload + assert_raises Errno::ECONNRESET, Errno::EPIPE do + tests = [ + Thread.new { do_test(@request, 1) }, + Thread.new { do_test(@request, 10) }, + ] + + tests.each {|t| t.join} + end + end + + def test_file_streamed_request + body = "a" * (Mongrel::Const::MAX_BODY * 2) + long = "GET /test HTTP/1.1\r\nContent-length: #{body.length}\r\n\r\n" + body + do_test(long, Mongrel::Const::CHUNK_SIZE * 2 -400) + end end |