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,28 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Protobuf::Rpc::Middleware::ResponseEncoder do
4
- let(:app) { Proc.new { |env| env.response = response; env } }
5
- let(:env) {
3
+ RSpec.describe Protobuf::Rpc::Middleware::ResponseEncoder do
4
+ let(:app) { proc { |env| env.response = response; env } }
5
+ let(:env) do
6
6
  Protobuf::Rpc::Env.new(
7
7
  'response_type' => Test::Resource,
8
8
  'log_signature' => 'log_signature'
9
9
  )
10
- }
10
+ end
11
11
  let(:encoded_response) { response_wrapper.encode }
12
12
  let(:response) { Test::Resource.new(:name => 'required') }
13
- let(:response_wrapper) { Protobuf::Socketrpc::Response.new(:response_proto => response) }
13
+ let(:response_wrapper) { ::Protobuf::Socketrpc::Response.new(:response_proto => response) }
14
14
 
15
15
  subject { described_class.new(app) }
16
16
 
17
17
  describe "#call" do
18
18
  it "encodes the response" do
19
19
  stack_env = subject.call(env)
20
- stack_env.encoded_response.should eq encoded_response
20
+ expect(stack_env.encoded_response).to eq encoded_response
21
21
  end
22
22
 
23
23
  it "calls the stack" do
24
24
  stack_env = subject.call(env)
25
- stack_env.response.should eq response
25
+ expect(stack_env.response).to eq response
26
26
  end
27
27
 
28
28
  context "when response is responds to :to_hash" do
@@ -31,7 +31,7 @@ describe Protobuf::Rpc::Middleware::ResponseEncoder do
31
31
 
32
32
  it "sets Env#response" do
33
33
  stack_env = subject.call(env)
34
- stack_env.response.should eq response
34
+ expect(stack_env.response).to eq response
35
35
  end
36
36
  end
37
37
 
@@ -41,7 +41,7 @@ describe Protobuf::Rpc::Middleware::ResponseEncoder do
41
41
 
42
42
  it "sets Env#response" do
43
43
  stack_env = subject.call(env)
44
- stack_env.response.should eq response
44
+ expect(stack_env.response).to eq response
45
45
  end
46
46
  end
47
47
 
@@ -60,12 +60,12 @@ describe Protobuf::Rpc::Middleware::ResponseEncoder do
60
60
 
61
61
  it "wraps and encodes the response" do
62
62
  stack_env = subject.call(env)
63
- stack_env.encoded_response.should eq encoded_response
63
+ expect(stack_env.encoded_response).to eq encoded_response
64
64
  end
65
65
  end
66
66
 
67
67
  context "when encoding fails" do
68
- before { Protobuf::Socketrpc::Response.any_instance.stub(:encode).and_raise(RuntimeError) }
68
+ before { allow_any_instance_of(::Protobuf::Socketrpc::Response).to receive(:encode).and_raise(RuntimeError) }
69
69
 
70
70
  it "raises a bad request data exception" do
71
71
  expect { subject.call(env) }.to raise_exception(Protobuf::Rpc::PbError)
@@ -2,8 +2,8 @@ require 'spec_helper'
2
2
  require 'timecop'
3
3
 
4
4
  describe Protobuf::Rpc::Middleware::Statsd do
5
- let(:app) { Proc.new { |inner_env| Timecop.freeze(Time.now + call_time); inner_env } }
6
- let(:env) {
5
+ let(:app) { proc { |inner_env| Timecop.freeze(Time.now + call_time); inner_env } }
6
+ let(:env) do
7
7
  Protobuf::Rpc::Env.new(
8
8
  'client_host' => 'client_host.test.co',
9
9
  'encoded_request' => request_wrapper.encode,
@@ -15,19 +15,19 @@ describe Protobuf::Rpc::Middleware::Statsd do
15
15
  'response_type' => rpc_method.response_type,
16
16
  'rpc_method' => rpc_method,
17
17
  'rpc_service' => service_class,
18
- 'service_name' => service_name,
18
+ 'service_name' => service_name
19
19
  )
20
- }
20
+ end
21
21
  let(:method_name) { :find }
