1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/-ext-/wait/test_wait.rb
Koichi Sasada 5c2b644166 fix random EBADF problem
```ruby
      r, w = IO.pipe
      r.close

      IO.for_fd(w.fileno).close
```

This code closes a file descriptor `w.fileno`, but `w` doesn't know
the closing. Another code can open same file descriptor with opening
file (`f`). After that, the `w` will GCed and `w.fileno` is closed
again, and `f.fileno` is closed too, so IO operations for `f` (`f.close`)
will cause EBADF.

To fix this issue, do this test in another process.
2021-10-26 11:39:52 +09:00

36 lines
693 B
Ruby

# frozen_string_literal: false
require 'test/unit'
class TestWait < Test::Unit::TestCase
require '-test-/wait'
def test_wait_for_valid_fd
IO.pipe do |r,w|
rc = IO.io_wait(w, IO::WRITABLE, nil)
assert_equal IO::WRITABLE, rc
end
end
def test_wait_for_invalid_fd
assert_separately [], <<~'RUBY'
require '-test-/wait'
r, w = IO.pipe
r.close
IO.for_fd(w.fileno).close
assert_raise(Errno::EBADF) do
IO.io_wait(w, IO::WRITABLE, nil)
end
RUBY
end
def test_wait_for_closed_pipe
IO.pipe do |r,w|
w.close
rc = IO.io_wait(r, IO::READABLE, nil)
assert_equal IO::READABLE, rc
end
end
end