• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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