grpc 0.10.0 → 0.11.0
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.
- checksums.yaml +4 -4
- data/Rakefile +4 -2
- data/bin/{interop/test/cpp/interop/test.rb → grpc_ruby_interop_client} +4 -14
- data/bin/{interop/test/cpp/interop/empty.rb → grpc_ruby_interop_server} +4 -15
- data/bin/interop/interop_client.rb +9 -335
- data/bin/interop/interop_server.rb +9 -153
- data/bin/math_client.rb +3 -3
- data/bin/math_server.rb +18 -1
- data/bin/noproto_server.rb +2 -1
- data/ext/grpc/rb_call.c +82 -15
- data/ext/grpc/rb_channel.c +141 -11
- data/ext/grpc/rb_channel_args.c +2 -1
- data/ext/grpc/rb_completion_queue.c +8 -7
- data/ext/grpc/rb_credentials.c +7 -6
- data/ext/grpc/rb_grpc.c +23 -8
- data/ext/grpc/rb_server.c +31 -45
- data/ext/grpc/rb_server_credentials.c +91 -34
- data/lib/grpc/generic/active_call.rb +7 -7
- data/lib/grpc/generic/bidi_call.rb +17 -12
- data/lib/grpc/generic/client_stub.rb +88 -22
- data/lib/grpc/generic/rpc_server.rb +19 -18
- data/lib/grpc/generic/service.rb +8 -10
- data/lib/grpc/grpc.so +0 -0
- data/lib/grpc/logconfig.rb +26 -10
- data/lib/grpc/version.rb +1 -1
- data/spec/call_spec.rb +9 -1
- data/spec/channel_spec.rb +2 -2
- data/spec/client_server_spec.rb +28 -11
- data/spec/credentials_spec.rb +7 -7
- data/spec/generic/active_call_spec.rb +43 -18
- data/spec/generic/client_stub_spec.rb +21 -1
- data/spec/generic/rpc_server_spec.rb +20 -9
- data/spec/pb/health/checker_spec.rb +232 -0
- data/spec/server_credentials_spec.rb +32 -7
- data/spec/server_spec.rb +8 -4
- data/spec/spec_helper.rb +13 -1
- metadata +31 -51
- data/.gitignore +0 -15
- data/.rspec +0 -4
- data/.rubocop.yml +0 -10
- data/.rubocop_todo.yml +0 -44
- data/CHANGELOG.md +0 -11
- data/Gemfile +0 -4
- data/README.md +0 -84
- data/bin/interop/README.md +0 -8
- data/bin/interop/test/cpp/interop/messages.rb +0 -89
- data/bin/interop/test/cpp/interop/test_services.rb +0 -60
- data/grpc.gemspec +0 -40
data/lib/grpc/grpc.so
ADDED
Binary file
|
data/lib/grpc/logconfig.rb
CHANGED
@@ -27,17 +27,33 @@
|
|
27
27
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
|
-
require 'logging'
|
31
|
-
|
32
30
|
# GRPC contains the General RPC module.
|
33
31
|
module GRPC
|
34
|
-
|
35
|
-
|
32
|
+
# DefaultLogger is a module included in GRPC if no other logging is set up for
|
33
|
+
# it. See ../spec/spec_helpers an example of where other logging is added.
|
34
|
+
module DefaultLogger
|
35
|
+
def logger
|
36
|
+
LOGGER
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# NoopLogger implements the methods of Ruby's conventional logging interface
|
42
|
+
# that are actually used internally within gRPC with a noop implementation.
|
43
|
+
class NoopLogger
|
44
|
+
def info(_ignored)
|
45
|
+
end
|
36
46
|
|
37
|
-
|
38
|
-
|
47
|
+
def debug(_ignored)
|
48
|
+
end
|
39
49
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
50
|
+
def warn(_ignored)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
LOGGER = NoopLogger.new
|
55
|
+
end
|
56
|
+
|
57
|
+
# Inject the noop #logger if no module-level logger method has been injected.
|
58
|
+
extend DefaultLogger unless methods.include?(:logger)
|
59
|
+
end
|
data/lib/grpc/version.rb
CHANGED
data/spec/call_spec.rb
CHANGED
@@ -31,6 +31,14 @@ require 'grpc'
|
|
31
31
|
|
32
32
|
include GRPC::Core::StatusCodes
|
33
33
|
|
34
|
+
describe GRPC::Core::WriteFlags do
|
35
|
+
it 'should define the known write flag values' do
|
36
|
+
m = GRPC::Core::WriteFlags
|
37
|
+
expect(m.const_get(:BUFFER_HINT)).to_not be_nil
|
38
|
+
expect(m.const_get(:NO_COMPRESS)).to_not be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
34
42
|
describe GRPC::Core::RpcErrors do
|
35
43
|
before(:each) do
|
36
44
|
@known_types = {
|
@@ -137,7 +145,7 @@ describe GRPC::Core::Call do
|
|
137
145
|
end
|
138
146
|
|
139
147
|
def make_test_call
|
140
|
-
@ch.create_call(client_queue, 'dummy_method',
|
148
|
+
@ch.create_call(client_queue, nil, nil, 'dummy_method', nil, deadline)
|
141
149
|
end
|
142
150
|
|
143
151
|
def deadline
|
data/spec/channel_spec.rb
CHANGED
@@ -117,7 +117,7 @@ describe GRPC::Core::Channel do
|
|
117
117
|
deadline = Time.now + 5
|
118
118
|
|
119
119
|
blk = proc do
|
120
|
-
ch.create_call(cq, 'dummy_method',
|
120
|
+
ch.create_call(cq, nil, nil, 'dummy_method', nil, deadline)
|
121
121
|
end
|
122
122
|
expect(&blk).to_not raise_error
|
123
123
|
end
|
@@ -128,7 +128,7 @@ describe GRPC::Core::Channel do
|
|
128
128
|
|
129
129
|
deadline = Time.now + 5
|
130
130
|
blk = proc do
|
131
|
-
ch.create_call(cq, 'dummy_method',
|
131
|
+
ch.create_call(cq, nil, nil, 'dummy_method', nil, deadline)
|
132
132
|
end
|
133
133
|
expect(&blk).to raise_error(RuntimeError)
|
134
134
|
end
|
data/spec/client_server_spec.rb
CHANGED
@@ -28,16 +28,9 @@
|
|
28
28
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
|
30
30
|
require 'grpc'
|
31
|
-
require 'spec_helper'
|
32
31
|
|
33
32
|
include GRPC::Core
|
34
33
|
|
35
|
-
def load_test_certs
|
36
|
-
test_root = File.join(File.dirname(__FILE__), 'testdata')
|
37
|
-
files = ['ca.pem', 'server1.key', 'server1.pem']
|
38
|
-
files.map { |f| File.open(File.join(test_root, f)).read }
|
39
|
-
end
|
40
|
-
|
41
34
|
shared_context 'setup: tags' do
|
42
35
|
let(:sent_message) { 'sent message' }
|
43
36
|
let(:reply_text) { 'the reply' }
|
@@ -47,7 +40,7 @@ shared_context 'setup: tags' do
|
|
47
40
|
end
|
48
41
|
|
49
42
|
def deadline
|
50
|
-
Time.now +
|
43
|
+
Time.now + 5
|
51
44
|
end
|
52
45
|
|
53
46
|
def server_allows_client_to_proceed
|
@@ -61,7 +54,7 @@ shared_context 'setup: tags' do
|
|
61
54
|
end
|
62
55
|
|
63
56
|
def new_client_call
|
64
|
-
@ch.create_call(@client_queue, '/method',
|
57
|
+
@ch.create_call(@client_queue, nil, nil, '/method', nil, deadline)
|
65
58
|
end
|
66
59
|
end
|
67
60
|
|
@@ -69,6 +62,23 @@ shared_examples 'basic GRPC message delivery is OK' do
|
|
69
62
|
include GRPC::Core
|
70
63
|
include_context 'setup: tags'
|
71
64
|
|
65
|
+
context 'the test channel' do
|
66
|
+
it 'should have a target' do
|
67
|
+
expect(@ch.target).to be_a(String)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'a client call' do
|
72
|
+
it 'should have a peer' do
|
73
|
+
expect(new_client_call.peer).to be_a(String)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'calls have peer info' do
|
78
|
+
call = new_client_call
|
79
|
+
expect(call.peer).to be_a(String)
|
80
|
+
end
|
81
|
+
|
72
82
|
it 'servers receive requests from clients and can respond' do
|
73
83
|
call = new_client_call
|
74
84
|
server_call = nil
|
@@ -385,7 +395,7 @@ describe 'the http client/server' do
|
|
385
395
|
@client_queue = GRPC::Core::CompletionQueue.new
|
386
396
|
@server_queue = GRPC::Core::CompletionQueue.new
|
387
397
|
@server = GRPC::Core::Server.new(@server_queue, nil)
|
388
|
-
server_port = @server.add_http2_port(server_host)
|
398
|
+
server_port = @server.add_http2_port(server_host, :this_port_is_insecure)
|
389
399
|
@server.start
|
390
400
|
@ch = Channel.new("0.0.0.0:#{server_port}", nil)
|
391
401
|
end
|
@@ -403,12 +413,19 @@ describe 'the http client/server' do
|
|
403
413
|
end
|
404
414
|
|
405
415
|
describe 'the secure http client/server' do
|
416
|
+
def load_test_certs
|
417
|
+
test_root = File.join(File.dirname(__FILE__), 'testdata')
|
418
|
+
files = ['ca.pem', 'server1.key', 'server1.pem']
|
419
|
+
files.map { |f| File.open(File.join(test_root, f)).read }
|
420
|
+
end
|
421
|
+
|
406
422
|
before(:example) do
|
407
423
|
certs = load_test_certs
|
408
424
|
server_host = '0.0.0.0:0'
|
409
425
|
@client_queue = GRPC::Core::CompletionQueue.new
|
410
426
|
@server_queue = GRPC::Core::CompletionQueue.new
|
411
|
-
server_creds = GRPC::Core::ServerCredentials.new(
|
427
|
+
server_creds = GRPC::Core::ServerCredentials.new(
|
428
|
+
nil, [{ private_key: certs[1], cert_chain: certs[2] }], false)
|
412
429
|
@server = GRPC::Core::Server.new(@server_queue, nil)
|
413
430
|
server_port = @server.add_http2_port(server_host, server_creds)
|
414
431
|
@server.start
|
data/spec/credentials_spec.rb
CHANGED
@@ -29,15 +29,15 @@
|
|
29
29
|
|
30
30
|
require 'grpc'
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
files = ['ca.pem', 'server1.pem', 'server1.key']
|
35
|
-
files.map { |f| File.open(File.join(test_root, f)).read }
|
36
|
-
end
|
32
|
+
describe GRPC::Core::Credentials do
|
33
|
+
Credentials = GRPC::Core::Credentials
|
37
34
|
|
38
|
-
|
35
|
+
def load_test_certs
|
36
|
+
test_root = File.join(File.dirname(__FILE__), 'testdata')
|
37
|
+
files = ['ca.pem', 'server1.pem', 'server1.key']
|
38
|
+
files.map { |f| File.open(File.join(test_root, f)).read }
|
39
|
+
end
|
39
40
|
|
40
|
-
describe Credentials do
|
41
41
|
describe '#new' do
|
42
42
|
it 'can be constructed with fake inputs' do
|
43
43
|
expect { Credentials.new('root_certs', 'key', 'cert') }.not_to raise_error
|
@@ -35,6 +35,7 @@ describe GRPC::ActiveCall do
|
|
35
35
|
ActiveCall = GRPC::ActiveCall
|
36
36
|
Call = GRPC::Core::Call
|
37
37
|
CallOps = GRPC::Core::CallOps
|
38
|
+
WriteFlags = GRPC::Core::WriteFlags
|
38
39
|
|
39
40
|
before(:each) do
|
40
41
|
@pass_through = proc { |x| x }
|
@@ -45,7 +46,7 @@ describe GRPC::ActiveCall do
|
|
45
46
|
@server_queue = GRPC::Core::CompletionQueue.new
|
46
47
|
host = '0.0.0.0:0'
|
47
48
|
@server = GRPC::Core::Server.new(@server_queue, nil)
|
48
|
-
server_port = @server.add_http2_port(host)
|
49
|
+
server_port = @server.add_http2_port(host, :this_port_is_insecure)
|
49
50
|
@server.start
|
50
51
|
@ch = GRPC::Core::Channel.new("0.0.0.0:#{server_port}", nil)
|
51
52
|
end
|
@@ -57,7 +58,7 @@ describe GRPC::ActiveCall do
|
|
57
58
|
describe 'restricted view methods' do
|
58
59
|
before(:each) do
|
59
60
|
call = make_test_call
|
60
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
61
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
61
62
|
@client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
62
63
|
@pass_through, deadline,
|
63
64
|
metadata_tag: md_tag)
|
@@ -87,7 +88,7 @@ describe GRPC::ActiveCall do
|
|
87
88
|
describe '#remote_send' do
|
88
89
|
it 'allows a client to send a payload to the server' do
|
89
90
|
call = make_test_call
|
90
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
91
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
91
92
|
@client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
92
93
|
@pass_through, deadline,
|
93
94
|
metadata_tag: md_tag)
|
@@ -111,7 +112,7 @@ describe GRPC::ActiveCall do
|
|
111
112
|
|
112
113
|
it 'marshals the payload using the marshal func' do
|
113
114
|
call = make_test_call
|
114
|
-
ActiveCall.client_invoke(call, @client_queue
|
115
|
+
ActiveCall.client_invoke(call, @client_queue)
|
115
116
|
marshal = proc { |x| 'marshalled:' + x }
|
116
117
|
client_call = ActiveCall.new(call, @client_queue, marshal,
|
117
118
|
@pass_through, deadline)
|
@@ -129,13 +130,37 @@ describe GRPC::ActiveCall do
|
|
129
130
|
@pass_through, deadline)
|
130
131
|
expect(server_call.remote_read).to eq('marshalled:' + msg)
|
131
132
|
end
|
133
|
+
|
134
|
+
TEST_WRITE_FLAGS = [WriteFlags::BUFFER_HINT, WriteFlags::NO_COMPRESS]
|
135
|
+
TEST_WRITE_FLAGS.each do |f|
|
136
|
+
it "successfully makes calls with write_flag set to #{f}" do
|
137
|
+
call = make_test_call
|
138
|
+
ActiveCall.client_invoke(call, @client_queue)
|
139
|
+
marshal = proc { |x| 'marshalled:' + x }
|
140
|
+
client_call = ActiveCall.new(call, @client_queue, marshal,
|
141
|
+
@pass_through, deadline)
|
142
|
+
msg = 'message is a string'
|
143
|
+
client_call.write_flag = f
|
144
|
+
client_call.remote_send(msg)
|
145
|
+
|
146
|
+
# confirm that the message was marshalled
|
147
|
+
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
|
148
|
+
recvd_call = recvd_rpc.call
|
149
|
+
server_ops = {
|
150
|
+
CallOps::SEND_INITIAL_METADATA => nil
|
151
|
+
}
|
152
|
+
recvd_call.run_batch(@server_queue, @server_tag, deadline, server_ops)
|
153
|
+
server_call = ActiveCall.new(recvd_call, @server_queue, @pass_through,
|
154
|
+
@pass_through, deadline)
|
155
|
+
expect(server_call.remote_read).to eq('marshalled:' + msg)
|
156
|
+
end
|
157
|
+
end
|
132
158
|
end
|
133
159
|
|
134
160
|
describe '#client_invoke' do
|
135
161
|
it 'sends keywords as metadata to the server when the are present' do
|
136
162
|
call = make_test_call
|
137
|
-
ActiveCall.client_invoke(call, @client_queue,
|
138
|
-
k1: 'v1', k2: 'v2')
|
163
|
+
ActiveCall.client_invoke(call, @client_queue, k1: 'v1', k2: 'v2')
|
139
164
|
recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
|
140
165
|
recvd_call = recvd_rpc.call
|
141
166
|
expect(recvd_call).to_not be_nil
|
@@ -148,7 +173,7 @@ describe GRPC::ActiveCall do
|
|
148
173
|
describe '#remote_read' do
|
149
174
|
it 'reads the response sent by a server' do
|
150
175
|
call = make_test_call
|
151
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
176
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
152
177
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
153
178
|
@pass_through, deadline,
|
154
179
|
metadata_tag: md_tag)
|
@@ -161,7 +186,7 @@ describe GRPC::ActiveCall do
|
|
161
186
|
|
162
187
|
it 'saves no metadata when the server adds no metadata' do
|
163
188
|
call = make_test_call
|
164
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
189
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
165
190
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
166
191
|
@pass_through, deadline,
|
167
192
|
metadata_tag: md_tag)
|
@@ -176,7 +201,7 @@ describe GRPC::ActiveCall do
|
|
176
201
|
|
177
202
|
it 'saves metadata add by the server' do
|
178
203
|
call = make_test_call
|
179
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
204
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
180
205
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
181
206
|
@pass_through, deadline,
|
182
207
|
metadata_tag: md_tag)
|
@@ -192,7 +217,7 @@ describe GRPC::ActiveCall do
|
|
192
217
|
|
193
218
|
it 'get a nil msg before a status when an OK status is sent' do
|
194
219
|
call = make_test_call
|
195
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
220
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
196
221
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
197
222
|
@pass_through, deadline,
|
198
223
|
metadata_tag: md_tag)
|
@@ -209,7 +234,7 @@ describe GRPC::ActiveCall do
|
|
209
234
|
|
210
235
|
it 'unmarshals the response using the unmarshal func' do
|
211
236
|
call = make_test_call
|
212
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
237
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
213
238
|
unmarshal = proc { |x| 'unmarshalled:' + x }
|
214
239
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
215
240
|
unmarshal, deadline,
|
@@ -234,7 +259,7 @@ describe GRPC::ActiveCall do
|
|
234
259
|
|
235
260
|
it 'the returns an enumerator that can read n responses' do
|
236
261
|
call = make_test_call
|
237
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
262
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
238
263
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
239
264
|
@pass_through, deadline,
|
240
265
|
metadata_tag: md_tag)
|
@@ -252,7 +277,7 @@ describe GRPC::ActiveCall do
|
|
252
277
|
|
253
278
|
it 'the returns an enumerator that stops after an OK Status' do
|
254
279
|
call = make_test_call
|
255
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
280
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
256
281
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
257
282
|
@pass_through, deadline,
|
258
283
|
metadata_tag: md_tag)
|
@@ -262,7 +287,7 @@ describe GRPC::ActiveCall do
|
|
262
287
|
client_call.writes_done(false)
|
263
288
|
server_call = expect_server_to_receive(msg)
|
264
289
|
e = client_call.each_remote_read
|
265
|
-
n = 3
|
290
|
+
n = 3 # arbitrary value > 1
|
266
291
|
n.times do
|
267
292
|
server_call.remote_send(reply)
|
268
293
|
expect(e.next).to eq(reply)
|
@@ -275,7 +300,7 @@ describe GRPC::ActiveCall do
|
|
275
300
|
describe '#writes_done' do
|
276
301
|
it 'finishes ok if the server sends a status response' do
|
277
302
|
call = make_test_call
|
278
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
303
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
279
304
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
280
305
|
@pass_through, deadline,
|
281
306
|
metadata_tag: md_tag)
|
@@ -291,7 +316,7 @@ describe GRPC::ActiveCall do
|
|
291
316
|
|
292
317
|
it 'finishes ok if the server sends an early status response' do
|
293
318
|
call = make_test_call
|
294
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
319
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
295
320
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
296
321
|
@pass_through, deadline,
|
297
322
|
metadata_tag: md_tag)
|
@@ -307,7 +332,7 @@ describe GRPC::ActiveCall do
|
|
307
332
|
|
308
333
|
it 'finishes ok if writes_done is true' do
|
309
334
|
call = make_test_call
|
310
|
-
md_tag = ActiveCall.client_invoke(call, @client_queue
|
335
|
+
md_tag = ActiveCall.client_invoke(call, @client_queue)
|
311
336
|
client_call = ActiveCall.new(call, @client_queue, @pass_through,
|
312
337
|
@pass_through, deadline,
|
313
338
|
metadata_tag: md_tag)
|
@@ -338,7 +363,7 @@ describe GRPC::ActiveCall do
|
|
338
363
|
end
|
339
364
|
|
340
365
|
def make_test_call
|
341
|
-
@ch.create_call(@client_queue, '/method',
|
366
|
+
@ch.create_call(@client_queue, nil, nil, '/method', nil, deadline)
|
342
367
|
end
|
343
368
|
|
344
369
|
def deadline
|
@@ -408,6 +408,26 @@ describe 'ClientStub' do
|
|
408
408
|
|
409
409
|
it_behaves_like 'bidi streaming'
|
410
410
|
end
|
411
|
+
|
412
|
+
describe 'without enough time to run' do
|
413
|
+
before(:each) do
|
414
|
+
@sent_msgs = Array.new(3) { |i| 'msg_' + (i + 1).to_s }
|
415
|
+
@replys = Array.new(3) { |i| 'reply_' + (i + 1).to_s }
|
416
|
+
server_port = create_test_server
|
417
|
+
@host = "localhost:#{server_port}"
|
418
|
+
end
|
419
|
+
|
420
|
+
it 'should fail with DeadlineExceeded', bidi: true do
|
421
|
+
@server.start
|
422
|
+
stub = GRPC::ClientStub.new(@host, @cq)
|
423
|
+
blk = proc do
|
424
|
+
e = stub.bidi_streamer(@method, @sent_msgs, noop, noop,
|
425
|
+
timeout: 0.001)
|
426
|
+
e.collect { |r| r }
|
427
|
+
end
|
428
|
+
expect(&blk).to raise_error GRPC::BadStatus, /Deadline Exceeded/
|
429
|
+
end
|
430
|
+
end
|
411
431
|
end
|
412
432
|
|
413
433
|
def run_server_streamer(expected_input, replys, status, **kw)
|
@@ -478,7 +498,7 @@ describe 'ClientStub' do
|
|
478
498
|
def create_test_server
|
479
499
|
@server_queue = GRPC::Core::CompletionQueue.new
|
480
500
|
@server = GRPC::Core::Server.new(@server_queue, nil)
|
481
|
-
@server.add_http2_port('0.0.0.0:0')
|
501
|
+
@server.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
|
482
502
|
end
|
483
503
|
|
484
504
|
def expect_server_to_be_invoked(notifier)
|
@@ -35,6 +35,14 @@ def load_test_certs
|
|
35
35
|
files.map { |f| File.open(File.join(test_root, f)).read }
|
36
36
|
end
|
37
37
|
|
38
|
+
def check_md(wanted_md, received_md)
|
39
|
+
wanted_md.zip(received_md).each do |w, r|
|
40
|
+
w.each do |key, value|
|
41
|
+
expect(r[key]).to eq(value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
38
46
|
# A test message
|
39
47
|
class EchoMsg
|
40
48
|
def self.marshal(_o)
|
@@ -131,7 +139,7 @@ describe GRPC::RpcServer do
|
|
131
139
|
@server_queue = GRPC::Core::CompletionQueue.new
|
132
140
|
server_host = '0.0.0.0:0'
|
133
141
|
@server = GRPC::Core::Server.new(@server_queue, nil)
|
134
|
-
server_port = @server.add_http2_port(server_host)
|
142
|
+
server_port = @server.add_http2_port(server_host, :this_port_is_insecure)
|
135
143
|
@host = "localhost:#{server_port}"
|
136
144
|
@ch = GRPC::Core::Channel.new(@host, nil)
|
137
145
|
end
|
@@ -376,7 +384,7 @@ describe GRPC::RpcServer do
|
|
376
384
|
stub = EchoStub.new(@host, **client_opts)
|
377
385
|
expect(stub.an_rpc(req, k1: 'v1', k2: 'v2')).to be_a(EchoMsg)
|
378
386
|
wanted_md = [{ 'k1' => 'v1', 'k2' => 'v2' }]
|
379
|
-
|
387
|
+
check_md(wanted_md, service.received_md)
|
380
388
|
@srv.stop
|
381
389
|
t.join
|
382
390
|
end
|
@@ -388,10 +396,11 @@ describe GRPC::RpcServer do
|
|
388
396
|
@srv.wait_till_running
|
389
397
|
req = EchoMsg.new
|
390
398
|
stub = SlowStub.new(@host, **client_opts)
|
391
|
-
|
392
|
-
|
399
|
+
timeout = service.delay + 1.0 # wait for long enough
|
400
|
+
resp = stub.an_rpc(req, timeout: timeout, k1: 'v1', k2: 'v2')
|
401
|
+
expect(resp).to be_a(EchoMsg)
|
393
402
|
wanted_md = [{ 'k1' => 'v1', 'k2' => 'v2' }]
|
394
|
-
|
403
|
+
check_md(wanted_md, service.received_md)
|
395
404
|
@srv.stop
|
396
405
|
t.join
|
397
406
|
end
|
@@ -403,8 +412,8 @@ describe GRPC::RpcServer do
|
|
403
412
|
@srv.wait_till_running
|
404
413
|
req = EchoMsg.new
|
405
414
|
stub = SlowStub.new(@host, **client_opts)
|
406
|
-
|
407
|
-
blk = proc { stub.an_rpc(req,
|
415
|
+
timeout = 0.1 # too short for SlowService to respond
|
416
|
+
blk = proc { stub.an_rpc(req, timeout: timeout, k1: 'v1', k2: 'v2') }
|
408
417
|
expect(&blk).to raise_error GRPC::BadStatus
|
409
418
|
wanted_md = []
|
410
419
|
expect(service.received_md).to eq(wanted_md)
|
@@ -443,7 +452,7 @@ describe GRPC::RpcServer do
|
|
443
452
|
expect(stub.an_rpc(req, k1: 'v1', k2: 'v2')).to be_a(EchoMsg)
|
444
453
|
wanted_md = [{ 'k1' => 'updated-v1', 'k2' => 'v2',
|
445
454
|
'jwt_aud_uri' => "https://#{@host}/EchoService" }]
|
446
|
-
|
455
|
+
check_md(wanted_md, service.received_md)
|
447
456
|
@srv.stop
|
448
457
|
t.join
|
449
458
|
end
|
@@ -535,7 +544,9 @@ describe GRPC::RpcServer do
|
|
535
544
|
'method' => '/EchoService/an_rpc',
|
536
545
|
'connect_k1' => 'connect_v1'
|
537
546
|
}
|
538
|
-
|
547
|
+
wanted_md.each do |key, value|
|
548
|
+
expect(op.metadata[key]).to eq(value)
|
549
|
+
end
|
539
550
|
@srv.stop
|
540
551
|
t.join
|
541
552
|
end
|