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.
14
15# Test stubs for various scenarios
16require 'spec_helper'
17
18# A test message
19class EchoMsg
20  def self.marshal(_o)
21    ''
22  end
23
24  def self.unmarshal(_o)
25    EchoMsg.new
26  end
27end
28
29# A test service with an echo implementation.
30class EchoService
31  include GRPC::GenericService
32  rpc :an_rpc, EchoMsg, EchoMsg
33  rpc :a_client_streaming_rpc, stream(EchoMsg), EchoMsg
34  rpc :a_server_streaming_rpc, EchoMsg, stream(EchoMsg)
35  rpc :a_bidi_rpc, stream(EchoMsg), stream(EchoMsg)
36  attr_reader :received_md
37
38  def initialize(**kw)
39    @trailing_metadata = kw
40    @received_md = []
41  end
42
43  def an_rpc(req, call)
44    GRPC.logger.info('echo service received a request')
45    call.output_metadata.update(@trailing_metadata)
46    @received_md << call.metadata unless call.metadata.nil?
47    req
48  end
49
50  def a_client_streaming_rpc(call)
51    # iterate through requests so call can complete
52    call.output_metadata.update(@trailing_metadata)
53    call.each_remote_read.each do |r|
54      GRPC.logger.info(r)
55    end
56    EchoMsg.new
57  end
58
59  def a_server_streaming_rpc(_req, call)
60    call.output_metadata.update(@trailing_metadata)
61    [EchoMsg.new, EchoMsg.new]
62  end
63
64  def a_bidi_rpc(requests, call)
65    call.output_metadata.update(@trailing_metadata)
66    requests.each do |r|
67      GRPC.logger.info(r)
68    end
69    [EchoMsg.new, EchoMsg.new]
70  end
71end
72
73EchoStub = EchoService.rpc_stub_class
74
75# For testing server interceptors
76class TestServerInterceptor < GRPC::ServerInterceptor
77  def request_response(request:, call:, method:)
78    GRPC.logger.info("Received request/response call at method #{method}" \
79      " with request #{request} for call #{call}")
80    call.output_metadata[:interc] = 'from_request_response'
81    GRPC.logger.info("[GRPC::Ok] (#{method.owner.name}.#{method.name})")
82    yield
83  end
84
85  def client_streamer(call:, method:)
86    call.output_metadata[:interc] = 'from_client_streamer'
87    call.each_remote_read.each do |r|
88      GRPC.logger.info("In interceptor: #{r}")
89    end
90    GRPC.logger.info(
91      "Received client streamer call at method #{method} for call #{call}"
92    )
93    yield
94  end
95
96  def server_streamer(request:, call:, method:)
97    GRPC.logger.info("Received server streamer call at method #{method} with request" \
98      " #{request} for call #{call}")
99    call.output_metadata[:interc] = 'from_server_streamer'
100    yield
101  end
102
103  def bidi_streamer(requests:, call:, method:)
104    requests.each do |r|
105      GRPC.logger.info("Bidi request: #{r}")
106    end
107    GRPC.logger.info("Received bidi streamer call at method #{method} with requests" \
108      " #{requests} for call #{call}")
109    call.output_metadata[:interc] = 'from_bidi_streamer'
110    yield
111  end
112end
113
114# For testing client interceptors
115class TestClientInterceptor < GRPC::ClientInterceptor
116  def request_response(request:, call:, method:, metadata: {})
117    GRPC.logger.info("Intercepted request/response call at method #{method}" \
118      " with request #{request} for call #{call}" \
119      " and metadata: #{metadata}")
120    metadata['foo'] = 'bar_from_request_response'
121    yield
122  end
123
124  def client_streamer(requests:, call:, method:, metadata: {})
125    GRPC.logger.info("Received client streamer call at method #{method}" \
126      " with requests #{requests} for call #{call}" \
127      " and metadata: #{metadata}")
128    requests.each do |r|
129      GRPC.logger.info("In client interceptor: #{r}")
130    end
131    metadata['foo'] = 'bar_from_client_streamer'
132    yield
133  end
134
135  def server_streamer(request:, call:, method:, metadata: {})
136    GRPC.logger.info("Received server streamer call at method #{method}" \
137      " with request #{request} for call #{call}" \
138      " and metadata: #{metadata}")
139    metadata['foo'] = 'bar_from_server_streamer'
140    yield
141  end
142
143  def bidi_streamer(requests:, call:, method:, metadata: {})
144    GRPC.logger.info("Received bidi streamer call at method #{method}" \
145      "with requests #{requests} for call #{call}" \
146      " and metadata: #{metadata}")
147    requests.each do |r|
148      GRPC.logger.info("In client interceptor: #{r}")
149    end
150    metadata['foo'] = 'bar_from_bidi_streamer'
151    yield
152  end
153end
154