ruby-changes:37725
From: nobu <ko1@a...>
Date: Mon, 2 Mar 2015 15:44:38 +0900 (JST)
Subject: [ruby-changes:37725] nobu:r49806 (trunk): envutil.rb: timeout_error argument to invoke_ruby
nobu 2015-03-02 15:44:34 +0900 (Mon, 02 Mar 2015) New Revision: 49806 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49806 Log: envutil.rb: timeout_error argument to invoke_ruby * test/lib/envutil.rb (invoke_ruby): add `timeout_error` optional keyword argument, the exception class to be raised if the target process timed out. if it is nil, no exception will be raised at timeout but the terminated output, error, and status will be returned. defaulted to Timeout::Error. * test/lib/envutil.rb (assert_separately): check outputs and status (including diagnostic reports) of timed-out process. Modified files: trunk/test/lib/envutil.rb Index: test/lib/envutil.rb =================================================================== --- test/lib/envutil.rb (revision 49805) +++ test/lib/envutil.rb (revision 49806) @@ -34,7 +34,7 @@ module EnvUtil https://github.com/ruby/ruby/blob/trunk/test/lib/envutil.rb#L34 DEFAULT_SIGNALS.delete("TERM") if /mswin|mingw/ =~ RUBY_PLATFORM def invoke_ruby(args, stdin_data = "", capture_stdout = false, capture_stderr = false, - encoding: nil, timeout: 10, reprieve: 1, + encoding: nil, timeout: 10, reprieve: 1, timeout_error: Timeout::Error, stdout_filter: nil, stderr_filter: nil, signal: :TERM, rubybin: EnvUtil.rubybin, @@ -67,10 +67,7 @@ module EnvUtil https://github.com/ruby/ruby/blob/trunk/test/lib/envutil.rb#L67 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 - if (!th_stdout || th_stdout.join(timeout)) && (!th_stderr || th_stderr.join(timeout)) - stdout = th_stdout.value if capture_stdout - stderr = th_stderr.value if capture_stderr && capture_stderr != :merge_to_stdout - else + unless (!th_stdout || th_stdout.join(timeout)) && (!th_stderr || th_stderr.join(timeout)) signals = Array(signal).select do |sig| DEFAULT_SIGNALS[sig.to_s] or DEFAULT_SIGNALS[Signal.signame(sig)] @@ -99,13 +96,17 @@ module EnvUtil https://github.com/ruby/ruby/blob/trunk/test/lib/envutil.rb#L96 end end end - bt = caller_locations - raise Timeout::Error, "execution of #{bt.shift.label} expired", bt.map(&:to_s) + 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 + stderr = th_stderr.value if capture_stderr && capture_stderr != :merge_to_stdout out_p.close if capture_stdout err_p.close if capture_stderr && capture_stderr != :merge_to_stdout - Process.wait pid - status = $? + status ||= Process.wait2(pid)[1] stdout = stdout_filter.call(stdout) if stdout_filter stderr = stderr_filter.call(stderr) if stderr_filter return stdout, stderr, status @@ -385,7 +386,7 @@ module Test https://github.com/ruby/ruby/blob/trunk/test/lib/envutil.rb#L386 eom args = args.dup args.insert((Hash === args.first ? 1 : 0), "--disable=gems", *$:.map {|l| "-I#{l}"}) - stdout, stderr, status = EnvUtil.invoke_ruby(args, src, true, true, **opt) + stdout, stderr, status = EnvUtil.invoke_ruby(args, src, true, true, timeout_error: nil, **opt) abort = status.coredump? || (status.signaled? && ABORT_SIGNALS.include?(status.termsig)) assert(!abort, FailDesc[status, nil, stderr]) self._assertions += stdout[/^assertions=(\d+)/, 1].to_i -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/