mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
d4db53a0e0
select() with timeout may return early in old Linux kernels with 250 Hz tickrate and no dynticks, so skip everything older than 2.6.32 (which has long term support). And, Make the timing assertions consistently use assert_operator with timing difference in error message Patch by Eric Wong. [Bug #5335] [ruby-core:39618] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33296 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
99 lines
2.5 KiB
Ruby
99 lines
2.5 KiB
Ruby
require 'test/unit'
|
|
|
|
class TestOldThreadSelect < Test::Unit::TestCase
|
|
require '-test-/old_thread_select/old_thread_select'
|
|
|
|
ANCIENT_LINUX = RUBY_PLATFORM =~ /linux/ && `uname -r`.chomp < '2.6.32'
|
|
|
|
def with_pipe
|
|
r, w = IO.pipe
|
|
begin
|
|
yield r, w
|
|
ensure
|
|
r.close unless r.closed?
|
|
w.close unless w.closed?
|
|
end
|
|
end
|
|
|
|
def test_old_select_read_timeout
|
|
with_pipe do |r, w|
|
|
t0 = Time.now
|
|
rc = IO.old_thread_select([r.fileno], nil, nil, 0.001)
|
|
diff = Time.now - t0
|
|
assert_equal 0, rc
|
|
assert_operator diff, :>=, 0.001, "returned too early: diff=#{diff}"
|
|
end
|
|
end unless ANCIENT_LINUX
|
|
|
|
def test_old_select_error_timeout
|
|
bug5299 = '[ruby-core:39380]'
|
|
with_pipe do |r, w|
|
|
t0 = Time.now
|
|
rc = IO.old_thread_select(nil, nil, [r.fileno], 0.001)
|
|
diff = Time.now - t0
|
|
assert_equal 0, rc, bug5299
|
|
assert_operator diff, :>=, 0.001, "returned too early: diff=#{diff}"
|
|
end
|
|
end unless ANCIENT_LINUX
|
|
|
|
def test_old_select_false_positive
|
|
bug5306 = '[ruby-core:39435]'
|
|
with_pipe do |r2, w2|
|
|
with_pipe do |r, w|
|
|
t0 = Time.now
|
|
w.syswrite '.'
|
|
rfds = [ r.fileno, r2.fileno ]
|
|
rc = IO.old_thread_select(rfds, nil, nil, nil)
|
|
assert_equal [ r.fileno ], rfds, bug5306
|
|
assert_equal 1, rc, bug5306
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_old_select_read_write_check
|
|
with_pipe do |r, w|
|
|
w.syswrite('.')
|
|
rc = IO.old_thread_select([r.fileno], nil, nil, nil)
|
|
assert_equal 1, rc
|
|
|
|
rc = IO.old_thread_select([r.fileno], [w.fileno], nil, nil)
|
|
assert_equal 2, rc
|
|
|
|
assert_equal '.', r.read(1)
|
|
|
|
rc = IO.old_thread_select([r.fileno], [w.fileno], nil, nil)
|
|
assert_equal 1, rc
|
|
end
|
|
end
|
|
|
|
def test_old_select_signal_safe
|
|
return unless Process.respond_to?(:kill)
|
|
received = false
|
|
trap(:INT) { received = true }
|
|
main = Thread.current
|
|
thr = Thread.new do
|
|
Thread.pass until main.stop?
|
|
Process.kill(:INT, $$)
|
|
true
|
|
end
|
|
|
|
rc = nil
|
|
diff = nil
|
|
with_pipe do |r,w|
|
|
assert_nothing_raised do
|
|
t0 = Time.now
|
|
rc = IO.old_thread_select([r.fileno], nil, nil, 1)
|
|
diff = Time.now - t0
|
|
end
|
|
end
|
|
|
|
unless ANCIENT_LINUX
|
|
assert_operator diff, :>=, 1, "interrupted or short wait: diff=#{diff}"
|
|
end
|
|
assert_equal 0, rc
|
|
assert_equal true, thr.value
|
|
assert_not_equal false, received, "SIGINT not received"
|
|
ensure
|
|
trap(:INT, "DEFAULT")
|
|
end
|
|
end
|