From 850889558cf070e5e7b6eb471d71a61300b3442f Mon Sep 17 00:00:00 2001
From: Stan Hu <stanhu@gmail.com>
Date: Tue, 4 Jul 2023 22:48:07 -0700
Subject: [PATCH] [ruby] Add test for DeadlineExceeded raised on late streaming
 responses

---
 src/ruby/spec/generic/rpc_server_spec.rb | 25 ++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb
index 6cb4ac2bda8..09b464c432f 100644
--- a/src/ruby/spec/generic/rpc_server_spec.rb
+++ b/src/ruby/spec/generic/rpc_server_spec.rb
@@ -61,6 +61,7 @@ FailingStub = FailingService.rpc_stub_class
 class SlowService
   include GRPC::GenericService
   rpc :an_rpc, EchoMsg, EchoMsg
+  rpc :a_server_streaming_rpc, EchoMsg, stream(EchoMsg)
   attr_reader :received_md, :delay
 
   def initialize(_default_var = 'ignored')
@@ -74,6 +75,13 @@ class SlowService
     @received_md << call.metadata unless call.metadata.nil?
     req  # send back the req as the response
   end
+
+  def a_server_streaming_rpc(_, call)
+    GRPC.logger.info("starting a slow #{@delay} server streaming rpc")
+    sleep @delay
+    @received_md << call.metadata unless call.metadata.nil?
+    [EchoMsg.new, EchoMsg.new]
+  end
 end
 
 SlowStub = SlowService.rpc_stub_class
@@ -410,6 +418,23 @@ describe GRPC::RpcServer do
         t.join
       end
 
+      it 'should raise DeadlineExceeded', server: true do
+        service = SlowService.new
+        @srv.handle(service)
+        t = Thread.new { @srv.run }
+        @srv.wait_till_running
+        req = EchoMsg.new
+        stub = SlowStub.new(@host, :this_channel_is_insecure, **client_opts)
+        timeout = service.delay - 0.1
+        deadline = GRPC::Core::TimeConsts.from_relative_time(timeout)
+        responses = stub.a_server_streaming_rpc(req,
+                                                deadline: deadline,
+                                                metadata: { k1: 'v1', k2: 'v2' })
+        expect { responses.to_a }.to raise_error(GRPC::DeadlineExceeded)
+        @srv.stop
+        t.join
+      end
+
       it 'should handle cancellation correctly', server: true do
         request_received = false
         request_received_mu = Mutex.new