protobuffy 3.6.0 → 4.0.0

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.
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,21 +0,0 @@
1
- require 'protobuf'
2
-
3
- module Protobuf
4
- module Rpc
5
- class Connector
6
-
7
- # Returns a connector class for the pre-defined connector_type.
8
- def self.connector_for_client
9
- case ::Protobuf.connector_type
10
- when :zmq then
11
- ::Protobuf::Rpc::Connectors::Zmq
12
- when :http then
13
- ::Protobuf::Rpc::Connectors::Http
14
- else
15
- ::Protobuf::Rpc::Connectors::Socket
16
- end
17
- end
18
-
19
- end
20
- end
21
- end
@@ -1,172 +0,0 @@
1
- require 'protobuf'
2
-
3
- module Protobuf
4
- module Rpc
5
- module Connectors
6
- module Common
7
-
8
- attr_reader :error
9
-
10
- def any_callbacks?
11
- return [@complete_cb, @failure_cb, @success_cb].inject(false) do |reduction, cb|
12
- reduction = (reduction || !cb.nil?)
13
- end
14
- end
15
-
16
- def request_caller
17
- @options[:client_host] || ::Protobuf.client_host
18
- end
19
-
20
- def complete
21
- @stats.stop
22
- log_info { @stats.to_s }
23
- log_debug { sign_message('Response proceessing complete') }
24
- @complete_cb.call(self) unless @complete_cb.nil?
25
- rescue => e
26
- log_error { sign_message('Complete callback error encountered') }
27
- log_exception(e)
28
- raise
29
- end
30
-
31
- def data_callback(data)
32
- log_debug { sign_message('Using data_callback') }
33
- @used_data_callback = true
34
- @data = data
35
- end
36
-
37
- # All failures should be routed through this method.
38
- #
39
- # @param [Symbol] code The code we're using (see ::Protobuf::Socketrpc::ErrorReason)
40
- # @param [String] message The error message
41
- def fail(code, message)
42
- @error = ClientError.new
43
- @error.code = Protobuf::Socketrpc::ErrorReason.fetch(code)
44
- @error.message = message
45
- log_debug { sign_message("Server failed request (invoking on_failure): #{@error.inspect}") }
46
-
47
- @stats.failure(code)
48
- @failure_cb.call(@error) unless @failure_cb.nil?
49
- rescue => e
50
- log_error { sign_message("Failure callback error encountered") }
51
- log_exception(e)
52
- raise
53
- ensure
54
- complete
55
- end
56
-
57
- def initialize_stats
58
- @stats = Protobuf::Rpc::Stat.new(:CLIENT)
59
- @stats.server = [@options[:port], @options[:host]]
60
- @stats.service = @options[:service].name
61
- @stats.method_name = @options[:method].to_s
62
- rescue => ex
63
- log_exception(ex)
64
- fail(:RPC_ERROR, "Invalid stats configuration. #{ex.message}")
65
- end
66
-
67
- def log_signature
68
- @_log_signature ||= "[client-#{self.class}]"
69
- end
70
-
71
- def parse_response
72
- # Close up the connection as we no longer need it
73
- close_connection
74
-
75
- log_debug { sign_message("Parsing response from server (connection closed)") }
76
-
77
- # Parse out the raw response
78
- @stats.response_size = @response_data.size unless @response_data.nil?
79
- response_wrapper = Protobuf::Socketrpc::Response.decode(@response_data)
80
-
81
- # Determine success or failure based on parsed data
82
- if response_wrapper.has_field?(:error_reason)
83
- log_debug { sign_message("Error response parsed") }
84
-
85
- # fail the call if we already know the client is failed
86
- # (don't try to parse out the response payload)
87
- fail(response_wrapper.error_reason, response_wrapper.error)
88
- else
89
- log_debug { sign_message("Successful response parsed") }
90
-
91
- # Ensure client_response is an instance
92
- parsed = @options[:response_type].decode(response_wrapper.response_proto.to_s)
93
-
94
- if parsed.nil? and not response_wrapper.has_field?(:error_reason)
95
- fail(:BAD_RESPONSE_PROTO, 'Unable to parse response from server')
96
- else
97
- verify_callbacks
98
- succeed(parsed)
99
- return @data if @used_data_callback
100
- end
101
- end
102
- end
103
-
104
- def post_init
105
- send_data unless error?
106
- rescue => e
107
- fail(:RPC_ERROR, "Connection error: #{e.message}")
108
- end
109
-
110
- def request_bytes
111
- validate_request_type!
112
- fields = { :service_name => @options[:service].name,
113
- :method_name => @options[:method].to_s,
114
- :request_proto => @options[:request],
115
- :caller => request_caller }
116
-
117
- return ::Protobuf::Socketrpc::Request.encode(fields)
118
- rescue => e
119
- fail(:INVALID_REQUEST_PROTO, "Could not set request proto: #{e.message}")
120
- end
121
-
122
- def setup_connection
123
- initialize_stats
124
- @request_data = request_bytes
125
- @stats.request_size = request_bytes.size
126
- end
127
-
128
- def succeed(response)
129
- log_debug { sign_message("Server succeeded request (invoking on_success)") }
130
- @stats.success
131
- @success_cb.call(response) unless @success_cb.nil?
132
- rescue => e
133
- log_error { sign_message("Success callback error encountered") }
134
- log_exception(e)
135
- fail(:RPC_ERROR, "An exception occurred while calling on_success: #{e.message}")
136
- ensure
137
- complete
138
- end
139
-
140
- # Wrap the given block in a timeout of the configured number of seconds.
141
- #
142
- def timeout_wrap(&block)
143
- ::Timeout.timeout(options[:timeout], &block)
144
- rescue ::Timeout::Error
145
- fail(:RPC_FAILED, "The server took longer than #{options[:timeout]} seconds to respond")
146
- end
147
-
148
- def validate_request_type!
149
- unless @options[:request].class == @options[:request_type]
150
- expected = @options[:request_type].name
151
- actual = @options[:request].class.name
152
- fail(:INVALID_REQUEST_PROTO, "Expected request type to be type of #{expected}, got #{actual} instead")
153
- end
154
- end
155
-
156
- def verify_callbacks
157
- unless any_callbacks?
158
- log_debug { sign_message("No callbacks set, using data_callback") }
159
- @success_cb = @failure_cb = self.method(:data_callback)
160
- end
161
- end
162
-
163
- def verify_options!
164
- # Verify the options that are necessary and merge them in
165
- [:service, :method, :host, :port].each do |opt|
166
- fail(:RPC_ERROR, "Invalid client connection configuration. #{opt} must be a defined option.") if @options[opt].nil?
167
- end
168
- end
169
- end
170
- end
171
- end
172
- end
data/spec/data/data.bin DELETED
@@ -1,3 +0,0 @@
1
-
2
- John Doe� jdoe@example.com"
3
- 555-4321
data/spec/data/types.bin DELETED
Binary file
@@ -1,145 +0,0 @@
1
- require 'protobuf/logger'
2
- require 'stringio'
3
- require 'fileutils'
4
-
5
- describe Protobuf::Logger do
6
-
7
- subject { Protobuf::Logger }
8
-
9
- before(:each) do
10
- Protobuf::Logger.reset_device!
11
- Protobuf::Logger.file = '/dev/null'
12
- Protobuf::Logger.level = ::Logger::INFO
13
- end
14
-
15
- after(:all) do
16
- ::FileUtils.rm_f('myfile.log')
17
- end
18
-
19
- describe '.instance' do
20
-
21
- it 'doesn\'t create a logger if the file was not set' do
22
- subject.file = nil
23
- subject.instance.should be_nil
24
- end
25
-
26
- it 'doesn\'t create a logger if the level was not set' do
27
- subject.level = nil
28
- subject.instance.should be_nil
29
- end
30
-
31
- it 'gets a new instance of the logger when file and level are set' do
32
- subject.file.should_not be_nil
33
- subject.level.should_not be_nil
34
- subject.instance.should_not be_nil
35
- end
36
-
37
- it 'keeps the same object from multiple calls to instance' do
38
- subject.instance === subject.instance
39
- end
40
-
41
- end
42
-
43
- describe '.configure' do
44
- before(:each) { subject.reset_device! }
45
- it 'sets the file and level in one call' do
46
- subject.file.should_not be
47
- subject.level.should_not be
48
- subject.instance.should_not be
49
- subject.configure :file => 'myfile.log', :level => ::Logger::WARN
50
- subject.file.should == 'myfile.log'
51
- subject.level.should == ::Logger::WARN
52
- subject.instance.level.should == ::Logger::WARN
53
- end
54
-
55
- context 'specifying logger' do
56
- let(:logger) { double('Logger') }
57
-
58
- it 'sets the logger instance' do
59
- subject.instance.should_not be
60
- subject.configure :logger => logger
61
- subject.instance.should == logger
62
- end
63
- end
64
- end
65
-
66
- describe '.reset_device!' do
67
-
68
- it 'resets the logger instance, file, and level' do
69
- subject.instance.should be
70
- subject.file.should be
71
- subject.level.should be
72
- subject.reset_device!
73
- subject.instance.should_not be
74
- subject.file.should_not be
75
- subject.level.should_not be
76
- end
77
-
78
- end
79
-
80
- context 'when logging' do
81
-
82
- it 'doesn\'t raise errors when log instance is nil' do
83
- subject.reset_device!
84
- subject.instance.should be_nil
85
- expect {
86
- subject.debug 'No errors here'
87
- subject.info 'No errors here'
88
- subject.warn 'No errors here'
89
- subject.error 'No errors here'
90
- subject.fatal 'No errors here'
91
- subject.add 'No errors here'
92
- subject.log 'No errors here'
93
- }.to_not raise_error
94
- end
95
-
96
- it 'logs correctly when instance is valid' do
97
- subject.instance.should_not be_nil
98
- subject.instance.should_receive(:info).with('Should log great')
99
- subject.info 'Should log great'
100
- end
101
-
102
- end
103
-
104
- describe Protobuf::Logger::LogMethods do
105
-
106
- context 'when included in another class' do
107
-
108
- before(:all) do
109
- class MyTestClass
110
- include Protobuf::Logger::LogMethods
111
- end
112
- end
113
-
114
- subject { MyTestClass.new }
115
-
116
- it { should respond_to(:log_debug) }
117
- it { should respond_to(:log_info) }
118
- it { should respond_to(:log_warn) }
119
- it { should respond_to(:log_error) }
120
- it { should respond_to(:log_fatal) }
121
- it { should respond_to(:log_add) }
122
- it { should respond_to(:log_log) }
123
-
124
- context '#log_exception' do
125
- it 'logs the exception message as an error and backtrace as debug' do
126
- subject.should_receive(:log_error).twice
127
- subject.should_receive(:log_debug)
128
- subject.log_exception(RuntimeError.new('this is an exception'))
129
- end
130
- end
131
-
132
- its(:log_signature) { should eq "[MyTestClass]" }
133
- describe '#sign_message' do
134
- specify { subject.sign_message("this is a test").should eq "[MyTestClass] this is a test" }
135
- specify { subject.class.sign_message("this is a test").should eq "[MyTestClass] this is a test" }
136
- end
137
-
138
- it 'passes all embedded log calls to Logger instance' do
139
- Protobuf::Logger.instance.should_receive(:debug).with('[MyTestClass] log this')
140
- subject.log_debug('log this')
141
- end
142
-
143
- end
144
- end
145
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
- require 'protobuf/socket'
3
- require 'protobuf/zmq'
4
-
5
- describe ::Protobuf::Rpc::Connector do
6
-
7
- describe '.connector_for_client(true)' do
8
- subject { described_class.connector_for_client }
9
-
10
- context 'Protobuf.connector_type is socket' do
11
- before { ::Protobuf.connector_type = :socket }
12
- it { should eq ::Protobuf::Rpc::Connectors::Socket }
13
- end
14
-
15
- context 'Protobuf.connector_type is not a known value' do
16
- before { ::Protobuf.stub(:connector_type) { :foo } }
17
- it { should eq ::Protobuf::Rpc::Connectors::Socket }
18
- end
19
-
20
- context 'Protobuf.connector_type is zmq' do
21
- before { ::Protobuf.connector_type = :zmq }
22
- it { should eq ::Protobuf::Rpc::Connectors::Zmq }
23
- end
24
- end
25
-
26
- end
@@ -1,170 +0,0 @@
1
- require 'spec_helper'
2
- require 'protobuf/rpc/service'
3
-
4
- describe Protobuf::Rpc::Connectors::Common do
5
- let(:common_class) do
6
- Class.new(Protobuf::Rpc::Connectors::Base) do
7
- include Protobuf::Rpc::Connectors::Common
8
- attr_accessor :options
9
- attr_accessor :stats
10
- end
11
- end
12
-
13
- let(:subject_options) { {} }
14
-
15
- subject { @subject ||= common_class.new(subject_options) }
16
-
17
- context "API" do
18
- specify { subject.respond_to?(:any_callbacks?).should be_true }
19
- specify { subject.respond_to?(:request_caller).should be_true }
20
- specify { subject.respond_to?(:data_callback).should be_true }
21
- specify { subject.respond_to?(:error).should be_true }
22
- specify { subject.respond_to?(:fail).should be_true }
23
- specify { subject.respond_to?(:complete).should be_true }
24
- specify { subject.respond_to?(:parse_response).should be_true }
25
- specify { subject.respond_to?(:verify_options!).should be_true }
26
- specify { subject.respond_to?(:verify_callbacks).should be_true }
27
- end
28
-
29
- describe "#any_callbacks?" do
30
-
31
- [:@complete_cb, :@success_cb, :@failure_cb].each do |cb|
32
- it "returns true if #{cb} is provided" do
33
- subject.instance_variable_set(cb, "something")
34
- subject.any_callbacks?.should be_true
35
- end
36
- end
37
-
38
- it "returns false when all callbacks are not provided" do
39
- subject.instance_variable_set(:@complete_cb, nil)
40
- subject.instance_variable_set(:@success_cb, nil)
41
- subject.instance_variable_set(:@failure_cb, nil)
42
-
43
- subject.any_callbacks?.should be_false
44
- end
45
-
46
- end
47
-
48
- describe '#request_caller' do
49
- its(:request_caller) { should eq ::Protobuf.client_host }
50
-
51
- context 'when "client_host" option is given to initializer' do
52
- let(:hostname) { 'myhost.myserver.com' }
53
- let(:subject_options) { { :client_host => hostname } }
54
-
55
- its(:request_caller) { should_not eq ::Protobuf.client_host }
56
- its(:request_caller) { should eq hostname }
57
- end
58
- end
59
-
60
- describe "#data_callback" do
61
- it "changes state to use the data callback" do
62
- subject.data_callback("data")
63
- subject.instance_variable_get(:@used_data_callback).should be_true
64
- end
65
-
66
- it "sets the data var when using the data_callback" do
67
- subject.data_callback("data")
68
- subject.instance_variable_get(:@data).should eq("data")
69
- end
70
- end
71
-
72
- describe '#request_bytes' do
73
- let(:service) { Test::ResourceService }
74
- let(:method) { :find }
75
- let(:request) { '' }
76
- let(:client_host) { 'myhost.myservice.com' }
77
- let(:subject_options) { { :service => service,
78
- :method => method,
79
- :request => request,
80
- :client_host => client_host } }
81
-
82
- let(:expected) { ::Protobuf::Socketrpc::Request.new({ :service_name => service.name,
83
- :method_name => 'find',
84
- :request_proto => '',
85
- :caller => client_host }) }
86
-
87
- before { subject.stub(:validate_request_type!).and_return(true) }
88
- before { subject.should_not_receive(:fail) }
89
-
90
- its(:request_bytes) { should eq expected.encode }
91
- end
92
-
93
- describe "#verify_callbacks" do
94
-
95
- it "sets @failure_cb to #data_callback when no callbacks are defined" do
96
- subject.verify_callbacks
97
- subject.instance_variable_get(:@failure_cb).should eq(subject.method(:data_callback))
98
- end
99
-
100
- it "sets @success_cb to #data_callback when no callbacks are defined" do
101
- subject.verify_callbacks
102
- subject.instance_variable_get(:@success_cb).should eq(subject.method(:data_callback))
103
- end
104
-
105
- it "doesn't set @failure_cb when already defined" do
106
- set_cb = lambda{ true }
107
- subject.instance_variable_set(:@failure_cb, set_cb)
108
- subject.verify_callbacks
109
- subject.instance_variable_get(:@failure_cb).should eq(set_cb)
110
- subject.instance_variable_get(:@failure_cb).should_not eq(subject.method(:data_callback))
111
- end
112
-
113
- it "doesn't set @success_cb when already defined" do
114
- set_cb = lambda{ true }
115
- subject.instance_variable_set(:@success_cb, set_cb)
116
- subject.verify_callbacks
117
- subject.instance_variable_get(:@success_cb).should eq(set_cb)
118
- subject.instance_variable_get(:@success_cb).should_not eq(subject.method(:data_callback))
119
- end
120
-
121
- end
122
-
123
- shared_examples "a ConnectorDisposition" do |meth, cb, *args|
124
-
125
- it "calls #complete before exit" do
126
- stats = double("Object")
127
- stats.stub(:success) { true }
128
- stats.stub(:failure) { true }
129
- stats.stub(:stop) { true }
130
- subject.stats = stats
131
-
132
- subject.should_receive(:complete)
133
- subject.method(meth).call(*args)
134
- end
135
-
136
- it "calls the #{cb} callback when provided" do
137
- stats = double("Object")
138
- stats.stub(:success) { true }
139
- stats.stub(:failure) { true }
140
- stats.stub(:stop) { true }
141
- subject.stats = stats
142
- _cb = double("Object")
143
-
144
- subject.instance_variable_set("@#{cb}", _cb)
145
- _cb.should_receive(:call).and_return(true)
146
- subject.method(meth).call(*args)
147
- end
148
-
149
- it "calls the complete callback when provided" do
150
- stats = double("Object")
151
- stats.stub(:success) { true }
152
- stats.stub(:failure) { true }
153
- stats.stub(:stop) { true }
154
- subject.stats = stats
155
- comp_cb = double("Object")
156
-
157
- subject.instance_variable_set(:@complete_cb, comp_cb)
158
- comp_cb.should_receive(:call).and_return(true)
159
- subject.method(meth).call(*args)
160
- end
161
-
162
- end
163
-
164
- it_behaves_like("a ConnectorDisposition", :fail, "failure_cb", "code", "message")
165
- it_behaves_like("a ConnectorDisposition", :fail, "complete_cb", "code", "message")
166
- it_behaves_like("a ConnectorDisposition", :succeed, "complete_cb", "response")
167
- it_behaves_like("a ConnectorDisposition", :succeed, "success_cb", "response")
168
- it_behaves_like("a ConnectorDisposition", :complete, "complete_cb")
169
-
170
- end