prepor-protobuf 3.5.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 (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +51 -0
  4. data/.rubocop_todo.yml +89 -0
  5. data/.travis.yml +25 -0
  6. data/.yardopts +5 -0
  7. data/CHANGES.md +256 -0
  8. data/CONTRIBUTING.md +16 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +33 -0
  12. data/Rakefile +64 -0
  13. data/bin/protoc-gen-ruby +16 -0
  14. data/bin/rpc_server +5 -0
  15. data/install-protobuf.sh +28 -0
  16. data/lib/protobuf.rb +100 -0
  17. data/lib/protobuf/cli.rb +242 -0
  18. data/lib/protobuf/code_generator.rb +44 -0
  19. data/lib/protobuf/decoder.rb +73 -0
  20. data/lib/protobuf/deprecation.rb +112 -0
  21. data/lib/protobuf/descriptors.rb +3 -0
  22. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +48 -0
  23. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +251 -0
  24. data/lib/protobuf/encoder.rb +67 -0
  25. data/lib/protobuf/enum.rb +303 -0
  26. data/lib/protobuf/exceptions.rb +9 -0
  27. data/lib/protobuf/field.rb +74 -0
  28. data/lib/protobuf/field/base_field.rb +267 -0
  29. data/lib/protobuf/field/bool_field.rb +59 -0
  30. data/lib/protobuf/field/bytes_field.rb +82 -0
  31. data/lib/protobuf/field/double_field.rb +25 -0
  32. data/lib/protobuf/field/enum_field.rb +68 -0
  33. data/lib/protobuf/field/field_array.rb +87 -0
  34. data/lib/protobuf/field/fixed32_field.rb +25 -0
  35. data/lib/protobuf/field/fixed64_field.rb +28 -0
  36. data/lib/protobuf/field/float_field.rb +41 -0
  37. data/lib/protobuf/field/int32_field.rb +21 -0
  38. data/lib/protobuf/field/int64_field.rb +21 -0
  39. data/lib/protobuf/field/integer_field.rb +23 -0
  40. data/lib/protobuf/field/message_field.rb +65 -0
  41. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  42. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  43. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  44. data/lib/protobuf/field/sint32_field.rb +21 -0
  45. data/lib/protobuf/field/sint64_field.rb +21 -0
  46. data/lib/protobuf/field/string_field.rb +34 -0
  47. data/lib/protobuf/field/uint32_field.rb +21 -0
  48. data/lib/protobuf/field/uint64_field.rb +21 -0
  49. data/lib/protobuf/field/varint_field.rb +73 -0
  50. data/lib/protobuf/generators/base.rb +70 -0
  51. data/lib/protobuf/generators/enum_generator.rb +41 -0
  52. data/lib/protobuf/generators/extension_generator.rb +27 -0
  53. data/lib/protobuf/generators/field_generator.rb +131 -0
  54. data/lib/protobuf/generators/file_generator.rb +135 -0
  55. data/lib/protobuf/generators/group_generator.rb +112 -0
  56. data/lib/protobuf/generators/message_generator.rb +98 -0
  57. data/lib/protobuf/generators/printable.rb +160 -0
  58. data/lib/protobuf/generators/service_generator.rb +26 -0
  59. data/lib/protobuf/lifecycle.rb +33 -0
  60. data/lib/protobuf/logging.rb +39 -0
  61. data/lib/protobuf/message.rb +193 -0
  62. data/lib/protobuf/message/fields.rb +133 -0
  63. data/lib/protobuf/message/serialization.rb +89 -0
  64. data/lib/protobuf/optionable.rb +23 -0
  65. data/lib/protobuf/rpc/buffer.rb +77 -0
  66. data/lib/protobuf/rpc/client.rb +168 -0
  67. data/lib/protobuf/rpc/connector.rb +19 -0
  68. data/lib/protobuf/rpc/connectors/base.rb +55 -0
  69. data/lib/protobuf/rpc/connectors/common.rb +176 -0
  70. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  71. data/lib/protobuf/rpc/connectors/zmq.rb +322 -0
  72. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +49 -0
  73. data/lib/protobuf/rpc/env.rb +58 -0
  74. data/lib/protobuf/rpc/error.rb +28 -0
  75. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  76. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  77. data/lib/protobuf/rpc/middleware.rb +25 -0
  78. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  79. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  80. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  81. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  82. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  83. data/lib/protobuf/rpc/rpc.pb.rb +55 -0
  84. data/lib/protobuf/rpc/server.rb +39 -0
  85. data/lib/protobuf/rpc/servers/socket/server.rb +123 -0
  86. data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
  87. data/lib/protobuf/rpc/servers/socket_runner.rb +40 -0
  88. data/lib/protobuf/rpc/servers/zmq/broker.rb +193 -0
  89. data/lib/protobuf/rpc/servers/zmq/server.rb +320 -0
  90. data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
  91. data/lib/protobuf/rpc/servers/zmq/worker.rb +104 -0
  92. data/lib/protobuf/rpc/servers/zmq_runner.rb +62 -0
  93. data/lib/protobuf/rpc/service.rb +179 -0
  94. data/lib/protobuf/rpc/service_directory.rb +253 -0
  95. data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
  96. data/lib/protobuf/rpc/service_filters.rb +272 -0
  97. data/lib/protobuf/rpc/stat.rb +97 -0
  98. data/lib/protobuf/socket.rb +21 -0
  99. data/lib/protobuf/tasks.rb +1 -0
  100. data/lib/protobuf/tasks/compile.rake +61 -0
  101. data/lib/protobuf/version.rb +3 -0
  102. data/lib/protobuf/wire_type.rb +10 -0
  103. data/lib/protobuf/zmq.rb +21 -0
  104. data/proto/dynamic_discovery.proto +44 -0
  105. data/proto/google/protobuf/compiler/plugin.proto +147 -0
  106. data/proto/google/protobuf/descriptor.proto +620 -0
  107. data/proto/rpc.proto +62 -0
  108. data/protobuf.gemspec +51 -0
  109. data/spec/benchmark/tasks.rb +139 -0
  110. data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
  111. data/spec/data/data.bin +3 -0
  112. data/spec/data/types.bin +0 -0
  113. data/spec/encoding/all_types_spec.rb +105 -0
  114. data/spec/encoding/extreme_values_spec.rb +0 -0
  115. data/spec/functional/class_inheritance_spec.rb +52 -0
  116. data/spec/functional/socket_server_spec.rb +59 -0
  117. data/spec/functional/zmq_server_spec.rb +105 -0
  118. data/spec/lib/protobuf/cli_spec.rb +273 -0
  119. data/spec/lib/protobuf/code_generator_spec.rb +60 -0
  120. data/spec/lib/protobuf/enum_spec.rb +265 -0
  121. data/spec/lib/protobuf/field/bool_field_spec.rb +51 -0
  122. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  123. data/spec/lib/protobuf/field/float_field_spec.rb +55 -0
  124. data/spec/lib/protobuf/field/int32_field_spec.rb +89 -0
  125. data/spec/lib/protobuf/field/string_field_spec.rb +45 -0
  126. data/spec/lib/protobuf/field_spec.rb +191 -0
  127. data/spec/lib/protobuf/generators/base_spec.rb +84 -0
  128. data/spec/lib/protobuf/generators/enum_generator_spec.rb +73 -0
  129. data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
  130. data/spec/lib/protobuf/generators/field_generator_spec.rb +102 -0
  131. data/spec/lib/protobuf/generators/file_generator_spec.rb +32 -0
  132. data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
  133. data/spec/lib/protobuf/generators/service_generator_spec.rb +46 -0
  134. data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
  135. data/spec/lib/protobuf/message_spec.rb +526 -0
  136. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  137. data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
  138. data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
  139. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  140. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
  141. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  142. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +117 -0
  143. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  144. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  145. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  146. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  147. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
  148. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
  149. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
  150. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
  151. data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
  152. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
  153. data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
  154. data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
  155. data/spec/lib/protobuf/rpc/stat_spec.rb +68 -0
  156. data/spec/lib/protobuf_spec.rb +98 -0
  157. data/spec/spec_helper.rb +44 -0
  158. data/spec/support/all.rb +6 -0
  159. data/spec/support/packed_field.rb +22 -0
  160. data/spec/support/server.rb +64 -0
  161. data/spec/support/test/all_types.data.bin +0 -0
  162. data/spec/support/test/all_types.data.txt +119 -0
  163. data/spec/support/test/defaults.pb.rb +27 -0
  164. data/spec/support/test/defaults.proto +9 -0
  165. data/spec/support/test/enum.pb.rb +55 -0
  166. data/spec/support/test/enum.proto +34 -0
  167. data/spec/support/test/extended.pb.rb +18 -0
  168. data/spec/support/test/extended.proto +10 -0
  169. data/spec/support/test/extreme_values.data.bin +0 -0
  170. data/spec/support/test/google_unittest.pb.rb +537 -0
  171. data/spec/support/test/google_unittest.proto +713 -0
  172. data/spec/support/test/google_unittest_import.pb.rb +39 -0
  173. data/spec/support/test/google_unittest_import.proto +64 -0
  174. data/spec/support/test/google_unittest_import_public.pb.rb +10 -0
  175. data/spec/support/test/google_unittest_import_public.proto +38 -0
  176. data/spec/support/test/multi_field_extensions.pb.rb +58 -0
  177. data/spec/support/test/multi_field_extensions.proto +33 -0
  178. data/spec/support/test/resource.pb.rb +119 -0
  179. data/spec/support/test/resource.proto +94 -0
  180. data/spec/support/test/resource_service.rb +23 -0
  181. data/spec/support/test_app_file.rb +2 -0
  182. metadata +502 -0
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+ require 'spec/support/test/resource_service'
3
+
4
+ RSpec.describe Protobuf::Rpc::Service do
5
+
6
+ context 'class methods' do
7
+ subject { Test::ResourceService }
8
+
9
+ before :each do
10
+ reset_service_location Test::ResourceService
11
+ end
12
+
13
+ describe '.host' do
14
+ specify { expect(subject.host).to eq described_class::DEFAULT_HOST }
15
+ end
16
+
17
+ describe '.host=' do
18
+ before { subject.host = 'mynewhost.com' }
19
+ specify { expect(subject.host).to eq 'mynewhost.com' }
20
+ end
21
+
22
+ describe '.port' do
23
+ specify { expect(subject.port).to eq described_class::DEFAULT_PORT }
24
+ end
25
+
26
+ describe '.port=' do
27
+ before { subject.port = 12345 }
28
+ specify { expect(subject.port).to eq 12345 }
29
+ end
30
+
31
+ describe '.configure' do
32
+ context 'when providing a host' do
33
+ before { subject.configure(:host => 'mynewhost.com') }
34
+ specify { expect(subject.host).to eq 'mynewhost.com' }
35
+ end
36
+
37
+ context 'when providing a port' do
38
+ before { subject.configure(:port => 12345) }
39
+ specify { expect(subject.port).to eq 12345 }
40
+ end
41
+ end
42
+
43
+ describe '.located_at' do
44
+ context 'when given location is empty' do
45
+ before { subject.located_at(nil) }
46
+ specify { expect(subject.host).to eq described_class::DEFAULT_HOST }
47
+ specify { expect(subject.port).to eq described_class::DEFAULT_PORT }
48
+ end
49
+
50
+ context 'when given location is invalid' do
51
+ before { subject.located_at('i like pie') }
52
+ specify { expect(subject.host).to eq described_class::DEFAULT_HOST }
53
+ specify { expect(subject.port).to eq described_class::DEFAULT_PORT }
54
+ end
55
+
56
+ context 'when given location contains a host and port' do
57
+ before { subject.located_at('mynewdomain.com:12345') }
58
+ specify { expect(subject.host).to eq 'mynewdomain.com' }
59
+ specify { expect(subject.port).to eq 12345 }
60
+ end
61
+ end
62
+
63
+ describe '.client' do
64
+ it 'initializes a client object for this service' do
65
+ client = double('client')
66
+ expect(::Protobuf::Rpc::Client).to receive(:new)
67
+ .with(hash_including(
68
+ :service => subject,
69
+ :host => subject.host,
70
+ :port => subject.port,
71
+ )).and_return(client)
72
+ expect(subject.client).to eq client
73
+ end
74
+ end
75
+
76
+ describe '.rpc' do
77
+ before { Test::ResourceService.rpc(:update, Test::ResourceFindRequest, Test::Resource) }
78
+ subject { Test::ResourceService.rpcs[:update] }
79
+ specify { expect(subject.method).to eq :update }
80
+ specify { expect(subject.request_type).to eq Test::ResourceFindRequest }
81
+ specify { expect(subject.response_type).to eq Test::Resource }
82
+ end
83
+
84
+ describe '.rpc_method?' do
85
+ before { Test::ResourceService.rpc(:delete, Test::Resource, Test::Resource) }
86
+
87
+ context 'when given name is a pre-defined rpc method' do
88
+ it 'returns true' do
89
+ expect(subject.rpc_method?(:delete)).to be true
90
+ end
91
+ end
92
+
93
+ context 'when given name is not a pre-defined rpc method' do
94
+ it 'returns false' do
95
+ expect(subject.rpc_method?(:zoobaboo)).to be false
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ context 'instance methods' do
102
+ context 'when invoking a service call' do
103
+ before do
104
+ stub_const('NewTestService', Class.new(Protobuf::Rpc::Service) do
105
+ rpc :find_with_implied_response, Test::ResourceFindRequest, Test::Resource
106
+ def find_with_implied_response
107
+ response.name = 'Implicit response'
108
+ end
109
+
110
+ rpc :find_with_respond_with, Test::ResourceFindRequest, Test::Resource
111
+ def find_with_respond_with
112
+ custom = Test::Resource.new(:name => 'Custom response')
113
+ respond_with(custom)
114
+ end
115
+
116
+ rpc :find_with_rpc_failed, Test::ResourceFindRequest, Test::Resource
117
+ def find_with_rpc_failed
118
+ rpc_failed('This is a failed endpoint')
119
+ response.name = 'Name will still be set'
120
+ end
121
+ end)
122
+ end
123
+
124
+ let(:request) { Test::ResourceFindRequest.new(:name => 'resource') }
125
+ let(:response) { Test::Resource.new }
126
+
127
+ context 'when calling the rpc method' do
128
+ context 'when response is implied' do
129
+ let(:env) do
130
+ Protobuf::Rpc::Env.new(
131
+ 'request' => request,
132
+ 'response_type' => response_type,
133
+ )
134
+ end
135
+ let(:response_type) { service.rpcs[:find_with_implied_response].response_type }
136
+ let(:service) { NewTestService }
137
+
138
+ subject { NewTestService.new(env) }
139
+
140
+ before { subject.find_with_implied_response }
141
+ specify { expect(subject.response).to be_a(Test::Resource) }
142
+ specify { expect(subject.response.name).to eq 'Implicit response' }
143
+ end
144
+
145
+ context 'when using respond_with paradigm' do
146
+ let(:env) do
147
+ Protobuf::Rpc::Env.new(
148
+ 'method_name' => :find_with_respond_with,
149
+ 'request' => request,
150
+ )
151
+ end
152
+
153
+ subject { NewTestService.new(env) }
154
+
155
+ before { subject.find_with_respond_with }
156
+ specify { expect(subject.response).to be_a(Test::Resource) }
157
+ specify { expect(subject.response.name).to eq 'Custom response' }
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+ require 'timecop'
3
+ require 'active_support/core_ext/numeric/time'
4
+
5
+ RSpec.describe ::Protobuf::Rpc::Stat do
6
+
7
+ before(:all) do
8
+ BarService = ::Struct.new(:method_name) unless defined?(BarService)
9
+ end
10
+
11
+ describe 'server mode' do
12
+ it 'describes a server response to a client' do
13
+ ::Timecop.freeze(10.minutes.ago) do
14
+ stats = ::Protobuf::Rpc::Stat.new(:SERVER)
15
+ stats.client = 'myserver1'
16
+ stats.dispatcher = double('dispatcher', :service => BarService.new(:find_bars))
17
+ stats.request_size = 43
18
+ stats.response_size = 1302
19
+
20
+ ::Timecop.freeze(1.62.seconds.from_now) do
21
+ stats.stop
22
+ expect(stats.to_s).to eq "[SRV] - myserver1 - #{stats.trace_id} - BarService#find_bars - 43B/1302B - 1.62s - #{::Time.now.iso8601}"
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'when request is still running' do
28
+ it 'omits response size, duration, and timestamp' do
29
+ stats = ::Protobuf::Rpc::Stat.new(:SERVER)
30
+ stats.client = 'myserver1'
31
+ stats.dispatcher = double('dispatcher', :service => BarService.new(:find_bars))
32
+ stats.request_size = 43
33
+ expect(stats.to_s).to eq "[SRV] - myserver1 - #{stats.trace_id} - BarService#find_bars - 43B/-"
34
+ end
35
+ end
36
+ end
37
+
38
+ describe 'client mode' do
39
+ it 'describes a client request to a server' do
40
+ ::Timecop.freeze(10.minutes.ago) do
41
+ stats = ::Protobuf::Rpc::Stat.new(:CLIENT)
42
+ stats.server = ['30000', 'myserver1.myhost.com']
43
+ stats.service = 'Foo::BarService'
44
+ stats.method_name = 'find_bars'
45
+ stats.request_size = 37
46
+ stats.response_size = 12345
47
+
48
+ ::Timecop.freeze(0.832.seconds.from_now) do
49
+ stats.stop
50
+ expect(stats.to_s).to eq "[CLT] - myserver1.myhost.com:30000 - #{stats.trace_id} - Foo::BarService#find_bars - 37B/12345B - 0.832s - #{::Time.now.iso8601}"
51
+ end
52
+
53
+ end
54
+ end
55
+
56
+ context 'when request is still running' do
57
+ it 'omits response size, duration, and timestamp' do
58
+ stats = ::Protobuf::Rpc::Stat.new(:CLIENT)
59
+ stats.server = ['30000', 'myserver1.myhost.com']
60
+ stats.service = 'Foo::BarService'
61
+ stats.method_name = 'find_bars'
62
+ stats.request_size = 37
63
+ expect(stats.to_s).to eq "[CLT] - myserver1.myhost.com:30000 - #{stats.trace_id} - Foo::BarService#find_bars - 37B/-"
64
+ end
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+ require 'protobuf'
3
+
4
+ RSpec.describe ::Protobuf do
5
+
6
+ describe '.client_host' do
7
+ after { ::Protobuf.client_host = nil }
8
+
9
+ subject { ::Protobuf.client_host }
10
+
11
+ context 'when client_host is not pre-configured' do
12
+ it { is_expected.to eq `hostname`.chomp }
13
+ end
14
+
15
+ context 'when client_host is pre-configured' do
16
+ let(:hostname) { 'override.myhost.com' }
17
+ before { ::Protobuf.client_host = hostname }
18
+ it { is_expected.to eq hostname }
19
+ end
20
+ end
21
+
22
+ describe '.connector_type' do
23
+ before { described_class.instance_variable_set(:@connector_type, nil) }
24
+
25
+ it 'defaults to socket' do
26
+ expect(described_class.connector_type).to eq :socket
27
+ end
28
+
29
+ it 'accepts socket or zmq' do
30
+ [:socket, :zmq].each do |type|
31
+ described_class.connector_type = type
32
+ expect(described_class.connector_type).to eq type
33
+ end
34
+ end
35
+
36
+ it 'does not accept other types' do
37
+ [:hello, :world, :evented].each do |type|
38
+ expect do
39
+ described_class.connector_type = type
40
+ end.to raise_error(ArgumentError)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe '.gc_pause_server_request?' do
46
+ before { described_class.instance_variable_set(:@gc_pause_server_request, nil) }
47
+
48
+ it 'defaults to a false value' do
49
+ expect(described_class.gc_pause_server_request?).to be false
50
+ end
51
+
52
+ it 'is settable' do
53
+ described_class.gc_pause_server_request = true
54
+ expect(described_class.gc_pause_server_request?).to be true
55
+ end
56
+ end
57
+
58
+ describe '.print_deprecation_warnings?' do
59
+ before { described_class.instance_variable_set(:@print_deprecation_warnings, nil) }
60
+
61
+ it 'defaults to a true value' do
62
+ expect(described_class.print_deprecation_warnings?).to be true
63
+ end
64
+
65
+ it 'is settable' do
66
+ described_class.print_deprecation_warnings = false
67
+ expect(described_class.print_deprecation_warnings?).to be false
68
+ end
69
+
70
+ context 'when ENV["PB_IGNORE_DEPRECATIONS"] present' do
71
+ it 'defaults to a false value' do
72
+ ENV['PB_IGNORE_DEPRECATIONS'] = '1'
73
+ expect(described_class.print_deprecation_warnings?).to be false
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '.ignore_unknown_fields?' do
79
+ before do
80
+ if described_class.instance_variable_defined?(:@_ignore_unknown_fields)
81
+ described_class.send(:remove_instance_variable, :@_ignore_unknown_fields)
82
+ end
83
+ end
84
+
85
+ it 'defaults to a true value' do
86
+ expect(described_class.ignore_unknown_fields?).to be true
87
+ end
88
+
89
+ it 'is settable' do
90
+ expect do
91
+ described_class.ignore_unknown_fields = false
92
+ end.to change {
93
+ described_class.ignore_unknown_fields?
94
+ }.from(true).to(false)
95
+ end
96
+ end
97
+
98
+ end
@@ -0,0 +1,44 @@
1
+ require 'timeout'
2
+ require 'rubygems'
3
+ require 'bundler'
4
+ Bundler.setup :default, :development, :test
5
+ require 'pry'
6
+
7
+ $LOAD_PATH << ::File.expand_path('../..', __FILE__)
8
+ $LOAD_PATH << ::File.expand_path('../support', __FILE__)
9
+
10
+ require 'protobuf'
11
+ require 'protobuf/rpc/server'
12
+ require ::File.expand_path('../support/all', __FILE__)
13
+
14
+ $LOAD_PATH << ::File.expand_path("../../lib/protobuf/descriptors", __FILE__)
15
+ require 'google/protobuf/compiler/plugin.pb'
16
+
17
+ # Including a way to turn on debug logger for spec runs
18
+ if ENV.key?('DEBUG')
19
+ debug_log = ::File.expand_path('../../debug_specs.log', __FILE__)
20
+ ::Protobuf::Logging.initialize_logger(debug_log, ::Logger::DEBUG)
21
+ else
22
+ ::Protobuf::Logging.initialize_logger('/dev/null')
23
+ end
24
+
25
+ # Get rid of the deprecation env var if present (messes with specs).
26
+ ENV.delete("PB_IGNORE_DEPRECATIONS")
27
+
28
+ support_proto_glob = File.expand_path('../support/**/*.pb.rb', __FILE__)
29
+ Dir[support_proto_glob].each { |proto_file| require proto_file }
30
+
31
+ RSpec.configure(&:disable_monkey_patching!)
32
+
33
+ ::Protobuf::Rpc::Client.class_eval do
34
+ def ==(other)
35
+ connector.options == other.options && \
36
+ success_cb == other.success_cb && \
37
+ failure_cb == other.failure_cb
38
+ end
39
+ end
40
+
41
+ def reset_service_location(service)
42
+ service.host = nil
43
+ service.port = nil
44
+ end
@@ -0,0 +1,6 @@
1
+ require 'support/packed_field'
2
+ require 'support/server'
3
+
4
+ def now
5
+ Time.new.to_f
6
+ end
@@ -0,0 +1,22 @@
1
+ if defined?(RSpec)
2
+ shared_examples_for :packable_field do |field_klass|
3
+
4
+ before(:all) do
5
+ unless defined?(PackableFieldTest)
6
+ class PackableFieldTest < ::Protobuf::Message; end
7
+ end
8
+
9
+ field_name = "#{field_klass.name.split('::').last.underscore}_packed_field".to_sym
10
+ tag_num = PackableFieldTest.fields.size + 1
11
+ PackableFieldTest.repeated(field_klass, field_name, tag_num, :packed => true)
12
+ end
13
+
14
+ let(:field_name) { "#{field_klass.name.split('::').last.underscore}_packed_field".to_sym }
15
+ let(:message_instance) { PackableFieldTest.new(field_name => [100, 200, 300]) }
16
+
17
+ subject { PackableFieldTest.get_field(field_name) }
18
+
19
+ specify { expect(subject).to be_packed }
20
+
21
+ end
22
+ end
@@ -0,0 +1,64 @@
1
+ require 'ostruct'
2
+
3
+ require 'active_support/core_ext/hash/reverse_merge'
4
+
5
+ require 'protobuf/logging'
6
+ require 'protobuf/rpc/server'
7
+ require 'protobuf/rpc/servers/socket/server'
8
+ require 'protobuf/rpc/servers/socket_runner'
9
+ require 'protobuf/rpc/servers/zmq/server'
10
+ require 'protobuf/rpc/servers/zmq_runner'
11
+ require 'spec/support/test/resource_service'
12
+
13
+ # Want to abort if server dies?
14
+ Thread.abort_on_exception = true
15
+
16
+ class StubServer
17
+ include Protobuf::Logging
18
+
19
+ private
20
+
21
+ attr_accessor :options, :runner, :runner_thread
22
+
23
+ public
24
+
25
+ def initialize(options = {})
26
+ self.options = OpenStruct.new(
27
+ options.reverse_merge(
28
+ :host => '127.0.0.1',
29
+ :port => 9399,
30
+ :worker_port => 9400,
31
+ :delay => 0,
32
+ :server => Protobuf::Rpc::Socket::Server,
33
+ ),
34
+ )
35
+
36
+ start
37
+ yield self
38
+ ensure
39
+ stop
40
+ end
41
+
42
+ def start
43
+ runner_class = {
44
+ ::Protobuf::Rpc::Zmq::Server => ::Protobuf::Rpc::ZmqRunner,
45
+ ::Protobuf::Rpc::Socket::Server => ::Protobuf::Rpc::SocketRunner,
46
+ }.fetch(options.server)
47
+
48
+ self.runner = runner_class.new(options)
49
+ self.runner_thread = Thread.new(runner, &:run)
50
+ runner_thread.abort_on_exception = true # Set for testing purposes
51
+ Thread.pass until runner.running?
52
+
53
+ logger.debug { sign_message("Server started #{options.host}:#{options.port}") }
54
+ end
55
+
56
+ def stop
57
+ runner.stop
58
+ runner_thread.join
59
+ end
60
+
61
+ def log_signature
62
+ @_log_signature ||= "[stub-server]"
63
+ end
64
+ end