blob: fda38824ed0b9131db058467146b8f3ffc870e01 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require 'test_help'
class TestProtocol < Test::Unit::TestCase
class ExampleProtocol
attr_reader :protocol_string, :valid, :name
attr_accessor :comment
def initialize(protocol_string, name=nil, comment='')
@protocol_string = protocol_string
@name = name || protocol_string # default to schema_string for name
@comment = comment
end
end
#
# Example Protocols
#
EXAMPLES = [
ExampleProtocol.new(<<-EOS, true),
{
"namespace": "com.acme",
"protocol": "HelloWorld",
"types": [
{"name": "Greeting", "type": "record", "fields": [
{"name": "message", "type": "string"}]},
{"name": "Curse", "type": "error", "fields": [
{"name": "message", "type": "string"}]}
],
"messages": {
"hello": {
"request": [{"name": "greeting", "type": "Greeting" }],
"response": "Greeting",
"errors": ["Curse"]
}
}
}
EOS
ExampleProtocol.new(<<-EOS, true),
{"namespace": "org.apache.avro.test",
"protocol": "Simple",
"types": [
{"name": "Kind", "type": "enum", "symbols": ["FOO","BAR","BAZ"]},
{"name": "MD5", "type": "fixed", "size": 16},
{"name": "TestRecord", "type": "record",
"fields": [
{"name": "name", "type": "string", "order": "ignore"},
{"name": "kind", "type": "Kind", "order": "descending"},
{"name": "hash", "type": "MD5"}
]
},
{"name": "TestError", "type": "error", "fields": [
{"name": "message", "type": "string"}
]
}
],
"messages": {
"hello": {
"request": [{"name": "greeting", "type": "string"}],
"response": "string"
},
"echo": {
"request": [{"name": "record", "type": "TestRecord"}],
"response": "TestRecord"
},
"add": {
"request": [{"name": "arg1", "type": "int"}, {"name": "arg2", "type": "int"}],
"response": "int"
},
"echoBytes": {
"request": [{"name": "data", "type": "bytes"}],
"response": "bytes"
},
"error": {
"request": [],
"response": "null",
"errors": ["TestError"]
}
}
}
EOS
ExampleProtocol.new(<<-EOS, true),
{"namespace": "org.apache.avro.test.namespace",
"protocol": "TestNamespace",
"types": [
{"name": "org.apache.avro.test.util.MD5", "type": "fixed", "size": 16},
{"name": "TestRecord", "type": "record",
"fields": [ {"name": "hash", "type": "org.apache.avro.test.util.MD5"} ]
},
{"name": "TestError", "namespace": "org.apache.avro.test.errors",
"type": "error", "fields": [ {"name": "message", "type": "string"} ]
}
],
"messages": {
"echo": {
"request": [{"name": "record", "type": "TestRecord"}],
"response": "TestRecord"
},
"error": {
"request": [],
"response": "null",
"errors": ["org.apache.avro.test.errors.TestError"]
}
}
}
EOS
ExampleProtocol.new(<<-EOS, true)
{"namespace": "org.apache.avro.test",
"protocol": "BulkData",
"types": [],
"messages": {
"read": {
"request": [],
"response": "bytes"
},
"write": {
"request": [ {"name": "data", "type": "bytes"} ],
"response": "null"
}
}
}
EOS
]
Protocol = Avro::Protocol
def test_parse
EXAMPLES.each do |example|
assert_nothing_raised("should be valid: #{example.protocol_string}") {
Protocol.parse(example.protocol_string)
}
end
end
def test_valid_cast_to_string_after_parse
EXAMPLES.each do |example|
assert_nothing_raised("round tripped okay #{example.protocol_string}") {
foo = Protocol.parse(example.protocol_string).to_s
Protocol.parse(foo)
}
end
end
def test_equivalence_after_round_trip
EXAMPLES.each do |example|
original = Protocol.parse(example.protocol_string)
round_trip = Protocol.parse(original.to_s)
assert_equal original, round_trip
end
end
def test_namespaces
protocol = Protocol.parse(EXAMPLES.first.protocol_string)
protocol.types.each do |type|
assert_equal type.namespace, 'com.acme'
end
end
end