summaryrefslogtreecommitdiff
path: root/test/fileutils
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-07-18 18:14:06 +0900
committergit <svn-admin@ruby-lang.org>2025-07-18 09:22:34 +0000
commitcfe8263f41d2a3f17575dcaaad7f96ddd9617180 (patch)
treeebbcee92ca1b42ba083b5ab566f789c04505a2ff /test/fileutils
parentbd50545f3cc14790f5fe9530690a3ad67afe6f92 (diff)
[ruby/fileutils] Fix `ln_sf` with multiple sources and `target_directory: false`
In this case, an ArgumentError is now raised rather than ignoring the option, just as GNU coreutils' `ln` would error on the command line. Fixes https://github.com/ruby/fileutils/pull/128 as well. https://github.com/ruby/fileutils/commit/4fc578a75f
Diffstat (limited to 'test/fileutils')
-rw-r--r--test/fileutils/test_fileutils.rb71
1 files changed, 56 insertions, 15 deletions
diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb
index 1d7be692f5..c9d8d0c7d0 100644
--- a/test/fileutils/test_fileutils.rb
+++ b/test/fileutils/test_fileutils.rb
@@ -955,16 +955,27 @@ class TestFileUtils < Test::Unit::TestCase
def test_ln_s
check_singleton :ln_s
+ ln_s TARGETS, 'tmp'
+ each_srcdest do |fname, lnfname|
+ assert_equal fname, File.readlink(lnfname)
+ ensure
+ rm_f lnfname
+ end
+
+ lnfname = 'symlink'
+ assert_raise(Errno::ENOENT, "multiple targets need a destination directory") {
+ ln_s TARGETS, lnfname
+ }
+ assert_file.not_exist?(lnfname)
+
TARGETS.each do |fname|
- begin
- fname = "../#{fname}"
- lnfname = 'tmp/lnsdest'
- ln_s fname, lnfname
- assert FileTest.symlink?(lnfname), 'not symlink'
- assert_equal fname, File.readlink(lnfname)
- ensure
- rm_f lnfname
- end
+ fname = "../#{fname}"
+ lnfname = 'tmp/lnsdest'
+ ln_s fname, lnfname
+ assert_file.symlink?(lnfname)
+ assert_equal fname, File.readlink(lnfname)
+ ensure
+ rm_f lnfname
end
end if have_symlink? and !no_broken_symlink?
@@ -1017,22 +1028,52 @@ class TestFileUtils < Test::Unit::TestCase
def test_ln_sr
check_singleton :ln_sr
- TARGETS.each do |fname|
- begin
- lnfname = 'tmp/lnsdest'
- ln_sr fname, lnfname
- assert FileTest.symlink?(lnfname), 'not symlink'
- assert_equal "../#{fname}", File.readlink(lnfname), fname
+ assert_all_assertions_foreach(nil, *TARGETS) do |fname|
+ lnfname = 'tmp/lnsdest'
+ ln_sr fname, lnfname
+ assert FileTest.symlink?(lnfname), 'not symlink'
+ assert_equal "../#{fname}", File.readlink(lnfname)
+ ensure
+ rm_f lnfname
+ end
+
+ ln_sr TARGETS, 'tmp'
+ assert_all_assertions do |all|
+ each_srcdest do |fname, lnfname|
+ all.for(fname) do
+ assert_equal "../#{fname}", File.readlink(lnfname)
+ end
ensure
rm_f lnfname
end
end
+
mkdir 'data/src'
File.write('data/src/xxx', 'ok')
File.symlink '../data/src', 'tmp/src'
ln_sr 'tmp/src/xxx', 'data'
assert File.symlink?('data/xxx')
assert_equal 'ok', File.read('data/xxx')
+ end
+
+ def test_ln_sr_not_target_directory
+ assert_raise(ArgumentError) {
+ ln_sr TARGETS, 'tmp', target_directory: false
+ }
+ assert_empty(Dir.children('tmp'))
+
+ lnfname = 'symlink'
+ assert_raise(ArgumentError) {
+ ln_sr TARGETS, lnfname, target_directory: false
+ }
+ assert_file.not_exist?(lnfname)
+
+ assert_all_assertions_foreach(nil, *TARGETS) do |fname|
+ assert_raise(Errno::EEXIST, Errno::EACCES) {
+ ln_sr fname, 'tmp', target_directory: false
+ }
+ assert_file.not_exist? File.join('tmp/', File.basename(fname))
+ end
end if have_symlink?
def test_ln_sr_broken_symlink