22
22
  let(:request) { request_type.new(:name => 'required') }
23
23
  let(:request_type) { rpc_method.request_type }
24
- let(:request_wrapper) {
24
+ let(:request_wrapper) do
25
25
  Protobuf::Socketrpc::Request.new(
26
26
  :service_name => service_name,
27
27
  :method_name => method_name.to_s,
28
28
  :request_proto => request
29
29
  )
30
- }
30
+ end
31
31
  let(:response) { rpc_method.response_type.new(:name => 'required') }
32
32
  let(:response_wrapper) { Protobuf::Socketrpc::Response.new(:response_proto => response) }
33
33
  let(:rpc_method) { service_class.rpcs[method_name] }
@@ -17,8 +17,9 @@ module ReverseModule
17
17
  rpc :reverse, ReverseRequest, ReverseResponse
18
18
  def reverse
19
19
  respond_with :reversed => request.input.reverse,
20
- :some_reversed_header => env.parent_env.has_key?('X-SOME-HEADER') ?
21
- env.parent_env['X-SOME-HEADER'].reverse : nil
20
+ :some_reversed_header => if env.parent_env.key?('X-SOME-HEADER')
21
+ env.parent_env['X-SOME-HEADER'].reverse
22
+ end
22
23
  end
23
24
  end
24
25
  end
@@ -33,79 +34,81 @@ describe Protobuf::Rpc::Http::Server do
33
34
  end
34
35
 
35
36
  it 'should return the correct response for ReverseModule::ReverseService.reverse' do
36
- response = client.post "/ReverseModule%3A%3AReverseService/reverse", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode()
37
- response.status.should eq 200
38
- response.headers['content-type'].should eq "application/x-protobuf"
39
- response.headers['x-protobuf-error'].should be_nil
40
- response.headers['x-protobuf-error-reason'].should be_nil
41
- response.body.should eq ReverseModule::ReverseResponse.new(:reversed => "hello world".reverse).encode()
37
+ response = client.post "/ReverseModule%3A%3AReverseService/reverse", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode
38
+ expect(response.status).to eq 200
39
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
40
+ expect(response.headers['x-protobuf-error']).to be_nil
41
+ expect(response.headers['x-protobuf-error-reason']).to be_nil
42
+ expect(response.body).to eq ReverseModule::ReverseResponse.new(:reversed => "hello world".reverse).encode
42
43
  end
43
44
 
44
45
  it 'should return the correct response for ReverseModule::ReverseService.reverse when some header is passed' do
45
46
  response = client.post "/ReverseModule%3A%3AReverseService/reverse",
46
- :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode(),
47
+ :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode,
47
48
  "X-SOME-HEADER" => "yes i am"
48
- response.status.should eq 200
49
- response.headers['content-type'].should eq "application/x-protobuf"
50
- response.headers['x-protobuf-error'].should be_nil
51
- response.headers['x-protobuf-error-reason'].should be_nil
52
- response.body.should eq ReverseModule::ReverseResponse.new(:reversed => "hello world".reverse,
53
- :some_reversed_header => "yes i am".reverse).encode()
49
+ expect(response.status).to eq 200
50
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
51
+ expect(response.headers['x-protobuf-error']).to be_nil
52
+ expect(response.headers['x-protobuf-error-reason']).to be_nil
53
+ expect(response.body).to eq ReverseModule::ReverseResponse.new(
54
+ :reversed => "hello world".reverse,
55
+ :some_reversed_header => "yes i am".reverse
56
+ ).encode
54
57
  end
55
58
 
56
59
  it 'should return METHOD_NOT_FOUND for ReverseModule::ReverseService.bobloblaw' do
