protobuf 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +28 -0
- data/README.md +216 -0
- data/Rakefile +1 -0
- data/bin/rpc_server +117 -0
- data/bin/rprotoc +46 -0
- data/examples/addressbook.pb.rb +55 -0
- data/examples/addressbook.proto +24 -0
- data/examples/reading_a_message.rb +32 -0
- data/examples/writing_a_message.rb +46 -0
- data/lib/protobuf.rb +6 -0
- data/lib/protobuf/common/exceptions.rb +11 -0
- data/lib/protobuf/common/logger.rb +64 -0
- data/lib/protobuf/common/util.rb +59 -0
- data/lib/protobuf/common/wire_type.rb +10 -0
- data/lib/protobuf/compiler/compiler.rb +52 -0
- data/lib/protobuf/compiler/nodes.rb +323 -0
- data/lib/protobuf/compiler/proto.y +216 -0
- data/lib/protobuf/compiler/proto2.ebnf +79 -0
- data/lib/protobuf/compiler/proto_parser.rb +1425 -0
- data/lib/protobuf/compiler/template/rpc_bin.erb +4 -0
- data/lib/protobuf/compiler/template/rpc_client.erb +18 -0
- data/lib/protobuf/compiler/template/rpc_service.erb +25 -0
- data/lib/protobuf/compiler/template/rpc_service_implementation.erb +42 -0
- data/lib/protobuf/compiler/visitors.rb +302 -0
- data/lib/protobuf/descriptor/descriptor.proto +286 -0
- data/lib/protobuf/descriptor/descriptor.rb +55 -0
- data/lib/protobuf/descriptor/descriptor_builder.rb +143 -0
- data/lib/protobuf/descriptor/descriptor_proto.rb +138 -0
- data/lib/protobuf/descriptor/enum_descriptor.rb +33 -0
- data/lib/protobuf/descriptor/field_descriptor.rb +49 -0
- data/lib/protobuf/descriptor/file_descriptor.rb +37 -0
- data/lib/protobuf/message/decoder.rb +83 -0
- data/lib/protobuf/message/encoder.rb +46 -0
- data/lib/protobuf/message/enum.rb +62 -0
- data/lib/protobuf/message/extend.rb +8 -0
- data/lib/protobuf/message/field.rb +701 -0
- data/lib/protobuf/message/message.rb +402 -0
- data/lib/protobuf/message/protoable.rb +38 -0
- data/lib/protobuf/rpc/buffer.rb +74 -0
- data/lib/protobuf/rpc/client.rb +268 -0
- data/lib/protobuf/rpc/client_connection.rb +225 -0
- data/lib/protobuf/rpc/error.rb +34 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/rpc.pb.rb +107 -0
- data/lib/protobuf/rpc/server.rb +183 -0
- data/lib/protobuf/rpc/service.rb +244 -0
- data/lib/protobuf/rpc/stat.rb +70 -0
- data/lib/protobuf/version.rb +3 -0
- data/proto/rpc.proto +73 -0
- data/protobuf.gemspec +25 -0
- data/script/mk_parser +2 -0
- data/spec/functional/embedded_service_spec.rb +7 -0
- data/spec/proto/test.pb.rb +31 -0
- data/spec/proto/test.proto +31 -0
- data/spec/proto/test_service.rb +30 -0
- data/spec/proto/test_service_impl.rb +17 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/unit/client_spec.rb +128 -0
- data/spec/unit/common/logger_spec.rb +121 -0
- data/spec/unit/enum_spec.rb +13 -0
- data/spec/unit/message_spec.rb +67 -0
- data/spec/unit/server_spec.rb +27 -0
- data/spec/unit/service_spec.rb +75 -0
- data/test/check_unbuild.rb +30 -0
- data/test/data/data.bin +3 -0
- data/test/data/data_source.py +14 -0
- data/test/data/types.bin +0 -0
- data/test/data/types_source.py +22 -0
- data/test/data/unk.png +0 -0
- data/test/proto/addressbook.pb.rb +66 -0
- data/test/proto/addressbook.proto +33 -0
- data/test/proto/addressbook_base.pb.rb +58 -0
- data/test/proto/addressbook_base.proto +26 -0
- data/test/proto/addressbook_ext.pb.rb +20 -0
- data/test/proto/addressbook_ext.proto +6 -0
- data/test/proto/collision.pb.rb +17 -0
- data/test/proto/collision.proto +5 -0
- data/test/proto/ext_collision.pb.rb +24 -0
- data/test/proto/ext_collision.proto +8 -0
- data/test/proto/ext_range.pb.rb +22 -0
- data/test/proto/ext_range.proto +7 -0
- data/test/proto/float_default.proto +10 -0
- data/test/proto/lowercase.pb.rb +30 -0
- data/test/proto/lowercase.proto +9 -0
- data/test/proto/merge.pb.rb +39 -0
- data/test/proto/merge.proto +15 -0
- data/test/proto/nested.pb.rb +30 -0
- data/test/proto/nested.proto +9 -0
- data/test/proto/optional_field.pb.rb +35 -0
- data/test/proto/optional_field.proto +12 -0
- data/test/proto/packed.pb.rb +22 -0
- data/test/proto/packed.proto +6 -0
- data/test/proto/rpc.proto +6 -0
- data/test/proto/types.pb.rb +84 -0
- data/test/proto/types.proto +37 -0
- data/test/test_addressbook.rb +56 -0
- data/test/test_compiler.rb +325 -0
- data/test/test_descriptor.rb +122 -0
- data/test/test_enum_value.rb +41 -0
- data/test/test_extension.rb +36 -0
- data/test/test_lowercase.rb +11 -0
- data/test/test_message.rb +128 -0
- data/test/test_optional_field.rb +103 -0
- data/test/test_packed_field.rb +40 -0
- data/test/test_parse.rb +15 -0
- data/test/test_repeated_types.rb +132 -0
- data/test/test_serialize.rb +61 -0
- data/test/test_standard_message.rb +96 -0
- data/test/test_types.rb +226 -0
- metadata +261 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
### Generated by rprotoc. DO NOT EDIT!
|
2
|
+
### <proto file: test/proto/packed.proto>
|
3
|
+
# package test.packed_field;
|
4
|
+
#
|
5
|
+
# message Message {
|
6
|
+
# repeated int32 a = 1 [packed = true];
|
7
|
+
# repeated fixed32 b = 2 [packed = true];
|
8
|
+
# }
|
9
|
+
|
10
|
+
require 'protobuf/message/message'
|
11
|
+
require 'protobuf/message/enum'
|
12
|
+
require 'protobuf/message/extend'
|
13
|
+
|
14
|
+
module Test
|
15
|
+
module PackedField
|
16
|
+
class Message < ::Protobuf::Message
|
17
|
+
defined_in __FILE__
|
18
|
+
repeated :int32, :a, 1, :packed => true
|
19
|
+
repeated :fixed32, :b, 2, :packed => true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
### Generated by rprotoc. DO NOT EDIT!
|
2
|
+
### <proto file: test/proto/types.proto>
|
3
|
+
# package test.types;
|
4
|
+
#
|
5
|
+
# message TestTypes {
|
6
|
+
# required double type1 = 1;
|
7
|
+
# required float type2 = 2;
|
8
|
+
# required int32 type3 = 3;
|
9
|
+
# required int64 type4 = 4;
|
10
|
+
# required uint32 type5 = 5;
|
11
|
+
# required uint64 type6 = 6;
|
12
|
+
# required sint32 type7 = 7;
|
13
|
+
# required sint64 type8 = 8;
|
14
|
+
# required fixed32 type9 = 9;
|
15
|
+
# required fixed64 type10 = 10;
|
16
|
+
# required bool type11 = 11;
|
17
|
+
# required string type12 = 12;
|
18
|
+
# required bytes type13 = 13;
|
19
|
+
# required sfixed32 type14 = 14;
|
20
|
+
# required sfixed64 type15 = 15;
|
21
|
+
# }
|
22
|
+
#
|
23
|
+
# message RepeatedTypes {
|
24
|
+
# repeated double type1 = 1;
|
25
|
+
# repeated float type2 = 2;
|
26
|
+
# repeated int32 type3 = 3;
|
27
|
+
# repeated int64 type4 = 4;
|
28
|
+
# repeated uint32 type5 = 5;
|
29
|
+
# repeated uint64 type6 = 6;
|
30
|
+
# repeated sint32 type7 = 7;
|
31
|
+
# repeated sint64 type8 = 8;
|
32
|
+
# repeated fixed32 type9 = 9;
|
33
|
+
# repeated fixed64 type10 = 10;
|
34
|
+
# repeated bool type11 = 11;
|
35
|
+
# repeated string type12 = 12;
|
36
|
+
# repeated bytes type13 = 13;
|
37
|
+
# repeated sfixed32 type14 = 14;
|
38
|
+
# repeated sfixed64 type15 = 15;
|
39
|
+
# }
|
40
|
+
|
41
|
+
require 'protobuf/message/message'
|
42
|
+
require 'protobuf/message/enum'
|
43
|
+
require 'protobuf/message/extend'
|
44
|
+
|
45
|
+
module Test
|
46
|
+
module Types
|
47
|
+
class TestTypes < ::Protobuf::Message
|
48
|
+
defined_in __FILE__
|
49
|
+
required :double, :type1, 1
|
50
|
+
required :float, :type2, 2
|
51
|
+
required :int32, :type3, 3
|
52
|
+
required :int64, :type4, 4
|
53
|
+
required :uint32, :type5, 5
|
54
|
+
required :uint64, :type6, 6
|
55
|
+
required :sint32, :type7, 7
|
56
|
+
required :sint64, :type8, 8
|
57
|
+
required :fixed32, :type9, 9
|
58
|
+
required :fixed64, :type10, 10
|
59
|
+
required :bool, :type11, 11
|
60
|
+
required :string, :type12, 12
|
61
|
+
required :bytes, :type13, 13
|
62
|
+
required :sfixed32, :type14, 14
|
63
|
+
required :sfixed64, :type15, 15
|
64
|
+
end
|
65
|
+
class RepeatedTypes < ::Protobuf::Message
|
66
|
+
defined_in __FILE__
|
67
|
+
repeated :double, :type1, 1
|
68
|
+
repeated :float, :type2, 2
|
69
|
+
repeated :int32, :type3, 3
|
70
|
+
repeated :int64, :type4, 4
|
71
|
+
repeated :uint32, :type5, 5
|
72
|
+
repeated :uint64, :type6, 6
|
73
|
+
repeated :sint32, :type7, 7
|
74
|
+
repeated :sint64, :type8, 8
|
75
|
+
repeated :fixed32, :type9, 9
|
76
|
+
repeated :fixed64, :type10, 10
|
77
|
+
repeated :bool, :type11, 11
|
78
|
+
repeated :string, :type12, 12
|
79
|
+
repeated :bytes, :type13, 13
|
80
|
+
repeated :sfixed32, :type14, 14
|
81
|
+
repeated :sfixed64, :type15, 15
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
package test.types;
|
2
|
+
|
3
|
+
message TestTypes {
|
4
|
+
required double type1 = 1;
|
5
|
+
required float type2 = 2;
|
6
|
+
required int32 type3 = 3;
|
7
|
+
required int64 type4 = 4;
|
8
|
+
required uint32 type5 = 5;
|
9
|
+
required uint64 type6 = 6;
|
10
|
+
required sint32 type7 = 7;
|
11
|
+
required sint64 type8 = 8;
|
12
|
+
required fixed32 type9 = 9;
|
13
|
+
required fixed64 type10 = 10;
|
14
|
+
required bool type11 = 11;
|
15
|
+
required string type12 = 12;
|
16
|
+
required bytes type13 = 13;
|
17
|
+
required sfixed32 type14 = 14;
|
18
|
+
required sfixed64 type15 = 15;
|
19
|
+
}
|
20
|
+
|
21
|
+
message RepeatedTypes {
|
22
|
+
repeated double type1 = 1;
|
23
|
+
repeated float type2 = 2;
|
24
|
+
repeated int32 type3 = 3;
|
25
|
+
repeated int64 type4 = 4;
|
26
|
+
repeated uint32 type5 = 5;
|
27
|
+
repeated uint64 type6 = 6;
|
28
|
+
repeated sint32 type7 = 7;
|
29
|
+
repeated sint64 type8 = 8;
|
30
|
+
repeated fixed32 type9 = 9;
|
31
|
+
repeated fixed64 type10 = 10;
|
32
|
+
repeated bool type11 = 11;
|
33
|
+
repeated string type12 = 12;
|
34
|
+
repeated bytes type13 = 13;
|
35
|
+
repeated sfixed32 type14 = 14;
|
36
|
+
repeated sfixed64 type15 = 15;
|
37
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'protobuf/message/message'
|
3
|
+
require 'protobuf/message/enum'
|
4
|
+
require 'test/proto/addressbook.pb'
|
5
|
+
|
6
|
+
class AddressbookTest < Test::Unit::TestCase
|
7
|
+
def test_enum
|
8
|
+
phone_number = Tutorial::Person::PhoneNumber.new
|
9
|
+
assert_equal(Tutorial::Person::PhoneType::HOME, phone_number.type)
|
10
|
+
phone_number.type = Tutorial::Person::PhoneType::MOBILE
|
11
|
+
assert_equal(0, phone_number.type)
|
12
|
+
phone_number.type = Tutorial::Person::PhoneType::HOME
|
13
|
+
assert_equal(1, phone_number.type)
|
14
|
+
phone_number.type = Tutorial::Person::PhoneType::WORK
|
15
|
+
assert_equal(2, phone_number.type)
|
16
|
+
assert_raise(TypeError) do
|
17
|
+
phone_number.type = 3
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_symbol_enum
|
22
|
+
phone_number = Tutorial::Person::PhoneNumber.new
|
23
|
+
assert_equal(Tutorial::Person::PhoneType::HOME, phone_number.type)
|
24
|
+
phone_number.type = :MOBILE
|
25
|
+
assert_equal(0, phone_number.type)
|
26
|
+
phone_number.type = :HOME
|
27
|
+
assert_equal(1, phone_number.type)
|
28
|
+
phone_number.type = :WORK
|
29
|
+
assert_equal(2, phone_number.type)
|
30
|
+
assert_raise(TypeError) do
|
31
|
+
phone_number.type = :UNKNOWN
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_initial_value
|
36
|
+
person = Tutorial::Person.new
|
37
|
+
assert_nil(person.name)
|
38
|
+
assert_nil(person.id)
|
39
|
+
assert_equal([], person.phone)
|
40
|
+
assert_equal('', person.email)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_repeatable
|
44
|
+
address_book = Tutorial::AddressBook.new
|
45
|
+
assert_equal([], address_book.person)
|
46
|
+
assert_instance_of(Protobuf::Field::FieldArray, address_book.person)
|
47
|
+
address_book.person << Tutorial::Person.new
|
48
|
+
assert_equal(1, address_book.person.size)
|
49
|
+
assert_raise(TypeError) do
|
50
|
+
address_book.person << 1
|
51
|
+
end
|
52
|
+
assert_equal(1, address_book.person.size)
|
53
|
+
address_book.person << Tutorial::Person.new
|
54
|
+
assert_equal(2, address_book.person.size)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,325 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'protobuf/compiler/compiler'
|
3
|
+
|
4
|
+
class CompilerTest < Test::Unit::TestCase
|
5
|
+
# Issue 12: Parse error on float default value
|
6
|
+
def test_compile_float_default
|
7
|
+
assert_compile_proto(<<-EOS, 'test/proto/float_default.proto')
|
8
|
+
### Generated by rprotoc. DO NOT EDIT!
|
9
|
+
### <proto file: test/proto/float_default.proto>
|
10
|
+
# message M {
|
11
|
+
# optional float f = 1 [default = 4.2];
|
12
|
+
# optional float g = 2 [default = -4.2];
|
13
|
+
# optional float h = 3 [default = 4352];
|
14
|
+
# optional float i = 4 [default = 23145.2 ];
|
15
|
+
# optional float j = 5 [default = -5 ];
|
16
|
+
# optional float k = 6 [default = +23 ];
|
17
|
+
# optional float l = 7 [default = +23.42 ];
|
18
|
+
# }
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'protobuf/message/message'
|
22
|
+
require 'protobuf/message/enum'
|
23
|
+
require 'protobuf/message/extend'
|
24
|
+
|
25
|
+
class M < ::Protobuf::Message
|
26
|
+
defined_in __FILE__
|
27
|
+
optional :float, :f, 1, :default => 4.2
|
28
|
+
optional :float, :g, 2, :default => -4.2
|
29
|
+
optional :float, :h, 3, :default => 4352
|
30
|
+
optional :float, :i, 4, :default => 23145.2
|
31
|
+
optional :float, :j, 5, :default => -5
|
32
|
+
optional :float, :k, 6, :default => 23
|
33
|
+
optional :float, :l, 7, :default => 23.42
|
34
|
+
end
|
35
|
+
EOS
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_create_message
|
39
|
+
assert_compile_proto(<<-EOS, 'test/proto/addressbook.proto')
|
40
|
+
### Generated by rprotoc. DO NOT EDIT!
|
41
|
+
### <proto file: test/proto/addressbook.proto>
|
42
|
+
# package tutorial;
|
43
|
+
#
|
44
|
+
# message Person {
|
45
|
+
# required string name = 1;
|
46
|
+
# required int32 id = 2;
|
47
|
+
# optional string email = 3;
|
48
|
+
#
|
49
|
+
# enum PhoneType {
|
50
|
+
# MOBILE = 0;
|
51
|
+
# HOME = 1;
|
52
|
+
# WORK = 2;
|
53
|
+
# }
|
54
|
+
#
|
55
|
+
# message PhoneNumber {
|
56
|
+
# required string number = 1;
|
57
|
+
# optional PhoneType type = 2 [default = HOME];
|
58
|
+
# }
|
59
|
+
#
|
60
|
+
# repeated PhoneNumber phone = 4;
|
61
|
+
# optional uint32 age = 5 [default = 20];
|
62
|
+
#
|
63
|
+
# extensions 100 to 200;
|
64
|
+
# }
|
65
|
+
#
|
66
|
+
# /*
|
67
|
+
# extend Person {
|
68
|
+
# optional int32 age = 100;
|
69
|
+
# }
|
70
|
+
# */
|
71
|
+
#
|
72
|
+
# message AddressBook {
|
73
|
+
# repeated Person person = 1;
|
74
|
+
# }
|
75
|
+
require 'protobuf/message/message'
|
76
|
+
require 'protobuf/message/enum'
|
77
|
+
require 'protobuf/message/extend'
|
78
|
+
|
79
|
+
module Tutorial
|
80
|
+
|
81
|
+
class Person < ::Protobuf::Message
|
82
|
+
defined_in __FILE__
|
83
|
+
required :string, :name, 1
|
84
|
+
required :int32, :id, 2
|
85
|
+
optional :string, :email, 3
|
86
|
+
|
87
|
+
class PhoneType < ::Protobuf::Enum
|
88
|
+
defined_in __FILE__
|
89
|
+
define :MOBILE, 0
|
90
|
+
define :HOME, 1
|
91
|
+
define :WORK, 2
|
92
|
+
end
|
93
|
+
|
94
|
+
class PhoneNumber < ::Protobuf::Message
|
95
|
+
defined_in __FILE__
|
96
|
+
required :string, :number, 1
|
97
|
+
optional :PhoneType, :type, 2, :default => :HOME
|
98
|
+
end
|
99
|
+
|
100
|
+
repeated :PhoneNumber, :phone, 4
|
101
|
+
optional :uint32, :age, 5, :default => 20
|
102
|
+
|
103
|
+
extensions 100..200
|
104
|
+
end
|
105
|
+
|
106
|
+
class AddressBook < ::Protobuf::Message
|
107
|
+
defined_in __FILE__
|
108
|
+
repeated :Person, :person, 1
|
109
|
+
end
|
110
|
+
end
|
111
|
+
EOS
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_create_nested_message
|
115
|
+
assert_compile_proto(<<-EOS, 'test/proto/nested.proto')
|
116
|
+
### Generated by rprotoc. DO NOT EDIT!
|
117
|
+
### <proto file: test/proto/nested.proto>
|
118
|
+
# package test.nested;
|
119
|
+
#
|
120
|
+
# message Foo {
|
121
|
+
# message Bar {
|
122
|
+
# }
|
123
|
+
# }
|
124
|
+
# message Baaz {
|
125
|
+
# optional Foo.Bar x = 1;
|
126
|
+
# }
|
127
|
+
|
128
|
+
require 'protobuf/message/message'
|
129
|
+
require 'protobuf/message/enum'
|
130
|
+
require 'protobuf/message/extend'
|
131
|
+
|
132
|
+
module Test
|
133
|
+
module Nested
|
134
|
+
class Foo < ::Protobuf::Message
|
135
|
+
defined_in __FILE__
|
136
|
+
class Bar < ::Protobuf::Message
|
137
|
+
defined_in __FILE__
|
138
|
+
end
|
139
|
+
end
|
140
|
+
class Baaz < ::Protobuf::Message
|
141
|
+
defined_in __FILE__
|
142
|
+
optional :'Foo::Bar', :x, 1
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
EOS
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_nested_message
|
150
|
+
file_contents = Protobuf::Compiler.new.create_message('test/proto/nested.proto', '.', '.', false)
|
151
|
+
assert_nothing_raised {Object.class_eval file_contents}
|
152
|
+
assert_raise(TypeError) {Test::Nested::Baaz.new.x = 1}
|
153
|
+
assert_nothing_raised {Test::Nested::Baaz.new.x = Test::Nested::Foo::Bar.new}
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_create_rpc
|
157
|
+
file_contents = Protobuf::Compiler.new.create_rpc('test/proto/rpc.proto', '.', 'test/proto', false)
|
158
|
+
|
159
|
+
assert_source(<<-EOS, file_contents['test/proto/address_book_service.rb'])
|
160
|
+
require 'protobuf/rpc/server'
|
161
|
+
require 'protobuf/rpc/handler'
|
162
|
+
require 'test/proto/rpc.pb'
|
163
|
+
|
164
|
+
class Tutorial::SearchHandler < Protobuf::Rpc::Handler
|
165
|
+
request Tutorial::Person
|
166
|
+
response Tutorial::AddressBook
|
167
|
+
|
168
|
+
def self.process_request(request, response)
|
169
|
+
# TODO: edit this method
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
class Tutorial::AddHandler < Protobuf::Rpc::Handler
|
174
|
+
request Tutorial::Person
|
175
|
+
response Tutorial::Person
|
176
|
+
|
177
|
+
def self.process_request(request, response)
|
178
|
+
# TODO: edit this method
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
class Tutorial::AddressBookService < Protobuf::Rpc::Server
|
183
|
+
def setup_handlers
|
184
|
+
@handlers = {
|
185
|
+
:search => Tutorial::SearchHandler,
|
186
|
+
:add => Tutorial::AddHandler,
|
187
|
+
}
|
188
|
+
end
|
189
|
+
end
|
190
|
+
EOS
|
191
|
+
|
192
|
+
assert_source(<<-EOS, file_contents['test/proto/start_address_book_service'])
|
193
|
+
#!/usr/bin/env ruby
|
194
|
+
require 'address_book_service'
|
195
|
+
|
196
|
+
Tutorial::AddressBookService.new(:Port => 9999).start
|
197
|
+
EOS
|
198
|
+
|
199
|
+
assert_source(<<-EOS, file_contents['test/proto/client_search.rb'])
|
200
|
+
#!/usr/bin/env ruby
|
201
|
+
require 'protobuf/rpc/client'
|
202
|
+
require 'test/proto/rpc.pb'
|
203
|
+
|
204
|
+
# build request
|
205
|
+
request = Tutorial::Person.new
|
206
|
+
# TODO: setup a request
|
207
|
+
raise StandardError, 'setup a request'
|
208
|
+
|
209
|
+
# create blunk response
|
210
|
+
response = Tutorial::AddressBook.new
|
211
|
+
|
212
|
+
# execute rpc
|
213
|
+
Protobuf::Rpc::Client.new('localhost', 9999).call :search, request, response
|
214
|
+
|
215
|
+
# show response
|
216
|
+
puts response
|
217
|
+
EOS
|
218
|
+
|
219
|
+
assert_source(<<-EOS, file_contents['test/proto/client_add.rb'])
|
220
|
+
#!/usr/bin/env ruby
|
221
|
+
require 'protobuf/rpc/client'
|
222
|
+
require 'test/proto/rpc.pb'
|
223
|
+
|
224
|
+
# build request
|
225
|
+
request = Tutorial::Person.new
|
226
|
+
# TODO: setup a request
|
227
|
+
raise StandardError, 'setup a request'
|
228
|
+
|
229
|
+
# create blunk response
|
230
|
+
response = Tutorial::Person.new
|
231
|
+
|
232
|
+
# execute rpc
|
233
|
+
Protobuf::Rpc::Client.new('localhost', 9999).call :add, request, response
|
234
|
+
|
235
|
+
# show response
|
236
|
+
puts response
|
237
|
+
EOS
|
238
|
+
end
|
239
|
+
|
240
|
+
def test_create_descriptor
|
241
|
+
proto_path = 'test/proto/addressbook.proto'
|
242
|
+
visitor = Protobuf::Visitor::CreateDescriptorVisitor.new(proto_path)
|
243
|
+
File.open(proto_path) do |file|
|
244
|
+
visitor.visit Protobuf::ProtoParser.new.parse(file)
|
245
|
+
end
|
246
|
+
file_descriptor = visitor.file_descriptor
|
247
|
+
assert_equal(proto_path, file_descriptor.name)
|
248
|
+
assert_equal('tutorial', file_descriptor.package)
|
249
|
+
|
250
|
+
person_descriptor = file_descriptor.message_type[0]
|
251
|
+
assert_equal('Person', person_descriptor.name)
|
252
|
+
assert_equal([:name, :id, :email, :phone, :age].size, person_descriptor.field.size)
|
253
|
+
|
254
|
+
name_field_descriptor = person_descriptor.field.find {|d| d.name == 'name'}
|
255
|
+
assert_equal(1, name_field_descriptor.number)
|
256
|
+
assert_equal(Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING, name_field_descriptor.type)
|
257
|
+
assert_equal(Google::Protobuf::FieldDescriptorProto::Label::LABEL_REQUIRED, name_field_descriptor.label)
|
258
|
+
assert_equal('string', name_field_descriptor.type_name)
|
259
|
+
|
260
|
+
phone_field_descriptor = person_descriptor.field.find {|d| d.name == 'phone'}
|
261
|
+
assert_equal(4, phone_field_descriptor.number)
|
262
|
+
assert_equal(0, phone_field_descriptor.type) #TODO: is this right?
|
263
|
+
assert_equal(Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED, phone_field_descriptor.label)
|
264
|
+
assert_equal('PhoneNumber', phone_field_descriptor.type_name)
|
265
|
+
|
266
|
+
age_field_descriptor = person_descriptor.field.find {|d| d.name == 'age'}
|
267
|
+
assert_equal(5, age_field_descriptor.number)
|
268
|
+
assert_equal(Google::Protobuf::FieldDescriptorProto::Type::TYPE_UINT32, age_field_descriptor.type)
|
269
|
+
assert_equal(Google::Protobuf::FieldDescriptorProto::Label::LABEL_OPTIONAL, age_field_descriptor.label)
|
270
|
+
assert_equal('uint32', age_field_descriptor.type_name)
|
271
|
+
assert_equal('20', age_field_descriptor.default_value)
|
272
|
+
|
273
|
+
phone_type_descriptor = person_descriptor.enum_type.first
|
274
|
+
assert_equal('PhoneType', phone_type_descriptor.name)
|
275
|
+
assert_equal(3, phone_type_descriptor.value.size)
|
276
|
+
|
277
|
+
phone_type_home_descriptor = phone_type_descriptor.value.find {|d| d.name == 'HOME'}
|
278
|
+
assert_equal('HOME', phone_type_home_descriptor.name)
|
279
|
+
assert_equal(1, phone_type_home_descriptor.number)
|
280
|
+
|
281
|
+
extensions_descriptor = person_descriptor.extension_range.first
|
282
|
+
assert_equal(100, extensions_descriptor.start)
|
283
|
+
assert_equal(200, extensions_descriptor.end)
|
284
|
+
|
285
|
+
phone_number_descriptor = person_descriptor.nested_type.first
|
286
|
+
assert_equal('PhoneNumber', phone_number_descriptor.name)
|
287
|
+
assert_equal([:number, :type].size, phone_number_descriptor.field.size)
|
288
|
+
|
289
|
+
#TODO: test extend
|
290
|
+
#extend_person_descriptor = ??
|
291
|
+
#assert_equal extend_person_descriptor
|
292
|
+
|
293
|
+
addressbook_descriptor = file_descriptor.message_type[1]
|
294
|
+
assert_equal('AddressBook', addressbook_descriptor.name)
|
295
|
+
end
|
296
|
+
|
297
|
+
def test_collision
|
298
|
+
assert_raise(Protobuf::TagCollisionError) do require 'test/proto/collision.pb' end
|
299
|
+
assert_raise(Protobuf::TagCollisionError) do
|
300
|
+
Protobuf::Compiler.new.create_message('test/proto/collision.proto', '.', '.', false)
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
def test_ext_collision
|
305
|
+
assert_raise(Protobuf::TagCollisionError) do require 'test/proto/ext_collision.pb' end
|
306
|
+
assert_raise(Protobuf::TagCollisionError) do
|
307
|
+
Protobuf::Compiler.new.create_message('test/proto/ext_collision.proto', '.', '.', false)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_ext_range
|
312
|
+
assert_raise(RangeError) do require 'test/proto/ext_range.pb' end
|
313
|
+
assert_raise(RangeError) do
|
314
|
+
Protobuf::Compiler.new.create_message('test/proto/ext_range.proto', '.', '.', false)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
def assert_compile_proto(ideal, filename)
|
319
|
+
assert_equal(ideal.gsub(/^\s*\n/, '').strip, Protobuf::Compiler.new.create_message(filename, '.', '.', false).gsub(/^\s*\n/, '').strip)
|
320
|
+
end
|
321
|
+
|
322
|
+
def assert_source(ideal, real)
|
323
|
+
assert_equal(ideal.strip.gsub(/^\s*\n/, '').gsub(/\s+\n/, "\n"), real.strip.gsub(/^\s*\n/, '').gsub(/\s+\n/, "\n"))
|
324
|
+
end
|
325
|
+
end
|