aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-21 10:52:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-21 10:52:31 +0000
commited2dd5e3f497448356205e5f965d55850e32bae6 (patch)
treeb86b3a31332d1271f9af519e334bf2f4a788ecab /test
parentdaa739876f1bbd14b043a6361e9d434d324afff5 (diff)
downloadruby-ed2dd5e3f497448356205e5f965d55850e32bae6.tar.gz
* io.c (rb_io_initialize): add autoclose argument to control close
at finalization. [ruby-core:26222] * io.c (rb_io_autoclose_p, rb_io_set_autoclose): new methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26999 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/ruby/test_io.rb43
1 files changed, 43 insertions, 0 deletions
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 2da2ae95e6..98b1d7b074 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -1266,6 +1266,49 @@ class TestIO < Test::Unit::TestCase
f.close
end
+ def try_fdopen(fd, autoclose = true, level = 100)
+ if level > 0
+ try_fdopen(fd, autoclose, level - 1)
+ GC.start
+ level
+ else
+ IO.for_fd(fd, autoclose: autoclose)
+ nil
+ end
+ end
+
+ def test_autoclose
+ feature2250 = '[ruby-core:26222]'
+ pre = 'ft2250'
+
+ Tempfile.new(pre) do |t|
+ f = IO.for_fd(t.fileno)
+ assert_equal(true, f.autoclose?)
+ f.autoclose = false
+ assert_equal(false, f.autoclose?)
+ f.close
+ assert_nothing_raised(Errno::EBADF) {t.close}
+
+ t.open
+ f = IO.for_fd(t.fileno, autoclose: false)
+ assert_equal(false, f.autoclose?)
+ f.autoclose = true
+ assert_equal(true, f.autoclose?)
+ f.close
+ assert_raise(Errno::EBADF) {t.close}
+ end
+
+ Tempfile.new(pre) do |t|
+ try_fdopen(t.fileno)
+ assert_raise(Errno::EBADF) {t.close}
+ end
+
+ Tempfile.new(pre) do |t|
+ try_fdopen(f.fileno, false)
+ assert_nothing_raised(Errno::EBADF) {t.close}
+ end
+ end
+
def test_open_redirect
o = Object.new
def o.to_open; self; end