blob: 1d50483c171e1d064ae3659e0122b8df1c894cbf [file] [log] [blame]
#!/usr/bin/env ruby
require 'test/unit'
require 'qpid_proton'
if ((RUBY_VERSION.split(".").map {|x| x.to_i} <=> [1, 9]) < 0)
require 'pathname'
class File
def self.absolute_path(name)
return Pathname.new(name).realpath
end
end
end
class InteropTest < Test::Unit::TestCase
Data = Qpid::Proton::Codec::Data
Message = Qpid::Proton::Message
def setup
@data = Data.new
@message = Message.new
end
# Walk up the directory tree to find the tests directory.
def get_data(name)
path = File.absolute_path(__FILE__)
while path and File.basename(path) != "tests" do path = File.dirname(path); end
path = File.join(path,"interop")
raise "Can't find test/interop directory from #{__FILE__}" unless File.directory?(path)
path = File.join(path,"#{name}.amqp")
File.open(path, "rb") { |f| f.read }
end
# Decode encoded bytes as a Data object
def decode_data(encoded)
buffer = encoded
while buffer.size > 0
n = @data.decode(buffer)
buffer = buffer[n..-1]
end
@data.rewind
reencoded = @data.encode
# Test the round-trip re-encoding gives the same result.
assert_equal(encoded, reencoded)
end
def decode_data_file(name) decode_data(get_data(name)); end
def decode_message_file(name)
message = Message.new()
message.decode(self.get_data(name))
self.decode_data(message.body)
end
def assert_next(type, value)
assert @data.next
assert_equal(type, @data.type)
assert_equal(value, type.get(@data))
end
def assert_array_next(expected, header)
assert_next(Qpid::Proton::Codec::ARRAY, expected)
result = @data.type.get(@data)
assert_equal(result.proton_array_header, header)
end
def test_message
decode_message_file("message")
assert_next(Qpid::Proton::Codec::STRING, "hello")
assert !@data.next
end
def test_primitives
decode_data_file("primitives")
assert_next(Qpid::Proton::Codec::BOOL, true)
assert_next(Qpid::Proton::Codec::BOOL, false)
assert_next(Qpid::Proton::Codec::UBYTE, 42)
assert_next(Qpid::Proton::Codec::USHORT, 42)
assert_next(Qpid::Proton::Codec::SHORT, -42)
assert_next(Qpid::Proton::Codec::UINT, 12345)
assert_next(Qpid::Proton::Codec::INT, -12345)
assert_next(Qpid::Proton::Codec::ULONG, 12345)
assert_next(Qpid::Proton::Codec::LONG, -12345)
assert_next(Qpid::Proton::Codec::FLOAT, 0.125)
assert_next(Qpid::Proton::Codec::DOUBLE, 0.125)
assert !@data.next
end
def test_strings
decode_data_file("strings")
assert_next(Qpid::Proton::Codec::BINARY, "abc\0defg")
assert_next(Qpid::Proton::Codec::STRING, "abcdefg")
assert_next(Qpid::Proton::Codec::SYMBOL, "abcdefg")
assert_next(Qpid::Proton::Codec::BINARY, "")
assert_next(Qpid::Proton::Codec::STRING, "")
assert_next(Qpid::Proton::Codec::SYMBOL, "")
assert !@data.next
end
def test_described
decode_data_file("described")
assert_next(Qpid::Proton::Codec::DESCRIBED, Qpid::Proton::Types::Described.new("foo-descriptor", "foo-value"))
assert(@data.described?)
assert_next(Qpid::Proton::Codec::DESCRIBED, Qpid::Proton::Types::Described.new(12, 13))
assert(@data.described?)
assert !@data.next
end
def test_described_array
decode_data_file("described_array")
assert_array_next((0...10).to_a,
Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT,
"int-array"))
end
def test_arrays
decode_data_file("arrays")
assert_array_next((0...100).to_a,
Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT))
assert_array_next(["a", "b", "c"],
Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::STRING))
assert_array_next([],
Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT))
assert !@data.next
end
def test_lists
decode_data_file("lists")
assert_next(Qpid::Proton::Codec::LIST, [32, "foo", true])
assert_next(Qpid::Proton::Codec::LIST, [])
assert !@data.next
end
def test_maps
decode_data_file("maps")
assert_next(Qpid::Proton::Codec::MAP, {"one" => 1, "two" => 2, "three" => 3 })
assert_next(Qpid::Proton::Codec::MAP, {1 => "one", 2 => "two", 3 => "three"})
assert_next(Qpid::Proton::Codec::MAP, {})
assert !@data.next
end
end