diff options
Diffstat (limited to 'test/ruby')
| -rw-r--r-- | test/ruby/envutil.rb | 4 | ||||
| -rw-r--r-- | test/ruby/test_thread.rb | 24 |
2 files changed, 18 insertions, 10 deletions
diff --git a/test/ruby/envutil.rb b/test/ruby/envutil.rb index 4a8451a9de..ef5f65c747 100644 --- a/test/ruby/envutil.rb +++ b/test/ruby/envutil.rb @@ -42,6 +42,7 @@ module EnvUtil out_p.set_encoding(enc) if out_p err_p.set_encoding(enc) if err_p end + timeout = opt.delete(:timeout) || 10 c = "C" child_env = {} LANG_ENVS.each {|lc| child_env[lc] = c} @@ -54,13 +55,12 @@ module EnvUtil out_c.close if capture_stdout err_c.close if capture_stderr && capture_stderr != :merge_to_stdout if block_given? - return yield in_p, out_p, err_p + return yield in_p, out_p, err_p, pid else th_stdout = Thread.new { out_p.read } if capture_stdout th_stderr = Thread.new { err_p.read } if capture_stderr && capture_stderr != :merge_to_stdout in_p.write stdin_data.to_str in_p.close - timeout = opt.fetch(:timeout, 10) 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 diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb index 209d4b006f..589ae7a899 100644 --- a/test/ruby/test_thread.rb +++ b/test/ruby/test_thread.rb @@ -689,15 +689,23 @@ class TestThreadGroup < Test::Unit::TestCase def test_thread_timer_and_interrupt bug5757 = '[ruby-dev:44985]' t0 = Time.now.to_f - pid = spawn(EnvUtil.rubybin, '-e', '$stdin.read') - sleep 1; - Process.kill(:SIGQUIT, pid) - Process.wait(pid) - s = $? - assert_equal([false, true, false], - [s.exited?, s.signaled?, s.stopped?], - "[s.exited?, s.signaled?, s.stopped?]") + pid = nil + cmd = 'r,=IO.pipe; Thread.start {Thread.pass until Thread.main.stop?; puts; STDOUT.flush}; r.read' + s, err = EnvUtil.invoke_ruby(['-e', cmd], "", true, true) do |in_p, out_p, err_p, cpid| + out_p.gets + pid = cpid + Process.kill(:SIGINT, pid) + Process.wait(pid) + [$?, err_p.read] + end t1 = Time.now.to_f + assert_equal(pid, s.pid) + unless /mswin|mingw/ =~ RUBY_PLATFORM + # status of signal is not supported on Windows + assert_equal([false, true, false, Signal.list["INT"]], + [s.exited?, s.signaled?, s.stopped?, s.termsig], + "[s.exited?, s.signaled?, s.stopped?, s.termsig]") + end assert_in_delta(t1 - t0, 1, 1) end end |
