blob: fce5d13e82587f62949cd87b933cf6e6464271e8 [file] [log] [blame]
Alexander Polcyn27338de2017-03-23 18:23:49 -07001#!/usr/bin/env ruby
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003# Copyright 2016 gRPC authors.
Alexander Polcyn27338de2017-03-23 18:23:49 -07004#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
Alexander Polcyn27338de2017-03-23 18:23:49 -07008#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009# http://www.apache.org/licenses/LICENSE-2.0
Alexander Polcyn27338de2017-03-23 18:23:49 -070010#
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Alexander Polcyn27338de2017-03-23 18:23:49 -070016
17require_relative './end2end_common'
18
Alexander Polcyn077f8902017-03-24 09:53:40 -070019# Service that sleeps for a long time upon receiving an 'echo request'
Alexander Polcyn4364ded2017-03-24 10:41:37 -070020# Also, this notifies @call_started_cv once it has received a request.
Alexander Polcyn27338de2017-03-23 18:23:49 -070021class SleepingEchoServerImpl < Echo::EchoServer::Service
22 def initialize(call_started, call_started_mu, call_started_cv)
23 @call_started = call_started
24 @call_started_mu = call_started_mu
25 @call_started_cv = call_started_cv
26 end
Alexander Polcyn077f8902017-03-24 09:53:40 -070027
Alexander Polcyn27338de2017-03-23 18:23:49 -070028 def echo(echo_req, _)
29 @call_started_mu.synchronize do
30 @call_started.set_true
31 @call_started_cv.signal
32 end
33 sleep 1000
34 Echo::EchoReply.new(response: echo_req.request)
35 end
36end
37
Alexander Polcyn077f8902017-03-24 09:53:40 -070038# Mutable boolean
Alexander Polcyn27338de2017-03-23 18:23:49 -070039class BoolHolder
Alexander Polcyn077f8902017-03-24 09:53:40 -070040 attr_reader :val
41
Alexander Polcyn27338de2017-03-23 18:23:49 -070042 def init
43 @val = false
44 end
Alexander Polcyn077f8902017-03-24 09:53:40 -070045
Alexander Polcyn27338de2017-03-23 18:23:49 -070046 def set_true
47 @val = true
48 end
Alexander Polcyn27338de2017-03-23 18:23:49 -070049end
50
Alexander Polcyn27338de2017-03-23 18:23:49 -070051def main
52 STDERR.puts 'start server'
53
54 call_started = BoolHolder.new
55 call_started_mu = Mutex.new
56 call_started_cv = ConditionVariable.new
57
Alexander Polcyn077f8902017-03-24 09:53:40 -070058 service_impl = SleepingEchoServerImpl.new(call_started,
59 call_started_mu,
60 call_started_cv)
61 server_runner = ServerRunner.new(service_impl)
Alexander Polcyn27338de2017-03-23 18:23:49 -070062 server_port = server_runner.run
63
64 STDERR.puts 'start client'
65 _, client_pid = start_client('killed_client_thread_client.rb',
Alexander Polcyn077f8902017-03-24 09:53:40 -070066 server_port)
Alexander Polcyn27338de2017-03-23 18:23:49 -070067
68 call_started_mu.synchronize do
Alexander Polcyn077f8902017-03-24 09:53:40 -070069 call_started_cv.wait(call_started_mu) until call_started.val
Alexander Polcyn27338de2017-03-23 18:23:49 -070070 end
71
Alexander Polcyn2f3e5882017-09-21 13:47:20 -070072 # SIGTERM the child process now that it's
Alexander Polcyn077f8902017-03-24 09:53:40 -070073 # in the middle of an RPC (happening on a non-main thread)
Alexander Polcyn2f3e5882017-09-21 13:47:20 -070074 Process.kill('SIGTERM', client_pid)
Alexander Polcyn27338de2017-03-23 18:23:49 -070075 STDERR.puts 'sent shutdown'
76
77 begin
78 Timeout.timeout(10) do
79 Process.wait(client_pid)
80 end
81 rescue Timeout::Error
82 STDERR.puts "timeout wait for client pid #{client_pid}"
83 Process.kill('SIGKILL', client_pid)
84 Process.wait(client_pid)
85 STDERR.puts 'killed client child'
Alexander Polcyn077f8902017-03-24 09:53:40 -070086 raise 'Timed out waiting for client process. ' \
87 'It likely hangs when killed while in the middle of an rpc'
Alexander Polcyn27338de2017-03-23 18:23:49 -070088 end
89
90 client_exit_code = $CHILD_STATUS
Alexander Polcyn2f3e5882017-09-21 13:47:20 -070091 if client_exit_code.termsig != 15 # SIGTERM
92 fail 'expected client exit from SIGTERM ' \
Alexander Polcyn077f8902017-03-24 09:53:40 -070093 "but got child status: #{client_exit_code}"
Alexander Polcyn27338de2017-03-23 18:23:49 -070094 end
95
96 server_runner.stop
97end
98
99main