summaryrefslogtreecommitdiff
path: root/test/test_tmpdir.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_tmpdir.rb')
-rw-r--r--test/test_tmpdir.rb153
1 files changed, 116 insertions, 37 deletions
diff --git a/test/test_tmpdir.rb b/test/test_tmpdir.rb
index 1e633d233b..c91fc334ed 100644
--- a/test/test_tmpdir.rb
+++ b/test/test_tmpdir.rb
@@ -5,48 +5,60 @@ require 'tmpdir'
class TestTmpdir < Test::Unit::TestCase
def test_tmpdir_modifiable
tmpdir = Dir.tmpdir
- assert_equal(false, tmpdir.frozen?)
+ assert_not_predicate(tmpdir, :frozen?)
tmpdir_org = tmpdir.dup
tmpdir << "foo"
assert_equal(tmpdir_org, Dir.tmpdir)
end
- def test_tmpdir_modifiable_safe
- Thread.new {
- $SAFE = 1
- tmpdir = Dir.tmpdir
- assert_equal(false, tmpdir.frozen?)
- tmpdir_org = tmpdir.dup
- tmpdir << "foo"
- assert_equal(tmpdir_org, Dir.tmpdir)
- }.join
- ensure
- $SAFE = 0
- end
-
def test_world_writable
- skip "no meaning on this platform" if /mswin|mingw/ =~ RUBY_PLATFORM
+ omit "no meaning on this platform" if /mswin|mingw/ =~ RUBY_PLATFORM
Dir.mktmpdir do |tmpdir|
# ToDo: fix for parallel test
- olddir, ENV["TMPDIR"] = ENV["TMPDIR"], tmpdir
+ envs = %w[TMPDIR TMP TEMP]
+ oldenv = envs.each_with_object({}) {|v, h| h[v] = ENV.delete(v)}
begin
- assert_equal(tmpdir, Dir.tmpdir)
- File.chmod(0777, tmpdir)
- assert_not_equal(tmpdir, Dir.tmpdir)
- newdir = Dir.mktmpdir("d", tmpdir) do |dir|
- assert_file.directory? dir
- assert_equal(tmpdir, File.dirname(dir))
- dir
+ envs.each do |e|
+ tmpdirx = File.join(tmpdir, e)
+ ENV[e] = tmpdirx
+ assert_not_equal(tmpdirx, assert_warn('') {Dir.tmpdir})
+ File.write(tmpdirx, "")
+ assert_not_equal(tmpdirx, assert_warn(/\A#{e} is not a directory/) {Dir.tmpdir})
+ File.unlink(tmpdirx)
+ ENV[e] = tmpdir
+ assert_equal(tmpdir, Dir.tmpdir)
+ File.chmod(0555, tmpdir)
+ assert_not_equal(tmpdir, assert_warn(/\A#{e} is not writable/) {Dir.tmpdir})
+ File.chmod(0777, tmpdir)
+ assert_not_equal(tmpdir, assert_warn(/\A#{e} is world-writable/) {Dir.tmpdir})
+ newdir = Dir.mktmpdir("d", tmpdir) do |dir|
+ assert_file.directory? dir
+ assert_equal(tmpdir, File.dirname(dir))
+ dir
+ end
+ assert_file.not_exist?(newdir)
+ File.chmod(01777, tmpdir)
+ assert_equal(tmpdir, Dir.tmpdir)
+ ENV[e] = nil
end
- assert_file.not_exist?(newdir)
- File.chmod(01777, tmpdir)
- assert_equal(tmpdir, Dir.tmpdir)
ensure
- ENV["TMPDIR"] = olddir
+ ENV.update(oldenv)
end
end
end
+ def test_tmpdir_not_empty_parent
+ Dir.mktmpdir do |tmpdir|
+ envs = %w[TMPDIR TMP TEMP]
+ oldenv = envs.each_with_object({}) {|v, h| h[v] = ENV.delete(v)}
+ ENV[envs[0]] = ""
+ ENV[envs[1]] = tmpdir
+ assert_equal(tmpdir, Dir.tmpdir)
+ ensure
+ ENV.update(oldenv)
+ end
+ end
+
def test_no_homedir
bug7547 = '[ruby-core:50793]'
home, ENV["HOME"] = ENV["HOME"], nil
@@ -65,22 +77,89 @@ class TestTmpdir < Test::Unit::TestCase
}
end
- TRAVERSAL_PATH = Array.new(Dir.pwd.split('/').count, '..').join('/') + Dir.pwd + '/'
- TRAVERSAL_PATH.delete!(':') if /mswin|mingw/ =~ RUBY_PLATFORM
+ def test_mktmpdir_mutate
+ bug16918 = '[ruby-core:98563]'
+ assert_nothing_raised(bug16918) do
+ assert_mktmpdir_traversal do |traversal_path|
+ Dir.mktmpdir(traversal_path + 'foo') do |actual|
+ actual << "foo"
+ end
+ end
+ end
+ end
def test_mktmpdir_traversal
- expect = Dir.glob(TRAVERSAL_PATH + '*').count
- Dir.mktmpdir(TRAVERSAL_PATH + 'foo') do
- actual = Dir.glob(TRAVERSAL_PATH + '*').count
- assert_equal expect, actual
+ assert_mktmpdir_traversal do |traversal_path|
+ Dir.mktmpdir(traversal_path + 'foo') do |actual|
+ actual
+ end
end
end
def test_mktmpdir_traversal_array
- expect = Dir.glob(TRAVERSAL_PATH + '*').count
- Dir.mktmpdir([TRAVERSAL_PATH, 'foo']) do
- actual = Dir.glob(TRAVERSAL_PATH + '*').count
- assert_equal expect, actual
+ assert_mktmpdir_traversal do |traversal_path|
+ Dir.mktmpdir([traversal_path, 'foo']) do |actual|
+ actual
+ end
end
end
+
+ def test_mktmpdir_not_empty_parent
+ assert_raise(ArgumentError) do
+ Dir.mktmpdir("foo", "")
+ end
+
+ path = Struct.new(:to_path).new("")
+ assert_raise(ArgumentError) do
+ Dir.mktmpdir("foo", path)
+ end
+
+ Dir.mktmpdir do |d|
+ path = Struct.new(:to_path).new(d)
+ assert_operator(Dir.mktmpdir("prefix-", path), :start_with?, d + "/prefix-")
+ end
+ end
+
+ def assert_mktmpdir_traversal
+ Dir.mktmpdir do |target|
+ target = target.chomp('/') + '/'
+ traversal_path = target.sub(/\A\w:/, '') # for DOSISH
+ traversal_path = Array.new(target.count('/')-2, '..').join('/') + traversal_path
+ [File::SEPARATOR, File::ALT_SEPARATOR].compact.each do |separator|
+ actual = yield traversal_path.tr('/', separator)
+ assert_not_send([File.absolute_path(actual), :start_with?, target])
+ end
+ end
+ end
+
+ def test_ractor
+ assert_ractor(<<~'end;', require: "tmpdir")
+ if defined?(Ractor::Port)
+ port = Ractor::Port.new
+ r = Ractor.new port do |port|
+ Dir.mktmpdir() do |d|
+ port << d
+ Ractor.receive
+ end
+ end
+ dir = port.receive
+ assert_file.directory? dir
+ r.send true
+ r.join
+ assert_file.not_exist? dir
+ else
+ r = Ractor.new do
+ Dir.mktmpdir() do |d|
+ Ractor.yield d
+ Ractor.receive
+ end
+ end
+ dir = r.take
+ assert_file.directory? dir
+ r.send true
+ r.take
+ assert_file.not_exist? dir
+ end
+ end;
+ end
end