summaryrefslogtreecommitdiff
path: root/test/ruby/test_signal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_signal.rb')
-rw-r--r--test/ruby/test_signal.rb46
1 files changed, 34 insertions, 12 deletions
diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb
index 7877a35129..1ee3720ded 100644
--- a/test/ruby/test_signal.rb
+++ b/test/ruby/test_signal.rb
@@ -310,22 +310,30 @@ class TestSignal < Test::Unit::TestCase
end
def test_self_stop
- assert_ruby_status([], <<-'end;')
- begin
- fork{
- sleep 1
- Process.kill(:CONT, Process.ppid)
- }
- Process.kill(:STOP, Process.pid)
- rescue NotImplementedError
- # ok
- end
- end;
+ omit unless Process.respond_to?(:fork)
+ omit unless defined?(Process::WUNTRACED)
+
+ # Make a process that stops itself
+ child_pid = fork do
+ Process.kill(:STOP, Process.pid)
+ end
+
+ # The parent should be notified about the stop
+ _, status = Process.waitpid2(child_pid, Process::WUNTRACED)
+ assert_predicate status, :stopped?
+
+ # It can be continued
+ Process.kill(:CONT, child_pid)
+
+ # And the child then runs to completion
+ _, status = Process.waitpid2(child_pid)
+ assert_predicate status, :exited?
+ assert_predicate status, :success?
end
def test_sigwait_fd_unused
t = EnvUtil.apply_timeout_scale(0.1)
- assert_separately([], <<-End)
+ assert_ruby_status([], <<-End)
tgt = $$
trap(:TERM) { exit(0) }
e = "Process.daemon; sleep #{t * 2}; Process.kill(:TERM,\#{tgt})"
@@ -342,4 +350,18 @@ class TestSignal < Test::Unit::TestCase
loop { sleep }
End
end if Process.respond_to?(:kill) && Process.respond_to?(:daemon)
+
+ def test_signal_during_kwarg_call
+ status = assert_in_out_err([], <<~'RUBY', [], [], success: false)
+ Thread.new do
+ sleep 0.1
+ Process.kill("TERM", $$)
+ end
+
+ loop do
+ File.open(IO::NULL, kwarg: true) {}
+ end
+ RUBY
+ assert_predicate(status, :signaled?) if Signal.list.include?("QUIT")
+ end if Process.respond_to?(:kill)
end