protobuf 2.8.13 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +84 -5
  3. data/CONTRIBUTING.md +3 -3
  4. data/Rakefile +46 -7
  5. data/lib/protobuf/cli.rb +2 -20
  6. data/lib/protobuf/decoder.rb +74 -0
  7. data/lib/protobuf/deprecator.rb +42 -0
  8. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +17 -16
  9. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +86 -85
  10. data/lib/protobuf/encoder.rb +62 -0
  11. data/lib/protobuf/enum.rb +298 -37
  12. data/lib/protobuf/field/base_field.rb +41 -27
  13. data/lib/protobuf/field/bool_field.rb +22 -4
  14. data/lib/protobuf/field/bytes_field.rb +36 -15
  15. data/lib/protobuf/field/double_field.rb +10 -3
  16. data/lib/protobuf/field/enum_field.rb +21 -18
  17. data/lib/protobuf/field/field_array.rb +26 -16
  18. data/lib/protobuf/field/fixed32_field.rb +10 -4
  19. data/lib/protobuf/field/fixed64_field.rb +10 -3
  20. data/lib/protobuf/field/float_field.rb +18 -5
  21. data/lib/protobuf/field/int32_field.rb +14 -4
  22. data/lib/protobuf/field/int64_field.rb +14 -4
  23. data/lib/protobuf/field/integer_field.rb +9 -4
  24. data/lib/protobuf/field/message_field.rb +16 -7
  25. data/lib/protobuf/field/sfixed32_field.rb +10 -3
  26. data/lib/protobuf/field/sfixed64_field.rb +12 -7
  27. data/lib/protobuf/field/signed_integer_field.rb +7 -0
  28. data/lib/protobuf/field/sint32_field.rb +14 -4
  29. data/lib/protobuf/field/sint64_field.rb +14 -4
  30. data/lib/protobuf/field/string_field.rb +11 -1
  31. data/lib/protobuf/field/uint32_field.rb +14 -4
  32. data/lib/protobuf/field/uint64_field.rb +14 -4
  33. data/lib/protobuf/field/varint_field.rb +11 -9
  34. data/lib/protobuf/field.rb +42 -25
  35. data/lib/protobuf/generators/enum_generator.rb +12 -1
  36. data/lib/protobuf/generators/field_generator.rb +1 -1
  37. data/lib/protobuf/lifecycle.rb +3 -4
  38. data/lib/protobuf/message/fields.rb +122 -0
  39. data/lib/protobuf/message/serialization.rb +84 -0
  40. data/lib/protobuf/message.rb +21 -221
  41. data/lib/protobuf/optionable.rb +23 -0
  42. data/lib/protobuf/rpc/client.rb +2 -4
  43. data/lib/protobuf/rpc/connector.rb +0 -2
  44. data/lib/protobuf/rpc/connectors/common.rb +2 -2
  45. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +14 -16
  46. data/lib/protobuf/rpc/env.rb +58 -0
  47. data/lib/protobuf/rpc/error.rb +8 -5
  48. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  49. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  50. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  51. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  52. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  53. data/lib/protobuf/rpc/middleware.rb +25 -0
  54. data/lib/protobuf/rpc/rpc.pb.rb +15 -16
  55. data/lib/protobuf/rpc/server.rb +14 -64
  56. data/lib/protobuf/rpc/servers/socket/server.rb +0 -2
  57. data/lib/protobuf/rpc/servers/socket/worker.rb +11 -15
  58. data/lib/protobuf/rpc/servers/zmq/util.rb +4 -1
  59. data/lib/protobuf/rpc/servers/zmq/worker.rb +5 -13
  60. data/lib/protobuf/rpc/servers/zmq_runner.rb +1 -1
  61. data/lib/protobuf/rpc/service.rb +38 -72
  62. data/lib/protobuf/rpc/service_dispatcher.rb +20 -108
  63. data/lib/protobuf/version.rb +1 -2
  64. data/lib/protobuf.rb +5 -13
  65. data/protobuf.gemspec +5 -5
  66. data/spec/benchmark/tasks.rb +2 -77
  67. data/spec/functional/zmq_server_spec.rb +13 -21
  68. data/spec/lib/protobuf/cli_spec.rb +5 -43
  69. data/spec/lib/protobuf/enum_spec.rb +194 -61
  70. data/spec/lib/protobuf/field_spec.rb +194 -0
  71. data/spec/lib/protobuf/generators/enum_generator_spec.rb +24 -1
  72. data/spec/lib/protobuf/generators/field_generator_spec.rb +6 -6
  73. data/spec/lib/protobuf/message_spec.rb +52 -70
  74. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  75. data/spec/lib/protobuf/rpc/client_spec.rb +1 -93
  76. data/spec/lib/protobuf/rpc/connector_spec.rb +1 -7
  77. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +8 -0
  78. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  79. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  80. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  81. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  82. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +0 -6
  83. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +10 -0
  84. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +30 -105
  85. data/spec/lib/protobuf/rpc/service_filters_spec.rb +4 -4
  86. data/spec/lib/protobuf/rpc/service_spec.rb +20 -24
  87. data/spec/lib/protobuf_spec.rb +3 -3
  88. data/spec/spec_helper.rb +5 -4
  89. data/spec/support/packed_field.rb +15 -14
  90. data/spec/support/server.rb +4 -21
  91. data/spec/support/test/defaults.pb.rb +4 -4
  92. data/spec/support/test/enum.pb.rb +13 -1
  93. data/spec/support/test/enum.proto +15 -0
  94. data/spec/support/test/extended.pb.rb +1 -1
  95. data/spec/support/test/google_unittest.pb.rb +239 -241
  96. data/spec/support/test/google_unittest_import.pb.rb +2 -2
  97. data/spec/support/test/multi_field_extensions.pb.rb +2 -2
  98. data/spec/support/test/resource.pb.rb +19 -18
  99. data/spec/support/test/resource.proto +1 -0
  100. data/spec/support/test/resource_service.rb +5 -0
  101. metadata +78 -57
  102. data/bin/rprotoc +0 -8
  103. data/lib/protobuf/enum_value.rb +0 -85
  104. data/lib/protobuf/evented.rb +0 -37
  105. data/lib/protobuf/ext/eventmachine.rb +0 -14
  106. data/lib/protobuf/field/extension_fields.rb +0 -32
  107. data/lib/protobuf/message/decoder.rb +0 -72
  108. data/lib/protobuf/message/message.rb +0 -1
  109. data/lib/protobuf/rpc/connectors/em_client.rb +0 -84
  110. data/lib/protobuf/rpc/connectors/eventmachine.rb +0 -87
  111. data/lib/protobuf/rpc/servers/evented/server.rb +0 -36
  112. data/lib/protobuf/rpc/servers/evented_runner.rb +0 -31
  113. data/spec/functional/embedded_service_spec.rb +0 -7
  114. data/spec/functional/evented_server_spec.rb +0 -64
  115. data/spec/lib/protobuf/enum_value_spec.rb +0 -29
  116. data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +0 -19
