[前][次][番号順一覧][スレッド一覧]

ruby-changes:12929

From: nobu <ko1@a...>
Date: Wed, 26 Aug 2009 19:01:52 +0900 (JST)
Subject: [ruby-changes:12929] Ruby:r24667 (trunk): * test/test_tempfile.rb: merged from Hongli Lai's fork.

nobu	2009-08-26 19:00:03 +0900 (Wed, 26 Aug 2009)

  New Revision: 24667

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24667

  Log:
    * test/test_tempfile.rb: merged from Hongli Lai's fork.
      cf [ruby-core:25131].

  Modified files:
    trunk/ChangeLog
    trunk/test/test_tempfile.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24666)
+++ ChangeLog	(revision 24667)
@@ -1,3 +1,8 @@
+Wed Aug 26 18:59:59 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* test/test_tempfile.rb: merged from Hongli Lai's fork.
+	  cf [ruby-core:25131].
+
 Wed Aug 26 18:49:22 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/tempfile.rb (Tempfile#close!): should not undefine finalizer
Index: test/test_tempfile.rb
===================================================================
--- test/test_tempfile.rb	(revision 24666)
+++ test/test_tempfile.rb	(revision 24667)
@@ -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)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]