# Copyright 2017 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. require 'spec_helper' describe 'Client Interceptors' do let(:interceptor) { TestClientInterceptor.new } let(:interceptors_opts) { { interceptors: [interceptor] } } let(:request) { EchoMsg.new } let(:service) { EchoService } before(:each) do build_rpc_server end context 'when a client interceptor is added' do context 'with a request/response call' do it 'should be called', server: true do expect(interceptor).to receive(:request_response) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) expect_any_instance_of(GRPC::ActiveCall).to receive(:request_response) .once.and_call_original expect(stub.an_rpc(request)).to be_a(EchoMsg) end end it 'can modify outgoing metadata', server: true do expect(interceptor).to receive(:request_response) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) expect_any_instance_of(GRPC::ActiveCall).to receive(:request_response) .with(request, metadata: { 'foo' => 'bar_from_request_response' }) .once.and_call_original expect(stub.an_rpc(request)).to be_a(EchoMsg) end end end context 'with a client streaming call' do it 'should be called', server: true do expect(interceptor).to receive(:client_streamer) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) expect_any_instance_of(GRPC::ActiveCall).to receive(:client_streamer) .once.and_call_original requests = [EchoMsg.new, EchoMsg.new] expect(stub.a_client_streaming_rpc(requests)).to be_a(EchoMsg) end end it 'can modify outgoing metadata', server: true do expect(interceptor).to receive(:client_streamer) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) requests = [EchoMsg.new, EchoMsg.new] expect_any_instance_of(GRPC::ActiveCall).to receive(:client_streamer) .with(requests, metadata: { 'foo' => 'bar_from_client_streamer' }) .once.and_call_original expect(stub.a_client_streaming_rpc(requests)).to be_a(EchoMsg) end end end context 'with a server streaming call' do it 'should be called', server: true do expect(interceptor).to receive(:server_streamer) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) request = EchoMsg.new expect_any_instance_of(GRPC::ActiveCall).to receive(:server_streamer) .once.and_call_original responses = stub.a_server_streaming_rpc(request) responses.each do |r| expect(r).to be_a(EchoMsg) end end end it 'can modify outgoing metadata', server: true do expect(interceptor).to receive(:server_streamer) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) request = EchoMsg.new expect_any_instance_of(GRPC::ActiveCall).to receive(:server_streamer) .with(request, metadata: { 'foo' => 'bar_from_server_streamer' }) .once.and_call_original responses = stub.a_server_streaming_rpc(request) responses.each do |r| expect(r).to be_a(EchoMsg) end end end end context 'with a bidi call' do it 'should be called', server: true do expect(interceptor).to receive(:bidi_streamer) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) expect_any_instance_of(GRPC::ActiveCall).to receive(:bidi_streamer) .once.and_call_original requests = [EchoMsg.new, EchoMsg.new] responses = stub.a_bidi_rpc(requests) responses.each do |r| expect(r).to be_a(EchoMsg) end end end it 'can modify outgoing metadata', server: true do expect(interceptor).to receive(:bidi_streamer) .once.and_call_original run_services_on_server(@server, services: [service]) do stub = build_insecure_stub(EchoStub, opts: interceptors_opts) requests = [EchoMsg.new, EchoMsg.new] expect_any_instance_of(GRPC::ActiveCall).to receive(:bidi_streamer) .with(requests, metadata: { 'foo' => 'bar_from_bidi_streamer' }) .once.and_call_original responses = stub.a_bidi_rpc(requests) responses.each do |r| expect(r).to be_a(EchoMsg) end end end end end end