57
- response = client.post "/ReverseModule%3A%3AReverseService/bobloblaw", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode()
58
- response.status.should eq 404
59
- response.headers['content-type'].should eq "application/x-protobuf"
60
- response.headers['x-protobuf-error'].should eq "ReverseModule::ReverseService#bobloblaw is not a defined RPC method."
61
- response.headers['x-protobuf-error-reason'].should eq Protobuf::Socketrpc::ErrorReason::METHOD_NOT_FOUND.to_s
62
- response.body.should eq ""
60
+ response = client.post "/ReverseModule%3A%3AReverseService/bobloblaw", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode
61
+ expect(response.status).to eq 404
62
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
63
+ expect(response.headers['x-protobuf-error']).to eq "ReverseModule::ReverseService#bobloblaw is not a defined RPC method."
64
+ expect(response.headers['x-protobuf-error-reason']).to eq Protobuf::Socketrpc::ErrorReason::METHOD_NOT_FOUND.to_s
65
+ expect(response.body).to eq ""
63
66
  end
64
67
 
65
68
  it 'should return SERVICE_NOT_FOUND for Bar::ReverseService.reverse' do
66
- response = client.post "/Bar%3A%3AReverseService/reverse", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode()
67
- response.status.should eq 404
68
- response.headers['content-type'].should eq "application/x-protobuf"
69
- response.headers['x-protobuf-error'].should eq "Service class Bar::ReverseService is not defined."
70
- response.headers['x-protobuf-error-reason'].should eq Protobuf::Socketrpc::ErrorReason::SERVICE_NOT_FOUND.to_s
71
- response.body.should eq ""
69
+ response = client.post "/Bar%3A%3AReverseService/reverse", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode
70
+ expect(response.status).to eq 404
71
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
72
+ expect(response.headers['x-protobuf-error']).to eq "Service class Bar::ReverseService is not defined."
73
+ expect(response.headers['x-protobuf-error-reason']).to eq Protobuf::Socketrpc::ErrorReason::SERVICE_NOT_FOUND.to_s
74
+ expect(response.body).to eq ""
72
75
  end
73
76
 
74
77
  it 'should return RPC_FAILED for missing input' do
75
78
  response = client.post "/ReverseModule%3A%3AReverseService/reverse", :input => ""
76
- response.status.should eq 500
77
- response.headers['content-type'].should eq "application/x-protobuf"
78
- response.headers['x-protobuf-error-reason'].should eq Protobuf::Socketrpc::ErrorReason::RPC_FAILED.to_s
79
- response.body.should eq ""
79
+ expect(response.status).to eq 400
80
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
81
+ expect(response.headers['x-protobuf-error-reason']).to eq Protobuf::Socketrpc::ErrorReason::BAD_REQUEST_DATA.to_s
82
+ expect(response.body).to eq ""
80
83
  end
81
84
 
82
85
  it 'should return RPC_ERROR for invalid input' do
83
86
  response = client.post "/ReverseModule%3A%3AReverseService/reverse", :input => "\\n\\x03foo"
84
- response.status.should eq 500
85
- response.headers['content-type'].should eq "application/x-protobuf"
86
- response.headers['x-protobuf-error-reason'].should eq Protobuf::Socketrpc::ErrorReason::RPC_ERROR.to_s
87
- response.body.should eq ""
87
+ expect(response.status).to eq 400
88
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
89
+ expect(response.headers['x-protobuf-error-reason']).to eq Protobuf::Socketrpc::ErrorReason::BAD_REQUEST_DATA.to_s
90
+ expect(response.body).to eq ""
88
91
  end
89
92
 
90
93
  it 'should return INVALID_REQUEST_PROTO for invalid URL' do
91
- response = client.post "/foo", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode()
92
- response.status.should eq 400
93
- response.headers['content-type'].should eq "application/x-protobuf"
94
- # response.headers['x-protobuf-error'].should eq "Service class Bar::ReverseService is not defined."
95
- response.headers['x-protobuf-error-reason'].should eq Protobuf::Socketrpc::ErrorReason::INVALID_REQUEST_PROTO.to_s
96
- response.body.should eq ""
94
+ response = client.post "/foo", :input => ReverseModule::ReverseRequest.new(:input => "hello world").encode
95
+ expect(response.status).to eq 400
96
+ expect(response.headers['content-type']).to eq "application/x-protobuf"
97
+ expect(response.headers['x-protobuf-error']).to eq "Expected path format /CLASS/METHOD"
98
+ expect(response.headers['x-protobuf-error-reason']).to eq Protobuf::Socketrpc::ErrorReason::INVALID_REQUEST_PROTO.to_s
99
+ expect(response.body).to eq ""
97
100
  end