@@ -0,0 +1,194 @@
1
+ require 'spec_helper'
2
+ require 'protobuf/field'
3
+
4
+ describe ::Protobuf::Field do
5
+
6
+ describe '.build' do
7
+ pending
8
+ end
9
+
10
+ describe '.field_class' do
11
+ context 'when type is an enum class' do
12
+ it 'returns an enum field' do
13
+ expect(subject.field_class(::Test::EnumTestType)).to eq(::Protobuf::Field::EnumField)
14
+ expect(subject.field_type(::Test::EnumTestType)).to eq(::Test::EnumTestType)
15
+ end
16
+ end
17
+
18
+ context 'when type is a message class' do
19
+ it 'returns a message field' do
20
+ expect(subject.field_class(::Test::Resource)).to eq(::Protobuf::Field::MessageField)
21
+ expect(subject.field_type(::Test::Resource)).to eq(::Test::Resource)
22
+ end
23
+ end
24
+
25
+ context 'when type is a base field class' do
26
+ it 'returns that class' do
27
+ expect(subject.field_class(::Protobuf::Field::BoolField)).to eq(::Protobuf::Field::BoolField)
28
+ end
29
+ end
30
+
31
+ context 'when type is a double field class or symbol' do
32
+ it 'returns that class' do
33
+ expected_field = ::Protobuf::Field::DoubleField
34
+ expect(subject.field_class(expected_field)).to eq(expected_field)
35
+ expect(subject.field_class(:double)).to eq(expected_field)
36
+ expect(subject.field_type(expected_field)).to eq(expected_field)
37
+ expect(subject.field_type(:double)).to eq(expected_field)
38
+ end
39
+ end
40
+
41
+ context 'when type is a float field class or symbol' do
42
+ it 'returns that class' do
43
+ expected_field = ::Protobuf::Field::FloatField
44
+ expect(subject.field_class(expected_field)).to eq(expected_field)
45
+ expect(subject.field_class(:float)).to eq(expected_field)
46
+ expect(subject.field_type(expected_field)).to eq(expected_field)
47
+ expect(subject.field_type(:float)).to eq(expected_field)
48
+ end
49
+ end
50
+
51
+ context 'when type is a int32 field class or symbol' do
52
+ it 'returns that class' do
53
+ expected_field = ::Protobuf::Field::Int32Field
54
+ expect(subject.field_class(expected_field)).to eq(expected_field)
55
+ expect(subject.field_class(:int32)).to eq(expected_field)
56
+ expect(subject.field_type(expected_field)).to eq(expected_field)
57
+ expect(subject.field_type(:int32)).to eq(expected_field)
58
+ end
59
+ end
60
+
61
+ context 'when type is a int64 field class or symbol' do
62
+ it 'returns that class' do
63
+ expected_field = ::Protobuf::Field::Int64Field
64
+ expect(subject.field_class(expected_field)).to eq(expected_field)
65
+ expect(subject.field_class(:int64)).to eq(expected_field)
66
+ expect(subject.field_type(expected_field)).to eq(expected_field)
67
+ expect(subject.field_type(:int64)).to eq(expected_field)
68
+ end
69
+ end
70
+
71
+ context 'when type is a uint32 field class or symbol' do
72
+ it 'returns that class' do
73
+ expected_field = ::Protobuf::Field::Uint32Field
74
+ expect(subject.field_class(expected_field)).to eq(expected_field)
75
+ expect(subject.field_class(:uint32)).to eq(expected_field)
76
+ expect(subject.field_type(expected_field)).to eq(expected_field)
77
+ expect(subject.field_type(:uint32)).to eq(expected_field)
78
+ end
79
+ end
80
+
81
+ context 'when type is a uint64 field class or symbol' do
82
+ it 'returns that class' do
83
+ expected_field = ::Protobuf::Field::Uint64Field
84
+ expect(subject.field_class(expected_field)).to eq(expected_field)
85
+ expect(subject.field_class(:uint64)).to eq(expected_field)
86
+ expect(subject.field_type(expected_field)).to eq(expected_field)
87
+ expect(subject.field_type(:uint64)).to eq(expected_field)
88
+ end
89
+ end
90
+
91
+ context 'when type is a sint32 field class or symbol' do
92
+ it 'returns that class' do
93
+ expected_field = ::Protobuf::Field::Sint32Field
94
+ expect(subject.field_class(expected_field)).to eq(expected_field)
95
+ expect(subject.field_class(:sint32)).to eq(expected_field)
96
+ expect(subject.field_type(expected_field)).to eq(expected_field)
97
+ expect(subject.field_type(:sint32)).to eq(expected_field)
98
+ end
99
+ end
100
+
101
+ context 'when type is a sint64 field class or symbol' do
102
+ it 'returns that class' do
103
+ expected_field = ::Protobuf::Field::Sint64Field
104
+ expect(subject.field_class(expected_field)).to eq(expected_field)
105
+ expect(subject.field_class(:sint64)).to eq(expected_field)
106
+ expect(subject.field_type(expected_field)).to eq(expected_field)
107
+ expect(subject.field_type(:sint64)).to eq(expected_field)
108
+ end
109
+ end
110
+
111
+ context 'when type is a fixed32 field class or symbol' do
112
+ it 'returns that class' do
113
+ expected_field = ::Protobuf::Field::Fixed32Field
114
+ expect(subject.field_class(expected_field)).to eq(expected_field)
115
+ expect(subject.field_class(:fixed32)).to eq(expected_field)
116
+ expect(subject.field_type(expected_field)).to eq(expected_field)
117
+ expect(subject.field_type(:fixed32)).to eq(expected_field)
118
+ end
119
+ end
120
+
121
+ context 'when type is a fixed64 field class or symbol' do
122
+ it 'returns that class' do
123
+ expected_field = ::Protobuf::Field::Fixed64Field
124
+ expect(subject.field_class(expected_field)).to eq(expected_field)
125
+ expect(subject.field_class(:fixed64)).to eq(expected_field)
126
+ expect(subject.field_type(expected_field)).to eq(expected_field)
127
+ expect(subject.field_type(:fixed64)).to eq(expected_field)
128
+ end
129
+ end
130
+
131
+ context 'when type is a sfixed32 field class or symbol' do
132
+ it 'returns that class' do
133
+ expected_field = ::Protobuf::Field::Sfixed32Field
134
+ expect(subject.field_class(expected_field)).to eq(expected_field)
135
+ expect(subject.field_class(:sfixed32)).to eq(expected_field)
136
+ expect(subject.field_type(expected_field)).to eq(expected_field)
137
+ expect(subject.field_type(:sfixed32)).to eq(expected_field)
138
+ end
139
+ end
140
+
141
+ context 'when type is a sfixed64 field class or symbol' do
142
+ it 'returns that class' do
143
+ expected_field = ::Protobuf::Field::Sfixed64Field
144
+ expect(subject.field_class(expected_field)).to eq(expected_field)
145
+ expect(subject.field_class(:sfixed64)).to eq(expected_field)
146
+ expect(subject.field_type(expected_field)).to eq(expected_field)
147
+ expect(subject.field_type(:sfixed64)).to eq(expected_field)
148
+ end
149
+ end
150
+
151
+
152
+ context 'when type is a string field class or symbol' do
153
+ it 'returns that class' do
154
+ expected_field = ::Protobuf::Field::StringField
155
+ expect(subject.field_class(expected_field)).to eq(expected_field)
156
+ expect(subject.field_class(:string)).to eq(expected_field)
157
+ expect(subject.field_type(expected_field)).to eq(expected_field)
158
+ expect(subject.field_type(:string)).to eq(expected_field)
159
+ end
160
+ end
161
+
162
+
163
+ context 'when type is a bytes field class or symbol' do
164
+ it 'returns that class' do
165
+ expected_field = ::Protobuf::Field::BytesField
166
+ expect(subject.field_class(expected_field)).to eq(expected_field)
167
+ expect(subject.field_class(:bytes)).to eq(expected_field)
168
+ expect(subject.field_type(expected_field)).to eq(expected_field)
169
+ expect(subject.field_type(:bytes)).to eq(expected_field)
170
+ end
171
+ end
172
+
173
+
174
+ context 'when type is a bool field class or symbol' do
175
+ it 'returns that class' do
176
+ expected_field = ::Protobuf::Field::BoolField
177
+ expect(subject.field_class(expected_field)).to eq(expected_field)
178
+ expect(subject.field_class(:bool)).to eq(expected_field)
179
+ expect(subject.field_type(expected_field)).to eq(expected_field)
180
+ expect(subject.field_type(:bool)).to eq(expected_field)
181
+ end
182
+ end
183
+
184
+ context 'when type is not mapped' do
185
+ it 'raises an ArgumentError' do
186
+ expect {
187
+ subject.field_class("boom")
188
+ }.to raise_error
189
+ end
190
+ end
191
+
192
+ end
193
+
194
+ end
@@ -11,8 +11,10 @@ describe ::Protobuf::Generators::EnumGenerator do
11
11
  { :name => 'BAZ', :number => 3 }
