xref: /aosp_15_r20/external/protobuf/ruby/tests/gc_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 Workerold_gc = GC.stress
7*1b3f573fSAndroid Build Coastguard Worker# Ruby 2.7.0 - 2.7.1 has a GC bug in its parser, so turn off stress for now
8*1b3f573fSAndroid Build Coastguard Worker# See https://bugs.ruby-lang.org/issues/16807
9*1b3f573fSAndroid Build Coastguard WorkerGC.stress = 0x01 | 0x04 unless RUBY_VERSION.match?(/^2\.7\./)
10*1b3f573fSAndroid Build Coastguard Workerrequire 'generated_code_pb'
11*1b3f573fSAndroid Build Coastguard Workerrequire 'generated_code_proto2_pb'
12*1b3f573fSAndroid Build Coastguard WorkerGC.stress = old_gc
13*1b3f573fSAndroid Build Coastguard Worker
14*1b3f573fSAndroid Build Coastguard Workerrequire 'test/unit'
15*1b3f573fSAndroid Build Coastguard Worker
16*1b3f573fSAndroid Build Coastguard Workerclass GCTest < Test::Unit::TestCase
17*1b3f573fSAndroid Build Coastguard Worker  def get_msg_proto3
18*1b3f573fSAndroid Build Coastguard Worker    A::B::C::TestMessage.new(
19*1b3f573fSAndroid Build Coastguard Worker        :optional_int32 => 1,
20*1b3f573fSAndroid Build Coastguard Worker        :optional_int64 => 1,
21*1b3f573fSAndroid Build Coastguard Worker        :optional_uint32 => 1,
22*1b3f573fSAndroid Build Coastguard Worker        :optional_uint64 => 1,
23*1b3f573fSAndroid Build Coastguard Worker        :optional_bool => true,
24*1b3f573fSAndroid Build Coastguard Worker        :optional_double => 1.0,
25*1b3f573fSAndroid Build Coastguard Worker        :optional_float => 1.0,
26*1b3f573fSAndroid Build Coastguard Worker        :optional_string => "a",
27*1b3f573fSAndroid Build Coastguard Worker        :optional_bytes => "b",
28*1b3f573fSAndroid Build Coastguard Worker        :optional_enum => A::B::C::TestEnum::A,
29*1b3f573fSAndroid Build Coastguard Worker        :optional_msg => A::B::C::TestMessage.new(),
30*1b3f573fSAndroid Build Coastguard Worker        :repeated_int32 => [1],
31*1b3f573fSAndroid Build Coastguard Worker        :repeated_int64 => [1],
32*1b3f573fSAndroid Build Coastguard Worker        :repeated_uint32 => [1],
33*1b3f573fSAndroid Build Coastguard Worker        :repeated_uint64 => [1],
34*1b3f573fSAndroid Build Coastguard Worker        :repeated_bool => [true],
35*1b3f573fSAndroid Build Coastguard Worker        :repeated_double => [1.0],
36*1b3f573fSAndroid Build Coastguard Worker        :repeated_float => [1.0],
37*1b3f573fSAndroid Build Coastguard Worker        :repeated_string => ["a"],
38*1b3f573fSAndroid Build Coastguard Worker        :repeated_bytes => ["b"],
39*1b3f573fSAndroid Build Coastguard Worker        :repeated_enum => [A::B::C::TestEnum::A],
40*1b3f573fSAndroid Build Coastguard Worker        :repeated_msg => [A::B::C::TestMessage.new()],
41*1b3f573fSAndroid Build Coastguard Worker        :map_int32_string => {1 => "a"},
42*1b3f573fSAndroid Build Coastguard Worker        :map_int64_string => {1 => "a"},
43*1b3f573fSAndroid Build Coastguard Worker        :map_uint32_string => {1 => "a"},
44*1b3f573fSAndroid Build Coastguard Worker        :map_uint64_string => {1 => "a"},
45*1b3f573fSAndroid Build Coastguard Worker        :map_bool_string => {true => "a"},
46*1b3f573fSAndroid Build Coastguard Worker        :map_string_string => {"a" => "a"},
47*1b3f573fSAndroid Build Coastguard Worker        :map_string_msg => {"a" => A::B::C::TestMessage.new()},
48*1b3f573fSAndroid Build Coastguard Worker        :map_string_int32 => {"a" => 1},
49*1b3f573fSAndroid Build Coastguard Worker        :map_string_bool => {"a" => true},
50*1b3f573fSAndroid Build Coastguard Worker    )
51*1b3f573fSAndroid Build Coastguard Worker  end
52*1b3f573fSAndroid Build Coastguard Worker
53*1b3f573fSAndroid Build Coastguard Worker  def get_msg_proto2
54*1b3f573fSAndroid Build Coastguard Worker    A::B::Proto2::TestMessage.new(
55*1b3f573fSAndroid Build Coastguard Worker        :optional_int32 => 1,
56*1b3f573fSAndroid Build Coastguard Worker        :optional_int64 => 1,
57*1b3f573fSAndroid Build Coastguard Worker        :optional_uint32 => 1,
58*1b3f573fSAndroid Build Coastguard Worker        :optional_uint64 => 1,
59*1b3f573fSAndroid Build Coastguard Worker        :optional_bool => true,
60*1b3f573fSAndroid Build Coastguard Worker        :optional_double => 1.0,
61*1b3f573fSAndroid Build Coastguard Worker        :optional_float => 1.0,
62*1b3f573fSAndroid Build Coastguard Worker        :optional_string => "a",
63*1b3f573fSAndroid Build Coastguard Worker        :optional_bytes => "b",
64*1b3f573fSAndroid Build Coastguard Worker        :optional_enum => A::B::Proto2::TestEnum::A,
65*1b3f573fSAndroid Build Coastguard Worker        :optional_msg => A::B::Proto2::TestMessage.new(),
66*1b3f573fSAndroid Build Coastguard Worker        :repeated_int32 => [1],
67*1b3f573fSAndroid Build Coastguard Worker        :repeated_int64 => [1],
68*1b3f573fSAndroid Build Coastguard Worker        :repeated_uint32 => [1],
69*1b3f573fSAndroid Build Coastguard Worker        :repeated_uint64 => [1],
70*1b3f573fSAndroid Build Coastguard Worker        :repeated_bool => [true],
71*1b3f573fSAndroid Build Coastguard Worker        :repeated_double => [1.0],
72*1b3f573fSAndroid Build Coastguard Worker        :repeated_float => [1.0],
73*1b3f573fSAndroid Build Coastguard Worker        :repeated_string => ["a"],
74*1b3f573fSAndroid Build Coastguard Worker        :repeated_bytes => ["b"],
75*1b3f573fSAndroid Build Coastguard Worker        :repeated_enum => [A::B::Proto2::TestEnum::A],
76*1b3f573fSAndroid Build Coastguard Worker        :repeated_msg => [A::B::Proto2::TestMessage.new()],
77*1b3f573fSAndroid Build Coastguard Worker        :required_int32 => 1,
78*1b3f573fSAndroid Build Coastguard Worker        :required_int64 => 1,
79*1b3f573fSAndroid Build Coastguard Worker        :required_uint32 => 1,
80*1b3f573fSAndroid Build Coastguard Worker        :required_uint64 => 1,
81*1b3f573fSAndroid Build Coastguard Worker        :required_bool => true,
82*1b3f573fSAndroid Build Coastguard Worker        :required_double => 1.0,
83*1b3f573fSAndroid Build Coastguard Worker        :required_float => 1.0,
84*1b3f573fSAndroid Build Coastguard Worker        :required_string => "a",
85*1b3f573fSAndroid Build Coastguard Worker        :required_bytes => "b",
86*1b3f573fSAndroid Build Coastguard Worker        :required_enum => A::B::Proto2::TestEnum::A,
87*1b3f573fSAndroid Build Coastguard Worker        :required_msg => A::B::Proto2::TestMessage.new(),
88*1b3f573fSAndroid Build Coastguard Worker    )
89*1b3f573fSAndroid Build Coastguard Worker  end
90*1b3f573fSAndroid Build Coastguard Worker
91*1b3f573fSAndroid Build Coastguard Worker  def test_generated_msg
92*1b3f573fSAndroid Build Coastguard Worker    old_gc = GC.stress
93*1b3f573fSAndroid Build Coastguard Worker    GC.stress = 0x01 | 0x04
94*1b3f573fSAndroid Build Coastguard Worker    from = get_msg_proto3
95*1b3f573fSAndroid Build Coastguard Worker    data = A::B::C::TestMessage.encode(from)
96*1b3f573fSAndroid Build Coastguard Worker    to = A::B::C::TestMessage.decode(data)
97*1b3f573fSAndroid Build Coastguard Worker    # This doesn't work for proto2 on JRuby because there is a nested required message.
98*1b3f573fSAndroid Build Coastguard Worker    # A::B::Proto2::TestMessage has :required_msg which is of type:
99*1b3f573fSAndroid Build Coastguard Worker    # A::B::Proto2::TestMessage so there is no way to generate a valid
100*1b3f573fSAndroid Build Coastguard Worker    # message that doesn't exceed the depth limit
101*1b3f573fSAndroid Build Coastguard Worker    if !defined? JRUBY_VERSION
102*1b3f573fSAndroid Build Coastguard Worker        from = get_msg_proto2
103*1b3f573fSAndroid Build Coastguard Worker        data = A::B::Proto2::TestMessage.encode(from)
104*1b3f573fSAndroid Build Coastguard Worker        to = A::B::Proto2::TestMessage.decode(data)
105*1b3f573fSAndroid Build Coastguard Worker    end
106*1b3f573fSAndroid Build Coastguard Worker    GC.stress = old_gc
107*1b3f573fSAndroid Build Coastguard Worker    puts "passed"
108*1b3f573fSAndroid Build Coastguard Worker  end
109*1b3f573fSAndroid Build Coastguard Workerend
110