Add round-trip testing to bin/validate

This commit is contained in:
Jim Menard 2009-01-12 11:23:07 -05:00
parent 5bbed1c5f0
commit 4258f6f200
2 changed files with 37 additions and 1 deletions

View File

@ -71,6 +71,9 @@ driver tests will then use some of the data files from that project when it
runs BSON tests. You can delete this directory at any time if you don't want
to run those tests any more.
Additionally, the script bin/validate is used by the mongo-qa project's
validator script.
= Documentation

View File

@ -6,6 +6,10 @@
# converts it into a Ruby OrderedHash, runs that through the BSON
# serialization code, and writes the BSON bytes to somefile.bson.
#
# In addition, this script takes the generated BSON, reads it in then writes
# it back out to a temp BSON file. If they are different, we report that error
# to STDOUT.
#
# This script is used by the mongo-qa project
# (http://github.com/mongodb/mongo-qa).
@ -13,6 +17,35 @@ $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
require 'mongo'
require 'mongo/util/xml_to_ruby'
obj = File.open(ARGV[0], 'r') { |f| XMLToRuby.new.xml_to_ruby(f) }
if ARGV.length < 2
$stderr.puts "usage: validate somefile.xson somefile.bson"
exit 1
end
# Translate the .xson XML into a Ruby object, turn that object into BSON, and
# write the BSON to the file as requested.
obj = File.open(ARGV[0], 'rb') { |f| XMLToRuby.new.xml_to_ruby(f) }
bson = BSON.new.serialize(obj).to_a
File.open(ARGV[1], 'wb') { |f| bson.each { |b| f.putc(b) } }
# Now the additional testing. Read the generated BSON back in, deserialize it,
# and re-serialize the results. Compare that BSON with the BSON from the file
# we output.
bson = File.open(ARGV[1], 'rb') { |f| f.read }
bson = if RUBY_VERSION >= '1.9'
bson.bytes.to_a
else
bson.split(//).collect { |c| c[0] }
end
# Turn the Ruby object into BSON bytes and compare with the BSON bytes from
# the file.
bson_from_ruby = BSON.new.serialize(obj).to_a
if bson.length != bson_from_ruby.length
$stderr.puts "error: round-trip BSON lengths differ when testing #{ARGV[0]}"
exit 1
elsif bson != bson_from_ruby
$stderr.puts "error: round-trip BSON contents differ when testing #{ARGV[0]}"
exit 1
end