diff options
Diffstat (limited to 'test/test_client_expire.rb')
-rw-r--r-- | test/test_client_expire.rb | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/test/test_client_expire.rb b/test/test_client_expire.rb new file mode 100644 index 0000000..8bc82fa --- /dev/null +++ b/test/test_client_expire.rb @@ -0,0 +1,82 @@ +# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require_relative 'server_helper' + +class TestClientExpire < Testcase + parallelize_me! + include ServerHelper + alias setup server_helper_setup + alias teardown server_helper_teardown + + def test_client_expire_negative + err = @err + cfg = Yahns::Config.new + host, port = @srv.addr[3], @srv.addr[1] + cfg.instance_eval do + GTL.synchronize do + ru = lambda { |e| h = { "Content-Length" => "0" }; [ 200, h, [] ] } + app(:rack, ru) do + listen "#{host}:#{port}", sndbuf: 2048, rcvbuf: 2048 + end + client_expire_threshold(-10) + end + logger(Logger.new(err.path)) + end + srv = Yahns::Server.new(cfg) + pid = fork do + ENV["YAHNS_FD"] = @srv.fileno.to_s + srv.start.join + end + Net::HTTP.start(host, port) { |h| + res = h.get("/") + assert_empty res.body + } + ensure + quit_wait(pid) + end + + def test_client_expire + nr = 32 + err = @err + cfg = Yahns::Config.new + host, port = @srv.addr[3], @srv.addr[1] + cfg.instance_eval do + GTL.synchronize do + h = { "Content-Length" => "0" } + app(:rack, lambda { |e| [ 200, h, [] ]}) do + listen "#{host}:#{port}", sndbuf: 2048, rcvbuf: 2048 + client_timeout 1 + end + client_expire_threshold(32) + end + logger(Logger.new(err.path)) + end + srv = Yahns::Server.new(cfg) + pid = fork do + ENV["YAHNS_FD"] = @srv.fileno.to_s + srv.start.join + end + f = TCPSocket.new(host, port) + s = TCPSocket.new(host, port) + req = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" + s.write(req) + str = Timeout.timeout(20) { s.readpartial(666) } + assert_match(%r{keep-alive}, str) + sleep 2 + abe = tmpfile(%w(abe .err)) + ab_res = `ab -c #{nr} -n 10000 -k http://#{host}:#{port}/ 2>#{abe.path}` + assert $?.success?, $?.inspect << abe.read + assert_match(/Complete requests:\s+10000\n/, ab_res) + + [ f, s ].each do |io| + assert_raises(Errno::EPIPE,Errno::ECONNRESET) do + req.each_byte { |b| io.write(b.chr) } + end + end + rescue => e + Yahns::Log.exception(Logger.new($stderr), "test", e) + raise + ensure + quit_wait(pid) + end +end |