protobuffy 3.6.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +67 -0
  4. data/.rubocop_todo.yml +145 -0
  5. data/.travis.yml +25 -5
  6. data/CHANGES.md +55 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.txt +17 -9
  9. data/README.md +13 -12
  10. data/Rakefile +15 -11
  11. data/bin/protoc-gen-ruby +8 -3
  12. data/bin/rpc_server +1 -0
  13. data/examples/lib/example/reverse-client.rb +2 -2
  14. data/install-protobuf.sh +28 -0
  15. data/lib/protobuf.rb +57 -53
  16. data/lib/protobuf/cli.rb +94 -74
  17. data/lib/protobuf/code_generator.rb +60 -9
  18. data/lib/protobuf/decoder.rb +19 -65
  19. data/lib/protobuf/deprecation.rb +117 -0
  20. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
  21. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
  22. data/lib/protobuf/encoder.rb +13 -53
  23. data/lib/protobuf/enum.rb +58 -63
  24. data/lib/protobuf/field.rb +4 -4
  25. data/lib/protobuf/field/base_field.rb +101 -173
  26. data/lib/protobuf/field/bool_field.rb +17 -11
  27. data/lib/protobuf/field/bytes_field.rb +21 -35
  28. data/lib/protobuf/field/double_field.rb +0 -1
  29. data/lib/protobuf/field/enum_field.rb +23 -22
  30. data/lib/protobuf/field/field_array.rb +5 -4
  31. data/lib/protobuf/field/fixed32_field.rb +1 -1
  32. data/lib/protobuf/field/fixed64_field.rb +0 -1
  33. data/lib/protobuf/field/float_field.rb +4 -1
  34. data/lib/protobuf/field/int32_field.rb +0 -1
  35. data/lib/protobuf/field/int64_field.rb +0 -1
  36. data/lib/protobuf/field/integer_field.rb +0 -1
  37. data/lib/protobuf/field/message_field.rb +13 -28
  38. data/lib/protobuf/field/sfixed32_field.rb +0 -1
  39. data/lib/protobuf/field/sfixed64_field.rb +0 -1
  40. data/lib/protobuf/field/signed_integer_field.rb +0 -1
  41. data/lib/protobuf/field/sint32_field.rb +0 -1
  42. data/lib/protobuf/field/sint64_field.rb +0 -1
  43. data/lib/protobuf/field/string_field.rb +2 -4
  44. data/lib/protobuf/field/uint32_field.rb +0 -1
  45. data/lib/protobuf/field/uint64_field.rb +0 -1
  46. data/lib/protobuf/field/varint_field.rb +30 -13
  47. data/lib/protobuf/generators/base.rb +30 -16
  48. data/lib/protobuf/generators/enum_generator.rb +6 -9
  49. data/lib/protobuf/generators/extension_generator.rb +1 -2
  50. data/lib/protobuf/generators/field_generator.rb +25 -13
  51. data/lib/protobuf/generators/file_generator.rb +157 -35
  52. data/lib/protobuf/generators/group_generator.rb +22 -17
  53. data/lib/protobuf/generators/message_generator.rb +13 -14
  54. data/lib/protobuf/generators/option_generator.rb +17 -0
  55. data/lib/protobuf/generators/printable.rb +12 -13
  56. data/lib/protobuf/generators/service_generator.rb +2 -3
  57. data/lib/protobuf/http.rb +2 -2
  58. data/lib/protobuf/lifecycle.rb +20 -33
  59. data/lib/protobuf/logging.rb +39 -0
  60. data/lib/protobuf/message.rb +114 -47
  61. data/lib/protobuf/message/fields.rb +170 -88
  62. data/lib/protobuf/message/serialization.rb +19 -18
  63. data/lib/protobuf/optionable.rb +53 -6
  64. data/lib/protobuf/rpc/buffer.rb +18 -19
  65. data/lib/protobuf/rpc/client.rb +22 -50
  66. data/lib/protobuf/rpc/connectors/base.rb +177 -12
  67. data/lib/protobuf/rpc/connectors/http.rb +14 -9
  68. data/lib/protobuf/rpc/connectors/ping.rb +89 -0
  69. data/lib/protobuf/rpc/connectors/socket.rb +13 -8
  70. data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
  71. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
  72. data/lib/protobuf/rpc/env.rb +12 -12
  73. data/lib/protobuf/rpc/error.rb +3 -3
  74. data/lib/protobuf/rpc/error/client_error.rb +4 -4
  75. data/lib/protobuf/rpc/error/server_error.rb +9 -9
  76. data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
  77. data/lib/protobuf/rpc/middleware/logger.rb +8 -4
  78. data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
  79. data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
  80. data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
  81. data/lib/protobuf/rpc/rpc.pb.rb +4 -1
  82. data/lib/protobuf/rpc/server.rb +1 -1
  83. data/lib/protobuf/rpc/servers/http/server.rb +19 -17
  84. data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
  85. data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
  86. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
  87. data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
  88. data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
  89. data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
  90. data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
  91. data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
  92. data/lib/protobuf/rpc/service.rb +21 -27
  93. data/lib/protobuf/rpc/service_directory.rb +43 -27
  94. data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
  95. data/lib/protobuf/rpc/service_filters.rb +32 -55
  96. data/lib/protobuf/rpc/stat.rb +4 -8
  97. data/lib/protobuf/socket.rb +1 -2
  98. data/lib/protobuf/tasks/compile.rake +3 -4
  99. data/lib/protobuf/varint.rb +9 -0
  100. data/lib/protobuf/varint_pure.rb +13 -0
  101. data/lib/protobuf/version.rb +1 -1
  102. data/lib/protobuf/zmq.rb +2 -2
  103. data/proto/google/protobuf/descriptor.proto +190 -31
  104. data/protobuffy.gemspec +30 -17
  105. data/spec/benchmark/tasks.rb +27 -19
  106. data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
  107. data/spec/encoding/all_types_spec.rb +96 -84
  108. data/spec/encoding/extreme_values_spec.rb +0 -0
  109. data/spec/functional/class_inheritance_spec.rb +52 -0
  110. data/spec/functional/code_generator_spec.rb +38 -0
  111. data/spec/functional/socket_server_spec.rb +15 -15
  112. data/spec/functional/zmq_server_spec.rb +29 -27
  113. data/spec/lib/protobuf/cli_spec.rb +82 -67
  114. data/spec/lib/protobuf/code_generator_spec.rb +37 -10
  115. data/spec/lib/protobuf/enum_spec.rb +77 -46
  116. data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
  117. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  118. data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
  119. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  120. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  121. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  122. data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
  123. data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
  124. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  125. data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
  126. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  127. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  128. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  129. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  130. data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
  131. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  132. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  133. data/spec/lib/protobuf/field_spec.rb +4 -6
  134. data/spec/lib/protobuf/generators/base_spec.rb +80 -13
  135. data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
  136. data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
  137. data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
  138. data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
  139. data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
  140. data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
  141. data/spec/lib/protobuf/message_spec.rb +578 -79
  142. data/spec/lib/protobuf/optionable_spec.rb +202 -26
  143. data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
  144. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
  145. data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
  146. data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
  147. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
  148. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
  149. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
  150. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
  151. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
  152. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
  153. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
  154. data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
  155. data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
  156. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
  157. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
  158. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
  159. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
  160. data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
  161. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
  162. data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
  163. data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
  164. data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
  165. data/spec/lib/protobuf/varint_spec.rb +29 -0
  166. data/spec/lib/protobuf_spec.rb +55 -28
  167. data/spec/spec_helper.rb +12 -27
  168. data/spec/support/all.rb +0 -1
  169. data/spec/support/packed_field.rb +4 -3
  170. data/spec/support/{test → protos}/all_types.data.bin +0 -0
  171. data/spec/support/{test → protos}/all_types.data.txt +0 -0
  172. data/spec/support/{test → protos}/enum.pb.rb +8 -4
  173. data/spec/support/{test → protos}/enum.proto +4 -1
  174. data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
  175. data/spec/support/protos/google_unittest.bin +0 -0
  176. data/spec/support/protos/google_unittest.pb.rb +798 -0
  177. data/spec/support/{test → protos}/google_unittest.proto +237 -66
  178. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  179. data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
  180. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  181. data/spec/support/protos/google_unittest_import.pb.rb +55 -0
  182. data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
  183. data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
  184. data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
  185. data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
  186. data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
  187. data/spec/support/{test → protos}/resource.pb.rb +47 -11
  188. data/spec/support/{test → protos}/resource.proto +24 -1
  189. data/spec/support/resource_service.rb +23 -0
  190. data/spec/support/server.rb +32 -61
  191. metadata +119 -59
  192. data/lib/protobuf/deprecator.rb +0 -42
  193. data/lib/protobuf/logger.rb +0 -93
  194. data/lib/protobuf/rpc/connector.rb +0 -21
  195. data/lib/protobuf/rpc/connectors/common.rb +0 -172
  196. data/spec/data/data.bin +0 -3
  197. data/spec/data/types.bin +0 -0
  198. data/spec/lib/protobuf/logger_spec.rb +0 -145
  199. data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
  200. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
  201. data/spec/support/test/defaults.pb.rb +0 -25
  202. data/spec/support/test/defaults.proto +0 -9
  203. data/spec/support/test/extended.pb.rb +0 -22
  204. data/spec/support/test/extended.proto +0 -10
  205. data/spec/support/test/google_unittest.pb.rb +0 -543
  206. data/spec/support/test/google_unittest_import.pb.rb +0 -37
  207. data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
  208. data/spec/support/test/resource_service.rb +0 -26
  209. data/spec/support/tolerance_matcher.rb +0 -40