98
101
  end
99
102
 
100
103
  describe '.running?' do
101
104
  it 'returns true if running' do
102
105
  subject.instance_variable_set(:@running, true)
103
- subject.running?.should be_true
106
+ expect(subject.running?).to be true
104
107
  end
105
108
 
106
109
  it 'returns false if not running' do
107
110
  subject.instance_variable_set(:@running, false)
108
- subject.running?.should be_false
111
+ expect(subject.running?).to be false
109
112
  end
110
113
  end
111
114
 
@@ -113,7 +116,7 @@ describe Protobuf::Rpc::Http::Server do
113
116
  it 'sets running to false' do
114
117
  # subject.instance_variable_set(:@workers, [])
115
118
  subject.stop
116
- subject.instance_variable_get(:@running).should be_false
119
+ expect(subject.instance_variable_get(:@running)).to be_falsey
117
120
  end
118
121
  end
119
122
  end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'spec/support/test/resource_service'
3
2
  require 'protobuf/rpc/servers/socket_runner'
4
3
  require 'protobuf/socket'
4
+ require SUPPORT_PATH.join('resource_service')
5
5
 
6
- describe Protobuf::Rpc::Socket::Server do
6
+ RSpec.describe Protobuf::Rpc::Socket::Server do
7
7
  before(:each) do
8
8
  load 'protobuf/socket.rb'
9
9
  end
@@ -14,7 +14,7 @@ describe Protobuf::Rpc::Socket::Server do
14
14
  @options = OpenStruct.new(:host => "127.0.0.1", :port => 9399, :backlog => 100, :threshold => 100)
15
15
  @runner = ::Protobuf::Rpc::SocketRunner.new(@options)
16
16
  @server = @runner.instance_variable_get(:@server)
17
- @server_thread = Thread.new(@runner) { |runner| runner.run }
17
+ @server_thread = Thread.new(@runner, &:run)
18
18
  Thread.pass until @server.running?
19
19
  end
20
20
 
@@ -24,15 +24,15 @@ describe Protobuf::Rpc::Socket::Server do
24
24
  end
25
25
 
26
26
  it "Runner provides a stop method" do
27
- @runner.should respond_to(:stop)
27
+ expect(@runner).to respond_to(:stop)
28
28
  end
29
29
 
30
30
  it "provides a stop method" do
31
- @server.should respond_to(:stop)
31
+ expect(@server).to respond_to(:stop)
32
32
  end
33
33
 
34
34
  it "signals the Server is running" do
35
- @server.should be_running
35
+ expect(@server).to be_running
36
36
  end
37
37
 
38
38
  end
@@ -1,15 +1,17 @@
1
1
  require 'spec_helper'
2
2
  require 'protobuf/rpc/servers/zmq/server'
3
3
 
4
- describe Protobuf::Rpc::Zmq::Server do
4
+ RSpec.describe Protobuf::Rpc::Zmq::Server do
5
5
  subject { described_class.new(options) }
6
6
 
7
- let(:options) {{
8
- :host => '127.0.0.1',
9
- :port => 9399,
10
- :worker_port => 9400,
11
- :workers_only => true
12
- }}
7
+ let(:options) do
8
+ {
9
+ :host => '127.0.0.1',
10
+ :port => 9399,
11
+ :worker_port => 9400,
12
+ :workers_only => true,
13
+ }
14
+ end
13
15
 
14
16
  before do
15
17
  load 'protobuf/zmq.rb'
@@ -22,12 +24,12 @@ describe Protobuf::Rpc::Zmq::Server do
22
24
  describe '.running?' do
23
25
  it 'returns true if running' do
24
26
  subject.instance_variable_set(:@running, true)
25
- subject.running?.should be_true
27
+ expect(subject.running?).to be true
26
28
  end
27
29
 
28
30
  it 'returns false if not running' do
