aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ruby/spec/generic/rpc_server_spec.rb
diff options
context:
space:
mode:
authorGravatar Alexander Polcyn <apolcyn@google.com>2017-04-13 10:47:16 -0700
committerGravatar Alexander Polcyn <apolcyn@google.com>2017-08-07 10:37:51 -0700
commitc6627caf3a05f76e8449eff5135955986b689c2b (patch)
treee9b99afd4f9cf9198dc0c93dcdc98fabd9161ad6 /src/ruby/spec/generic/rpc_server_spec.rb
parent8dc1b7db51c49869ab24404bc810500db51fc86d (diff)
cancel calls with an error message when bidi write loop fails with user
error
Diffstat (limited to 'src/ruby/spec/generic/rpc_server_spec.rb')
-rw-r--r--src/ruby/spec/generic/rpc_server_spec.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb
index e0646f4599..27642d6975 100644
--- a/src/ruby/spec/generic/rpc_server_spec.rb
+++ b/src/ruby/spec/generic/rpc_server_spec.rb
@@ -152,6 +152,18 @@ end
CheckCallAfterFinishedServiceStub = CheckCallAfterFinishedService.rpc_stub_class
+# A service with a bidi streaming method.
+class BidiService
+ include GRPC::GenericService
+ rpc :server_sends_bad_input, stream(EchoMsg), stream(EchoMsg)
+
+ def server_sends_bad_input(_, _)
+ 'bad response. (not an enumerable, client sees an error)'
+ end
+end
+
+BidiStub = BidiService.rpc_stub_class
+
describe GRPC::RpcServer do
RpcServer = GRPC::RpcServer
StatusCodes = GRPC::Core::StatusCodes
@@ -450,6 +462,29 @@ describe GRPC::RpcServer do
t.join
expect(one_failed_as_unavailable).to be(true)
end
+
+ it 'should send a status UNKNOWN with a relevant message when the' \
+ 'servers response stream is not an enumerable' do
+ @srv.handle(BidiService)
+ t = Thread.new { @srv.run }
+ @srv.wait_till_running
+ stub = BidiStub.new(@host, :this_channel_is_insecure, **client_opts)
+ responses = stub.server_sends_bad_input([])
+ exception = nil
+ begin
+ responses.each { |r| r }
+ rescue GRPC::Unknown => e
+ exception = e
+ end
+ # Erroneous responses sent from the server handler should cause an
+ # exception on the client with relevant info.
+ expected_details = 'NoMethodError: undefined method `each\' for '\
+ '"bad response. (not an enumerable, client sees an error)"'
+
+ expect(exception.inspect.include?(expected_details)).to be true
+ @srv.stop
+ t.join
+ end
end
context 'with connect metadata' do