@@ -1,46 +1,222 @@
1
1
  require 'spec_helper'
2
2
  require 'protobuf/optionable'
3
+ require 'protobuf/field/message_field'
4
+ require PROTOS_PATH.join('resource.pb')
3
5
 
4
- describe 'Optionable' do
6
+ RSpec.describe 'Optionable' do
7
+ describe '.{get,get!}_option' do
8
+ before do
9
+ stub_const("OptionableGetOptionTest", Class.new(::Protobuf::Message) do
10
+ set_option :deprecated, true
11
+ set_option :".package.message_field", :field => 33
5
12
 
6
- describe '.set_option' do
7
- before(:all) do
8
- OptionableSetOptionTest = ::Class.new do
9
- include ::Protobuf::Optionable
10
- end
13
+ optional :int32, :field, 1
14
+ end)
15
+ end
16
+
17
+ it '.get_option retrieves the option as a symbol' do
18
+ expect(OptionableGetOptionTest.get_option(:deprecated)).to be(true)
19
+ end
20
+
21
+ it '.get_option returns the default value for unset options' do
22
+ expect(OptionableGetOptionTest.get_option(:message_set_wire_format)).to be(false)
23
+ end
24
+
25
+ it '.get_option retrieves the option as a string' do
26
+ expect(OptionableGetOptionTest.get_option('deprecated')).to be(true)
27
+ end
28
+
29
+ it '.get_option errors if the option does not exist' do
30
+ expect { OptionableGetOptionTest.get_option(:baz) }.to raise_error(ArgumentError)
31
+ end
32
+
33
+ it '.get_option errors if the option is not accessed by its fully qualified name' do
34
+ message_field = ::Protobuf::Field::MessageField.new(
35
+ OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, '.message_field', {})
36
+ allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
37
+ expect { OptionableGetOptionTest.get_option(message_field.name) }.to raise_error(ArgumentError)
38
+ end
39
+
40
+ it '.get_option can return an option representing a message' do
41
+ message_field = ::Protobuf::Field::MessageField.new(
42
+ OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
43
+ allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
44
+ expect(OptionableGetOptionTest.get_option(message_field.fully_qualified_name)).to eq(OptionableGetOptionTest.new(:field => 33))
45
+ end
46
+
47
+ it '.get_option! retrieves explicitly an set option' do
48
+ expect(OptionableGetOptionTest.get_option!(:deprecated)).to be(true)
49
+ end
50
+
51
+ it '.get_option! returns nil for unset options' do
52
+ expect(OptionableGetOptionTest.get_option!(:message_set_wire_format)).to be(nil)
11
53
  end
12
54
 
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
55
+ it '.get_option! errors if the option does not exist' do
56
+ expect { OptionableGetOptionTest.get_option(:baz) }.to raise_error(ArgumentError)
19
57
  end
20
58
 
21
- it 'defaults the value to true' do
22
- OptionableSetOptionTest.set_option(:baz_enabled)
23
- expect(OptionableSetOptionTest.get_option(:baz_enabled)).to be_true
59
+ it '#get_option retrieves the option as a symbol' do
60
+ expect(OptionableGetOptionTest.new.get_option(:deprecated)).to be(true)
61
+ end
62
+
63
+ it '#get_option returns the default value for unset options' do
64
+ expect(OptionableGetOptionTest.new.get_option(:message_set_wire_format)).to be(false)
65
+ end
66
+
67
+ it '#get_option retrieves the option as a string' do
68
+ expect(OptionableGetOptionTest.new.get_option('deprecated')).to be(true)
69
+ end
70
+
71
+ it '#get_option errors if the option is not accessed by its fully qualified name' do
72
+ message_field = ::Protobuf::Field::MessageField.new(
73
+ OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
74
+ allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
75
+ expect { OptionableGetOptionTest.new.get_option(message_field.name) }.to raise_error(ArgumentError)
76
+ end
77
+
78
+ it '#get_option can return an option representing a message' do
79
+ message_field = ::Protobuf::Field::MessageField.new(
80
+ OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
81
+ allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
82
+ expect(OptionableGetOptionTest.new.get_option(message_field.fully_qualified_name)).to eq(OptionableGetOptionTest.new(:field => 33))
83
+ end
84
+
85
+ it '#get_option errors if the option does not exist' do
86
+ expect { OptionableGetOptionTest.new.get_option(:baz) }.to raise_error(ArgumentError)
87
+ end
88
+
89
+ it '#get_option! retrieves explicitly an set option' do
90
+ expect(OptionableGetOptionTest.new.get_option!(:deprecated)).to be(true)
91
+ end
92
+
93
+ it '#get_option! returns nil for unset options' do
94
+ expect(OptionableGetOptionTest.new.get_option!(:message_set_wire_format)).to be(nil)
95
+ end
96
+
97
+ it '#get_option! errors if the option does not exist' do
98
+ expect { OptionableGetOptionTest.new.get_option(:baz) }.to raise_error(ArgumentError)
24
99
  end
25
100
  end
26
101
 
27
- describe '.get_option' do
28
- before(:all) do
29
- OptionableGetOptionTest = ::Class.new do
30
- include ::Protobuf::Optionable
31
- set_option :foo, :bar
102
+ describe '.inject' do
103
+ let(:klass) { Class.new }
104
+
105
+ it 'adds klass.{set,get}_option' do
106
+ expect { klass.get_option(:deprecated) }.to raise_error(NoMethodError)
107
+ expect { klass.__send__(:set_option, :deprecated, true) }.to raise_error(NoMethodError)
108
+ ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
109
+ expect(klass.get_option(:deprecated)).to eq(false)
110
+ expect { klass.set_option(:deprecated, true) }.to raise_error(NoMethodError)
111
+ klass.__send__(:set_option, :deprecated, true)
112
+ expect(klass.get_option(:deprecated)).to eq(true)
113
+ end
114
+
115
+ it 'adds klass#get_option' do
116
+ expect { klass.new.get_option(:deprecated) }.to raise_error(NoMethodError)
117
+ ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
118
+ expect(klass.new.get_option(:deprecated)).to eq(false)
119
+ end
120
+
121
+ it 'adds klass.optionable_descriptor_class' do
122
+ expect { klass.optionable_descriptor_class }.to raise_error(NoMethodError)
123
+ ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
124
+ expect(klass.optionable_descriptor_class).to eq(::Google::Protobuf::MessageOptions)
125
+ end
126
+
127
+ it 'does not add klass.optionable_descriptor_class twice' do
128
+ expect(klass).to receive(:define_singleton_method).once
129
+ ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
130
+ klass.instance_eval do
131
+ def optionable_descriptor_class
132
+ ::Google::Protobuf::MessageOptions
133
+ end
32
134
  end
135
+ ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
33
136
  end
34
137
 
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
138
+ it 'throws error when klass.optionable_descriptor_class defined twice with different args' do
139
+ ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
140
+ expect { ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::FileOptions } }
141
+ .to raise_error('A class is being defined with two different descriptor classes, something is very wrong')
38
142
  end
39
143
 
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
144
+ context 'extend_class = false' do
145
+ let(:object) { klass.new }
146
+ it 'adds object.{get,set}_option' do
147
+ expect { object.get_option(:deprecated) }.to raise_error(NoMethodError)
148
+ expect { object.__send__(:set_option, :deprecated, true) }.to raise_error(NoMethodError)
149
+ ::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
150
+ expect(object.get_option(:deprecated)).to eq(false)
151
+ expect { object.set_option(:deprecated, true) }.to raise_error(NoMethodError)
152
+ object.__send__(:set_option, :deprecated, true)
153
+ expect(object.get_option(:deprecated)).to eq(true)
154
+ end
155
+
156
+ it 'does not add klass.{get,set}_option' do
157
+ expect { object.get_option(:deprecated) }.to raise_error(NoMethodError)
158
+ ::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
159
+ expect { klass.get_option(:deprecated) }.to raise_error(NoMethodError)
160
+ expect { klass.__send__(:set_option, :deprecated) }.to raise_error(NoMethodError)
161
+ end
162
+
163
+ it 'creates an instance method optionable_descriptor_class' do
164
+ expect { object.optionable_descriptor_class }.to raise_error(NoMethodError)
165
+ ::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
166
+ expect(object.optionable_descriptor_class).to eq(::Google::Protobuf::MessageOptions)
167
+ end
43
168
  end
44
169
  end
45
170
 
171
+ describe 'getting options from generated code' do
172
+ context 'file options' do
173
+ it 'gets base options' do
174
+ expect(::Test.get_option!(:cc_generic_services)).to eq(true)
175
+ end
176
+
177
+ it 'gets unset options' do
178
+ expect(::Test.get_option!(:java_multiple_files)).to eq(nil)
179
+ expect(::Test.get_option(:java_multiple_files)).to eq(false)
180
+ end
181
+
182
+ it 'gets custom options' do
183
+ expect(::Test.get_option!(:".test.file_option")).to eq(9876543210)
184
+ end
185
+ end
186
+
187
+ context 'field options' do
188
+ subject { ::Test::Resource.fields[0] }
189
+
190
+ it 'gets base options' do
191
+ expect(subject.get_option!(:ctype))
192
+ .to eq(::Google::Protobuf::FieldOptions::CType::CORD)
193
+ end
194
+
195
+ it 'gets unset options' do
196
+ expect(subject.get_option!(:lazy)).to eq(nil)
197
+ expect(subject.get_option(:lazy)).to eq(false)
198
+ end
199
+
200
+ it 'gets custom options' do
201
+ expect(subject.get_option!(:".test.field_option")).to eq(8765432109)
202
+ end
203
+ end
204
+
205
+ context 'enum options' do
206
+ subject { ::Test::StatusType }
207
+
208
+ it 'gets base options' do
209
+ expect(subject.get_option!(:allow_alias)).to eq(true)
210
+ end
211
+
212
+ it 'gets unset options' do
213
+ expect(subject.get_option!(:deprecated)).to eq(nil)
214
+ expect(subject.get_option(:deprecated)).to eq(false)
215
+ end
216
+
217
+ it 'gets custom options' do
218
+ expect(subject.get_option!(:".test.enum_option")).to eq(-789)
219
+ end
220
+ end
221
+ end
46
222
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'spec/support/test/resource_service'
2
+ require SUPPORT_PATH.join('resource_service')
3
3
 
4
- describe Protobuf::Rpc::Client do
4
+ RSpec.describe Protobuf::Rpc::Client do
5
5
  before(:each) do
6
6
  load 'protobuf/socket.rb'
7
7
  end
@@ -10,29 +10,29 @@ describe Protobuf::Rpc::Client do
10
10
  before { reset_service_location(Test::ResourceService) }
11
11
 
12
12
  it 'should be able to get a client through the Service#client helper method' do
13
- Test::ResourceService.client(:port => 9191).should eq(Protobuf::Rpc::Client.new(:service => Test::ResourceService, :port => 9191))
13
+ expect(::Test::ResourceService.client(:port => 9191)).to eq(Protobuf::Rpc::Client.new(:service => Test::ResourceService, :port => 9191))
14
14
  end
15
15
 
16
16
  it "should be able to override a service location's host and port" do
17
17
  Test::ResourceService.located_at 'somewheregreat.com:12345'
18
18
  clean_client = Test::ResourceService.client
19
- clean_client.options[:host].should eq('somewheregreat.com')
20
- clean_client.options[:port].should eq(12345)
19
+ expect(clean_client.options[:host]).to eq('somewheregreat.com')
20
+ expect(clean_client.options[:port]).to eq(12345)
21
21
 
22
22
  updated_client = Test::ResourceService.client(:host => 'amazing.com', :port => 54321)
23
- updated_client.options[:host].should eq('amazing.com')
24
- updated_client.options[:port].should eq(54321)
23
+ expect(updated_client.options[:host]).to eq('amazing.com')
24
+ expect(updated_client.options[:port]).to eq(54321)
25
25
  end
26
26
 
27
27
  it 'should be able to define which service to create itself for' do
28
28
  client = Protobuf::Rpc::Client.new :service => Test::ResourceService
29
- client.options[:service].should eq(Test::ResourceService)
29
+ expect(client.options[:service]).to eq(Test::ResourceService)
30
30
  end
31
31
 
32
32
  it 'should have a hard default for host and port on a service that has not been configured' do
33
33
  client = Test::ResourceService.client
34
- client.options[:host].should eq(Protobuf::Rpc::Service::DEFAULT_HOST)
35
- client.options[:port].should eq(Protobuf::Rpc::Service::DEFAULT_PORT)
34
+ expect(client.options[:host]).to eq(Protobuf::Rpc::Service::DEFAULT_HOST)
35
+ expect(client.options[:port]).to eq(Protobuf::Rpc::Service::DEFAULT_PORT)
36
36
  end
37
37
 
38
38
  end
@@ -45,7 +45,7 @@ describe Protobuf::Rpc::Client do
45
45
 
46
46
  it 'should respond to defined service methods' do
47
47
  client = Test::ResourceService.client
48
- client.should_receive(:send_request).and_return(nil)
48
+ expect(client).to receive(:send_request).and_return(nil)
49
49
  expect { client.find(nil) }.to_not raise_error
50
50
  end
51
51
  end
@@ -54,11 +54,11 @@ describe Protobuf::Rpc::Client do
54
54
 
55
55
  it 'should be able to create the correct request object if passed a hash' do
56
56
  client = Test::ResourceService.client
57
- client.should_receive(:send_request)
58
- client.find({:name => 'Test Name', :active => false})
59
- client.options[:request].should be_a(Test::ResourceFindRequest)
60
- client.options[:request].name.should eq('Test Name')
61
- client.options[:request].active.should eq(false)
57
+ expect(client).to receive(:send_request)
58
+ client.find(:name => 'Test Name', :active => false)
59
+ expect(client.options[:request]).to be_a(Test::ResourceFindRequest)
60
+ expect(client.options[:request].name).to eq('Test Name')
61
+ expect(client.options[:request].active).to eq(false)
62
62
  end
63
63
 
64
64
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Protobuf::Rpc::Connectors::Base do
3
+ RSpec.describe Protobuf::Rpc::Connectors::Base do
4
4
 
5
5
  let(:options) do
6
6
  { :timeout => 60 }
@@ -8,43 +8,197 @@ describe Protobuf::Rpc::Connectors::Base do
8
8
 
9
9
  subject { Protobuf::Rpc::Connectors::Base.new(options) }
10
10
 
11
+ context "API" do
12
+ specify { expect(subject.respond_to?(:any_callbacks?)).to be true }
13
+ specify { expect(subject.respond_to?(:request_caller)).to be true }
14
+ specify { expect(subject.respond_to?(:data_callback)).to be true }
15
+ specify { expect(subject.respond_to?(:error)).to be true }
16
+ specify { expect(subject.respond_to?(:failure)).to be true }
17
+ specify { expect(subject.respond_to?(:complete)).to be true }
18
+ specify { expect(subject.respond_to?(:parse_response)).to be true }
19
+ specify { expect(subject.respond_to?(:verify_options!)).to be true }
20
+ specify { expect(subject.respond_to?(:verify_callbacks)).to be true }
21
+ end
22
+
23
+ describe "#any_callbacks?" do
24
+ [:@complete_cb, :@success_cb, :@failure_cb].each do |cb|
25
+ it "returns true if #{cb} is provided" do
26
+ subject.instance_variable_set(cb, "something")
27
+ expect(subject.any_callbacks?).to be true
28
+ end
29
+ end
30
+
31
+ it "returns false when all callbacks are not provided" do
32
+ subject.instance_variable_set(:@complete_cb, nil)
33
+ subject.instance_variable_set(:@success_cb, nil)
34
+ subject.instance_variable_set(:@failure_cb, nil)
35
+
36
+ expect(subject.any_callbacks?).to be false
37
+ end
38
+ end
39
+
40
+ describe "#data_callback" do
41
+ it "changes state to use the data callback" do
42
+ subject.data_callback("data")
43
+ expect(subject.instance_variable_get(:@used_data_callback)).to be true
44
+ end
45
+
46
+ it "sets the data var when using the data_callback" do
47
+ subject.data_callback("data")
48
+ expect(subject.instance_variable_get(:@data)).to eq("data")
49
+ end
50
+ end
51
+
11
52
  describe "#send_request" do
12
53
  it "raising an error when 'send_request' is not overridden" do
13
- expect{ subject.send_request }.to raise_error(RuntimeError, /inherit a Connector/)
54
+ expect { subject.send_request }.to raise_error(RuntimeError, /inherit a Connector/)
14
55
  end
15
56
 
16
57
  it "does not raise error when 'send_request' is overridden" do
17
- new_sub = Class.new(subject.class){ def send_request; end }.new(options)
18
- expect{ new_sub.send_request }.to_not raise_error
58
+ new_sub = Class.new(subject.class) { def send_request; end }.new(options)
59
+ expect { new_sub.send_request }.to_not raise_error
19
60
  end
20
61
  end
21
62
 
22
63
  describe '.new' do
23
64
  it 'assigns passed options and initializes success/failure callbacks' do
24
- subject.options.should eq(Protobuf::Rpc::Connectors::DEFAULT_OPTIONS.merge(options))
25
- subject.success_cb.should be_nil
26
- subject.failure_cb.should be_nil
65
+ expect(subject.options).to eq(Protobuf::Rpc::Connectors::DEFAULT_OPTIONS.merge(options))
66
+ expect(subject.success_cb).to be_nil
67
+ expect(subject.failure_cb).to be_nil
27
68
  end
28
69
  end
29
70
 
30
71
  describe '#success_cb' do
31
72
  it 'allows setting the success callback and calling it' do
32
- subject.success_cb.should be_nil
33
- cb = proc {|res| raise res }
73
+ expect(subject.success_cb).to be_nil
74
+ cb = proc { |res| fail res }
34
75
  subject.success_cb = cb
35
- subject.success_cb.should eq(cb)
76
+ expect(subject.success_cb).to eq(cb)
36
77
  expect { subject.success_cb.call('an error from cb') }.to raise_error 'an error from cb'
37
78
  end
38
79
  end
39
80
 
40
81
  describe '#failure_cb' do
41
82
  it 'allows setting the failure callback and calling it' do
42
- subject.failure_cb.should be_nil
43
- cb = proc {|res| raise res }
83
+ expect(subject.failure_cb).to be_nil
84
+ cb = proc { |res| fail res }
44
85
  subject.failure_cb = cb
45
- subject.failure_cb.should eq(cb)
86
+ expect(subject.failure_cb).to eq(cb)
46
87
  expect { subject.failure_cb.call('an error from cb') }.to raise_error 'an error from cb'
47
88
  end
48
89
  end
49
90
 
91
+ describe '#request_bytes' do
92
+ let(:service) { Test::ResourceService }
93
+ let(:method) { :find }
94
+ let(:request) { '' }
95
+ let(:client_host) { 'myhost.myservice.com' }
96
+ let(:options) do
97
+ {
98
+ :service => service,
99
+ :method => method,
100
+ :request => request,
101
+ :client_host => client_host,
102
+ :timeout => 60,
103
+ }
104
+ end
105
+
106
+ let(:expected) do
107
+ ::Protobuf::Socketrpc::Request.new(
108
+ :service_name => service.name,
109
+ :method_name => 'find',
110
+ :request_proto => '',
111
+ :caller => client_host
112
+ )
113
+ end
114
+
115
+ before { allow(subject).to receive(:validate_request_type!).and_return(true) }
116
+ before { expect(subject).not_to receive(:failure) }
117
+
118
+ specify { expect(subject.request_bytes).to eq expected.encode }
119
+ end
120
+
121
+ describe '#request_caller' do
122
+ specify { expect(subject.request_caller).to eq ::Protobuf.client_host }
123
+
124
+ context 'when "client_host" option is given to initializer' do
125
+ let(:hostname) { 'myhost.myserver.com' }
126
+ let(:options) { { :client_host => hostname, :timeout => 60 } }
127
+
128
+ specify { expect(subject.request_caller).to_not eq ::Protobuf.client_host }
129
+ specify { expect(subject.request_caller).to eq hostname }
130
+ end
131
+ end
132
+
133
+ describe "#verify_callbacks" do
134
+ it "sets @failure_cb to #data_callback when no callbacks are defined" do
135
+ subject.verify_callbacks
136
+ expect(subject.instance_variable_get(:@failure_cb)).to eq(subject.method(:data_callback))
137
+ end
138
+
139
+ it "sets @success_cb to #data_callback when no callbacks are defined" do
140
+ subject.verify_callbacks
141
+ expect(subject.instance_variable_get(:@success_cb)).to eq(subject.method(:data_callback))
142
+ end
143
+
144
+ it "doesn't set @failure_cb when already defined" do
145
+ set_cb = -> { true }
146
+ subject.instance_variable_set(:@failure_cb, set_cb)
147
+ subject.verify_callbacks
148
+ expect(subject.instance_variable_get(:@failure_cb)).to eq(set_cb)
149
+ expect(subject.instance_variable_get(:@failure_cb)).to_not eq(subject.method(:data_callback))
150
+ end
151
+
152
+ it "doesn't set @success_cb when already defined" do
153
+ set_cb = -> { true }
154
+ subject.instance_variable_set(:@success_cb, set_cb)
155
+ subject.verify_callbacks
156
+ expect(subject.instance_variable_get(:@success_cb)).to eq(set_cb)
157
+ expect(subject.instance_variable_get(:@success_cb)).to_not eq(subject.method(:data_callback))
158
+ end
159
+
160
+ end
161
+
162
+ shared_examples "a ConnectorDisposition" do |meth, stats_meth, cb, *args|
163
+ let(:stats) { double("Object", :stop => true, :success => true, :failure => true) }
164
+ before { subject.stats = stats }
165
+
166
+ it "calls #complete before exit" do
167
+ expect(subject).to receive(:complete)
168
+ subject.method(meth).call(*args)
169
+ end
170
+
171
+ it "calls the #{cb} callback when provided" do
172
+ some_cb = double("Object")
173
+
174
+ subject.instance_variable_set("@#{cb}", some_cb)
175
+ expect(some_cb).to receive(:call).and_return(true)
176
+ subject.method(meth).call(*args)
177
+ end
178
+
179
+ it "calls the complete callback when provided" do
180
+ comp_cb = double("Object")
181
+
182
+ subject.instance_variable_set(:@complete_cb, comp_cb)
183
+ expect(comp_cb).to receive(:call).and_return(true)
184
+ subject.method(meth).call(*args)
185
+ end
186
+
187
+ it "calls method on stats" do
188
+ subject.stats = Class.new
189
+ expected_args = stats_meth == :failure ? args[0] : no_args
190
+ expect(subject.stats).to receive(stats_meth).once.with(expected_args)
191
+ allow(subject.stats).to receive(:stop)
192
+
193
+ subject.method(meth).call(*args)
194
+ end
195
+
196
+ end
197
+
198
+ it_behaves_like("a ConnectorDisposition", :failure, :failure, "failure_cb", "code", "message")
199
+ it_behaves_like("a ConnectorDisposition", :failure, :failure, "complete_cb", "code", "message")
200
+ it_behaves_like("a ConnectorDisposition", :succeed, :success, "complete_cb", "response")
201
+ it_behaves_like("a ConnectorDisposition", :succeed, :success, "success_cb", "response")
202
+ it_behaves_like("a ConnectorDisposition", :complete, :stop, "complete_cb")
203
+
50
204
  end