12
12
  ]
13
13
  }
14
+ let(:options) { nil }
14
15
  let(:enum_fields) { { :name => 'TestEnum',
15
- :value => values } }
16
+ :value => values,
17
+ :options => options } }
16
18
 
17
19
  let(:enum) { ::Google::Protobuf::EnumDescriptorProto.new(enum_fields) }
18
20
 
@@ -33,6 +35,27 @@ end
33
35
  subject.compile
34
36
  subject.to_s.should eq(compiled)
35
37
  end
38
+
39
+ context 'when allow_alias option is set' do
40
+ let(:compiled) {
41
+ %q{class TestEnum < ::Protobuf::Enum
42
+ set_option :allow_alias
43
+
44
+ define :FOO, 1
45
+ define :BAR, 2
46
+ define :BAZ, 3
47
+ end
48
+
49
+ }
50
+ }
51
+
52
+ let(:options) { { :allow_alias => true } }
53
+
54
+ it 'sets the allow_alias option' do
55
+ subject.compile
56
+ subject.to_s.should eq(compiled)
57
+ end
58
+ end
36
59
  end
37
60
 
38
61
  describe '#build_value' do
@@ -27,7 +27,7 @@ describe ::Protobuf::Generators::FieldGenerator do
27
27
  describe '#compile' do
