|  | # 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 |