blob: b247882241c6bf055af45975a85559123f0ec058 [file] [log] [blame]
Craig Tiller06059952015-02-18 08:34:56 -08001# Copyright 2015, Google Inc.
nnoble097ef9b2014-12-01 17:06:10 -08002# 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
30require 'grpc'
nnoble097ef9b2014-12-01 17:06:10 -080031require 'spec_helper'
32
nnoble0c475f02014-12-05 15:37:39 -080033include GRPC::Core
34
35def 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 }
39end
nnoble097ef9b2014-12-01 17:06:10 -080040
41shared_context 'setup: tags' do
Tim Emiola05e934f2015-03-28 15:19:34 -070042 let(:sent_message) { 'sent message' }
43 let(:reply_text) { 'the reply' }
nnoble097ef9b2014-12-01 17:06:10 -080044 before(:example) do
45 @server_finished_tag = Object.new
46 @client_finished_tag = Object.new
Tim Emiola75d7f9a2015-01-26 16:57:33 -080047 @client_metadata_tag = Object.new
nnoble097ef9b2014-12-01 17:06:10 -080048 @server_tag = Object.new
49 @tag = Object.new
50 end
51
52 def deadline
Tim Emiola75d7f9a2015-01-26 16:57:33 -080053 Time.now + 2
nnoble097ef9b2014-12-01 17:06:10 -080054 end
55
Tim Emiola75d7f9a2015-01-26 16:57:33 -080056 def server_allows_client_to_proceed
Tim Emiola05e934f2015-03-28 15:19:34 -070057 recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
58 expect(recvd_rpc).to_not eq nil
59 server_call = recvd_rpc.call
60 ops = { CallOps::SEND_INITIAL_METADATA => {} }
61 svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline, ops)
62 expect(svr_batch.send_metadata).to be true
Tim Emiola75d7f9a2015-01-26 16:57:33 -080063 server_call
64 end
65
nnoble097ef9b2014-12-01 17:06:10 -080066 def new_client_call
Tim Emiola05e934f2015-03-28 15:19:34 -070067 @ch.create_call(@client_queue, '/method', 'foo.test.google.fr', deadline)
nnoble097ef9b2014-12-01 17:06:10 -080068 end
nnoble097ef9b2014-12-01 17:06:10 -080069end
70
71shared_examples 'basic GRPC message delivery is OK' do
Tim Emiola05e934f2015-03-28 15:19:34 -070072 include GRPC::Core
nnoble097ef9b2014-12-01 17:06:10 -080073 include_context 'setup: tags'
74
Tim Emiola05e934f2015-03-28 15:19:34 -070075 it 'servers receive requests from clients and can respond' do
nnoble097ef9b2014-12-01 17:06:10 -080076 call = new_client_call
Craig Tiller09600be2015-05-13 16:46:55 -070077 server_call = nil
78
79 server_thread = Thread.new do
80 server_call = server_allows_client_to_proceed
81 end
82
Tim Emiola05e934f2015-03-28 15:19:34 -070083 client_ops = {
84 CallOps::SEND_INITIAL_METADATA => {},
85 CallOps::SEND_MESSAGE => sent_message
86 }
87 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
88 client_ops)
89 expect(batch_result.send_metadata).to be true
90 expect(batch_result.send_message).to be true
nnoble097ef9b2014-12-01 17:06:10 -080091
92 # confirm the server can read the inbound message
Craig Tiller09600be2015-05-13 16:46:55 -070093 server_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -070094 server_ops = {
95 CallOps::RECV_MESSAGE => nil
96 }
97 svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline,
98 server_ops)
99 expect(svr_batch.message).to eq(sent_message)
nnoble097ef9b2014-12-01 17:06:10 -0800100 end
101
102 it 'responses written by servers are received by the client' do
103 call = new_client_call
Craig Tiller09600be2015-05-13 16:46:55 -0700104 server_call = nil
105
106 server_thread = Thread.new do
107 server_call = server_allows_client_to_proceed
108 end
109
Tim Emiola05e934f2015-03-28 15:19:34 -0700110 client_ops = {
111 CallOps::SEND_INITIAL_METADATA => {},
112 CallOps::SEND_MESSAGE => sent_message
113 }
114 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
115 client_ops)
116 expect(batch_result.send_metadata).to be true
117 expect(batch_result.send_message).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800118
Tim Emiola05e934f2015-03-28 15:19:34 -0700119 # confirm the server can read the inbound message
Craig Tiller09600be2015-05-13 16:46:55 -0700120 server_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700121 server_ops = {
122 CallOps::RECV_MESSAGE => nil,
123 CallOps::SEND_MESSAGE => reply_text
124 }
125 svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline,
126 server_ops)
127 expect(svr_batch.message).to eq(sent_message)
128 expect(svr_batch.send_message).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800129 end
130
131 it 'servers can ignore a client write and send a status' do
nnoble097ef9b2014-12-01 17:06:10 -0800132 call = new_client_call
Craig Tiller09600be2015-05-13 16:46:55 -0700133 server_call = nil
134
135 server_thread = Thread.new do
136 server_call = server_allows_client_to_proceed
137 end
138
Tim Emiola05e934f2015-03-28 15:19:34 -0700139 client_ops = {
140 CallOps::SEND_INITIAL_METADATA => {},
141 CallOps::SEND_MESSAGE => sent_message
142 }
143 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
144 client_ops)
145 expect(batch_result.send_metadata).to be true
146 expect(batch_result.send_message).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800147
Tim Emiola05e934f2015-03-28 15:19:34 -0700148 # confirm the server can read the inbound message
149 the_status = Struct::Status.new(StatusCodes::OK, 'OK')
Craig Tiller09600be2015-05-13 16:46:55 -0700150 server_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700151 server_ops = {
152 CallOps::SEND_STATUS_FROM_SERVER => the_status
153 }
154 svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline,
155 server_ops)
156 expect(svr_batch.message).to eq nil
157 expect(svr_batch.send_status).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800158 end
159
160 it 'completes calls by sending status to client and server' do
161 call = new_client_call
Craig Tiller09600be2015-05-13 16:46:55 -0700162 server_call = nil
163
164 server_thread = Thread.new do
165 server_call = server_allows_client_to_proceed
166 end
167
Tim Emiola05e934f2015-03-28 15:19:34 -0700168 client_ops = {
169 CallOps::SEND_INITIAL_METADATA => {},
170 CallOps::SEND_MESSAGE => sent_message
171 }
172 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
173 client_ops)
174 expect(batch_result.send_metadata).to be true
175 expect(batch_result.send_message).to be true
176
177 # confirm the server can read the inbound message and respond
178 the_status = Struct::Status.new(StatusCodes::OK, 'OK', {})
Craig Tiller09600be2015-05-13 16:46:55 -0700179 server_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700180 server_ops = {
181 CallOps::RECV_MESSAGE => nil,
182 CallOps::SEND_MESSAGE => reply_text,
183 CallOps::SEND_STATUS_FROM_SERVER => the_status
184 }
185 svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline,
186 server_ops)
187 expect(svr_batch.message).to eq sent_message
188 expect(svr_batch.send_status).to be true
189 expect(svr_batch.send_message).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800190
Tim Emiola05e934f2015-03-28 15:19:34 -0700191 # confirm the client can receive the server response and status.
192 client_ops = {
193 CallOps::SEND_CLOSE_FROM_CLIENT => nil,
194 CallOps::RECV_MESSAGE => nil,
195 CallOps::RECV_STATUS_ON_CLIENT => nil
196 }
197 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
198 client_ops)
199 expect(batch_result.send_close).to be true
200 expect(batch_result.message).to eq reply_text
201 expect(batch_result.status).to eq the_status
nnoble097ef9b2014-12-01 17:06:10 -0800202
Tim Emiola05e934f2015-03-28 15:19:34 -0700203 # confirm the server can receive the client close.
204 server_ops = {
205 CallOps::RECV_CLOSE_ON_SERVER => nil
206 }
207 svr_batch = server_call.run_batch(@server_queue, @server_tag, deadline,
208 server_ops)
209 expect(svr_batch.send_close).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800210 end
nnoble097ef9b2014-12-01 17:06:10 -0800211end
212
nnoble097ef9b2014-12-01 17:06:10 -0800213shared_examples 'GRPC metadata delivery works OK' do
nnoble097ef9b2014-12-01 17:06:10 -0800214 include_context 'setup: tags'
215
216 describe 'from client => server' do
nnoble097ef9b2014-12-01 17:06:10 -0800217 before(:example) do
218 n = 7 # arbitrary number of metadata
Tim Emiola1e098122015-04-14 09:42:09 -0700219 diff_keys_fn = proc { |i| [format('k%d', i), format('v%d', i)] }
Tim Emiolae2860c52015-01-16 02:58:41 -0800220 diff_keys = Hash[n.times.collect { |x| diff_keys_fn.call x }]
Tim Emiola1e098122015-04-14 09:42:09 -0700221 null_vals_fn = proc { |i| [format('k%d', i), format('v\0%d', i)] }
Tim Emiolae2860c52015-01-16 02:58:41 -0800222 null_vals = Hash[n.times.collect { |x| null_vals_fn.call x }]
Tim Emiola1e098122015-04-14 09:42:09 -0700223 same_keys_fn = proc { |i| [format('k%d', i), [format('v%d', i)] * n] }
Tim Emiolae2860c52015-01-16 02:58:41 -0800224 same_keys = Hash[n.times.collect { |x| same_keys_fn.call x }]
225 symbol_key = { a_key: 'a val' }
nnoble097ef9b2014-12-01 17:06:10 -0800226 @valid_metadata = [diff_keys, same_keys, null_vals, symbol_key]
227 @bad_keys = []
228 @bad_keys << { Object.new => 'a value' }
229 @bad_keys << { 1 => 'a value' }
230 end
231
232 it 'raises an exception if a metadata key is invalid' do
233 @bad_keys.each do |md|
234 call = new_client_call
Tim Emiola05e934f2015-03-28 15:19:34 -0700235 client_ops = {
236 CallOps::SEND_INITIAL_METADATA => md
237 }
238 blk = proc do
239 call.run_batch(@client_queue, @client_tag, deadline,
240 client_ops)
241 end
242 expect(&blk).to raise_error
nnoble097ef9b2014-12-01 17:06:10 -0800243 end
244 end
245
nnoble097ef9b2014-12-01 17:06:10 -0800246 it 'sends all the metadata pairs when keys and values are valid' do
247 @valid_metadata.each do |md|
Craig Tiller09600be2015-05-13 16:46:55 -0700248 recvd_rpc = nil
249 rcv_thread = Thread.new do
250 recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
251 end
252
nnoble097ef9b2014-12-01 17:06:10 -0800253 call = new_client_call
Tim Emiola05e934f2015-03-28 15:19:34 -0700254 client_ops = {
255 CallOps::SEND_INITIAL_METADATA => md
256 }
257 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
258 client_ops)
259 expect(batch_result.send_metadata).to be true
nnoble097ef9b2014-12-01 17:06:10 -0800260
Tim Emiola05e934f2015-03-28 15:19:34 -0700261 # confirm the server can receive the client metadata
Craig Tiller09600be2015-05-13 16:46:55 -0700262 rcv_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700263 expect(recvd_rpc).to_not eq nil
264 recvd_md = recvd_rpc.metadata
Tim Emiolae2860c52015-01-16 02:58:41 -0800265 replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }]
Tim Emiola05e934f2015-03-28 15:19:34 -0700266 expect(recvd_md).to eq(recvd_md.merge(replace_symbols))
nnoble097ef9b2014-12-01 17:06:10 -0800267 end
268 end
nnoble097ef9b2014-12-01 17:06:10 -0800269 end
270
271 describe 'from server => client' do
nnoble097ef9b2014-12-01 17:06:10 -0800272 before(:example) do
273 n = 7 # arbitrary number of metadata
Tim Emiola1e098122015-04-14 09:42:09 -0700274 diff_keys_fn = proc { |i| [format('k%d', i), format('v%d', i)] }
Tim Emiolae2860c52015-01-16 02:58:41 -0800275 diff_keys = Hash[n.times.collect { |x| diff_keys_fn.call x }]
Tim Emiola1e098122015-04-14 09:42:09 -0700276 null_vals_fn = proc { |i| [format('k%d', i), format('v\0%d', i)] }
Tim Emiolae2860c52015-01-16 02:58:41 -0800277 null_vals = Hash[n.times.collect { |x| null_vals_fn.call x }]
Tim Emiola1e098122015-04-14 09:42:09 -0700278 same_keys_fn = proc { |i| [format('k%d', i), [format('v%d', i)] * n] }
Tim Emiolae2860c52015-01-16 02:58:41 -0800279 same_keys = Hash[n.times.collect { |x| same_keys_fn.call x }]
280 symbol_key = { a_key: 'a val' }
nnoble097ef9b2014-12-01 17:06:10 -0800281 @valid_metadata = [diff_keys, same_keys, null_vals, symbol_key]
282 @bad_keys = []
283 @bad_keys << { Object.new => 'a value' }
284 @bad_keys << { 1 => 'a value' }
285 end
286
287 it 'raises an exception if a metadata key is invalid' do
288 @bad_keys.each do |md|
Craig Tiller09600be2015-05-13 16:46:55 -0700289 recvd_rpc = nil
290 rcv_thread = Thread.new do
291 recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
292 end
293
nnoble097ef9b2014-12-01 17:06:10 -0800294 call = new_client_call
Tim Emiola05e934f2015-03-28 15:19:34 -0700295 # client signals that it's done sending metadata to allow server to
296 # respond
297 client_ops = {
298 CallOps::SEND_INITIAL_METADATA => nil
299 }
300 call.run_batch(@client_queue, @client_tag, deadline, client_ops)
nnoble097ef9b2014-12-01 17:06:10 -0800301
302 # server gets the invocation
Craig Tiller09600be2015-05-13 16:46:55 -0700303 rcv_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700304 expect(recvd_rpc).to_not eq nil
305 server_ops = {
306 CallOps::SEND_INITIAL_METADATA => md
307 }
308 blk = proc do
309 recvd_rpc.call.run_batch(@server_queue, @server_tag, deadline,
310 server_ops)
311 end
312 expect(&blk).to raise_error
nnoble097ef9b2014-12-01 17:06:10 -0800313 end
314 end
315
Tim Emiola05e934f2015-03-28 15:19:34 -0700316 it 'sends an empty hash if no metadata is added' do
Craig Tiller09600be2015-05-13 16:46:55 -0700317 recvd_rpc = nil
318 rcv_thread = Thread.new do
319 recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
320 end
321
nnoble097ef9b2014-12-01 17:06:10 -0800322 call = new_client_call
Tim Emiola05e934f2015-03-28 15:19:34 -0700323 # client signals that it's done sending metadata to allow server to
324 # respond
325 client_ops = {
326 CallOps::SEND_INITIAL_METADATA => nil
327 }
328 call.run_batch(@client_queue, @client_tag, deadline, client_ops)
nnoble097ef9b2014-12-01 17:06:10 -0800329
Tim Emiola05e934f2015-03-28 15:19:34 -0700330 # server gets the invocation but sends no metadata back
Craig Tiller09600be2015-05-13 16:46:55 -0700331 rcv_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700332 expect(recvd_rpc).to_not eq nil
333 server_call = recvd_rpc.call
334 server_ops = {
335 CallOps::SEND_INITIAL_METADATA => nil
336 }
337 server_call.run_batch(@server_queue, @server_tag, deadline, server_ops)
nnoble097ef9b2014-12-01 17:06:10 -0800338
Tim Emiola05e934f2015-03-28 15:19:34 -0700339 # client receives nothing as expected
340 client_ops = {
341 CallOps::RECV_INITIAL_METADATA => nil
342 }
343 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
344 client_ops)
345 expect(batch_result.metadata).to eq({})
nnoble097ef9b2014-12-01 17:06:10 -0800346 end
347
Tim Emiola5d66df82015-02-09 12:35:10 -0800348 it 'sends all the pairs when keys and values are valid' do
nnoble097ef9b2014-12-01 17:06:10 -0800349 @valid_metadata.each do |md|
Craig Tiller09600be2015-05-13 16:46:55 -0700350 recvd_rpc = nil
351 rcv_thread = Thread.new do
352 recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
353 end
354
nnoble097ef9b2014-12-01 17:06:10 -0800355 call = new_client_call
Tim Emiola05e934f2015-03-28 15:19:34 -0700356 # client signals that it's done sending metadata to allow server to
357 # respond
358 client_ops = {
359 CallOps::SEND_INITIAL_METADATA => nil
360 }
361 call.run_batch(@client_queue, @client_tag, deadline, client_ops)
nnoble097ef9b2014-12-01 17:06:10 -0800362
Tim Emiola05e934f2015-03-28 15:19:34 -0700363 # server gets the invocation but sends no metadata back
Craig Tiller09600be2015-05-13 16:46:55 -0700364 rcv_thread.join
Tim Emiola05e934f2015-03-28 15:19:34 -0700365 expect(recvd_rpc).to_not eq nil
366 server_call = recvd_rpc.call
367 server_ops = {
368 CallOps::SEND_INITIAL_METADATA => md
369 }
370 server_call.run_batch(@server_queue, @server_tag, deadline, server_ops)
nnoble097ef9b2014-12-01 17:06:10 -0800371
Tim Emiola05e934f2015-03-28 15:19:34 -0700372 # client receives nothing as expected
373 client_ops = {
374 CallOps::RECV_INITIAL_METADATA => nil
375 }
376 batch_result = call.run_batch(@client_queue, @client_tag, deadline,
377 client_ops)
Tim Emiolae2860c52015-01-16 02:58:41 -0800378 replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }]
Tim Emiola05e934f2015-03-28 15:19:34 -0700379 expect(batch_result.metadata).to eq(replace_symbols)
nnoble097ef9b2014-12-01 17:06:10 -0800380 end
nnoble097ef9b2014-12-01 17:06:10 -0800381 end
nnoble097ef9b2014-12-01 17:06:10 -0800382 end
nnoble097ef9b2014-12-01 17:06:10 -0800383end
384
nnoble097ef9b2014-12-01 17:06:10 -0800385describe 'the http client/server' do
nnoble097ef9b2014-12-01 17:06:10 -0800386 before(:example) do
Tim Emiola75d7f9a2015-01-26 16:57:33 -0800387 server_host = '0.0.0.0:0'
nnoble0c475f02014-12-05 15:37:39 -0800388 @client_queue = GRPC::Core::CompletionQueue.new
389 @server_queue = GRPC::Core::CompletionQueue.new
390 @server = GRPC::Core::Server.new(@server_queue, nil)
Tim Emiola0343b102015-01-26 17:06:51 -0800391 server_port = @server.add_http2_port(server_host)
nnoble097ef9b2014-12-01 17:06:10 -0800392 @server.start
Tim Emiola75d7f9a2015-01-26 16:57:33 -0800393 @ch = Channel.new("0.0.0.0:#{server_port}", nil)
nnoble097ef9b2014-12-01 17:06:10 -0800394 end
395
396 after(:example) do
Tim Emiola75d7f9a2015-01-26 16:57:33 -0800397 @ch.close
nnoble097ef9b2014-12-01 17:06:10 -0800398 @server.close
399 end
400
nnoble0c475f02014-12-05 15:37:39 -0800401 it_behaves_like 'basic GRPC message delivery is OK' do
402 end
403
404 it_behaves_like 'GRPC metadata delivery works OK' do
405 end
nnoble0c475f02014-12-05 15:37:39 -0800406end
407
408describe 'the secure http client/server' do
nnoble0c475f02014-12-05 15:37:39 -0800409 before(:example) do
410 certs = load_test_certs
Tim Emiola0ce8edc2015-03-05 15:17:30 -0800411 server_host = '0.0.0.0:0'
nnoble0c475f02014-12-05 15:37:39 -0800412 @client_queue = GRPC::Core::CompletionQueue.new
413 @server_queue = GRPC::Core::CompletionQueue.new
414 server_creds = GRPC::Core::ServerCredentials.new(nil, certs[1], certs[2])
Tim Emiola0ce8edc2015-03-05 15:17:30 -0800415 @server = GRPC::Core::Server.new(@server_queue, nil)
416 server_port = @server.add_http2_port(server_host, server_creds)
nnoble0c475f02014-12-05 15:37:39 -0800417 @server.start
Julien Boeuf597a4f22015-02-23 15:57:14 -0800418 args = { Channel::SSL_TARGET => 'foo.test.google.fr' }
Tim Emiola2b90e302015-01-26 17:37:15 -0800419 @ch = Channel.new("0.0.0.0:#{server_port}", args,
nnoble0c475f02014-12-05 15:37:39 -0800420 GRPC::Core::Credentials.new(certs[0], nil, nil))
421 end
422
423 after(:example) do
424 @server.close
425 end
nnoble097ef9b2014-12-01 17:06:10 -0800426
Tim Emiola0ce8edc2015-03-05 15:17:30 -0800427 it_behaves_like 'basic GRPC message delivery is OK' do
428 end
nnoble097ef9b2014-12-01 17:06:10 -0800429
Tim Emiola0ce8edc2015-03-05 15:17:30 -0800430 it_behaves_like 'GRPC metadata delivery works OK' do
431 end
Craig Tiller190d3602015-02-18 09:23:38 -0800432end