xref: /aosp_15_r20/external/protobuf/ruby/tests/encode_decode_test.rb (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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