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