1*1b3f573fSAndroid Build Coastguard Worker#!/usr/bin/ruby 2*1b3f573fSAndroid Build Coastguard Worker 3*1b3f573fSAndroid Build Coastguard Worker# generated_code.rb is in the same directory as this test. 4*1b3f573fSAndroid Build Coastguard Worker$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) 5*1b3f573fSAndroid Build Coastguard Worker 6*1b3f573fSAndroid Build Coastguard Workerrequire 'generated_code_pb' 7*1b3f573fSAndroid Build Coastguard Workerrequire 'google/protobuf/well_known_types' 8*1b3f573fSAndroid Build Coastguard Workerrequire 'test/unit' 9*1b3f573fSAndroid Build Coastguard Worker 10*1b3f573fSAndroid Build Coastguard Workerdef hex2bin(s) 11*1b3f573fSAndroid Build Coastguard Worker s.scan(/../).map { |x| x.hex.chr }.join 12*1b3f573fSAndroid Build Coastguard Workerend 13*1b3f573fSAndroid Build Coastguard Worker 14*1b3f573fSAndroid Build Coastguard Workerclass EncodeDecodeTest < Test::Unit::TestCase 15*1b3f573fSAndroid Build Coastguard Worker def test_discard_unknown 16*1b3f573fSAndroid Build Coastguard Worker # Test discard unknown in message. 17*1b3f573fSAndroid Build Coastguard Worker unknown_msg = A::B::C::TestUnknown.new(:unknown_field => 1) 18*1b3f573fSAndroid Build Coastguard Worker from = A::B::C::TestUnknown.encode(unknown_msg) 19*1b3f573fSAndroid Build Coastguard Worker m = A::B::C::TestMessage.decode(from) 20*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf.discard_unknown(m) 21*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.encode(m) 22*1b3f573fSAndroid Build Coastguard Worker assert_equal '', to 23*1b3f573fSAndroid Build Coastguard Worker 24*1b3f573fSAndroid Build Coastguard Worker # Test discard unknown for singular message field. 25*1b3f573fSAndroid Build Coastguard Worker unknown_msg = A::B::C::TestUnknown.new( 26*1b3f573fSAndroid Build Coastguard Worker :optional_unknown => 27*1b3f573fSAndroid Build Coastguard Worker A::B::C::TestUnknown.new(:unknown_field => 1)) 28*1b3f573fSAndroid Build Coastguard Worker from = A::B::C::TestUnknown.encode(unknown_msg) 29*1b3f573fSAndroid Build Coastguard Worker m = A::B::C::TestMessage.decode(from) 30*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf.discard_unknown(m) 31*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.encode(m.optional_msg) 32*1b3f573fSAndroid Build Coastguard Worker assert_equal '', to 33*1b3f573fSAndroid Build Coastguard Worker 34*1b3f573fSAndroid Build Coastguard Worker # Test discard unknown for repeated message field. 35*1b3f573fSAndroid Build Coastguard Worker unknown_msg = A::B::C::TestUnknown.new( 36*1b3f573fSAndroid Build Coastguard Worker :repeated_unknown => 37*1b3f573fSAndroid Build Coastguard Worker [A::B::C::TestUnknown.new(:unknown_field => 1)]) 38*1b3f573fSAndroid Build Coastguard Worker from = A::B::C::TestUnknown.encode(unknown_msg) 39*1b3f573fSAndroid Build Coastguard Worker m = A::B::C::TestMessage.decode(from) 40*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf.discard_unknown(m) 41*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.encode(m.repeated_msg[0]) 42*1b3f573fSAndroid Build Coastguard Worker assert_equal '', to 43*1b3f573fSAndroid Build Coastguard Worker 44*1b3f573fSAndroid Build Coastguard Worker # Test discard unknown for map value message field. 45*1b3f573fSAndroid Build Coastguard Worker unknown_msg = A::B::C::TestUnknown.new( 46*1b3f573fSAndroid Build Coastguard Worker :map_unknown => 47*1b3f573fSAndroid Build Coastguard Worker {"" => A::B::C::TestUnknown.new(:unknown_field => 1)}) 48*1b3f573fSAndroid Build Coastguard Worker from = A::B::C::TestUnknown.encode(unknown_msg) 49*1b3f573fSAndroid Build Coastguard Worker m = A::B::C::TestMessage.decode(from) 50*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf.discard_unknown(m) 51*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.encode(m.map_string_msg['']) 52*1b3f573fSAndroid Build Coastguard Worker assert_equal '', to 53*1b3f573fSAndroid Build Coastguard Worker 54*1b3f573fSAndroid Build Coastguard Worker # Test discard unknown for oneof message field. 55*1b3f573fSAndroid Build Coastguard Worker unknown_msg = A::B::C::TestUnknown.new( 56*1b3f573fSAndroid Build Coastguard Worker :oneof_unknown => 57*1b3f573fSAndroid Build Coastguard Worker A::B::C::TestUnknown.new(:unknown_field => 1)) 58*1b3f573fSAndroid Build Coastguard Worker from = A::B::C::TestUnknown.encode(unknown_msg) 59*1b3f573fSAndroid Build Coastguard Worker m = A::B::C::TestMessage.decode(from) 60*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf.discard_unknown(m) 61*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.encode(m.oneof_msg) 62*1b3f573fSAndroid Build Coastguard Worker assert_equal '', to 63*1b3f573fSAndroid Build Coastguard Worker end 64*1b3f573fSAndroid Build Coastguard Worker 65*1b3f573fSAndroid Build Coastguard Worker def test_encode_json 66*1b3f573fSAndroid Build Coastguard Worker msg = A::B::C::TestMessage.new({ optional_int32: 22 }) 67*1b3f573fSAndroid Build Coastguard Worker json = msg.to_json 68*1b3f573fSAndroid Build Coastguard Worker 69*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.decode_json(json) 70*1b3f573fSAndroid Build Coastguard Worker assert_equal to.optional_int32, 22 71*1b3f573fSAndroid Build Coastguard Worker 72*1b3f573fSAndroid Build Coastguard Worker msg = A::B::C::TestMessage.new({ optional_int32: 22 }) 73*1b3f573fSAndroid Build Coastguard Worker json = msg.to_json({ preserve_proto_fieldnames: true }) 74*1b3f573fSAndroid Build Coastguard Worker 75*1b3f573fSAndroid Build Coastguard Worker assert_match 'optional_int32', json 76*1b3f573fSAndroid Build Coastguard Worker 77*1b3f573fSAndroid Build Coastguard Worker to = A::B::C::TestMessage.decode_json(json) 78*1b3f573fSAndroid Build Coastguard Worker assert_equal 22, to.optional_int32 79*1b3f573fSAndroid Build Coastguard Worker 80*1b3f573fSAndroid Build Coastguard Worker msg = A::B::C::TestMessage.new({ optional_int32: 22 }) 81*1b3f573fSAndroid Build Coastguard Worker json = A::B::C::TestMessage.encode_json( 82*1b3f573fSAndroid Build Coastguard Worker msg, 83*1b3f573fSAndroid Build Coastguard Worker { preserve_proto_fieldnames: true, emit_defaults: true } 84*1b3f573fSAndroid Build Coastguard Worker ) 85*1b3f573fSAndroid Build Coastguard Worker 86*1b3f573fSAndroid Build Coastguard Worker assert_match 'optional_int32', json 87*1b3f573fSAndroid Build Coastguard Worker end 88*1b3f573fSAndroid Build Coastguard Worker 89*1b3f573fSAndroid Build Coastguard Worker def test_encode_wrong_msg 90*1b3f573fSAndroid Build Coastguard Worker assert_raise ::ArgumentError do 91*1b3f573fSAndroid Build Coastguard Worker m = A::B::C::TestMessage.new( 92*1b3f573fSAndroid Build Coastguard Worker :optional_int32 => 1, 93*1b3f573fSAndroid Build Coastguard Worker ) 94*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf::Any.encode(m) 95*1b3f573fSAndroid Build Coastguard Worker end 96*1b3f573fSAndroid Build Coastguard Worker end 97*1b3f573fSAndroid Build Coastguard Worker 98*1b3f573fSAndroid Build Coastguard Worker def test_json_name 99*1b3f573fSAndroid Build Coastguard Worker msg = A::B::C::TestJsonName.new(:value => 42) 100*1b3f573fSAndroid Build Coastguard Worker json = msg.to_json 101*1b3f573fSAndroid Build Coastguard Worker assert_match json, "{\"CustomJsonName\":42}" 102*1b3f573fSAndroid Build Coastguard Worker end 103*1b3f573fSAndroid Build Coastguard Worker 104*1b3f573fSAndroid Build Coastguard Worker def test_decode_depth_limit 105*1b3f573fSAndroid Build Coastguard Worker msg = A::B::C::TestMessage.new( 106*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 107*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 108*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 109*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 110*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 111*1b3f573fSAndroid Build Coastguard Worker ) 112*1b3f573fSAndroid Build Coastguard Worker ) 113*1b3f573fSAndroid Build Coastguard Worker ) 114*1b3f573fSAndroid Build Coastguard Worker ) 115*1b3f573fSAndroid Build Coastguard Worker ) 116*1b3f573fSAndroid Build Coastguard Worker ) 117*1b3f573fSAndroid Build Coastguard Worker msg_encoded = A::B::C::TestMessage.encode(msg) 118*1b3f573fSAndroid Build Coastguard Worker msg_out = A::B::C::TestMessage.decode(msg_encoded) 119*1b3f573fSAndroid Build Coastguard Worker assert_match msg.to_json, msg_out.to_json 120*1b3f573fSAndroid Build Coastguard Worker 121*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::ParseError do 122*1b3f573fSAndroid Build Coastguard Worker A::B::C::TestMessage.decode(msg_encoded, { recursion_limit: 4 }) 123*1b3f573fSAndroid Build Coastguard Worker end 124*1b3f573fSAndroid Build Coastguard Worker 125*1b3f573fSAndroid Build Coastguard Worker msg_out = A::B::C::TestMessage.decode(msg_encoded, { recursion_limit: 5 }) 126*1b3f573fSAndroid Build Coastguard Worker assert_match msg.to_json, msg_out.to_json 127*1b3f573fSAndroid Build Coastguard Worker end 128*1b3f573fSAndroid Build Coastguard Worker 129*1b3f573fSAndroid Build Coastguard Worker def test_encode_depth_limit 130*1b3f573fSAndroid Build Coastguard Worker msg = A::B::C::TestMessage.new( 131*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 132*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 133*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 134*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 135*1b3f573fSAndroid Build Coastguard Worker optional_msg: A::B::C::TestMessage.new( 136*1b3f573fSAndroid Build Coastguard Worker ) 137*1b3f573fSAndroid Build Coastguard Worker ) 138*1b3f573fSAndroid Build Coastguard Worker ) 139*1b3f573fSAndroid Build Coastguard Worker ) 140*1b3f573fSAndroid Build Coastguard Worker ) 141*1b3f573fSAndroid Build Coastguard Worker ) 142*1b3f573fSAndroid Build Coastguard Worker msg_encoded = A::B::C::TestMessage.encode(msg) 143*1b3f573fSAndroid Build Coastguard Worker msg_out = A::B::C::TestMessage.decode(msg_encoded) 144*1b3f573fSAndroid Build Coastguard Worker assert_match msg.to_json, msg_out.to_json 145*1b3f573fSAndroid Build Coastguard Worker 146*1b3f573fSAndroid Build Coastguard Worker assert_raise RuntimeError do 147*1b3f573fSAndroid Build Coastguard Worker A::B::C::TestMessage.encode(msg, { recursion_limit: 5 }) 148*1b3f573fSAndroid Build Coastguard Worker end 149*1b3f573fSAndroid Build Coastguard Worker 150*1b3f573fSAndroid Build Coastguard Worker msg_encoded = A::B::C::TestMessage.encode(msg, { recursion_limit: 6 }) 151*1b3f573fSAndroid Build Coastguard Worker msg_out = A::B::C::TestMessage.decode(msg_encoded) 152*1b3f573fSAndroid Build Coastguard Worker assert_match msg.to_json, msg_out.to_json 153*1b3f573fSAndroid Build Coastguard Worker end 154*1b3f573fSAndroid Build Coastguard Worker 155*1b3f573fSAndroid Build Coastguard Workerend 156