1require 'test/unit' 2 3class TestOldThreadSelect < Test::Unit::TestCase 4 require '-test-/old_thread_select/old_thread_select' 5 6 ANCIENT_LINUX = RUBY_PLATFORM =~ /linux/ && `uname -r`.chomp < '2.6.32' 7 DARWIN_10 = RUBY_PLATFORM =~ /darwin10/ 8 9 def with_pipe 10 r, w = IO.pipe 11 begin 12 yield r, w 13 ensure 14 r.close unless r.closed? 15 w.close unless w.closed? 16 end 17 end 18 19 def test_old_select_read_timeout 20 with_pipe do |r, w| 21 t0 = Time.now 22 rc = IO.old_thread_select([r.fileno], nil, nil, 0.001) 23 diff = Time.now - t0 24 assert_equal 0, rc 25 assert_operator diff, :>=, 0.001, "returned too early: diff=#{diff}" 26 end 27 end unless ANCIENT_LINUX 28 29 def test_old_select_error_timeout 30 bug5299 = '[ruby-core:39380]' 31 with_pipe do |r, w| 32 t0 = Time.now 33 rc = IO.old_thread_select(nil, nil, [r.fileno], 0.001) 34 diff = Time.now - t0 35 assert_equal 0, rc, bug5299 36 assert_operator diff, :>=, 0.001, "returned too early: diff=#{diff}" 37 end 38 end unless ANCIENT_LINUX 39 40 def test_old_select_false_positive 41 bug5306 = '[ruby-core:39435]' 42 with_pipe do |r2, w2| 43 with_pipe do |r, w| 44 t0 = Time.now 45 w.syswrite '.' 46 rfds = [ r.fileno, r2.fileno ] 47 rc = IO.old_thread_select(rfds, nil, nil, nil) 48 assert_equal [ r.fileno ], rfds, bug5306 49 assert_equal 1, rc, bug5306 50 end 51 end 52 end 53 54 def test_old_select_read_write_check 55 with_pipe do |r, w| 56 w.syswrite('.') 57 rc = IO.old_thread_select([r.fileno], nil, nil, nil) 58 assert_equal 1, rc 59 60 rc = IO.old_thread_select([r.fileno], [w.fileno], nil, nil) 61 assert_equal 2, rc 62 63 assert_equal '.', r.read(1) 64 65 rc = IO.old_thread_select([r.fileno], [w.fileno], nil, nil) 66 assert_equal 1, rc 67 end 68 end 69 70 def test_old_select_signal_safe 71 return unless Process.respond_to?(:kill) 72 received = false 73 trap(:INT) { received = true } 74 main = Thread.current 75 thr = Thread.new do 76 Thread.pass until main.stop? 77 Process.kill(:INT, $$) 78 true 79 end 80 81 rc = nil 82 diff = nil 83 with_pipe do |r,w| 84 assert_nothing_raised do 85 t0 = Time.now 86 rc = IO.old_thread_select([r.fileno], nil, nil, 1) 87 diff = Time.now - t0 88 end 89 end 90 91 unless ANCIENT_LINUX || DARWIN_10 92 assert_operator diff, :>=, 1, "interrupted or short wait: diff=#{diff}" 93 end 94 assert_equal 0, rc 95 assert_equal true, thr.value 96 assert_not_equal false, received, "SIGINT not received" 97 ensure 98 trap(:INT, "DEFAULT") 99 end 100end 101