From 9c5d5c5bf48a2996203c2e15f281575a15994694 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 1 Nov 2013 07:02:18 +0000 Subject: tests: more intelligent waiting for output buffering This should speed up our tests a little while removing the dependency on md5sum(1) from coreutils. --- test/test_output_buffering.rb | 83 +++++++++++++++++++++---------------------- 1 file 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/ -- cgit v1.2.3-24-ge0c7