grpc 0.13.0.pre1.1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/etc/roots.pem +5114 -0
  3. data/grpc_c.32.ruby +0 -0
  4. data/grpc_c.64.ruby +0 -0
  5. data/src/ruby/bin/apis/google/protobuf/empty.rb +44 -0
  6. data/src/ruby/bin/apis/pubsub_demo.rb +256 -0
  7. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +174 -0
  8. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +103 -0
  9. data/src/ruby/bin/grpc_ruby_interop_client +33 -0
  10. data/src/ruby/bin/grpc_ruby_interop_server +33 -0
  11. data/src/ruby/bin/interop/interop_client.rb +51 -0
  12. data/src/ruby/bin/interop/interop_server.rb +50 -0
  13. data/src/ruby/bin/math.rb +32 -0
  14. data/src/ruby/bin/math_client.rb +147 -0
  15. data/src/ruby/bin/math_server.rb +206 -0
  16. data/src/ruby/bin/math_services.rb +27 -0
  17. data/src/ruby/bin/noproto_client.rb +108 -0
  18. data/src/ruby/bin/noproto_server.rb +112 -0
  19. data/src/ruby/ext/grpc/extconf.rb +129 -0
  20. data/src/ruby/ext/grpc/rb_byte_buffer.c +70 -0
  21. data/src/ruby/ext/grpc/rb_byte_buffer.h +47 -0
  22. data/src/ruby/ext/grpc/rb_call.c +908 -0
  23. data/src/ruby/ext/grpc/rb_call.h +66 -0
  24. data/src/ruby/ext/grpc/rb_call_credentials.c +319 -0
  25. data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
  26. data/src/ruby/ext/grpc/rb_channel.c +432 -0
  27. data/src/ruby/ext/grpc/rb_channel.h +47 -0
  28. data/src/ruby/ext/grpc/rb_channel_args.c +169 -0
  29. data/src/ruby/ext/grpc/rb_channel_args.h +53 -0
  30. data/src/ruby/ext/grpc/rb_channel_credentials.c +268 -0
  31. data/src/ruby/ext/grpc/rb_channel_credentials.h +47 -0
  32. data/src/ruby/ext/grpc/rb_completion_queue.c +183 -0
  33. data/src/ruby/ext/grpc/rb_completion_queue.h +55 -0
  34. data/src/ruby/ext/grpc/rb_event_thread.c +158 -0
  35. data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
  36. data/src/ruby/ext/grpc/rb_grpc.c +336 -0
  37. data/src/ruby/ext/grpc/rb_grpc.h +85 -0
  38. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +560 -0
  39. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +843 -0
  40. data/src/ruby/ext/grpc/rb_loader.c +72 -0
  41. data/src/ruby/ext/grpc/rb_loader.h +40 -0
  42. data/src/ruby/ext/grpc/rb_server.c +400 -0
  43. data/src/ruby/ext/grpc/rb_server.h +47 -0
  44. data/src/ruby/ext/grpc/rb_server_credentials.c +284 -0
  45. data/src/ruby/ext/grpc/rb_server_credentials.h +47 -0
  46. data/src/ruby/lib/grpc.rb +44 -0
  47. data/src/ruby/lib/grpc/2.0/grpc_c.so +0 -0
  48. data/src/ruby/lib/grpc/2.1/grpc_c.so +0 -0
  49. data/src/ruby/lib/grpc/2.2/grpc_c.so +0 -0
  50. data/src/ruby/lib/grpc/2.3/grpc_c.so +0 -0
  51. data/src/ruby/lib/grpc/core/time_consts.rb +71 -0
  52. data/src/ruby/lib/grpc/errors.rb +62 -0
  53. data/src/ruby/lib/grpc/generic/active_call.rb +488 -0
  54. data/src/ruby/lib/grpc/generic/bidi_call.rb +218 -0
  55. data/src/ruby/lib/grpc/generic/client_stub.rb +471 -0
  56. data/src/ruby/lib/grpc/generic/rpc_desc.rb +147 -0
  57. data/src/ruby/lib/grpc/generic/rpc_server.rb +504 -0
  58. data/src/ruby/lib/grpc/generic/service.rb +234 -0
  59. data/src/ruby/lib/grpc/grpc.rb +34 -0
  60. data/src/ruby/lib/grpc/grpc_c.so +0 -0
  61. data/src/ruby/lib/grpc/logconfig.rb +59 -0
  62. data/src/ruby/lib/grpc/notifier.rb +60 -0
  63. data/src/ruby/lib/grpc/version.rb +33 -0
  64. data/src/ruby/pb/README.md +42 -0
  65. data/src/ruby/pb/generate_proto_ruby.sh +51 -0
  66. data/src/ruby/pb/grpc/health/checker.rb +75 -0
  67. data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
  68. data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
  69. data/src/ruby/pb/test/client.rb +469 -0
  70. data/src/ruby/pb/test/proto/empty.rb +15 -0
  71. data/src/ruby/pb/test/proto/messages.rb +80 -0
  72. data/src/ruby/pb/test/proto/test.rb +14 -0
  73. data/src/ruby/pb/test/proto/test_services.rb +64 -0
  74. data/src/ruby/pb/test/server.rb +253 -0
  75. data/src/ruby/spec/call_credentials_spec.rb +57 -0
  76. data/src/ruby/spec/call_spec.rb +163 -0
  77. data/src/ruby/spec/channel_credentials_spec.rb +97 -0
  78. data/src/ruby/spec/channel_spec.rb +177 -0
  79. data/src/ruby/spec/client_server_spec.rb +475 -0
  80. data/src/ruby/spec/completion_queue_spec.rb +42 -0
  81. data/src/ruby/spec/generic/active_call_spec.rb +373 -0
  82. data/src/ruby/spec/generic/client_stub_spec.rb +476 -0
  83. data/src/ruby/spec/generic/rpc_desc_spec.rb +331 -0
  84. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +138 -0
  85. data/src/ruby/spec/generic/rpc_server_spec.rb +576 -0
  86. data/src/ruby/spec/generic/service_spec.rb +345 -0
  87. data/src/ruby/spec/pb/health/checker_spec.rb +232 -0
  88. data/src/ruby/spec/server_credentials_spec.rb +94 -0
  89. data/src/ruby/spec/server_spec.rb +209 -0
  90. data/src/ruby/spec/spec_helper.rb +69 -0
  91. data/src/ruby/spec/testdata/README +1 -0
  92. data/src/ruby/spec/testdata/ca.pem +15 -0
  93. data/src/ruby/spec/testdata/server1.key +16 -0
  94. data/src/ruby/spec/testdata/server1.pem +16 -0
  95. data/src/ruby/spec/time_consts_spec.rb +89 -0
  96. metadata +320 -0
