about summary refs log tree commit homepage
path: root/test/test_client_expire.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_client_expire.rb')
-rw-r--r--test/test_client_expire.rb82
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