From 2e3972ae5497f7bcff260ce891191dfba7f55297 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Wed, 21 Dec 2016 13:57:42 -0800 Subject: [PATCH] Add advanced interop test behavior for Ruby server side --- src/ruby/pb/test/server.rb | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/ruby/pb/test/server.rb b/src/ruby/pb/test/server.rb index 3f1e0a1ccfc..c9b71aec76f 100755 --- a/src/ruby/pb/test/server.rb +++ b/src/ruby/pb/test/server.rb @@ -129,6 +129,27 @@ def nulls(l) [].pack('x' * l).force_encoding('ascii-8bit') end +def maybe_echo_metadata(_call) + + # these are consistent for all interop tests + initial_metadata_key = "x-grpc-test-echo-initial" + trailing_metadata_key = "x-grpc-test-echo-trailing-bin" + + if _call.metadata.has_key?(initial_metadata_key) + _call.metadata_to_send[initial_metadata_key] = _call.metadata[initial_metadata_key] + end + if _call.metadata.has_key?(trailing_metadata_key) + _call.output_metadata[trailing_metadata_key] = _call.metadata[trailing_metadata_key] + end +end + +def maybe_echo_status_and_message(req) + unless req.response_status.nil? + fail GRPC::BadStatus.new_status_exception( + req.response_status.code, req.response_status.message) + end +end + # A FullDuplexEnumerator passes requests to a block and yields generated responses class FullDuplexEnumerator include Grpc::Testing @@ -143,6 +164,7 @@ class FullDuplexEnumerator begin cls = StreamingOutputCallResponse @requests.each do |req| + maybe_echo_status_and_message(req) req.response_parameters.each do |params| resp_size = params.size GRPC.logger.info("read a req, response size is #{resp_size}") @@ -170,18 +192,23 @@ class TestTarget < Grpc::Testing::TestService::Service end def unary_call(simple_req, _call) + maybe_echo_metadata(_call) + maybe_echo_status_and_message(simple_req) req_size = simple_req.response_size SimpleResponse.new(payload: Payload.new(type: :COMPRESSABLE, body: nulls(req_size))) end def streaming_input_call(call) + maybe_echo_metadata(call) sizes = call.each_remote_read.map { |x| x.payload.body.length } sum = sizes.inject(0) { |s, x| s + x } StreamingInputCallResponse.new(aggregated_payload_size: sum) end def streaming_output_call(req, _call) + maybe_echo_metadata(_call) + maybe_echo_status_and_message(req) cls = StreamingOutputCallResponse req.response_parameters.map do |p| cls.new(payload: Payload.new(type: req.response_type, @@ -189,7 +216,8 @@ class TestTarget < Grpc::Testing::TestService::Service end end - def full_duplex_call(reqs) + def full_duplex_call(reqs, _call) + maybe_echo_metadata(_call) # reqs is a lazy Enumerator of the requests sent by the client. FullDuplexEnumerator.new(reqs).each_item end