29
31
  subject.instance_variable_set(:@running, false)
30
- subject.running?.should be_false
32
+ expect(subject.running?).to be false
31
33
  end
32
34
  end
33
35
 
@@ -35,7 +37,7 @@ describe Protobuf::Rpc::Zmq::Server do
35
37
  it 'sets running to false' do
36
38
  subject.instance_variable_set(:@workers, [])
37
39
  subject.stop
38
- subject.instance_variable_get(:@running).should be_false
40
+ expect(subject.instance_variable_get(:@running)).to be false
39
41
  end
40
42
  end
41
43
  end
@@ -4,7 +4,7 @@ class UtilTest
4
4
  include ::Protobuf::Rpc::Zmq::Util
5
5
  end
6
6
 
7
- describe ::Protobuf::Rpc::Zmq::Util do
7
+ RSpec.describe ::Protobuf::Rpc::Zmq::Util do
8
8
  before(:each) do
9
9
  load 'protobuf/zmq.rb'
10
10
  end
@@ -12,34 +12,34 @@ describe ::Protobuf::Rpc::Zmq::Util do
12
12
  subject { UtilTest.new }
13
13
  describe '#zmq_error_check' do
14
14
  it 'raises when the error code is less than 0' do
15
- expect {
15
+ expect do
16
16
  subject.zmq_error_check(-1, :test)
17
- }.to raise_error(/test/)
17
+ end.to raise_error(/test/)
18
18
  end
19
19
 
20
20
  it 'retrieves the error string from ZeroMQ' do
21
- ZMQ::Util.stub(:error_string).and_return('an error from zmq')
22
- expect {
21
+ allow(ZMQ::Util).to receive(:error_string).and_return('an error from zmq')
22
+ expect do
23
23
  subject.zmq_error_check(-1, :test)
24
- }.to raise_error(RuntimeError, /an error from zmq/i)
24
+ end.to raise_error(RuntimeError, /an error from zmq/i)
25
25
  end
26
26
 
27
27
  it 'does nothing if the error code is > 0' do
28
- expect {
28
+ expect do
29
29
  subject.zmq_error_check(1, :test)
30
- }.to_not raise_error
30
+ end.to_not raise_error
31
31
  end
32
32
 
33
33
  it 'does nothing if the error code is == 0' do
34
- expect {
34
+ expect do
35
35
  subject.zmq_error_check(0, :test)
36
- }.to_not raise_error
36
+ end.to_not raise_error
37
37
  end
38
38
  end
39
39
 
40
40
  describe '#log_signature' do
41
41
  it 'returns the signature for the log' do
42
- subject.log_signature.should include('server', 'UtilTest')
42
+ expect(subject.log_signature).to include('server', 'UtilTest')
43
43
  end
44
44
  end
45
45
 
@@ -1,20 +1,20 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ::Protobuf::Rpc::Zmq::Worker do
4
- before(:each) do
3
+ RSpec.describe ::Protobuf::Rpc::Zmq::Worker do
4
+ before(:each) do
5
5
  load 'protobuf/zmq.rb'
6
6
 
7
7
  fake_socket = double
8
- fake_socket.should_receive(:connect).and_return(0)
9
- fake_socket.should_receive(:send_string).and_return(0)
8
+ expect(fake_socket).to receive(:connect).and_return(0)
9
+ expect(fake_socket).to receive(:send_string).and_return(0)
10
10
 
11
11
  fake_context = double
12
- fake_context.should_receive(:socket).and_return( fake_socket )
13
- ::ZMQ::Context.should_receive(:new).and_return( fake_context )
12
+ expect(fake_context).to receive(:socket).and_return(fake_socket)
13
+ expect(::ZMQ::Context).to receive(:new).and_return(fake_context)
14
14
  end
15
15
 
16
16
  subject do
17
- described_class.new({ :host => '127.0.0.1', :port => 9400 })
17
+ described_class.new(:host => '127.0.0.1', :port => 9400)
18
18
  end
19
19
 
20
20
  describe '#run' do
@@ -2,48 +2,48 @@ require 'spec_helper'
2
2
 
