|  | @@ -74,6 +74,12 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    it 'servers receive requests from clients and can respond' do
 | 
	
		
			
				|  |  |      call = new_client_call
 | 
	
		
			
				|  |  | +    server_call = nil
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server_thread = Thread.new do
 | 
	
		
			
				|  |  | +      server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      client_ops = {
 | 
	
		
			
				|  |  |        CallOps::SEND_INITIAL_METADATA => {},
 | 
	
		
			
				|  |  |        CallOps::SEND_MESSAGE => sent_message
 | 
	
	
		
			
				|  | @@ -84,7 +90,7 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |      expect(batch_result.send_message).to be true
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      # confirm the server can read the inbound message
 | 
	
		
			
				|  |  | -    server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    server_thread.join
 | 
	
		
			
				|  |  |      server_ops = {
 | 
	
		
			
				|  |  |        CallOps::RECV_MESSAGE => nil
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -95,6 +101,12 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    it 'responses written by servers are received by the client' do
 | 
	
		
			
				|  |  |      call = new_client_call
 | 
	
		
			
				|  |  | +    server_call = nil
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server_thread = Thread.new do
 | 
	
		
			
				|  |  | +      server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      client_ops = {
 | 
	
		
			
				|  |  |        CallOps::SEND_INITIAL_METADATA => {},
 | 
	
		
			
				|  |  |        CallOps::SEND_MESSAGE => sent_message
 | 
	
	
		
			
				|  | @@ -105,7 +117,7 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |      expect(batch_result.send_message).to be true
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      # confirm the server can read the inbound message
 | 
	
		
			
				|  |  | -    server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    server_thread.join
 | 
	
		
			
				|  |  |      server_ops = {
 | 
	
		
			
				|  |  |        CallOps::RECV_MESSAGE => nil,
 | 
	
		
			
				|  |  |        CallOps::SEND_MESSAGE => reply_text
 | 
	
	
		
			
				|  | @@ -118,6 +130,12 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    it 'servers can ignore a client write and send a status' do
 | 
	
		
			
				|  |  |      call = new_client_call
 | 
	
		
			
				|  |  | +    server_call = nil
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server_thread = Thread.new do
 | 
	
		
			
				|  |  | +      server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      client_ops = {
 | 
	
		
			
				|  |  |        CallOps::SEND_INITIAL_METADATA => {},
 | 
	
		
			
				|  |  |        CallOps::SEND_MESSAGE => sent_message
 | 
	
	
		
			
				|  | @@ -129,7 +147,7 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      # confirm the server can read the inbound message
 | 
	
		
			
				|  |  |      the_status = Struct::Status.new(StatusCodes::OK, 'OK')
 | 
	
		
			
				|  |  | -    server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    server_thread.join
 | 
	
		
			
				|  |  |      server_ops = {
 | 
	
		
			
				|  |  |        CallOps::SEND_STATUS_FROM_SERVER => the_status
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -141,6 +159,12 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    it 'completes calls by sending status to client and server' do
 | 
	
		
			
				|  |  |      call = new_client_call
 | 
	
		
			
				|  |  | +    server_call = nil
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server_thread = Thread.new do
 | 
	
		
			
				|  |  | +      server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      client_ops = {
 | 
	
		
			
				|  |  |        CallOps::SEND_INITIAL_METADATA => {},
 | 
	
		
			
				|  |  |        CallOps::SEND_MESSAGE => sent_message
 | 
	
	
		
			
				|  | @@ -152,7 +176,7 @@ shared_examples 'basic GRPC message delivery is OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      # confirm the server can read the inbound message and respond
 | 
	
		
			
				|  |  |      the_status = Struct::Status.new(StatusCodes::OK, 'OK', {})
 | 
	
		
			
				|  |  | -    server_call = server_allows_client_to_proceed
 | 
	
		
			
				|  |  | +    server_thread.join
 | 
	
		
			
				|  |  |      server_ops = {
 | 
	
		
			
				|  |  |        CallOps::RECV_MESSAGE => nil,
 | 
	
		
			
				|  |  |        CallOps::SEND_MESSAGE => reply_text,
 | 
	
	
		
			
				|  | @@ -221,6 +245,11 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      it 'sends all the metadata pairs when keys and values are valid' do
 | 
	
		
			
				|  |  |        @valid_metadata.each do |md|
 | 
	
		
			
				|  |  | +        recvd_rpc = nil
 | 
	
		
			
				|  |  | +        rcv_thread = Thread.new do
 | 
	
		
			
				|  |  | +          recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +        end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          call = new_client_call
 | 
	
		
			
				|  |  |          client_ops = {
 | 
	
		
			
				|  |  |            CallOps::SEND_INITIAL_METADATA => md
 | 
	
	
		
			
				|  | @@ -230,7 +259,7 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |          expect(batch_result.send_metadata).to be true
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # confirm the server can receive the client metadata
 | 
	
		
			
				|  |  | -        recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +        rcv_thread.join
 | 
	
		
			
				|  |  |          expect(recvd_rpc).to_not eq nil
 | 
	
		
			
				|  |  |          recvd_md = recvd_rpc.metadata
 | 
	
		
			
				|  |  |          replace_symbols = Hash[md.each_pair.collect { |x, y| [x.to_s, y] }]
 | 
	
	
		
			
				|  | @@ -257,6 +286,11 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      it 'raises an exception if a metadata key is invalid' do
 | 
	
		
			
				|  |  |        @bad_keys.each do |md|
 | 
	
		
			
				|  |  | +        recvd_rpc = nil
 | 
	
		
			
				|  |  | +        rcv_thread = Thread.new do
 | 
	
		
			
				|  |  | +          recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +        end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          call = new_client_call
 | 
	
		
			
				|  |  |          # client signals that it's done sending metadata to allow server to
 | 
	
		
			
				|  |  |          # respond
 | 
	
	
		
			
				|  | @@ -266,7 +300,7 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |          call.run_batch(@client_queue, @client_tag, deadline, client_ops)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # server gets the invocation
 | 
	
		
			
				|  |  | -        recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +        rcv_thread.join
 | 
	
		
			
				|  |  |          expect(recvd_rpc).to_not eq nil
 | 
	
		
			
				|  |  |          server_ops = {
 | 
	
		
			
				|  |  |            CallOps::SEND_INITIAL_METADATA => md
 | 
	
	
		
			
				|  | @@ -280,6 +314,11 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |      end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      it 'sends an empty hash if no metadata is added' do
 | 
	
		
			
				|  |  | +      recvd_rpc = nil
 | 
	
		
			
				|  |  | +      rcv_thread = Thread.new do
 | 
	
		
			
				|  |  | +        recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +      end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        call = new_client_call
 | 
	
		
			
				|  |  |        # client signals that it's done sending metadata to allow server to
 | 
	
		
			
				|  |  |        # respond
 | 
	
	
		
			
				|  | @@ -289,7 +328,7 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |        call.run_batch(@client_queue, @client_tag, deadline, client_ops)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        # server gets the invocation but sends no metadata back
 | 
	
		
			
				|  |  | -      recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +      rcv_thread.join
 | 
	
		
			
				|  |  |        expect(recvd_rpc).to_not eq nil
 | 
	
		
			
				|  |  |        server_call = recvd_rpc.call
 | 
	
		
			
				|  |  |        server_ops = {
 | 
	
	
		
			
				|  | @@ -308,6 +347,11 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      it 'sends all the pairs when keys and values are valid' do
 | 
	
		
			
				|  |  |        @valid_metadata.each do |md|
 | 
	
		
			
				|  |  | +        recvd_rpc = nil
 | 
	
		
			
				|  |  | +        rcv_thread = Thread.new do
 | 
	
		
			
				|  |  | +          recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +        end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          call = new_client_call
 | 
	
		
			
				|  |  |          # client signals that it's done sending metadata to allow server to
 | 
	
		
			
				|  |  |          # respond
 | 
	
	
		
			
				|  | @@ -317,7 +361,7 @@ shared_examples 'GRPC metadata delivery works OK' do
 | 
	
		
			
				|  |  |          call.run_batch(@client_queue, @client_tag, deadline, client_ops)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # server gets the invocation but sends no metadata back
 | 
	
		
			
				|  |  | -        recvd_rpc = @server.request_call(@server_queue, @server_tag, deadline)
 | 
	
		
			
				|  |  | +        rcv_thread.join
 | 
	
		
			
				|  |  |          expect(recvd_rpc).to_not eq nil
 | 
	
		
			
				|  |  |          server_call = recvd_rpc.call
 | 
	
		
			
				|  |  |          server_ops = {
 |