diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2025-07-18 18:14:06 +0900 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2025-07-18 09:22:34 +0000 |
| commit | cfe8263f41d2a3f17575dcaaad7f96ddd9617180 (patch) | |
| tree | ebbcee92ca1b42ba083b5ab566f789c04505a2ff /test/fileutils | |
| parent | bd50545f3cc14790f5fe9530690a3ad67afe6f92 (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.rb | 71 |
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 |
