d0535cc09e
This change only adds basic proto2 support without advanced features like extensions, custom options, maps, etc. The protoc binary now generates ruby code for proto2 syntax. However, for now, it is restricted to proto2 files without advanced features like extensions, in which case it still errors out. This change also modifies the DSL to add proto messages to the DescriptorPool. There is a new DSL Builder#add_file to create a new FileDescriptor. With this, the generated ruby DSL looks something like: Google::Protobuf::DescriptorPool.generated_pool.build do add_file "test.proto" do add_message "foo" do optional :val, :int32, 1 end end end
103 lines
3.1 KiB
Ruby
103 lines
3.1 KiB
Ruby
#!/usr/bin/ruby
|
|
#
|
|
# generated_code.rb is in the same directory as this test.
|
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
|
|
|
old_gc = GC.stress
|
|
GC.stress = 0x01 | 0x04
|
|
require 'generated_code_pb'
|
|
require 'generated_code_proto2_pb'
|
|
GC.stress = old_gc
|
|
|
|
require 'test/unit'
|
|
|
|
class GCTest < Test::Unit::TestCase
|
|
def get_msg_proto3
|
|
A::B::C::TestMessage.new(
|
|
:optional_int32 => 1,
|
|
:optional_int64 => 1,
|
|
:optional_uint32 => 1,
|
|
:optional_uint64 => 1,
|
|
:optional_bool => true,
|
|
:optional_double => 1.0,
|
|
:optional_float => 1.0,
|
|
:optional_string => "a",
|
|
:optional_bytes => "b",
|
|
:optional_enum => A::B::C::TestEnum::A,
|
|
:optional_msg => A::B::C::TestMessage.new(),
|
|
:repeated_int32 => [1],
|
|
:repeated_int64 => [1],
|
|
:repeated_uint32 => [1],
|
|
:repeated_uint64 => [1],
|
|
:repeated_bool => [true],
|
|
:repeated_double => [1.0],
|
|
:repeated_float => [1.0],
|
|
:repeated_string => ["a"],
|
|
:repeated_bytes => ["b"],
|
|
:repeated_enum => [A::B::C::TestEnum::A],
|
|
:repeated_msg => [A::B::C::TestMessage.new()],
|
|
:map_int32_string => {1 => "a"},
|
|
:map_int64_string => {1 => "a"},
|
|
:map_uint32_string => {1 => "a"},
|
|
:map_uint64_string => {1 => "a"},
|
|
:map_bool_string => {true => "a"},
|
|
:map_string_string => {"a" => "a"},
|
|
:map_string_msg => {"a" => A::B::C::TestMessage.new()},
|
|
:map_string_int32 => {"a" => 1},
|
|
:map_string_bool => {"a" => true},
|
|
)
|
|
end
|
|
|
|
def get_msg_proto2
|
|
A::B::Proto2::TestMessage.new(
|
|
:optional_int32 => 1,
|
|
:optional_int64 => 1,
|
|
:optional_uint32 => 1,
|
|
:optional_uint64 => 1,
|
|
:optional_bool => true,
|
|
:optional_double => 1.0,
|
|
:optional_float => 1.0,
|
|
:optional_string => "a",
|
|
:optional_bytes => "b",
|
|
:optional_enum => A::B::Proto2::TestEnum::A,
|
|
:optional_msg => A::B::Proto2::TestMessage.new(),
|
|
:repeated_int32 => [1],
|
|
:repeated_int64 => [1],
|
|
:repeated_uint32 => [1],
|
|
:repeated_uint64 => [1],
|
|
:repeated_bool => [true],
|
|
:repeated_double => [1.0],
|
|
:repeated_float => [1.0],
|
|
:repeated_string => ["a"],
|
|
:repeated_bytes => ["b"],
|
|
:repeated_enum => [A::B::Proto2::TestEnum::A],
|
|
:repeated_msg => [A::B::Proto2::TestMessage.new()],
|
|
:required_int32 => 1,
|
|
:required_int64 => 1,
|
|
:required_uint32 => 1,
|
|
:required_uint64 => 1,
|
|
:required_bool => true,
|
|
:required_double => 1.0,
|
|
:required_float => 1.0,
|
|
:required_string => "a",
|
|
:required_bytes => "b",
|
|
:required_enum => A::B::Proto2::TestEnum::A,
|
|
:required_msg => A::B::Proto2::TestMessage.new(),
|
|
)
|
|
end
|
|
|
|
def test_generated_msg
|
|
old_gc = GC.stress
|
|
GC.stress = 0x01 | 0x04
|
|
from = get_msg_proto3
|
|
data = A::B::C::TestMessage.encode(from)
|
|
to = A::B::C::TestMessage.decode(data)
|
|
|
|
from = get_msg_proto2
|
|
data = A::B::Proto2::TestMessage.encode(from)
|
|
to = A::B::Proto2::TestMessage.decode(data)
|
|
GC.stress = old_gc
|
|
puts "passed"
|
|
end
|
|
end
|