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