28
28
  subject { described_class.new(field).to_s }
29
29
 
30
- it { should eq "optional ::Protobuf::Field::StringField, :foo_bar, 3\n" }
30
+ it { should eq "optional :string, :foo_bar, 3\n" }
31
31
 
32
32
  context 'when the type is another message' do
33
33
  let(:type_enum) { :TYPE_MESSAGE }
@@ -39,7 +39,7 @@ describe ::Protobuf::Generators::FieldGenerator do
39
39
  context 'when a default value is used' do
40
40
  let(:type_enum) { :TYPE_INT32 }
41
41
  let(:default_value) { '42' }
42
- it { should eq "optional ::Protobuf::Field::Int32Field, :foo_bar, 3, :default => 42\n" }
42
+ it { should eq "optional :int32, :foo_bar, 3, :default => 42\n" }
43
43
 
44
44
  context 'when type is an enum' do
45
45
  let(:type_enum) { :TYPE_ENUM }
@@ -53,7 +53,7 @@ describe ::Protobuf::Generators::FieldGenerator do
53
53
  let(:type_enum) { :TYPE_STRING }
54
54
  let(:default_value) { "a default \"string\"" }
55
55
 
56
- it { should eq %Q{optional ::Protobuf::Field::StringField, :foo_bar, 3, :default => "a default \"string\""\n} }
56
+ it { should eq %Q{optional :string, :foo_bar, 3, :default => "a default \"string\""\n} }
57
57
  end
