From bac6ef1b877f1de8a7877818e73bc48f4d484937 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 12 Aug 2015 03:50:59 +0000 Subject: envutil.rb: abort at timeout * test/lib/envutil.rb (invoke_ruby): abort at timeout and show the backtrace of the target process. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51539 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/lib/envutil.rb | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'test/lib/envutil.rb') diff --git a/test/lib/envutil.rb b/test/lib/envutil.rb index 2a0334dedb..ebb2ef57d0 100644 --- a/test/lib/envutil.rb +++ b/test/lib/envutil.rb @@ -73,12 +73,14 @@ module EnvUtil th_stderr = Thread.new { err_p.read } if capture_stderr && capture_stderr != :merge_to_stdout in_p.write stdin_data.to_str unless stdin_data.empty? in_p.close - unless (!th_stdout || th_stdout.join(timeout)) && (!th_stderr || th_stderr.join(timeout)) + if (!th_stdout || th_stdout.join(timeout)) && (!th_stderr || th_stderr.join(timeout)) + timeout_error = nil + else signals = Array(signal).select do |sig| DEFAULT_SIGNALS[sig.to_s] or DEFAULT_SIGNALS[Signal.signame(sig)] rescue false end - signals |= [:KILL] + signals |= [:ABRT, :KILL] case pgroup = opt[:pgroup] when 0, true pgroup = -pid @@ -102,10 +104,6 @@ module EnvUtil end end end - if timeout_error - bt = caller_locations - raise timeout_error, "execution of #{bt.shift.label} expired", bt.map(&:to_s) - end status = $? end stdout = th_stdout.value if capture_stdout @@ -115,6 +113,12 @@ module EnvUtil status ||= Process.wait2(pid)[1] stdout = stdout_filter.call(stdout) if stdout_filter stderr = stderr_filter.call(stderr) if stderr_filter + if timeout_error + bt = caller_locations + msg = "execution of #{bt.shift.label} expired" + msg = Test::Unit::Assertions::FailDesc[status, msg, [stdout, stderr].join("\n")].() + raise timeout_error, msg, bt.map(&:to_s) + end return stdout, stderr, status end ensure -- cgit v1.2.3