3
3
  require 'protobuf/rpc/service_directory'
4
4
 
5
- describe ::Protobuf::Rpc::ServiceDirectory do
5
+ RSpec.describe ::Protobuf::Rpc::ServiceDirectory do
6
6
  subject { described_class.instance }
7
7
 
8
- let(:echo_server) {
8
+ let(:echo_server) do
9
9
  ::Protobuf::Rpc::DynamicDiscovery::Server.new(
10
10
  :uuid => 'echo',
11
11
  :address => '127.0.0.1',
12
12
  :port => '1111',
13
13
  :ttl => 10,
14
- :services => %w[EchoService]
14
+ :services => %w(EchoService)
15
15
  )
16
- }
16
+ end
17
17
 
18
- let(:hello_server) {
18
+ let(:hello_server) do
19
19
  ::Protobuf::Rpc::DynamicDiscovery::Server.new(
20
20
  :uuid => "hello",
21
21
  :address => '127.0.0.1',
22
22
  :port => "1112",
23
23
  :ttl => 10,
24
- :services => %w[HelloService]
24
+ :services => %w(HelloService)
25
25
  )
26
- }
26
+ end
27
27
 
28
- let(:hello_server_with_short_ttl) {
28
+ let(:hello_server_with_short_ttl) do
29
29
  ::Protobuf::Rpc::DynamicDiscovery::Server.new(
30
30
  :uuid => "hello_server_with_short_ttl",
31
31
  :address => '127.0.0.1',
32
32
  :port => '1113',
33
33
  :ttl => 1,
34
- :services => %w[HelloService]
34
+ :services => %w(HelloService)
35
35
  )
36
- }
36
+ end
37
37
 
38
- let(:combo_server) {
38
+ let(:combo_server) do
39
39
  ::Protobuf::Rpc::DynamicDiscovery::Server.new(
40
40
  :uuid => "combo",
41
41
  :address => '127.0.0.1',
42
42
  :port => '1114',
43
43
  :ttl => 10,
44
- :services => %w[HelloService EchoService]
44
+ :services => %w(HelloService EchoService)
45
45
  )
46
- }
46
+ end
47
47
 
48
48
  before(:all) do
49
49
  @address = "127.0.0.1"
@@ -56,10 +56,8 @@ describe ::Protobuf::Rpc::ServiceDirectory do
56
56
  end
57
57
 
58
58
  def expect_event_trigger(event)
59
- ::ActiveSupport::Notifications
60
- .should_receive(:instrument)
61
- .with(event, hash_including(:listing => an_instance_of(::Protobuf::Rpc::ServiceDirectory::Listing)))
62
- .once
59
+ expect(::ActiveSupport::Notifications).to receive(:instrument)
60
+ .with(event, hash_including(:listing => an_instance_of(::Protobuf::Rpc::ServiceDirectory::Listing))).once
63
61
  end
64
62
 
65
63
  def send_beacon(type, server)
@@ -74,29 +72,29 @@ describe ::Protobuf::Rpc::ServiceDirectory do
74
72
  end
75
73
 
76
74
  it "should be a singleton" do
77
- subject.should be_a_kind_of(Singleton)
75
+ expect(subject).to be_a_kind_of(Singleton)
78
76
  end
79
77
 
80
78
  it "should be configured to listen to address 127.0.0.1" do
81
- described_class.address.should eq '127.0.0.1'
79
+ expect(described_class.address).to eq '127.0.0.1'
82
80
  end
83
81
 
84
82
  it "should be configured to listen to port 33333" do
85
- described_class.port.should eq 33333
83
+ expect(described_class.port).to eq 33333
86
84
  end
87
85
 
88
86
  it "should defer .start to the instance#start" do
89
- described_class.instance.should_receive(:start)
87
+ expect(described_class.instance).to receive(:start)
90
88
  described_class.start
91
89
  end
92
90
 
93
91
  it "should yeild itself to blocks passed to .start" do
94
- described_class.instance.stub(:start)
92
+ allow(described_class.instance).to receive(:start)
95
93
  expect { |b| described_class.start(&b) }.to yield_with_args(described_class)