58
58
 
59
59
  context 'when float or double field type' do
@@ -79,19 +79,19 @@ describe ::Protobuf::Generators::FieldGenerator do
79
79
  context 'when the field is an extension' do
80
80
  let(:extendee) { 'foo.bar.Baz' }
81
81
 
82
- it { should eq "optional ::Protobuf::Field::StringField, :foo_bar, 3, :extension => true\n" }
82
+ it { should eq "optional :string, :foo_bar, 3, :extension => true\n" }
83
83
  end
84
84
 
85
85
  context 'when field is packed' do
86
86
  let(:field_options) { { :packed => true } }
87
87
 
88
- it { should eq "optional ::Protobuf::Field::StringField, :foo_bar, 3, :packed => true\n" }
88
+ it { should eq "optional :string, :foo_bar, 3, :packed => true\n" }
89
89
  end
90
90
 
91
91
  context 'when field is deprecated' do
92
92
  let(:field_options) { { :deprecated => true } }
93
93
 
94
- it { should eq "optional ::Protobuf::Field::StringField, :foo_bar, 3, :deprecated => true\n" }
94
+ it { should eq "optional :string, :foo_bar, 3, :deprecated => true\n" }
95
95
  end
96
96
  end
97
97
 
@@ -10,13 +10,13 @@ describe Protobuf::Message do
10
10
  end
11
11
  end
12
12
 
13
- describe '.define_field' do
13
+ describe 'defining a new field' do
14
14
  context 'when defining a field with a tag that has already been used' do
15
15
  it 'raises a TagCollisionError' do
16
16
  expect {
17
17
  Class.new(Protobuf::Message) do
18
- define_field :optional, ::Protobuf::Field::Int32Field, :foo, 1, {}
19
- define_field :optional, ::Protobuf::Field::Int32Field, :bar, 1, {}
18
+ optional ::Protobuf::Field::Int32Field, :foo, 1
19
+ optional ::Protobuf::Field::Int32Field, :bar, 1
20
20
  end
21
21
  }.to raise_error(Protobuf::TagCollisionError, /Field number 1 has already been used/)
22
22
  end
@@ -27,8 +27,8 @@ describe Protobuf::Message do
27
27
  expect {
28
28
  Class.new(Protobuf::Message) do
29
29
  extensions 100...110
30
- define_field :optional, ::Protobuf::Field::Int32Field, :foo, 100, {}
31
- define_field :optional, ::Protobuf::Field::Int32Field, :bar, 100, :extension => true
30
+ optional ::Protobuf::Field::Int32Field, :foo, 100
31
+ optional ::Protobuf::Field::Int32Field, :bar, 100, :extension => true
32
32
  end
33
33
  }.to raise_error(Protobuf::TagCollisionError, /Field number 100 has already been used/)
34
34
  end
@@ -38,8 +38,8 @@ describe Protobuf::Message do
38
38
  it 'raises a DuplicateFieldNameError' do