@@ -0,0 +1,331 @@
1
+ # Copyright 2015, Google Inc.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are
6
+ # met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above
11
+ # copyright notice, this list of conditions and the following disclaimer
12
+ # in the documentation and/or other materials provided with the
13
+ # distribution.
14
+ # * Neither the name of Google Inc. nor the names of its
15
+ # contributors may be used to endorse or promote products derived from
16
+ # this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ require 'grpc'
31
+ require 'grpc/generic/rpc_desc'
32
+
33
+ describe GRPC::RpcDesc do
34
+ RpcDesc = GRPC::RpcDesc
35
+ Stream = RpcDesc::Stream
36
+ OK = GRPC::Core::StatusCodes::OK
37
+ INTERNAL = GRPC::Core::StatusCodes::INTERNAL
38
+ UNKNOWN = GRPC::Core::StatusCodes::UNKNOWN
39
+ CallError = GRPC::Core::CallError
40
+
41
+ before(:each) do
42
+ @request_response = RpcDesc.new('rr', Object.new, Object.new, 'encode',
43
+ 'decode')
44
+ @client_streamer = RpcDesc.new('cs', Stream.new(Object.new), Object.new,
45
+ 'encode', 'decode')
46
+ @server_streamer = RpcDesc.new('ss', Object.new, Stream.new(Object.new),
47
+ 'encode', 'decode')
48
+ @bidi_streamer = RpcDesc.new('ss', Stream.new(Object.new),
49
+ Stream.new(Object.new), 'encode', 'decode')
50
+ @bs_code = INTERNAL
51
+ @no_reason = 'no reason given'
52
+ @ok_response = Object.new
53
+ end
54
+
55
+ shared_examples 'it handles errors' do
56
+ it 'sends the specified status if BadStatus is raised' do
57
+ expect(@call).to receive(:remote_read).once.and_return(Object.new)
58
+ expect(@call).to receive(:send_status).once.with(@bs_code, 'NOK', false,
59
+ {})
60
+ this_desc.run_server_method(@call, method(:bad_status))
61
+ end
62
+
63
+ it 'sends status UNKNOWN if other StandardErrors are raised' do
64
+ expect(@call).to receive(:remote_read).once.and_return(Object.new)
65
+ expect(@call).to receive(:send_status) .once.with(UNKNOWN, @no_reason,
66
+ false, {})
67
+ this_desc.run_server_method(@call, method(:other_error))
68
+ end
69
+
70
+ it 'absorbs CallError with no further action' do
71
+ expect(@call).to receive(:remote_read).once.and_raise(CallError)
72
+ blk = proc do
73
+ this_desc.run_server_method(@call, method(:fake_reqresp))
74
+ end
75
+ expect(&blk).to_not raise_error
76
+ end
77
+ end
78
+
79
+ describe '#run_server_method' do
80
+ let(:fake_md) { { k1: 'v1', k2: 'v2' } }
81
+ describe 'for request responses' do
82
+ let(:this_desc) { @request_response }
83
+ before(:each) do
84
+ @call = double('active_call')
85
+ allow(@call).to receive(:single_req_view).and_return(@call)
86
+ end
87
+
88
+ it_behaves_like 'it handles errors'
89
+
90
+ it 'sends a response and closes the stream if there no errors' do
91
+ req = Object.new
92
+ expect(@call).to receive(:remote_read).once.and_return(req)
93
+ expect(@call).to receive(:remote_send).once.with(@ok_response)
94
+ expect(@call).to receive(:output_metadata).and_return(fake_md)
95
+ expect(@call).to receive(:send_status).once.with(OK, 'OK', true,
96
+ **fake_md)
97
+ this_desc.run_server_method(@call, method(:fake_reqresp))
98
+ end
99
+ end
100
+
101
+ describe 'for client streamers' do
102
+ before(:each) do
103
+ @call = double('active_call')
104
+ allow(@call).to receive(:multi_req_view).and_return(@call)
105
+ end
106
+
107
+ it 'sends the specified status if BadStatus is raised' do
108
+ expect(@call).to receive(:send_status).once.with(@bs_code, 'NOK', false,
109
+ {})
110
+ @client_streamer.run_server_method(@call, method(:bad_status_alt))
111
+ end
112
+
113
+ it 'sends status UNKNOWN if other StandardErrors are raised' do
114
+ expect(@call).to receive(:send_status) .once.with(UNKNOWN, @no_reason,
115
+ false, {})
116
+ @client_streamer.run_server_method(@call, method(:other_error_alt))
117
+ end
118
+
119
+ it 'absorbs CallError with no further action' do
120
+ expect(@call).to receive(:remote_send).once.and_raise(CallError)
121
+ blk = proc do
122
+ @client_streamer.run_server_method(@call, method(:fake_clstream))
123
+ end
124
+ expect(&blk).to_not raise_error
125
+ end
126
+
127
+ it 'sends a response and closes the stream if there no errors' do
128
+ expect(@call).to receive(:remote_send).once.with(@ok_response)
129
+ expect(@call).to receive(:output_metadata).and_return(fake_md)
130
+ expect(@call).to receive(:send_status).once.with(OK, 'OK', true,
131
+ **fake_md)
132
+ @client_streamer.run_server_method(@call, method(:fake_clstream))
133
+ end
134
+ end
135
+
136
+ describe 'for server streaming' do
137
+ let(:this_desc) { @request_response }
138
+ before(:each) do
139
+ @call = double('active_call')
140
+ allow(@call).to receive(:single_req_view).and_return(@call)
141
+ end
142
+
143
+ it_behaves_like 'it handles errors'
144
+
145
+ it 'sends a response and closes the stream if there no errors' do
146
+ req = Object.new
147
+ expect(@call).to receive(:remote_read).once.and_return(req)
148
+ expect(@call).to receive(:remote_send).twice.with(@ok_response)
149
+ expect(@call).to receive(:output_metadata).and_return(fake_md)
150
+ expect(@call).to receive(:send_status).once.with(OK, 'OK', true,
151
+ **fake_md)
152
+ @server_streamer.run_server_method(@call, method(:fake_svstream))
153
+ end
154
+ end
155
+
156
+ describe 'for bidi streamers' do
157
+ before(:each) do
158
+ @call = double('active_call')
159
+ enq_th, rwl_th = double('enqueue_th'), ('read_write_loop_th')
160
+ allow(enq_th).to receive(:join)
161
+ allow(rwl_th).to receive(:join)
162
+ end
163
+
164
+ it 'sends the specified status if BadStatus is raised' do
165
+ e = GRPC::BadStatus.new(@bs_code, 'NOK')
166
+ expect(@call).to receive(:run_server_bidi).and_raise(e)
167
+ expect(@call).to receive(:send_status).once.with(@bs_code, 'NOK', false,
168
+ {})
169
+ @bidi_streamer.run_server_method(@call, method(:bad_status_alt))
170
+ end
171
+
172
+ it 'sends status UNKNOWN if other StandardErrors are raised' do
173
+ expect(@call).to receive(:run_server_bidi).and_raise(StandardError)
174
+ expect(@call).to receive(:send_status).once.with(UNKNOWN, @no_reason,
175
+ false, {})
176
+ @bidi_streamer.run_server_method(@call, method(:other_error_alt))
177
+ end
178
+
179
+ it 'closes the stream if there no errors' do
180
+ expect(@call).to receive(:run_server_bidi)
181
+ expect(@call).to receive(:output_metadata).and_return(fake_md)
182
+ expect(@call).to receive(:send_status).once.with(OK, 'OK', true,
183
+ **fake_md)
184
+ @bidi_streamer.run_server_method(@call, method(:fake_bidistream))
185
+ end
186
+ end
187
+ end
188
+
189
+ describe '#assert_arity_matches' do
190
+ def no_arg
191
+ end
192
+
193
+ def fake_clstream(_arg)
194
+ end
195
+
196
+ def fake_svstream(_arg1, _arg2)
197
+ end
198
+
199
+ it 'raises when a request_response does not have 2 args' do
200
+ [:fake_clstream, :no_arg].each do |mth|
201
+ blk = proc do
202
+ @request_response.assert_arity_matches(method(mth))
203
+ end
204
+ expect(&blk).to raise_error
205
+ end
206
+ end
207
+
208
+ it 'passes when a request_response has 2 args' do
209
+ blk = proc do
210
+ @request_response.assert_arity_matches(method(:fake_svstream))
211
+ end
212
+ expect(&blk).to_not raise_error
213
+ end
214
+
215
+ it 'raises when a server_streamer does not have 2 args' do
216
+ [:fake_clstream, :no_arg].each do |mth|
217
+ blk = proc do
218
+ @server_streamer.assert_arity_matches(method(mth))
219
+ end
220
+ expect(&blk).to raise_error
221
+ end
222
+ end
223
+
224
+ it 'passes when a server_streamer has 2 args' do
225
+ blk = proc do
226
+ @server_streamer.assert_arity_matches(method(:fake_svstream))
227
+ end
228
+ expect(&blk).to_not raise_error
229
+ end
230
+
231
+ it 'raises when a client streamer does not have 1 arg' do
232
+ [:fake_svstream, :no_arg].each do |mth|
233
+ blk = proc do
234
+ @client_streamer.assert_arity_matches(method(mth))
235
+ end
236
+ expect(&blk).to raise_error
237
+ end
238
+ end
239
+
240
+ it 'passes when a client_streamer has 1 arg' do
241
+ blk = proc do
242
+ @client_streamer.assert_arity_matches(method(:fake_clstream))
243
+ end
244
+ expect(&blk).to_not raise_error
245
+ end
246
+
247
+ it 'raises when a bidi streamer does not have 1 arg' do
248
+ [:fake_svstream, :no_arg].each do |mth|
249
+ blk = proc do
250
+ @bidi_streamer.assert_arity_matches(method(mth))
251
+ end
252
+ expect(&blk).to raise_error
253
+ end
254
+ end
255
+
256
+ it 'passes when a bidi streamer has 1 arg' do
257
+ blk = proc do
258
+ @bidi_streamer.assert_arity_matches(method(:fake_clstream))
259
+ end
260
+ expect(&blk).to_not raise_error
261
+ end
262
+ end
263
+
264
+ describe '#request_response?' do
265
+ it 'is true only input and output are both not Streams' do
266
+ expect(@request_response.request_response?).to be(true)
267
+ expect(@client_streamer.request_response?).to be(false)
268
+ expect(@bidi_streamer.request_response?).to be(false)
269
+ expect(@server_streamer.request_response?).to be(false)
270
+ end
271
+ end
272
+
273
+ describe '#client_streamer?' do
274
+ it 'is true only when input is a Stream and output is not a Stream' do
275
+ expect(@client_streamer.client_streamer?).to be(true)
276
+ expect(@request_response.client_streamer?).to be(false)
277
+ expect(@server_streamer.client_streamer?).to be(false)
278
+ expect(@bidi_streamer.client_streamer?).to be(false)
279
+ end
280
+ end
281
+
282
+ describe '#server_streamer?' do
283
+ it 'is true only when output is a Stream and input is not a Stream' do
284
+ expect(@server_streamer.server_streamer?).to be(true)
285
+ expect(@client_streamer.server_streamer?).to be(false)
286
+ expect(@request_response.server_streamer?).to be(false)
287
+ expect(@bidi_streamer.server_streamer?).to be(false)
288
+ end
289
+ end
290
+
291
+ describe '#bidi_streamer?' do
292
+ it 'is true only when output is a Stream and input is a Stream' do
293
+ expect(@bidi_streamer.bidi_streamer?).to be(true)
294
+ expect(@server_streamer.bidi_streamer?).to be(false)
295
+ expect(@client_streamer.bidi_streamer?).to be(false)
296
+ expect(@request_response.bidi_streamer?).to be(false)
297
+ end
298
+ end
299
+
300
+ def fake_reqresp(_req, _call)
301
+ @ok_response
302
+ end
303
+
304
+ def fake_clstream(_call)
305
+ @ok_response
306
+ end
307
+
308
+ def fake_svstream(_req, _call)
309
+ [@ok_response, @ok_response]
310
+ end
311
+
312
+ def fake_bidistream(an_array)
313
+ an_array
314
+ end
315
+
316
+ def bad_status(_req, _call)
317
+ fail GRPC::BadStatus.new(@bs_code, 'NOK')
318
+ end
319
+
320
+ def other_error(_req, _call)
321
+ fail(ArgumentError, 'other error')
322
+ end
323
+
324
+ def bad_status_alt(_call)
325
+ fail GRPC::BadStatus.new(@bs_code, 'NOK')
326
+ end
327
+
328
+ def other_error_alt(_call)
329
+ fail(ArgumentError, 'other error')
330
+ end
331
+ end
@@ -0,0 +1,138 @@
1
+ # Copyright 2015, Google Inc.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are
6
+ # met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above
11
+ # copyright notice, this list of conditions and the following disclaimer
12
+ # in the documentation and/or other materials provided with the
13
+ # distribution.
14
+ # * Neither the name of Google Inc. nor the names of its
15
+ # contributors may be used to endorse or promote products derived from
16
+ # this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ require 'grpc'
31
+
32
+ describe GRPC::Pool do
33
+ Pool = GRPC::Pool
34
+
35
+ describe '#new' do
36
+ it 'raises if a non-positive size is used' do
37
+ expect { Pool.new(0) }.to raise_error
38
+ expect { Pool.new(-1) }.to raise_error
39
+ expect { Pool.new(Object.new) }.to raise_error
40
+ end
41
+
42
+ it 'is constructed OK with a positive size' do
43
+ expect { Pool.new(1) }.not_to raise_error
44
+ end
45
+ end
46
+
47
+ describe '#jobs_waiting' do
48
+ it 'at start, it is zero' do
49
+ p = Pool.new(1)
50
+ expect(p.jobs_waiting).to be(0)
51
+ end
52
+
53
+ it 'it increases, with each scheduled job if the pool is not running' do
54
+ p = Pool.new(1)
55
+ job = proc {}
56
+ expect(p.jobs_waiting).to be(0)
57
+ 5.times do |i|
58
+ p.schedule(&job)
59
+ expect(p.jobs_waiting).to be(i + 1)
60
+ end
61
+ end
62
+
63
+ it 'it decreases as jobs are run' do
64
+ p = Pool.new(1)
65
+ job = proc {}
66
+ expect(p.jobs_waiting).to be(0)
67
+ 3.times do
68
+ p.schedule(&job)
69
+ end
70
+ p.start
71
+ sleep 2
72
+ expect(p.jobs_waiting).to be(0)
73
+ end
74
+ end
75
+
76
+ describe '#schedule' do
77
+ it 'return if the pool is already stopped' do
78
+ p = Pool.new(1)
79
+ p.stop
80
+ job = proc {}
81
+ expect { p.schedule(&job) }.to_not raise_error
82
+ end
83
+
84
+ it 'adds jobs that get run by the pool' do
85
+ p = Pool.new(1)
86
+ p.start
87
+ o, q = Object.new, Queue.new
88
+ job = proc { q.push(o) }
89
+ p.schedule(&job)
90
+ expect(q.pop).to be(o)
91
+ p.stop
92
+ end
93
+ end
94
+
95
+ describe '#stop' do
96
+ it 'works when there are no scheduled tasks' do
97
+ p = Pool.new(1)
98
+ expect { p.stop }.not_to raise_error
99
+ end
100
+
101
+ it 'stops jobs when there are long running jobs' do
102
+ p = Pool.new(1)
103
+ p.start
104
+ o, q = Object.new, Queue.new
105
+ job = proc do
106
+ sleep(5) # long running
107
+ q.push(o)
108
+ end
109
+ p.schedule(&job)
110
+ sleep(1) # should ensure the long job gets scheduled
111
+ expect { p.stop }.not_to raise_error
112
+ end
113
+ end
114
+
115
+ describe '#start' do
116
+ it 'runs pre-scheduled jobs' do
117
+ p = Pool.new(2)
118
+ o, q = Object.new, Queue.new
119
+ n = 5 # arbitrary
120
+ n.times { p.schedule(o, &q.method(:push)) }
121
+ p.start
122
+ n.times { expect(q.pop).to be(o) }
123
+ p.stop
124
+ end
125
+
126
+ it 'runs jobs as they are scheduled ' do
127
+ p = Pool.new(2)
128
+ o, q = Object.new, Queue.new
129
+ p.start
130
+ n = 5 # arbitrary
131
+ n.times do
132
+ p.schedule(o, &q.method(:push))
133
+ expect(q.pop).to be(o)
134
+ end
135
+ p.stop
136
+ end
137
+ end
138
+ end