1# Copyright 2017 gRPC authors. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14require 'spec_helper' 15 16describe 'Client Interceptors' do 17 let(:interceptor) { TestClientInterceptor.new } 18 let(:interceptors_opts) { { interceptors: [interceptor] } } 19 let(:request) { EchoMsg.new } 20 let(:service) { EchoService } 21 22 before(:each) do 23 build_rpc_server 24 end 25 26 context 'when a client interceptor is added' do 27 context 'with a request/response call' do 28 it 'should be called', server: true do 29 expect(interceptor).to receive(:request_response) 30 .once.and_call_original 31 32 run_services_on_server(@server, services: [service]) do 33 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 34 expect_any_instance_of(GRPC::ActiveCall).to receive(:request_response) 35 .once.and_call_original 36 expect(stub.an_rpc(request)).to be_a(EchoMsg) 37 end 38 end 39 40 it 'can modify outgoing metadata', server: true do 41 expect(interceptor).to receive(:request_response) 42 .once.and_call_original 43 44 run_services_on_server(@server, services: [service]) do 45 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 46 expect_any_instance_of(GRPC::ActiveCall).to receive(:request_response) 47 .with(request, metadata: { 'foo' => 'bar_from_request_response' }) 48 .once.and_call_original 49 expect(stub.an_rpc(request)).to be_a(EchoMsg) 50 end 51 end 52 end 53 54 context 'with a client streaming call' do 55 it 'should be called', server: true do 56 expect(interceptor).to receive(:client_streamer) 57 .once.and_call_original 58 59 run_services_on_server(@server, services: [service]) do 60 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 61 expect_any_instance_of(GRPC::ActiveCall).to receive(:client_streamer) 62 .once.and_call_original 63 requests = [EchoMsg.new, EchoMsg.new] 64 expect(stub.a_client_streaming_rpc(requests)).to be_a(EchoMsg) 65 end 66 end 67 68 it 'can modify outgoing metadata', server: true do 69 expect(interceptor).to receive(:client_streamer) 70 .once.and_call_original 71 72 run_services_on_server(@server, services: [service]) do 73 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 74 requests = [EchoMsg.new, EchoMsg.new] 75 expect_any_instance_of(GRPC::ActiveCall).to receive(:client_streamer) 76 .with(requests, metadata: { 'foo' => 'bar_from_client_streamer' }) 77 .once.and_call_original 78 expect(stub.a_client_streaming_rpc(requests)).to be_a(EchoMsg) 79 end 80 end 81 end 82 83 context 'with a server streaming call' do 84 it 'should be called', server: true do 85 expect(interceptor).to receive(:server_streamer) 86 .once.and_call_original 87 88 run_services_on_server(@server, services: [service]) do 89 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 90 request = EchoMsg.new 91 expect_any_instance_of(GRPC::ActiveCall).to receive(:server_streamer) 92 .once.and_call_original 93 responses = stub.a_server_streaming_rpc(request) 94 responses.each do |r| 95 expect(r).to be_a(EchoMsg) 96 end 97 end 98 end 99 100 it 'can modify outgoing metadata', server: true do 101 expect(interceptor).to receive(:server_streamer) 102 .once.and_call_original 103 104 run_services_on_server(@server, services: [service]) do 105 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 106 request = EchoMsg.new 107 expect_any_instance_of(GRPC::ActiveCall).to receive(:server_streamer) 108 .with(request, metadata: { 'foo' => 'bar_from_server_streamer' }) 109 .once.and_call_original 110 responses = stub.a_server_streaming_rpc(request) 111 responses.each do |r| 112 expect(r).to be_a(EchoMsg) 113 end 114 end 115 end 116 end 117 118 context 'with a bidi call' do 119 it 'should be called', server: true do 120 expect(interceptor).to receive(:bidi_streamer) 121 .once.and_call_original 122 123 run_services_on_server(@server, services: [service]) do 124 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 125 expect_any_instance_of(GRPC::ActiveCall).to receive(:bidi_streamer) 126 .once.and_call_original 127 requests = [EchoMsg.new, EchoMsg.new] 128 responses = stub.a_bidi_rpc(requests) 129 responses.each do |r| 130 expect(r).to be_a(EchoMsg) 131 end 132 end 133 end 134 135 it 'can modify outgoing metadata', server: true do 136 expect(interceptor).to receive(:bidi_streamer) 137 .once.and_call_original 138 139 run_services_on_server(@server, services: [service]) do 140 stub = build_insecure_stub(EchoStub, opts: interceptors_opts) 141 requests = [EchoMsg.new, EchoMsg.new] 142 expect_any_instance_of(GRPC::ActiveCall).to receive(:bidi_streamer) 143 .with(requests, metadata: { 'foo' => 'bar_from_bidi_streamer' }) 144 .once.and_call_original 145 responses = stub.a_bidi_rpc(requests) 146 responses.each do |r| 147 expect(r).to be_a(EchoMsg) 148 end 149 end 150 end 151 end 152 end 153end 154