%w(lib ../lib . ..).each{|d| $:.unshift d} require 'session' # clean up children def reap begin; Process.kill 9, -Process.gid; rescue Exception => e; end begin; Process.wait2; rescue Exception => e; end true end # ctrl-c [2].each{|sig| trap(sig){ reap and exit }} # a timeout method which does not stop all threads! trap 'SIGUSR1', 'IGNORE' class TimeoutError < StandardError; end def timeout n begin trap('SIGUSR1'){throw :timeout, TimeoutError.new} cid = nil unless((cid = fork)) sleep n begin; Process.kill 'SIGUSR1', Process.ppid; rescue Exception => e; end else thrown = catch(:timeout) do ret = yield Process.kill 'SIGKILL', cid ret end raise thrown if TimeoutError === thrown end ensure trap 'SIGUSR1', 'IGNORE' end end require "test/unit" module Session class Test < Test::Unit::TestCase def test_0 #{{{ sh = nil assert_nothing_raised { sh = Shell.new } #}}} end def test_1 #{{{ assert_nothing_raised { timeout(4) { sh = nil assert_nothing_raised { sh = Shell.new } sh.execute 'ls' } } #}}} end def test_3 #{{{ assert_nothing_raised { timeout(16) { sh = nil assert_nothing_raised { sh = Shell.new } 128.times { sh.execute 'echo 42' } } } #}}} end def test_4 #{{{ cmds = ['ls', 'echo 42', 'printf "foobar"', 'printf "foobar\n"'] assert_nothing_raised { timeout(32) { sh = nil assert_nothing_raised { sh = Shell.new } 128.times { cmds.each{|cmd| sh.execute cmd;sh.execute "#{cmd} 1>&2"} } } } #}}} end def test_5 #{{{ assert_nothing_raised { timeout(4) { sh = nil assert_nothing_raised { sh = Shell.new } out, err = sh.execute 'echo 42' assert_equal '42', out.strip out, err = sh.execute 'echo "forty-two" 1>&2' assert_equal 'forty-two', err.strip } } #}}} end def test_6 #{{{ out = '' err = '' assert_nothing_raised { timeout(4) { sh = nil assert_nothing_raised { sh = Shell.new } sh.execute 'echo 42', :stdout => out, :stderr => err assert_equal '42', out.strip sh.execute 'echo "forty-two" 1>&2', :stdout => out, :stderr => err assert_equal 'forty-two', err.strip } } #}}} end def test_7 #{{{ assert_nothing_raised { timeout(4) { sh = nil assert_nothing_raised { sh = Shell.new } sh.execute('echo 42') do |out, err| assert out assert_equal '42', out.strip end sh.execute('echo "forty-two" 1>&2') do |out, err| assert_equal 'forty-two', err.strip end } } #}}} end def test_8 #{{{ out = '' err = '' assert_nothing_raised { timeout(16) { idl = nil assert_nothing_raised { idl = IDL.new } #p idl idl.execute 'printf, -1, 42', :stdout => out, :stderr => err #p out #p err assert_equal '42', out.strip idl.execute 'printf, -2, \'forty-two\'', :stdout => out, :stderr => err #p out #p err assert_equal 'forty-two', err.strip } } #}}} end end end