96
94
  end
97
95
 
98
96
  it "should defer .stop to the instance#stop" do
99
- described_class.instance.should_receive(:stop)
97
+ expect(described_class.instance).to receive(:stop)
100
98
  described_class.stop
101
99
  end
102
100
 
@@ -106,20 +104,20 @@ describe ::Protobuf::Rpc::ServiceDirectory do
106
104
  describe "#lookup" do
107
105
  it "should return nil" do
108
106
  send_beacon(:heartbeat, echo_server)
109
- subject.lookup("EchoService").should be_nil
107
+ expect(subject.lookup("EchoService")).to be_nil
110
108
  end
111
109
  end
112
110
 
113
111
  describe "#restart" do
114
112
  it "should start the service" do
115
113
  subject.restart
116
- subject.should be_running
114
+ expect(subject).to be_running
117
115
  end
118
116
  end
119
117
 
120
118
  describe "#running" do
121
119
  it "should be false" do
122
- subject.should_not be_running
120
+ expect(subject).to_not be_running
123
121
  end
124
122
  end
125
123
 
@@ -134,7 +132,7 @@ describe ::Protobuf::Rpc::ServiceDirectory do
134
132
  before { subject.start }
135
133
  after { subject.stop }
136
134
 
137
- it { should be_running }
135
+ specify { expect(subject).to be_running }
138
136
 
139
137
  it "should trigger added events" do
140
138
  expect_event_trigger("directory.listing.added")
@@ -159,13 +157,13 @@ describe ::Protobuf::Rpc::ServiceDirectory do
159
157
  send_beacon(:heartbeat, hello_server)
160
158
  send_beacon(:heartbeat, combo_server)
161
159
 
162
- subject.all_listings_for("HelloService").size.should eq(2)
160
+ expect(subject.all_listings_for("HelloService").size).to eq(2)
163
161
  end
164
162
  end
165
163
 
166
164
  context "when no listings are present" do
167
165
  it "returns and empty array" do
168
- subject.all_listings_for("HelloService").size.should eq(0)
166
+ expect(subject.all_listings_for("HelloService").size).to eq(0)
169
167
  end
170
168
  end
171
169
  end
@@ -176,16 +174,16 @@ describe ::Protobuf::Rpc::ServiceDirectory do
176
174
  send_beacon(:heartbeat, echo_server)
177
175
  send_beacon(:heartbeat, combo_server)
178
176
 
179
- expect { |block|
177
+ expect do |block|
180
178
  subject.each_listing(&block)
181
- }.to yield_control.exactly(3).times
179
+ end.to yield_control.exactly(3).times
182
180
  end
183
181
  end
184
182
 
185
183
  describe "#lookup" do
186
184
  it "should provide listings by service" do
187
185
  send_beacon(:heartbeat, hello_server)
188
- subject.lookup("HelloService").to_hash.should eq hello_server.to_hash
186
+ expect(subject.lookup("HelloService").to_hash).to eq hello_server.to_hash
189
187
  end
190
188
 
191
189
  it "should return random listings" do
@@ -193,14 +191,14 @@ describe ::Protobuf::Rpc::ServiceDirectory do
193
191
  send_beacon(:heartbeat, combo_server)
194
192
 
195
193
  uuids = 100.times.map { subject.lookup("HelloService").uuid }
196
- uuids.count("hello").should be_within(25).of(50)
197
- uuids.count("combo").should be_within(25).of(50)
194
+ expect(uuids.count("hello")).to be_within(25).of(50)
195
+ expect(uuids.count("combo")).to be_within(25).of(50)
198
196
  end
199
197
 
200
198
  it "should not return expired listings" do
201
199
  send_beacon(:heartbeat, hello_server_with_short_ttl)
202
- sleep 1
203
- subject.lookup("HelloService").should be_nil
200
+ sleep 5
201
+ expect(subject.lookup("HelloService")).to be_nil
204
202
  end
205
203
 
206
204
  it "should not return flatlined servers" do
@@ -209,7 +207,7 @@ describe ::Protobuf::Rpc::ServiceDirectory do
209
207
  send_beacon(:flatline, echo_server)
