2003-09-17 05:52:50 -04:00
|
|
|
#
|
|
|
|
# test/fileutils/test_fileutils.rb
|
|
|
|
#
|
|
|
|
|
|
|
|
$:.unshift File.dirname(__FILE__)
|
|
|
|
|
|
|
|
require 'fileutils'
|
|
|
|
require 'test/unit'
|
|
|
|
require 'fileasserts'
|
|
|
|
|
|
|
|
|
2003-09-26 20:44:50 -04:00
|
|
|
def windows?
|
|
|
|
/mswin|mingw|bcc|djgpp/ === RUBY_PLATFORM
|
|
|
|
end
|
|
|
|
|
|
|
|
def have_symlink?
|
|
|
|
begin
|
2003-09-29 03:11:50 -04:00
|
|
|
File.symlink 'not_exist', 'symlink_test'
|
|
|
|
return true
|
2003-09-26 20:44:50 -04:00
|
|
|
rescue NotImplementedError
|
|
|
|
return false
|
2003-09-29 03:11:50 -04:00
|
|
|
ensure
|
|
|
|
File.unlink 'symlink_test' if File.symlink?('symlink_test')
|
2003-09-26 20:44:50 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2003-09-17 05:52:50 -04:00
|
|
|
class TestFileUtils < Test::Unit::TestCase
|
|
|
|
|
|
|
|
include FileUtils
|
|
|
|
|
|
|
|
def my_rm_rf( path )
|
|
|
|
if File.exist?('/bin/rm')
|
|
|
|
system "/bin/rm -rf #{path}"
|
|
|
|
else
|
2003-09-26 20:44:50 -04:00
|
|
|
FileUtils.rm_rf path
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def setup
|
|
|
|
my_rm_rf 'data'; Dir.mkdir 'data'
|
|
|
|
my_rm_rf 'tmp'; Dir.mkdir 'tmp'
|
|
|
|
prepare_data_file
|
|
|
|
prepare_time_data
|
|
|
|
end
|
|
|
|
|
|
|
|
def teardown
|
|
|
|
my_rm_rf 'data'
|
|
|
|
my_rm_rf 'tmp'
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
TARGETS = %w( data/same data/all data/random data/zero )
|
|
|
|
|
|
|
|
def prepare_data_file
|
|
|
|
same_chars = 'a' * 50
|
|
|
|
File.open('data/same', 'w') {|f|
|
|
|
|
32.times do
|
|
|
|
f.puts same_chars
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
|
|
|
all_chars = (0..255).map {|n| n.chr }.join('')
|
|
|
|
File.open('data/all', 'w') {|f|
|
|
|
|
32.times do
|
|
|
|
f.puts all_chars
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
|
|
|
random_chars = (0...50).map { rand(256).chr }.join('')
|
|
|
|
File.open('data/random', 'w') {|f|
|
|
|
|
32.times do
|
|
|
|
f.puts random_chars
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
|
|
|
File.open('data/zero', 'w') {|f|
|
|
|
|
;
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
BIGFILE = 'data/big'
|
|
|
|
|
|
|
|
def prepare_big_file
|
|
|
|
File.open('data/big', 'w') {|f|
|
|
|
|
(4 * 1024 * 1024 / 256).times do # 4MB
|
|
|
|
f.print "aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa\n"
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def prepare_time_data
|
|
|
|
File.open('data/old', 'w') {|f| f.puts 'dummy' }
|
|
|
|
File.open('data/newer', 'w') {|f| f.puts 'dummy' }
|
|
|
|
File.open('data/newest', 'w') {|f| f.puts 'dummy' }
|
|
|
|
t = Time.now
|
|
|
|
File.utime t-8, t-8, 'data/old'
|
|
|
|
File.utime t-4, t-4, 'data/newer'
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_pwd
|
|
|
|
assert_equal Dir.pwd, pwd()
|
2003-09-26 20:44:50 -04:00
|
|
|
|
|
|
|
cwd = Dir.pwd
|
|
|
|
if windows?
|
|
|
|
cd('C:/') {
|
|
|
|
assert_equal 'C:/', pwd()
|
|
|
|
}
|
|
|
|
assert_equal cwd, pwd()
|
|
|
|
else
|
2003-09-17 05:52:50 -04:00
|
|
|
cd('/') {
|
|
|
|
assert_equal '/', pwd()
|
|
|
|
}
|
2003-09-26 20:44:50 -04:00
|
|
|
assert_equal cwd, pwd()
|
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_cmp
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
assert cmp(fname, fname), 'not same?'
|
|
|
|
end
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
cmp TARGETS[0], TARGETS[0], :undefinedoption => true
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_cp
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
cp fname, 'tmp/cp'
|
|
|
|
assert_same_file fname, 'tmp/cp'
|
|
|
|
|
|
|
|
cp fname, 'tmp'
|
|
|
|
assert_same_file fname, 'tmp/' + File.basename(fname)
|
|
|
|
|
|
|
|
cp fname, 'tmp/preserve', :preserve => true
|
|
|
|
assert_same_file fname, 'tmp/preserve'
|
|
|
|
a = File.stat(fname)
|
|
|
|
b = File.stat('tmp/preserve')
|
|
|
|
assert_equal a.mode, b.mode
|
|
|
|
assert_equal a.mtime, b.mtime
|
|
|
|
assert_equal a.uid, b.uid
|
|
|
|
assert_equal a.gid, b.gid
|
|
|
|
end
|
2003-11-18 00:09:20 -05:00
|
|
|
|
|
|
|
# src==dest
|
|
|
|
touch 'tmp/cptmp'
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
cp 'tmp/cptmp', 'tmp/cptmp'
|
|
|
|
}
|
|
|
|
if have_symlink?
|
|
|
|
File.symlink 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
cp 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
}
|
|
|
|
File.symlink 'tmp/symlink', 'tmp/symlink'
|
|
|
|
assert_raises(Errno::ELOOP) {
|
|
|
|
cp 'tmp/symlink', 'tmp/symlink'
|
|
|
|
}
|
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_cp_r
|
|
|
|
cp_r 'data', 'tmp'
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
assert_same_file fname, "tmp/#{fname}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_mv
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
cp fname, 'tmp/mvsrc'
|
|
|
|
mv 'tmp/mvsrc', 'tmp/mvdest'
|
|
|
|
assert_same_file fname, 'tmp/mvdest'
|
|
|
|
end
|
2003-11-18 00:09:20 -05:00
|
|
|
|
|
|
|
# src==dest
|
|
|
|
touch 'tmp/cptmp'
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
mv 'tmp/cptmp', 'tmp/cptmp'
|
|
|
|
}
|
|
|
|
if have_symlink?
|
|
|
|
File.symlink 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
mv 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
}
|
|
|
|
File.symlink 'tmp/symlink', 'tmp/symlink'
|
|
|
|
assert_raises(Errno::ELOOP) {
|
|
|
|
mv 'tmp/symlink', 'tmp/symlink'
|
|
|
|
}
|
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_rm
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
cp fname, 'tmp/rmsrc'
|
|
|
|
rm 'tmp/rmsrc'
|
|
|
|
assert_file_not_exist 'tmp/rmsrc'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_rm_f
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
cp fname, 'tmp/rmsrc'
|
|
|
|
rm_f 'tmp/rmsrc'
|
|
|
|
assert_file_not_exist 'tmp/rmsrc'
|
|
|
|
end
|
|
|
|
|
2003-09-26 20:44:50 -04:00
|
|
|
if have_symlink?
|
2003-09-17 05:52:50 -04:00
|
|
|
File.open('tmp/lnf_symlink_src', 'w') {|f| f.puts 'dummy' }
|
|
|
|
File.symlink 'tmp/lnf_symlink_src', 'tmp/lnf_symlink_dest'
|
|
|
|
rm_f 'tmp/lnf_symlink_dest'
|
|
|
|
assert_file_not_exist 'tmp/lnf_symlink_dest'
|
|
|
|
assert_file_exist 'tmp/lnf_symlink_src'
|
2003-09-26 20:44:50 -04:00
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
|
|
|
|
rm_f 'notexistdatafile'
|
|
|
|
rm_f 'tmp/notexistdatafile'
|
|
|
|
my_rm_rf 'tmpdatadir'
|
|
|
|
Dir.mkdir 'tmpdatadir'
|
|
|
|
# rm_f 'tmpdatadir'
|
|
|
|
Dir.rmdir 'tmpdatadir'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_rm_r
|
|
|
|
my_rm_rf 'tmpdatadir'
|
|
|
|
|
|
|
|
Dir.mkdir 'tmpdatadir'
|
|
|
|
rm_r 'tmpdatadir'
|
|
|
|
assert_file_not_exist 'tmpdatadir'
|
|
|
|
|
|
|
|
Dir.mkdir 'tmpdatadir'
|
|
|
|
rm_r 'tmpdatadir/'
|
|
|
|
assert_file_not_exist 'tmpdatadir'
|
|
|
|
|
|
|
|
Dir.mkdir 'tmp/tmpdir'
|
|
|
|
rm_r 'tmp/tmpdir/'
|
|
|
|
assert_file_not_exist 'tmp/tmpdir'
|
|
|
|
assert_file_exist 'tmp'
|
|
|
|
|
|
|
|
Dir.mkdir 'tmp/tmpdir'
|
|
|
|
rm_r 'tmp/tmpdir'
|
|
|
|
assert_file_not_exist 'tmp/tmpdir'
|
|
|
|
assert_file_exist 'tmp'
|
|
|
|
|
|
|
|
Dir.mkdir 'tmp/tmpdir'
|
|
|
|
File.open('tmp/tmpdir/a', 'w') {|f| f.puts 'dummy' }
|
|
|
|
File.open('tmp/tmpdir/b', 'w') {|f| f.puts 'dummy' }
|
|
|
|
File.open('tmp/tmpdir/c', 'w') {|f| f.puts 'dummy' }
|
|
|
|
rm_r 'tmp/tmpdir'
|
|
|
|
assert_file_not_exist 'tmp/tmpdir'
|
|
|
|
assert_file_exist 'tmp'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_with_big_file
|
|
|
|
prepare_big_file
|
|
|
|
|
|
|
|
cp BIGFILE, 'tmp/cpdest'
|
|
|
|
assert_same_file BIGFILE, 'tmp/cpdest'
|
|
|
|
assert cmp(BIGFILE, 'tmp/cpdest'), 'orig != copied'
|
|
|
|
|
|
|
|
mv 'tmp/cpdest', 'tmp/mvdest'
|
|
|
|
assert_same_file BIGFILE, 'tmp/mvdest'
|
|
|
|
assert_file_not_exist 'tmp/cpdest'
|
|
|
|
|
|
|
|
rm 'tmp/mvdest'
|
|
|
|
assert_file_not_exist 'tmp/mvdest'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_ln
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
ln fname, 'tmp/lndest'
|
|
|
|
assert_same_file fname, 'tmp/lndest'
|
|
|
|
File.unlink 'tmp/lndest'
|
|
|
|
end
|
|
|
|
|
|
|
|
ln TARGETS, 'tmp'
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
assert_same_file fname, 'tmp/' + File.basename(fname)
|
|
|
|
end
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
File.unlink 'tmp/' + File.basename(fname)
|
|
|
|
end
|
2003-11-18 00:09:20 -05:00
|
|
|
|
|
|
|
# src==dest
|
|
|
|
touch 'tmp/cptmp'
|
|
|
|
assert_raises(Errno::EEXIST) {
|
|
|
|
ln 'tmp/cptmp', 'tmp/cptmp'
|
|
|
|
}
|
|
|
|
if have_symlink?
|
|
|
|
File.symlink 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
assert_raises(Errno::EEXIST) {
|
|
|
|
ln 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
}
|
|
|
|
File.symlink 'tmp/symlink', 'tmp/symlink'
|
|
|
|
assert_raises(Errno::EEXIST) {
|
|
|
|
ln 'tmp/symlink', 'tmp/symlink'
|
|
|
|
}
|
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
|
2003-09-26 20:44:50 -04:00
|
|
|
if have_symlink?
|
2003-09-17 05:52:50 -04:00
|
|
|
def test_ln_s
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
ln_s fname, 'tmp/lnsdest'
|
|
|
|
assert FileTest.symlink?('tmp/lnsdest'), 'not symlink'
|
|
|
|
assert_equal fname, File.readlink('tmp/lnsdest')
|
|
|
|
rm_f 'tmp/lnsdest'
|
|
|
|
end
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_nothing_raised {
|
|
|
|
ln_s 'tmp/symlink', 'tmp/symlink'
|
|
|
|
}
|
|
|
|
assert_symlink 'tmp/symlink'
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
2003-09-26 20:44:50 -04:00
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
|
2003-09-26 20:44:50 -04:00
|
|
|
if have_symlink?
|
2003-09-17 05:52:50 -04:00
|
|
|
def test_ln_sf
|
|
|
|
TARGETS.each do |fname|
|
|
|
|
ln_sf fname, 'tmp/lnsdest'
|
|
|
|
assert FileTest.symlink?('tmp/lnsdest'), 'not symlink'
|
|
|
|
assert_equal fname, File.readlink('tmp/lnsdest')
|
|
|
|
ln_sf fname, 'tmp/lnsdest'
|
|
|
|
ln_sf fname, 'tmp/lnsdest'
|
|
|
|
end
|
|
|
|
end
|
2003-09-26 20:44:50 -04:00
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
|
|
|
|
def test_mkdir
|
|
|
|
my_rm_rf 'tmpdatadir'
|
|
|
|
mkdir 'tmpdatadir'
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_directory 'tmpdatadir'
|
2003-09-17 05:52:50 -04:00
|
|
|
Dir.rmdir 'tmpdatadir'
|
|
|
|
|
|
|
|
mkdir 'tmp/mkdirdest'
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_directory 'tmp/mkdirdest'
|
2003-09-17 05:52:50 -04:00
|
|
|
Dir.rmdir 'tmp/mkdirdest'
|
|
|
|
|
|
|
|
mkdir 'tmp/tmp', :mode => 0700
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_directory 'tmp/tmp'
|
2003-09-26 20:44:50 -04:00
|
|
|
assert_equal 0700, (File.stat('tmp/tmp').mode & 0777) unless windows?
|
2003-09-17 05:52:50 -04:00
|
|
|
Dir.rmdir 'tmp/tmp'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_mkdir_p
|
|
|
|
dirs = %w(
|
|
|
|
tmpdir/dir/
|
|
|
|
tmpdir/dir/./
|
|
|
|
tmpdir/dir/./.././dir/
|
|
|
|
tmpdir/a
|
|
|
|
tmpdir/a/
|
|
|
|
tmpdir/a/b
|
|
|
|
tmpdir/a/b/
|
|
|
|
tmpdir/a/b/c/
|
|
|
|
tmpdir/a/b/c
|
|
|
|
tmpdir/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
|
|
|
|
tmpdir/a/a
|
|
|
|
)
|
|
|
|
rm_rf 'tmpdir'
|
|
|
|
dirs.each do |d|
|
|
|
|
mkdir_p d
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_directory d
|
2003-09-17 05:52:50 -04:00
|
|
|
assert_file_not_exist "#{d}/a"
|
|
|
|
assert_file_not_exist "#{d}/b"
|
|
|
|
assert_file_not_exist "#{d}/c"
|
|
|
|
rm_rf 'tmpdir'
|
|
|
|
end
|
|
|
|
dirs.each do |d|
|
|
|
|
mkdir_p d
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_directory d
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
rm_rf 'tmpdir'
|
|
|
|
|
|
|
|
mkdir_p 'tmp/tmp/tmp', :mode => 0700
|
2003-11-18 00:09:20 -05:00
|
|
|
assert_directory 'tmp/tmp'
|
|
|
|
assert_directory 'tmp/tmp/tmp'
|
2003-09-26 20:44:50 -04:00
|
|
|
assert_equal 0700, (File.stat('tmp/tmp').mode & 0777) unless windows?
|
|
|
|
assert_equal 0700, (File.stat('tmp/tmp/tmp').mode & 0777) unless windows?
|
2003-09-17 05:52:50 -04:00
|
|
|
rm_rf 'tmp/tmp'
|
|
|
|
end
|
|
|
|
|
|
|
|
def try_mkdirp( dirs, del )
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_uptodate?
|
|
|
|
Dir.chdir('data') {
|
|
|
|
assert( uptodate?('newest', %w(old newer notexist)) )
|
|
|
|
assert( ! uptodate?('newer', %w(old newest notexist)) )
|
|
|
|
assert( ! uptodate?('notexist', %w(old newest newer)) )
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_install
|
|
|
|
File.open('tmp/aaa', 'w') {|f| f.puts 'aaa' }
|
|
|
|
File.open('tmp/bbb', 'w') {|f| f.puts 'bbb' }
|
|
|
|
install 'tmp/aaa', 'tmp/bbb', :mode => 0600
|
|
|
|
assert_equal "aaa\n", File.read('tmp/bbb')
|
2003-09-26 20:44:50 -04:00
|
|
|
assert_equal 0600, (File.stat('tmp/bbb').mode & 0777) unless windows?
|
2003-09-17 05:52:50 -04:00
|
|
|
|
|
|
|
t = File.mtime('tmp/bbb')
|
|
|
|
install 'tmp/aaa', 'tmp/bbb'
|
|
|
|
assert_equal "aaa\n", File.read('tmp/bbb')
|
2003-09-26 20:44:50 -04:00
|
|
|
assert_equal 0600, (File.stat('tmp/bbb').mode & 0777) unless windows?
|
2003-09-17 05:52:50 -04:00
|
|
|
assert_equal t, File.mtime('tmp/bbb')
|
|
|
|
|
|
|
|
File.unlink 'tmp/aaa'
|
|
|
|
File.unlink 'tmp/bbb'
|
2003-11-18 00:09:20 -05:00
|
|
|
|
|
|
|
# src==dest
|
|
|
|
touch 'tmp/cptmp'
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
install 'tmp/cptmp', 'tmp/cptmp'
|
|
|
|
}
|
|
|
|
if have_symlink?
|
|
|
|
File.symlink 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
assert_raises(ArgumentError) {
|
|
|
|
install 'tmp/cptmp', 'tmp/cptmp_symlink'
|
|
|
|
}
|
|
|
|
File.symlink 'tmp/symlink', 'tmp/symlink'
|
|
|
|
assert_raises(Errno::ELOOP) {
|
|
|
|
install 'tmp/symlink', 'tmp/symlink'
|
|
|
|
}
|
|
|
|
end
|
2003-09-17 05:52:50 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|