summaryrefslogtreecommitdiff
path: root/ruby_1_8_5/test/ruby/test_signal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ruby_1_8_5/test/ruby/test_signal.rb')
-rw-r--r--ruby_1_8_5/test/ruby/test_signal.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/ruby_1_8_5/test/ruby/test_signal.rb b/ruby_1_8_5/test/ruby/test_signal.rb
new file mode 100644
index 0000000000..43e16b8c79
--- /dev/null
+++ b/ruby_1_8_5/test/ruby/test_signal.rb
@@ -0,0 +1,68 @@
+require 'test/unit'
+require 'timeout'
+
+class TestSignal < Test::Unit::TestCase
+ def have_fork?
+ begin
+ fork{}
+ true
+ rescue NotImplementedError
+ false
+ end
+ end
+
+ def test_signal
+ defined?(Process.kill) or return
+ begin
+ $x = 0
+ oldtrap = trap "SIGINT", proc{|sig| $x = 2}
+ Process.kill "SIGINT", $$
+ sleep 0.1
+ assert_equal(2, $x)
+
+ trap "SIGINT", proc{raise "Interrupt"}
+
+ x = assert_raises(RuntimeError) do
+ Process.kill "SIGINT", $$
+ sleep 0.1
+ end
+ assert(x)
+ assert_match(/Interrupt/, x.message)
+ ensure
+ trap "SIGINT", oldtrap
+ end
+ end
+
+ def test_exit_action
+ return unless have_fork? # snip this test
+ begin
+ r, w = IO.pipe
+ r0, w0 = IO.pipe
+ pid = fork {
+ trap(:USR1, "EXIT")
+ w0.close
+ w.syswrite("a")
+ Thread.start { Thread.pass }
+ r0.sysread(4096)
+ }
+ r.sysread(1)
+ sleep 0.1
+ assert_nothing_raised("[ruby-dev:26128]") {
+ Process.kill(:USR1, pid)
+ begin
+ Timeout.timeout(10) {
+ Process.waitpid pid
+ }
+ rescue Timeout::Error
+ Process.kill(:TERM, pid)
+ raise
+ end
+ }
+ ensure
+ r.close
+ w.close
+ r0.close
+ w0.close
+ end
+ end
+end