macks-ruby_protobuf 0.3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|