| # 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. |
| |
| # Test stubs for various scenarios |
| require 'grpc' |
| |
| # A test message |
| class EchoMsg |
| def self.marshal(_o) |
| '' |
| end |
| |
| def self.unmarshal(_o) |
| EchoMsg.new |
| end |
| end |
| |
| # A test service with an echo implementation. |
| class EchoService |
| include GRPC::GenericService |
| rpc :an_rpc, EchoMsg, EchoMsg |
| rpc :a_client_streaming_rpc, stream(EchoMsg), EchoMsg |
| rpc :a_server_streaming_rpc, EchoMsg, stream(EchoMsg) |
| rpc :a_bidi_rpc, stream(EchoMsg), stream(EchoMsg) |
| attr_reader :received_md |
| |
| def initialize(**kw) |
| @trailing_metadata = kw |
| @received_md = [] |
| end |
| |
| def an_rpc(req, call) |
| GRPC.logger.info('echo service received a request') |
| call.output_metadata.update(@trailing_metadata) |
| @received_md << call.metadata unless call.metadata.nil? |
| req |
| end |
| |
| def a_client_streaming_rpc(call) |
| # iterate through requests so call can complete |
| call.output_metadata.update(@trailing_metadata) |
| call.each_remote_read.each { |r| p r } |
| EchoMsg.new |
| end |
| |
| def a_server_streaming_rpc(_req, call) |
| call.output_metadata.update(@trailing_metadata) |
| [EchoMsg.new, EchoMsg.new] |
| end |
| |
| def a_bidi_rpc(requests, call) |
| call.output_metadata.update(@trailing_metadata) |
| requests.each { |r| p r } |
| [EchoMsg.new, EchoMsg.new] |
| end |
| end |
| |
| EchoStub = EchoService.rpc_stub_class |
| |
| # For testing server interceptors |
| class TestServerInterceptor < GRPC::ServerInterceptor |
| def request_response(request:, call:, method:) |
| p "Received request/response call at method #{method}" \ |
| " with request #{request} for call #{call}" |
| call.output_metadata[:interc] = 'from_request_response' |
| p "[GRPC::Ok] (#{method.owner.name}.#{method.name})" |
| yield |
| end |
| |
| def client_streamer(call:, method:) |
| call.output_metadata[:interc] = 'from_client_streamer' |
| call.each_remote_read.each do |r| |
| p "In interceptor: #{r}" |
| end |
| p "Received client streamer call at method #{method} for call #{call}" |
| yield |
| end |
| |
| def server_streamer(request:, call:, method:) |
| p "Received server streamer call at method #{method} with request" \ |
| " #{request} for call #{call}" |
| call.output_metadata[:interc] = 'from_server_streamer' |
| yield |
| end |
| |
| def bidi_streamer(requests:, call:, method:) |
| requests.each do |r| |
| p "Bidi request: #{r}" |
| end |
| p "Received bidi streamer call at method #{method} with requests" \ |
| " #{requests} for call #{call}" |
| call.output_metadata[:interc] = 'from_bidi_streamer' |
| yield |
| end |
| end |
| |
| # For testing client interceptors |
| class TestClientInterceptor < GRPC::ClientInterceptor |
| def request_response(request:, call:, method:, metadata: {}) |
| p "Intercepted request/response call at method #{method}" \ |
| " with request #{request} for call #{call}" \ |
| " and metadata: #{metadata}" |
| metadata['foo'] = 'bar_from_request_response' |
| yield |
| end |
| |
| def client_streamer(requests:, call:, method:, metadata: {}) |
| p "Received client streamer call at method #{method}" \ |
| " with requests #{requests} for call #{call}" \ |
| " and metadata: #{metadata}" |
| requests.each do |r| |
| p "In client interceptor: #{r}" |
| end |
| metadata['foo'] = 'bar_from_client_streamer' |
| yield |
| end |
| |
| def server_streamer(request:, call:, method:, metadata: {}) |
| p "Received server streamer call at method #{method}" \ |
| " with request #{request} for call #{call}" \ |
| " and metadata: #{metadata}" |
| metadata['foo'] = 'bar_from_server_streamer' |
| yield |
| end |
| |
| def bidi_streamer(requests:, call:, method:, metadata: {}) |
| p "Received bidi streamer call at method #{method}" \ |
| "with requests #{requests} for call #{call}" \ |
| " and metadata: #{metadata}" |
| requests.each do |r| |
| p "In client interceptor: #{r}" |
| end |
| metadata['foo'] = 'bar_from_bidi_streamer' |
| yield |
| end |
| end |