mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* test/test_tempfile.rb: merged from Hongli Lai's fork.
cf [ruby-core:25131]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24667 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ffd0da0333
commit
47a1a7b67d
2 changed files with 262 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
|||
Wed Aug 26 18:59:59 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* test/test_tempfile.rb: merged from Hongli Lai's fork.
|
||||
cf [ruby-core:25131].
|
||||
|
||||
Wed Aug 26 18:49:22 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* lib/tempfile.rb (Tempfile#close!): should not undefine finalizer
|
||||
|
|
|
@ -1,32 +1,285 @@
|
|||
require 'test/unit'
|
||||
require 'tempfile'
|
||||
require_relative 'ruby/envutil'
|
||||
|
||||
class TestTempfile < Test::Unit::TestCase
|
||||
def tempfile(*args, &block)
|
||||
t = Tempfile.new(*args, &block)
|
||||
@tempfile = (t unless block)
|
||||
end
|
||||
|
||||
def teardown
|
||||
if @tempfile
|
||||
@tempfile.close!
|
||||
end
|
||||
end
|
||||
|
||||
def test_basic
|
||||
t = tempfile("foo")
|
||||
path = t.path
|
||||
t.write("hello world")
|
||||
t.close
|
||||
assert_equal "hello world", File.read(path)
|
||||
end
|
||||
|
||||
def test_saves_in_dir_tmpdir_by_default
|
||||
t = tempfile("foo")
|
||||
assert_equal Dir.tmpdir, File.dirname(t.path)
|
||||
end
|
||||
|
||||
def test_saves_in_given_directory
|
||||
subdir = File.join(Dir.tmpdir, "tempfile-test-#{rand}")
|
||||
Dir.mkdir(subdir)
|
||||
begin
|
||||
tempfile = Tempfile.new("foo", subdir)
|
||||
tempfile.close
|
||||
begin
|
||||
assert_equal subdir, File.dirname(tempfile.path)
|
||||
ensure
|
||||
tempfile.unlink
|
||||
end
|
||||
ensure
|
||||
Dir.rmdir(subdir)
|
||||
end
|
||||
end
|
||||
|
||||
def test_basename
|
||||
t = tempfile("foo")
|
||||
assert_match /^foo/, File.basename(t.path)
|
||||
end
|
||||
|
||||
def test_basename_with_suffix
|
||||
t = tempfile(["foo", ".txt"])
|
||||
assert_match /^foo/, File.basename(t.path)
|
||||
assert_match /\.txt$/, File.basename(t.path)
|
||||
end
|
||||
|
||||
def test_unlink
|
||||
t = tempfile("foo")
|
||||
path = t.path
|
||||
|
||||
t.close
|
||||
assert File.exist?(path)
|
||||
|
||||
t.unlink
|
||||
assert !File.exist?(path)
|
||||
|
||||
assert_nil t.path
|
||||
end
|
||||
|
||||
def test_unlink_silently_fails_on_windows
|
||||
tempfile = tempfile("foo")
|
||||
path = tempfile.path
|
||||
begin
|
||||
assert_nothing_raised do
|
||||
tempfile.unlink
|
||||
end
|
||||
ensure
|
||||
tempfile.close
|
||||
File.unlink(path) if File.exist?(path)
|
||||
end
|
||||
end
|
||||
|
||||
def test_unlink_before_close_works_on_posix_systems
|
||||
tempfile = tempfile("foo")
|
||||
begin
|
||||
path = tempfile.path
|
||||
tempfile.unlink
|
||||
assert !File.exist?(path)
|
||||
tempfile.write("hello ")
|
||||
tempfile.write("world\n")
|
||||
tempfile.rewind
|
||||
assert_equal "hello world\n", tempfile.read
|
||||
ensure
|
||||
tempfile.close
|
||||
tempfile.unlink
|
||||
end
|
||||
end
|
||||
|
||||
def test_close_and_close_p
|
||||
t = tempfile("foo")
|
||||
assert !t.closed?
|
||||
t.close
|
||||
assert t.closed?
|
||||
end
|
||||
|
||||
def test_close_with_unlink_now_true_works
|
||||
t = tempfile("foo")
|
||||
path = t.path
|
||||
t.close(true)
|
||||
assert t.closed?
|
||||
assert_nil t.path
|
||||
assert !File.exist?(path)
|
||||
end
|
||||
|
||||
def test_close_with_unlink_now_true_does_not_unlink_if_already_unlinked
|
||||
t = tempfile("foo")
|
||||
path = t.path
|
||||
t.unlink
|
||||
File.open(path, "w").close
|
||||
begin
|
||||
t.close(true)
|
||||
assert File.exist?(path)
|
||||
ensure
|
||||
File.unlink(path) rescue nil
|
||||
end
|
||||
end
|
||||
|
||||
def test_close_bang_works
|
||||
t = tempfile("foo")
|
||||
path = t.path
|
||||
t.close!
|
||||
assert t.closed?
|
||||
assert_nil t.path
|
||||
assert !File.exist?(path)
|
||||
end
|
||||
|
||||
def test_close_bang_does_not_unlink_if_already_unlinked
|
||||
t = tempfile("foo")
|
||||
path = t.path
|
||||
t.unlink
|
||||
File.open(path, "w").close
|
||||
begin
|
||||
t.close!
|
||||
assert File.exist?(path)
|
||||
ensure
|
||||
File.unlink(path) rescue nil
|
||||
end
|
||||
end
|
||||
|
||||
def test_finalizer_does_not_unlink_if_already_unlinked
|
||||
assert_in_out_err('-rtempfile', <<-'EOS') do |(filename), (error)|
|
||||
file = Tempfile.new('foo')
|
||||
path = file.path
|
||||
puts path
|
||||
file.close!
|
||||
File.open(path, "w").close
|
||||
EOS
|
||||
assert File.exist?(filename)
|
||||
File.unlink(filename)
|
||||
assert_nil error
|
||||
end
|
||||
|
||||
assert_in_out_err('-rtempfile', <<-'EOS') do |(filename), (error)|
|
||||
file = Tempfile.new('foo')
|
||||
path = file.path
|
||||
file.unlink
|
||||
puts path
|
||||
File.open(path, "w").close
|
||||
EOS
|
||||
if !filename.empty?
|
||||
# POSIX unlink semantics supported, continue with test
|
||||
assert File.exist?(filename)
|
||||
File.unlink(filename)
|
||||
end
|
||||
assert_nil error
|
||||
end
|
||||
end
|
||||
|
||||
def test_close_does_not_make_path_nil
|
||||
t = tempfile("foo")
|
||||
t.close
|
||||
assert_not_nil t.path
|
||||
end
|
||||
|
||||
def test_close_flushes_buffer
|
||||
t = tempfile("foo")
|
||||
t.write("hello")
|
||||
t.close
|
||||
assert 5, File.size(t.path)
|
||||
end
|
||||
|
||||
def test_tempfile_is_unlinked_when_ruby_exits
|
||||
assert_in_out_err('-rtempfile', <<-'EOS') do |(filename), (error)|
|
||||
puts Tempfile.new('foo').path
|
||||
EOS
|
||||
assert !File.exist?(filename)
|
||||
end
|
||||
end
|
||||
|
||||
def test_size_flushes_buffer_before_determining_file_size
|
||||
t = tempfile("foo")
|
||||
t.write("hello")
|
||||
assert 0, File.size(t.path)
|
||||
assert 5, t.size
|
||||
assert 5, File.size(t.path)
|
||||
end
|
||||
|
||||
def test_size_works_if_file_is_closed
|
||||
t = tempfile("foo")
|
||||
t.write("hello")
|
||||
t.close
|
||||
assert 5, t.size
|
||||
end
|
||||
|
||||
def test_concurrency
|
||||
threads = []
|
||||
tempfiles = []
|
||||
lock = Mutex.new
|
||||
cond = ConditionVariable.new
|
||||
start = false
|
||||
|
||||
4.times do
|
||||
threads << Thread.new do
|
||||
lock.synchronize do
|
||||
while !start
|
||||
cond.wait(lock)
|
||||
end
|
||||
end
|
||||
result = []
|
||||
30.times do
|
||||
result << Tempfile.new('foo')
|
||||
end
|
||||
Thread.current[:result] = result
|
||||
end
|
||||
end
|
||||
|
||||
lock.synchronize do
|
||||
start = true
|
||||
cond.broadcast
|
||||
end
|
||||
threads.each do |thread|
|
||||
thread.join
|
||||
tempfiles |= thread[:result]
|
||||
end
|
||||
filenames = tempfiles.map { |f| f.path }
|
||||
begin
|
||||
assert_equal filenames.size, filenames.uniq.size
|
||||
ensure
|
||||
tempfiles.each do |tempfile|
|
||||
tempfile.close!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module M
|
||||
end
|
||||
|
||||
def test_extend
|
||||
o = Tempfile.new("foo")
|
||||
o = tempfile("foo")
|
||||
o.extend M
|
||||
assert(M === o, "[ruby-dev:32932]")
|
||||
end
|
||||
|
||||
def test_tempfile_encoding_nooption
|
||||
default_external=Encoding.default_external
|
||||
t=Tempfile.new("TEST")
|
||||
t = tempfile("TEST")
|
||||
t.write("\xE6\x9D\xBE\xE6\xB1\x9F")
|
||||
t.rewind
|
||||
assert_equal(default_external,t.read.encoding)
|
||||
end
|
||||
|
||||
def test_tempfile_encoding_ascii8bit
|
||||
default_external=Encoding.default_external
|
||||
t=Tempfile.new("TEST",:encoding=>"ascii-8bit")
|
||||
t = tempfile("TEST",:encoding=>"ascii-8bit")
|
||||
t.write("\xE6\x9D\xBE\xE6\xB1\x9F")
|
||||
t.rewind
|
||||
assert_equal(Encoding::ASCII_8BIT,t.read.encoding)
|
||||
end
|
||||
|
||||
def test_tempfile_encoding_ascii8bit2
|
||||
default_external=Encoding.default_external
|
||||
t=Tempfile.new("TEST",Dir::tmpdir,:encoding=>"ascii-8bit")
|
||||
t = tempfile("TEST",Dir::tmpdir,:encoding=>"ascii-8bit")
|
||||
t.write("\xE6\x9D\xBE\xE6\xB1\x9F")
|
||||
t.rewind
|
||||
assert_equal(Encoding::ASCII_8BIT,t.read.encoding)
|
||||
|
|
Loading…
Reference in a new issue