summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--test/lib/envutil.rb21
-rw-r--r--version.h2
3 files changed, 25 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index d2519545be..76aa269539 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Sun Mar 26 16:22:03 2017 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ 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.
+
Sun Mar 26 13:07:21 2017 NAKAMURA Usaku <usa@ruby-lang.org>
* thread.c (rb_thread_sleep_deadly_allow_spurious_wakeup): need to
diff --git a/test/lib/envutil.rb b/test/lib/envutil.rb
index 4a48ee6ae6..7e3c7a08b1 100644
--- a/test/lib/envutil.rb
+++ b/test/lib/envutil.rb
@@ -31,7 +31,7 @@ module EnvUtil
LANG_ENVS = %w"LANG LC_ALL LC_CTYPE"
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,
rubybin: EnvUtil.rubybin,
**opt)
@@ -63,10 +63,7 @@ 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
- 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))
signal = /mswin|mingw/ =~ RUBY_PLATFORM ? :KILL : :TERM
case pgroup = opt[:pgroup]
when 0, true
@@ -87,13 +84,17 @@ module EnvUtil
else
break
end while true
- 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
@@ -373,7 +374,7 @@ module Test
eom
args = args.dup
args.insert((Hash === args.first ? 1 : 0), "-w", "--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
diff --git a/version.h b/version.h
index 31d2f74e48..44e195b084 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.2.7"
#define RUBY_RELEASE_DATE "2017-03-26"
-#define RUBY_PATCHLEVEL 465
+#define RUBY_PATCHLEVEL 466
#define RUBY_RELEASE_YEAR 2017
#define RUBY_RELEASE_MONTH 3