From 08f3d42b34453fedb7b8f2169a162adc23077847 Mon Sep 17 00:00:00 2001 From: Matthew Bloch Date: Thu, 7 Jun 2012 02:06:08 +0100 Subject: [PATCH] Improved fuzz test to find an actual code bug (previous bug was in the test ). --- tests/flexnbd.rb | 13 ++++++++----- tests/fuzz | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tests/flexnbd.rb b/tests/flexnbd.rb index 66801cb..b2adef5 100644 --- a/tests/flexnbd.rb +++ b/tests/flexnbd.rb @@ -7,7 +7,7 @@ class FlexNBD def initialize(bin, ip, port) @bin = bin - @debug = `#{@bin} serve --help` =~ /--debug/ ? "--debug" : "" + @debug = "--verbose" # tests always run in debug mode! @valgrind = ENV['VALGRIND'] ? "valgrind " : "" @bin = "#{@valgrind}#{@bin}" raise "#{bin} not executable" unless File.executable?(bin) @@ -25,6 +25,7 @@ class FlexNBD "--sock #{ctrl} "\ "#{@debug} "\ "#{acl.join(' ')}" + #STDERR.print "#{cmd}\n" @pid = fork do exec(cmd) end @@ -42,15 +43,17 @@ class FlexNBD end def read(offset, length) - IO.popen("#{@bin} read "\ + + out = IO.popen("#{@bin} read "\ "--addr #{ip} "\ "--port #{port} "\ "--from #{offset} "\ "#{@debug} "\ "--size #{length}","r") do |fh| - return fh.read + fh.read end - raise "read failed" unless $?.success? + raise IOError.new "NBD read failed" unless $?.success? + out end def write(offset, data) @@ -62,7 +65,7 @@ class FlexNBD "--size #{data.length}","w") do |fh| fh.write(data) end - raise "write failed" unless $?.success? + raise IOError.new "NBD write failed" unless $?.success? nil end diff --git a/tests/fuzz b/tests/fuzz index e3e3558..e4fb8a6 100644 --- a/tests/fuzz +++ b/tests/fuzz @@ -22,7 +22,7 @@ end testname_local = "#{$0}.test.#{$$}.local" testname_serve = "#{$0}.test.#{$$}.serve" [testname_local, testname_serve].each do |name| - File.open(name, "w+") { |fh| fh.seek(test_size-1, IO::SEEK_SET); fh.write("0") } + File.open(name, "w+") { |fh| fh.seek(test_size-1, IO::SEEK_SET); fh.write("\0") } end @local = File.open(testname_local, "r+") @@ -55,15 +55,22 @@ repetitions.times do |n| length &= 0xfffff000 if CHEAT_AND_ROUND_DOWN offset = rand(test_size - length) offset &= 0xfffff000 if CHEAT_AND_ROUND_DOWN - content = (n%2 == 1) ? ("x" * length) : ("\0" * length) - + + content = (n%2 == 0) ? ("\0" * length) : ( ((n/2)&255).chr * length) + @local.seek(offset, IO::SEEK_SET) @local.write(content) + @local.fsync @serve.write(offset, content) - if @serve.read(offset, length) != content - STDERR.print "After pass #{n}: Didn't read back what we wrote!" + check_read = @serve.read(offset, length) + if check_read != content + STDERR.print "After pass #{n}: Didn't read back what we wrote!\n" + STDERR.print "*** We wrote these #{content.length} bytes...\n" + IO.popen("hexdump", "w") { |io| io.print(content) } + STDERR.print "*** But we got back these #{check_read.length} bytes...\n" + IO.popen("hexdump", "w") { |io| io.print(check_read) } exit 1 end