about summary refs log tree commit homepage
path: root/test
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2013-10-26 01:39:49 +0000
committerEric Wong <normalperson@yhbt.net>2013-10-26 02:00:17 +0000
commit14b21f7a162c6f4e76d00d6d08fa9a09524997ae (patch)
treecd36f7f1115cd9f3bc0f003100fb74da5ac5daaf /test
parentf38e54f8d54f8cdfdc15f43b2394f0acfff5d413 (diff)
downloadyahns-14b21f7a162c6f4e76d00d6d08fa9a09524997ae.tar.gz
The write buffer may block on a single write and immediately
become unblocked afterwards.  We need to account for this odd
corner case when serving static files; because clients can
trigger strange corner cases like this.
Diffstat (limited to 'test')
-rw-r--r--test/server_helper.rb7
-rw-r--r--test/test_expect_100.rb7
-rw-r--r--test/test_serve_static.rb30
3 files changed, 37 insertions, 7 deletions
diff --git a/test/server_helper.rb b/test/server_helper.rb
index aeb0dc9..73d3ec8 100644
--- a/test/server_helper.rb
+++ b/test/server_helper.rb
@@ -79,3 +79,10 @@ module ServerHelper
     end
   end
 end
+
+module TrywriteBlocked
+  def kgio_trywrite(*args)
+    return :wait_writable if $_tw_block_on.include?($_tw_blocked += 1)
+    super
+  end
+end
diff --git a/test/test_expect_100.rb b/test/test_expect_100.rb
index 5b1ffa8..4c19493 100644
--- a/test/test_expect_100.rb
+++ b/test/test_expect_100.rb
@@ -19,13 +19,6 @@ class TestExpect100 < Testcase
     end
   end
 
-  module TrywriteBlocked
-    def kgio_trywrite(*args)
-      return :wait_writable if $_tw_block_on.include?($_tw_blocked += 1)
-      super
-    end
-  end
-
   def test_buffer_noccc; _test_expect_100(true, false); end
   def test_nobuffer_noccc; _test_expect_100(false, false); end
   def test_lazybuffer_noccc; _test_expect_100(:lazy, false); end
diff --git a/test/test_serve_static.rb b/test/test_serve_static.rb
index 4b46fb0..95c07bc 100644
--- a/test/test_serve_static.rb
+++ b/test/test_serve_static.rb
@@ -36,4 +36,34 @@ class TestServeStatic < Testcase
   ensure
     quit_wait(pid)
   end
+
+  def test_serve_static_blocked_header
+    err = @err
+    cfg = Yahns::Config.new
+    host, port = @srv.addr[3], @srv.addr[1]
+    cfg.instance_eval do
+      GTL.synchronize do
+        app(:rack, Rack::File.new(Dir.pwd)) { listen "#{host}:#{port}" }
+      end
+      logger(Logger.new(err.path))
+    end
+    pid = fork do
+      ENV["YAHNS_FD"] = @srv.fileno.to_s
+      $_tw_blocked = 0
+      $_tw_block_on = [1]
+      Yahns::HttpClient.__send__(:include, TrywriteBlocked)
+      Yahns::Server.new(cfg).start.join
+    end
+    gplv3 = File.read("COPYING")
+    Net::HTTP.start(host, port) do |http|
+      res = http.request(Net::HTTP::Get.new("/COPYING"))
+      assert_equal gplv3, res.body
+
+      req = Net::HTTP::Get.new("/COPYING", "Range" => "bytes=5-46")
+      res = http.request(req)
+      assert_equal gplv3[5..46], res.body
+    end
+  ensure
+    quit_wait(pid)
+  end
 end