210
208
 
211
209
  uuids = 100.times.map { subject.lookup("EchoService").uuid }
212
- uuids.count("combo").should eq 100
210
+ expect(uuids.count("combo")).to eq 100
213
211
  end
214
212
 
215
213
  it "should return up-to-date listings" do
@@ -217,13 +215,13 @@ describe ::Protobuf::Rpc::ServiceDirectory do
217
215
  echo_server.port = "7777"
218
216
  send_beacon(:heartbeat, echo_server)
219
217
 
220
- subject.lookup("EchoService").port.should eq "7777"
218
+ expect(subject.lookup("EchoService").port).to eq "7777"
221
219
  end
222
220
 
223
221
  context 'when given service identifier is a class name' do
224
222
  it 'returns the listing corresponding to the class name' do
225
223
  send_beacon(:heartbeat, echo_server)
226
- subject.lookup(EchoService).uuid.should eq echo_server.uuid
224
+ expect(subject.lookup(EchoService).uuid).to eq echo_server.uuid
227
225
  end
228
226
  end
229
227
  end
@@ -233,13 +231,13 @@ describe ::Protobuf::Rpc::ServiceDirectory do
233
231
  send_beacon(:heartbeat, echo_server)
234
232
  send_beacon(:heartbeat, combo_server)
235
233
  subject.restart
236
- subject.lookup("EchoService").should be_nil
234
+ expect(subject.lookup("EchoService")).to be_nil
237
235
  end
238
236
  end
239
237
 
240
238
  describe "#running" do
241
239
  it "should be true" do
242
- subject.should be_running
240
+ expect(subject).to be_running
243
241
  end
244
242
  end
245
243
 
@@ -248,29 +246,29 @@ describe ::Protobuf::Rpc::ServiceDirectory do
248
246
  send_beacon(:heartbeat, echo_server)
249
247
  send_beacon(:heartbeat, combo_server)
250
248
  subject.stop
251
- subject.lookup("EchoService").should be_nil
249
+ expect(subject.lookup("EchoService")).to be_nil
252
250
  end
253
251
 
254
252
  it "should stop the server" do
255
253
  subject.stop
256
- subject.should_not be_running
254
+ expect(subject).to_not be_running
257
255
  end
258
256
  end
259
257
  end
260
258
 
261
259
  if ENV.key?("BENCH")
262
260
  context "performance" do
263
- let(:servers) {
264
- 100.times.collect do |x|
261
+ let(:servers) do
262
+ 100.times.map do |x|
265
263
  ::Protobuf::Rpc::DynamicDiscovery::Server.new(
266
264
  :uuid => "performance_server#{x + 1}",
267
265
  :address => '127.0.0.1',
268
266
  :port => (5555 + x).to_s,
269
267
  :ttl => rand(1..5),
270
- :services => 10.times.collect { |y| "PerformanceService#{y}" }
268
+ :services => 10.times.map { |y| "PerformanceService#{y}" }
271
269
  )
272
270
  end
273
- }
271
+ end
274
272
 
275
273
  before do
276
274
  require 'benchmark'
@@ -285,8 +283,8 @@ describe ::Protobuf::Rpc::ServiceDirectory do
285
283
  it "should perform lookups in constant time" do
286
284
  print "\n\n"
287
285
  Benchmark.bm(17) do |x|
288
- x.report(" 1_000 lookups:") { 1_000.times { subject.lookup("PerformanceService#{rand(0..9)}") } }
289
- x.report(" 10_000 lookups:") { 10_000.times { subject.lookup("PerformanceService#{rand(0..9)}") } }
286
+ x.report(" 1_000 lookups:") { 1_000.times { subject.lookup("PerformanceService#{rand(0..9)}") } }
287
+ x.report(" 10_000 lookups:") { 10_000.times { subject.lookup("PerformanceService#{rand(0..9)}") } }
290
288
  x.report("100_000 lookups:") { 100_000.times { subject.lookup("PerformanceService#{rand(0..9)}") } }
291
289
  end
292
290
  end