39
39
  expect {
40
40
  Class.new(Protobuf::Message) do
41
- define_field :optional, ::Protobuf::Field::Int32Field, :foo, 1, {}
42
- define_field :optional, ::Protobuf::Field::Int32Field, :foo, 2, {}
41
+ optional ::Protobuf::Field::Int32Field, :foo, 1
42
+ optional ::Protobuf::Field::Int32Field, :foo, 2
43
43
  end
44
44
  }.to raise_error(Protobuf::DuplicateFieldNameError, /Field name foo has already been used/)
45
45
  end
@@ -50,8 +50,8 @@ describe Protobuf::Message do
50
50
  expect {
51
51
  Class.new(Protobuf::Message) do
52
52
  extensions 100...110
53
- define_field :optional, ::Protobuf::Field::Int32Field, :foo, 1, {}
54
- define_field :optional, ::Protobuf::Field::Int32Field, :foo, 100, :extension => true
53
+ optional ::Protobuf::Field::Int32Field, :foo, 1
54
+ optional ::Protobuf::Field::Int32Field, :foo, 100, :extension => true
55
55
  end
56
56
  }.to raise_error(Protobuf::DuplicateFieldNameError, /Field name foo has already been used/)
57
57
  end
@@ -289,44 +289,9 @@ describe Protobuf::Message do
289
289
  its(:to_json) { should eq '{"name":"Test Name","active":false}' }
290
290
  end
291
291
 
292
- describe '.to_json' do
293
- it 'returns the class name of the message for use in json encoding' do
294
- expect {
295
- ::Timeout.timeout(0.1) do
296
- expect(::Test::Resource.to_json).to eq("Test::Resource")
297
- end
298
- }.not_to raise_error
299
- end
300
- end
301
-
302
- describe '#get_field_by_name' do
303
- subject do
304
- ::Test::Resource.new({ :name => 'Test Name', :date_created => Time.now.to_i })
305
- end
306
-
307
- context 'when name is a valid field' do
308
- let(:valid_field) { subject.get_field_by_name(:name) }
309
- specify { valid_field.should be_a ::Protobuf::Field::StringField }
310
- specify { valid_field.name.should eq :name }
311
- end
312
-
313
- context 'when name is not a valid field' do
314
- specify do
315
- subject.get_field_by_name(1).should be_nil
316
- end
317
-
318
- specify do
319
- subject.get_field_by_name(:nothere).should be_nil
320
- end
321
-
322
- specify do
323
- subject.get_field_by_name(nil).should be_nil
324
- end
325
- end
326
- end
327
-
328
292
  describe "#define_setter" do
329
293
  subject { ::Test::Resource.new }
294
+
330
295
  it "allows string fields to be set to nil" do
331
296
  expect { subject.name = nil }.to_not raise_error
332
297
  end
@@ -336,40 +301,57 @@ describe Protobuf::Message do
336
301
  end
337
302
  end
338
303
 
339
- describe '#get_ext_field_by_name' do
340
- pending 'Need to get a proto compiled with extensions first'
304
+ describe '.get_extension_field' do
305
+ it 'fetches an extension field by its tag' do
306
+ field = ::Test::Resource.get_extension_field(100)
307
+ expect(field).to be_a(::Protobuf::Field::BoolField)
308
+ expect(field.tag).to eq(100)
309
+ expect(field.name).to eq(:ext_is_searchable)
310
+ expect(field).to be_extension
311
+ end
312
+
313
+ it 'fetches an extension field by its symbolized name' do
314
+ expect(::Test::Resource.get_extension_field(:ext_is_searchable)).to be_a(::Protobuf::Field::BoolField)
315
+ expect(::Test::Resource.get_extension_field('ext_is_searchable')).to be_a(::Protobuf::Field::BoolField)
316
+ end
317
+
318
+ it 'returns nil when attempting to get a non-extension field' do
319
+ expect(::Test::Resource.get_extension_field(1)).to be_nil
320
+ end
321
+
322
+ it 'returns nil when field is not found' do
323
+ ::Test::Resource.get_extension_field(-1).should be_nil
324
+ ::Test::Resource.get_extension_field(nil).should be_nil
325
+ end
341
326
  end
342
327
 
343
- describe '#get_field_by_tag' do
344
- subject do
345
- ::Test::Resource.new({ :name => 'Test Name', :date_created => Time.now.to_i })
328
+ describe '.get_field' do
329
+ it 'fetches a non-extension field by its tag' do
330
+ field = ::Test::Resource.get_field(1)
331
+ expect(field).to be_a(::Protobuf::Field::StringField)
332
+ expect(field.tag).to eq(1)
333
+ expect(field.name).to eq(:name)
334
+ expect(field).not_to be_extension
346
335
  end
