about summary refs log tree commit homepage
path: root/test
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-11-01 07:02:18 +0000
committerEric Wong <normalperson@yhbt.net>2013-11-01 07:20:35 +0000
commit9c5d5c5bf48a2996203c2e15f281575a15994694 (patch)
treebf565ceda280ec92491f3827fd22889c09c3a6ef /test
parentfebabe3dcfd1ee41cc253ca43fd667c9e2ec6444 (diff)
downloadyahns-9c5d5c5bf48a2996203c2e15f281575a15994694.tar.gz
This should speed up our tests a little while removing the
dependency on md5sum(1) from coreutils.
Diffstat (limited to 'test')
-rw-r--r--test/test_output_buffering.rb83
1 files changed, 41 insertions, 42 deletions
diff --git a/test/test_output_buffering.rb b/test/test_output_buffering.rb
index 029b90c..4ddfe7b 100644
--- a/test/test_output_buffering.rb
+++ b/test/test_output_buffering.rb
@@ -63,42 +63,21 @@ class TestOutputBuffering < Testcase
     case check_type
     when :curl
       # curl is faster for piping gigantic wads of data than Net::HTTP
-      sh_sleep = delay ? "sleep #{delay} && " : ""
-      md5 = `curl -sSf http://#{host}:#{port}/ | (#{sh_sleep} md5sum)`
-      assert $?.success?, $?.inspect
-      (md5 =~ /([a-f0-9]{32})/i) or raise "bad md5: #{md5.inspect}"
-      md5 = $1
-      assert_equal MD5.value, md5
+      c = IO.popen("curl -N -sSf http://#{host}:#{port}/")
+      wait_for_full(c)
+      dig, nr = md5sum(c)
+      c.close
+      assert_equal MD5.value, dig.hexdigest
     when :http09
       # HTTP/0.9
       c = get_tcp_client(host, port)
       c.write("GET /\r\n\r\n")
-      md5in = cloexec_pipe
-      md5out = cloexec_pipe
-      sleep(delay) if delay
-      md5pid = Process.spawn("md5sum", :in => md5in[0], :out => md5out[1])
-      md5in[0].close
-      md5out[1].close
-      begin
-        nr = IO.copy_stream(c, md5in[1])
-      rescue Errno::ESPIPE # rbx bug workaround
-        nr = 0
-        buf = ""
-        while c.read(1024 * 1024, buf)
-          nr += md5in[1].write(buf)
-        end
-      end
+      wait_for_full(c)
+      dig, nr = md5sum(c)
       assert_equal(NR * RAND.size, nr)
       c.shutdown
       c.close
-      md5in[1].close
-      _, status = Timeout.timeout(10) { Process.waitpid2(md5pid) }
-      assert status.success?, status.inspect
-      md5 = md5out[0].read
-      (md5 =~ /([a-f0-9]{32})/i) or raise "bad md5: #{md5.inspect}"
-      md5 = $1
-      assert_equal MD5.value, md5
-      md5out[0].close
+      assert_equal MD5.value, dig.hexdigest
     else
       raise "TESTBUG"
     end
@@ -106,6 +85,31 @@ class TestOutputBuffering < Testcase
     quit_wait(pid)
   end
 
+  def wait_for_full(c)
+    prev = 0
+    prev_time = Time.now
+    begin
+      nr = c.nread
+      break if nr > 0 && nr == prev && (Time.now - prev_time) > 0.5
+      if nr != prev
+        prev = nr
+        prev_time = Time.now
+      end
+      Thread.pass
+    end while sleep(0.1)
+  end
+
+  def md5sum(c)
+    dig = Digest::MD5.new
+    buf = ""
+    nr = 0
+    while c.read(8192, buf)
+      dig << buf
+      nr += buf.bytesize
+    end
+    [ dig, nr ]
+  end
+
   class BigHeader
     A = "A" * 65536
     def initialize(h)
@@ -166,9 +170,7 @@ class TestOutputBuffering < Testcase
     threads << Thread.new do
       c = get_tcp_client(host, port)
       c.write "GET / HTTP/1.0\r\n\r\n"
-      begin
-        sleep 1
-      end while c.nread == 0
+      wait_for_full(c)
       nr = 0
       last = nil
       c.each_line do |line|
@@ -186,9 +188,7 @@ class TestOutputBuffering < Testcase
     threads << Thread.new do
       c = get_tcp_client(host, port)
       c.write "GET /COPYING HTTP/1.0\r\n\r\n"
-      begin
-        sleep 1
-      end while c.nread == 0
+      wait_for_full(c)
       nr = 0
       c.each_line do |line|
         case line
@@ -205,9 +205,7 @@ class TestOutputBuffering < Testcase
     threads << Thread.new do
       c = get_tcp_client(host, port)
       c.write "GET /COPYING HTTP/1.0\r\nRange: bytes=5-46\r\n\r\n"
-      begin
-        sleep 1
-      end while c.nread == 0
+      wait_for_full(c)
       nr = 0
       c.each_line do |line|
         case line
@@ -258,7 +256,8 @@ class TestOutputBuffering < Testcase
     threads << Thread.new do
       c = get_tcp_client(host, port)
       c.write("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
-      sleep(5) # wait for timeout
+      wait_for_full(c)
+      sleep(3.5) # wait for timeout
       assert_operator c.nread, :>, 0
       c
     end
@@ -266,7 +265,8 @@ class TestOutputBuffering < Testcase
     threads << Thread.new do
       c = get_tcp_client(host, port)
       c.write("GET /bh HTTP/1.1\r\nHost: example.com\r\n\r\n")
-      sleep(5) # wait for timeout
+      wait_for_full(c)
+      sleep(3.5) # wait for timeout
       assert_operator c.nread, :>, 0
       c
     end
@@ -323,5 +323,4 @@ class TestOutputBuffering < Testcase
   ensure
     quit_wait(pid)
   end
-end if `which curl 2>/dev/null`.strip =~ /curl/ &&
-       `which md5sum 2>/dev/null`.strip =~ /md5sum/
+end if `which curl 2>/dev/null`.strip =~ /curl/