| #!/usr/bin/ruby |
| |
| # generated_code.rb is in the same directory as this test. |
| $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) |
| |
| require 'generated_code_pb' |
| require 'google/protobuf/well_known_types' |
| require 'test/unit' |
| |
| def hex2bin(s) |
| s.scan(/../).map { |x| x.hex.chr }.join |
| end |
| |
| class EncodeDecodeTest < Test::Unit::TestCase |
| def test_discard_unknown |
| # Test discard unknown in message. |
| unknown_msg = A::B::C::TestUnknown.new(:unknown_field => 1) |
| from = A::B::C::TestUnknown.encode(unknown_msg) |
| m = A::B::C::TestMessage.decode(from) |
| Google::Protobuf.discard_unknown(m) |
| to = A::B::C::TestMessage.encode(m) |
| assert_empty to |
| # Test discard unknown for singular message field. |
| unknown_msg = A::B::C::TestUnknown.new( |
| :optional_unknown => |
| A::B::C::TestUnknown.new(:unknown_field => 1)) |
| from = A::B::C::TestUnknown.encode(unknown_msg) |
| m = A::B::C::TestMessage.decode(from) |
| Google::Protobuf.discard_unknown(m) |
| to = A::B::C::TestMessage.encode(m.optional_msg) |
| assert_empty to |
| # Test discard unknown for repeated message field. |
| unknown_msg = A::B::C::TestUnknown.new( |
| :repeated_unknown => |
| [A::B::C::TestUnknown.new(:unknown_field => 1)]) |
| from = A::B::C::TestUnknown.encode(unknown_msg) |
| m = A::B::C::TestMessage.decode(from) |
| Google::Protobuf.discard_unknown(m) |
| to = A::B::C::TestMessage.encode(m.repeated_msg[0]) |
| assert_empty to |
| # Test discard unknown for map value message field. |
| unknown_msg = A::B::C::TestUnknown.new( |
| :map_unknown => |
| {"" => A::B::C::TestUnknown.new(:unknown_field => 1)}) |
| from = A::B::C::TestUnknown.encode(unknown_msg) |
| m = A::B::C::TestMessage.decode(from) |
| Google::Protobuf.discard_unknown(m) |
| to = A::B::C::TestMessage.encode(m.map_string_msg['']) |
| assert_empty to |
| # Test discard unknown for oneof message field. |
| unknown_msg = A::B::C::TestUnknown.new( |
| :oneof_unknown => |
| A::B::C::TestUnknown.new(:unknown_field => 1)) |
| from = A::B::C::TestUnknown.encode(unknown_msg) |
| m = A::B::C::TestMessage.decode(from) |
| Google::Protobuf.discard_unknown(m) |
| to = A::B::C::TestMessage.encode(m.oneof_msg) |
| assert_empty to |
| end |
| |
| def test_encode_json |
| msg = A::B::C::TestMessage.new({ optional_int32: 22 }) |
| json = msg.to_json |
| |
| to = A::B::C::TestMessage.decode_json(json) |
| assert_equal 22, to.optional_int32 |
| msg = A::B::C::TestMessage.new({ optional_int32: 22 }) |
| json = msg.to_json({ preserve_proto_fieldnames: true }) |
| |
| assert_match 'optional_int32', json |
| |
| to = A::B::C::TestMessage.decode_json(json) |
| assert_equal 22, to.optional_int32 |
| |
| msg = A::B::C::TestMessage.new({ optional_int32: 22 }) |
| json = A::B::C::TestMessage.encode_json( |
| msg, |
| { preserve_proto_fieldnames: true, emit_defaults: true } |
| ) |
| |
| assert_match 'optional_int32', json |
| |
| |
| # Test for enums printing as ints. |
| msg = A::B::C::TestMessage.new({ optional_enum: 1 }) |
| json = A::B::C::TestMessage.encode_json( |
| msg, |
| { :format_enums_as_integers => true } |
| ) |
| |
| assert_match '"optionalEnum":1', json |
| |
| # Test for default enum being printed as int. |
| msg = A::B::C::TestMessage.new({ optional_enum: 0 }) |
| json = A::B::C::TestMessage.encode_json( |
| msg, |
| { :format_enums_as_integers => true, :emit_defaults => true } |
| ) |
| |
| assert_match '"optionalEnum":0', json |
| |
| # Test for repeated enums printing as ints. |
| msg = A::B::C::TestMessage.new({ repeated_enum: [0,1,2,3] }) |
| json = A::B::C::TestMessage.encode_json( |
| msg, |
| { :format_enums_as_integers => true } |
| ) |
| |
| assert_match '"repeatedEnum":[0,1,2,3]', json |
| end |
| |
| def test_encode_wrong_msg |
| assert_raises ::ArgumentError do |
| m = A::B::C::TestMessage.new( |
| :optional_int32 => 1, |
| ) |
| Google::Protobuf::Any.encode(m) |
| end |
| end |
| |
| def test_json_name |
| msg = A::B::C::TestJsonName.new(:value => 42) |
| json = msg.to_json |
| assert_match json, "{\"CustomJsonName\":42}" |
| end |
| |
| def test_decode_depth_limit |
| msg = A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| msg_encoded = A::B::C::TestMessage.encode(msg) |
| msg_out = A::B::C::TestMessage.decode(msg_encoded) |
| assert_match msg.to_json, msg_out.to_json |
| |
| assert_raises Google::Protobuf::ParseError do |
| A::B::C::TestMessage.decode(msg_encoded, { recursion_limit: 4 }) |
| end |
| |
| msg_out = A::B::C::TestMessage.decode(msg_encoded, { recursion_limit: 5 }) |
| assert_match msg.to_json, msg_out.to_json |
| end |
| |
| def test_encode_depth_limit |
| msg = A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| optional_msg: A::B::C::TestMessage.new( |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| msg_encoded = A::B::C::TestMessage.encode(msg) |
| msg_out = A::B::C::TestMessage.decode(msg_encoded) |
| assert_match msg.to_json, msg_out.to_json |
| |
| assert_raises RuntimeError do |
| A::B::C::TestMessage.encode(msg, { recursion_limit: 5 }) |
| end |
| |
| msg_encoded = A::B::C::TestMessage.encode(msg, { recursion_limit: 6 }) |
| msg_out = A::B::C::TestMessage.decode(msg_encoded) |
| assert_match msg.to_json, msg_out.to_json |
| end |
| |
| end |