347
336
 
348
- context 'when tag references a valid field' do
349
- let(:valid_field) { subject.get_field_by_tag(1) }
350
- specify { valid_field.should be_a ::Protobuf::Field::StringField }
351
- specify { valid_field.name.should eq :name }
337
+ it 'fetches a non-extension field by its symbolized name' do
338
+ expect(::Test::Resource.get_field(:name)).to be_a(::Protobuf::Field::StringField)
339
+ expect(::Test::Resource.get_field('name')).to be_a(::Protobuf::Field::StringField)
352
340
  end
353
341
 
354
- context 'when tag does not reference a field' do
355
- it 'returns nil' do
356
- pending 'need to implement a range-limiting array sub-class for field access'
357
- subject.get_field_by_tag(-1).should be_nil
358
- end
342
+ it 'fetches an extension field when forced' do
343
+ expect(::Test::Resource.get_field(100, true)).to be_a(::Protobuf::Field::BoolField)
344
+ expect(::Test::Resource.get_field(:ext_is_searchable, true)).to be_a(::Protobuf::Field::BoolField)
345
+ expect(::Test::Resource.get_field('ext_is_searchable', true)).to be_a(::Protobuf::Field::BoolField)
359
346
  end
360
347
 
361
- context 'when tag is not numeric' do
362
- specify do
363
- expect {
364
- subject.get_field_by_tag("not a number")
365
- }.to raise_error(::Protobuf::FieldNotDefinedError, /.*not a number.*#{subject.class.name}/)
366
- end
348
+ it 'returns nil when attempting to get an extension field' do
349
+ expect(::Test::Resource.get_field(100)).to be_nil
350
+ end
367
351
 
368
- specify do
369
- expect {
370
- subject.get_field_by_tag(nil)
371
- }.to raise_error(::Protobuf::FieldNotDefinedError, /.*nil.*#{subject.class.name}/)
372
- end
352
+ it 'returns nil when field is not defined' do
353
+ ::Test::Resource.get_field(-1).should be_nil
354
+ ::Test::Resource.get_field(nil).should be_nil
373
355
  end
374
356
  end
375
357
 
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require 'protobuf/optionable'
3
+
4
+ describe 'Optionable' do
5
+
6
+ describe '.set_option' do
7
+ before(:all) do
8
+ OptionableSetOptionTest = ::Class.new do
9
+ include ::Protobuf::Optionable
10
+ end
11
+ end
12
+
13
+ it 'stores the given option and value' do
14
+ expect(OptionableSetOptionTest).to respond_to(:set_option)
15
+ expect(OptionableSetOptionTest.method(:set_option).arity).to eq(-2)
16
+ expect {
17
+ OptionableSetOptionTest.set_option(:foo, :bar)
18
+ }.to_not raise_error
19
+ end
20
+
21
+ it 'defaults the value to true' do
22
+ OptionableSetOptionTest.set_option(:baz_enabled)
23
+ expect(OptionableSetOptionTest.get_option(:baz_enabled)).to be_true
24
+ end
25
+ end
26
+
27
+ describe '.get_option' do
28
+ before(:all) do
29
+ OptionableGetOptionTest = ::Class.new do
30
+ include ::Protobuf::Optionable
31
+ set_option :foo, :bar
32
+ end
33
+ end
34
+
35
+ it 'retrieves the option for the given name, if any' do
36
+ expect(OptionableGetOptionTest.get_option(:foo)).to eq(:bar)
37
+ expect(OptionableGetOptionTest.get_option(:baz)).to be_nil
38
+ end
39
+
40
+ it 'retrieves the option in the context of an instance' do
41
+ expect(OptionableGetOptionTest.new.get_option(:foo)).to eq(:bar)
42
+ expect(OptionableGetOptionTest.new.get_option(:baz)).to be_nil
43
+ end
44
+ end
45
+
46
+ end
@@ -3,99 +3,7 @@ require 'spec/support/test/resource_service'
3
3
 
4
4
  describe Protobuf::Rpc::Client do
5
5
  before(:each) do
6
- load 'protobuf/evented.rb'
7
- end
8
-
9
- context "when using fiber based calls", :skip => true do
10
- it "waits for response" do
11
- EventMachine.fiber_run do
12
- StubServer.new(:delay => 1) do |server|
13
- client = Test::ResourceService.client
14
- start = now
15
-
16
- client.find(:name => "Test Name", :active => true) do |c|
17
- c.on_success do |succ|
18
- succ.name.should eq("Test Name")
19
- succ.status.should eq(Test::StatusType::ENABLED)
20
- end
21
-
22
- c.on_failure do |err|
23
- raise err.inspect
24
- end
25
- end
26
-
27
- (now - start).should be_within(server.options.delay * 0.10).of(server.options.delay)
28
- end
29
-
30
- EM.stop
31
- end
32
- end
33
-
34
- it "throws and error when call is attempted without 'EventMachine.fiber_run'" do
35
- subject = Proc.new do
36
- EventMachine.run do
37
- StubServer.new(:delay => 1) do |server|
38
- client = Test::ResourceService.client
39
- client.find(:name => "Test Name", :active => true)
40
- end
41
- end
42
- end
43
-
44
- subject.should raise_error(RuntimeError, /EM.fiber_run/)
45
- end
46
-
47
- it "throws a timeout when client timeout is exceeded" do
48
- error = nil
49
- test_proc = Proc.new do
50
- EventMachine.fiber_run do
51
- StubServer.new(:delay => 2) do |server|
52
- client = Test::ResourceService.client(:timeout => 1)
53
- client.find(:name => "Test Name", :active => true) do |cl|
54
- cl.on_success {}
55
- cl.on_failure {|f| error = f}
56
- end
57
- end
58
- EM.stop
59
- end
60
- end
61
-
62
- test_proc.call
63
- error.message.should =~ /timeout/i
64
- end
65
-
66
- context "without reactor_running?" do
67
-
68
- it "throws a timeout when client timeout is exceeded" do
69
- subject = Proc.new do
70
- StubServer.new(:delay => 2) do |server|
71
- client = Test::ResourceService.client(:timeout => 1)
72
- client.find(:name => "Test Name", :active => true)
73
- end
74
- end
75
-
76
- subject.should raise_error(RuntimeError, /timeout/i)
77
- end
78
-
79
- it "calls failure_cb & throws a timeout when client timeout is exceeded" do
80
- failure_message = nil
81
-
82
- subject = Proc.new do
83
- StubServer.new(:delay => 2) do |server|
84
- client = Test::ResourceService.client(:timeout => 1)
85
- client.find(:name => "Test Name", :active => true) do |c|
86
- c.on_failure do |f|
87
- failure_message = f.message
88
- end
89
- end
90
- end
91
- end
92
-
93
- subject.call
94
- failure_message.should match(/timeout/)
95
- end
96
-
97
- end
98
-
6
+ load 'protobuf/socket.rb'
99
7
  end
100
8
 
101
9
  context 'when creating a client from a service' do
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
  require 'protobuf/socket'
3
- require 'protobuf/evented'
4
3
  require 'protobuf/zmq'
5
4
 
6
5
  describe ::Protobuf::Rpc::Connector do
@@ -14,15 +13,10 @@ describe ::Protobuf::Rpc::Connector do
14
13
  end
15
14
 
16
15
  context 'Protobuf.connector_type is not a known value' do
17
- before { ::Protobuf.connector_type = :socket }
16
+ before { ::Protobuf.stub(:connector_type) { :foo } }
18
17
  it { should eq ::Protobuf::Rpc::Connectors::Socket }
19
18
  end
20
19
 
21
- context 'Protobuf.connector_type is evented' do
22
- before { ::Protobuf.connector_type = :evented }
23
- it { should eq ::Protobuf::Rpc::Connectors::EventMachine }
24
- end
25
-
26
20
  context 'Protobuf.connector_type is zmq' do
27
21
  before { ::Protobuf.connector_type = :zmq }
28
22
  it { should eq ::Protobuf::Rpc::Connectors::Zmq }
@@ -28,6 +28,14 @@ describe ::Protobuf::Rpc::Connectors::Zmq do
28
28
  ::ZMQ::Context.stub(:new).and_return(zmq_context_double)
29
29
  end
30
30
 
31
+ before(:all) do
32
+ @ping_port_before = ENV['PB_RPC_PING_PORT']
33
+ end
34
+
35
+ after(:all) do
36
+ ENV['PB_RPC_PING_PORT'] = @ping_port_before
37
+ end
38
+
31
39
  describe "#lookup_server_uri" do
32
40
  let(:service_directory) { double('ServiceDirectory', :running? => running? ) }
33
41
  let(:listing) { double('Listing', :address => '127.0.0.2', :port => 9399) }