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.

Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -2
  3. data/bin/{interop/test/cpp/interop/test.rb → grpc_ruby_interop_client} +4 -14
  4. data/bin/{interop/test/cpp/interop/empty.rb → grpc_ruby_interop_server} +4 -15
  5. data/bin/interop/interop_client.rb +9 -335
  6. data/bin/interop/interop_server.rb +9 -153
  7. data/bin/math_client.rb +3 -3
  8. data/bin/math_server.rb +18 -1
  9. data/bin/noproto_server.rb +2 -1
  10. data/ext/grpc/rb_call.c +82 -15
  11. data/ext/grpc/rb_channel.c +141 -11
  12. data/ext/grpc/rb_channel_args.c +2 -1
  13. data/ext/grpc/rb_completion_queue.c +8 -7
  14. data/ext/grpc/rb_credentials.c +7 -6
  15. data/ext/grpc/rb_grpc.c +23 -8
  16. data/ext/grpc/rb_server.c +31 -45
  17. data/ext/grpc/rb_server_credentials.c +91 -34
  18. data/lib/grpc/generic/active_call.rb +7 -7
  19. data/lib/grpc/generic/bidi_call.rb +17 -12
  20. data/lib/grpc/generic/client_stub.rb +88 -22
  21. data/lib/grpc/generic/rpc_server.rb +19 -18
  22. data/lib/grpc/generic/service.rb +8 -10
  23. data/lib/grpc/grpc.so +0 -0
  24. data/lib/grpc/logconfig.rb +26 -10
  25. data/lib/grpc/version.rb +1 -1
  26. data/spec/call_spec.rb +9 -1
  27. data/spec/channel_spec.rb +2 -2
  28. data/spec/client_server_spec.rb +28 -11
  29. data/spec/credentials_spec.rb +7 -7
  30. data/spec/generic/active_call_spec.rb +43 -18
  31. data/spec/generic/client_stub_spec.rb +21 -1
  32. data/spec/generic/rpc_server_spec.rb +20 -9
  33. data/spec/pb/health/checker_spec.rb +232 -0
  34. data/spec/server_credentials_spec.rb +32 -7
  35. data/spec/server_spec.rb +8 -4
  36. data/spec/spec_helper.rb +13 -1
  37. metadata +31 -51
  38. data/.gitignore +0 -15
  39. data/.rspec +0 -4
  40. data/.rubocop.yml +0 -10
  41. data/.rubocop_todo.yml +0 -44
  42. data/CHANGELOG.md +0 -11
  43. data/Gemfile +0 -4
  44. data/README.md +0 -84
  45. data/bin/interop/README.md +0 -8
  46. data/bin/interop/test/cpp/interop/messages.rb +0 -89
  47. data/bin/interop/test/cpp/interop/test_services.rb +0 -60
  48. data/grpc.gemspec +0 -40
Binary file
@@ -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
- extend Logging.globally
35
- end
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
- Logging.logger.root.appenders = Logging.appenders.stdout
38
- Logging.logger.root.level = :info
47
+ def debug(_ignored)
48
+ end
39
49
 
40
- # TODO: provide command-line configuration for logging
41
- Logging.logger['GRPC'].level = :info
42
- Logging.logger['GRPC::ActiveCall'].level = :info
43
- Logging.logger['GRPC::BidiCall'].level = :info
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
@@ -29,5 +29,5 @@
29
29
 
30
30
  # GRPC contains the General RPC module.
31
31
  module GRPC
32
- VERSION = '0.10.0'
32
+ VERSION = '0.11.0'
33
33
  end
@@ -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', 'dummy_host', deadline)
148
+ @ch.create_call(client_queue, nil, nil, 'dummy_method', nil, deadline)
141
149
  end
142
150
 
143
151
  def deadline
@@ -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', 'dummy_host', deadline)
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', 'dummy_host', deadline)
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
@@ -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 + 2
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', 'foo.test.google.fr', deadline)
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(nil, certs[1], certs[2])
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
@@ -29,15 +29,15 @@
29
29
 
30
30
  require 'grpc'
31
31
 
32
- def load_test_certs
33
- test_root = File.join(File.dirname(__FILE__), 'testdata')
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
- Credentials = GRPC::Core::Credentials
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, deadline)
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, deadline)
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, deadline)
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, deadline,
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, deadline)
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, deadline)
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, deadline)
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, deadline)
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, deadline)
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, deadline)
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, deadline)
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 # arbitrary value > 1
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, deadline)
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, deadline)
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, deadline)
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', 'a.dummy.host', deadline)
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
- expect(service.received_md).to eq(wanted_md)
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
- deadline = service.delay + 1.0 # wait for long enough
392
- expect(stub.an_rpc(req, deadline, k1: 'v1', k2: 'v2')).to be_a(EchoMsg)
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
- expect(service.received_md).to eq(wanted_md)
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
- deadline = 0.1 # too short for SlowService to respond
407
- blk = proc { stub.an_rpc(req, deadline, k1: 'v1', k2: 'v2') }
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
- expect(service.received_md).to eq(wanted_md)
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
- expect(op.metadata).to eq(wanted_md)
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