1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
require 'stat'
require 'file_info_testcase.rb'
require 'socket'
class TestFileTest < FileInfoTest
# compares modified times
def test_CMP # '<=>'
assert(test(?=, @file1, @file1))
assert(test(?=, @file2, @file2))
assert(test(?>, @file1, @file2))
assert(test(?<, @file2, @file1))
end
def test_hlink
File.link(@file1, "_link")
begin
assert(!test(?-, @file1, @file2))
assert(test(?-, @file1, @file1))
assert(test(?-, @file1, "_link"))
assert(test(?-, "_link", @file1))
ensure
File.unlink("_link")
end
end
def test_skipped
skipping "Tests for O R W X "
end
def test_test
fileg = "_test/_fileg"
File.open(fileg, File::CREAT, 02755) { }
filek = "_test/_filek"
Dir.mkdir(filek, 01644)
File.chmod(01644, filek)
filel = filep = filer = fileu = nil
Windows.dont do
filel = "_test/_filel"
File.symlink(@file1, filel)
filep = "_test/_filep"
system "mkfifo #{filep}"
assert_equal(0, $?)
filer = "_test/_filer"
File.open(filer, File::CREAT, 0222) { }
fileu = "_test/_fileu"
File.open(fileu, File::CREAT, 0644) { }
File.chmod(04644, fileu) # set-uid bit
end
filew = "_test/_filew"
File.open(filew, File::CREAT, 0444) { }
filez = "_test/_filez"
File.open(filez, File::CREAT|File::WRONLY, 0644) { |f| f.puts "hi" }
filez_size = $os <= WindowsNative ? 4 : 3
filesock = sock = nil
MsWin32.dont do
filesock = "_test/_filesock"
sock = UNIXServer.open(filesock)
filesock = nil unless sock
end
atime = Time.at(RubiconStat::atime(@file1))
ctime = Time.at(RubiconStat::ctime(@file1))
mtime = Time.at(RubiconStat::mtime(@file1))
begin
tests = [
[ nil, ?A, @file1, atime ],
[ :blockdev?, ?b, ".", false ],
[ :chardev?, ?c, ".", false ],
[ nil, ?C, @file1, ctime ],
[ :directory?, ?d, ".", true ],
[ :directory?, ?d, "/dev/fd0", false ],
[ :exist?, ?e, filez, true ],
[ :exist?, ?e, "wombat", false ],
[ :file?, ?f, ".", false ],
[ :file?, ?f, "/dev/fd0", false ],
[ :file?, ?f, @file1, true ],
[ :setgid?, ?g, @file1, false ],
[ :symlink?, ?l, ".", false ],
[ :symlink?, ?l, @file1, false ],
[ nil, ?M, @file1, mtime ],
[ :owned?, ?o, @file1, true ],
[ :pipe?, ?p, ".", false ],
[ :readable?, ?r, @file1, true ],
[ :size?, ?s, filez, filez_size ],
[ :size?, ?s, @file2, nil ],
[ :socket?, ?S, ".", false ],
[ :socket?, ?S, @file1, false ],
[ :setuid?, ?u, @file1, false ],
[ :writable?, ?w, @file2, true ],
[ :executable?, ?x, "/dev/fd0", false ],
[ :zero?, ?z, filez, false ],
[ :zero?, ?z, @file2, true ],
]
Solaris.dont do
tests << [ :symlink?, ?l, "/dev/tty", false ]
end
Windows.dont do
tests << [ :pipe?, ?p, filep, true ]
tests << [ :symlink?, ?l, filel, true ]
tests << [ :readable?, ?r, filer, Process.euid == 0 ]
tests << [ :setuid?, ?u, fileu, true ]
tests << [ :owned?, ?o, "/etc/passwd", Process.euid == 0 ]
end
MsWin32.dont do
tests << [ :socket?, ?S, filesock, true ]
end
Unix.or_variant do
tests << [ :blockdev?, ?b, "/dev/tty", false ]
tests << [ :chardev?, ?c, "/dev/tty", true ]
tests << [ :directory?, ?d, "/dev/tty", false ]
tests << [ :file?, ?f, "/dev/tty", false ]
tests << [ :exist?, ?e, "/dev/tty", true ]
tests << [ :sticky?, ?k, "/dev/tty", false ]
tests << [ :pipe?, ?p, "/dev/tty", false ]
tests << [ :socket?, ?S, "/dev/tty", false ]
tests << [ :executable?, ?x, "/dev/tty", false ]
tests << [ :executable?, ?x, "/bin/echo", true ]
# HACK - requires super on osx? tests << [ :setgid?, ?g, fileg, true ]
tests << [ :sticky?, ?k, ".", false ]
tests << [ :sticky?, ?k, @file1, false ]
tests << [ :sticky?, ?k, filek, true ]
end
Linux.only do
tests << [ :chardev?, ?c, "/dev/fd0", false ]
tests << [ :blockdev?, ?b, "/dev/fd0", true ]
tests << [ :grpowned?, ?G, @file1, true ]
tests << [ :grpowned?, ?G, "/etc/passwd", Process.egid == 0 ]
end
for meth, t, file, result in tests
if file
assert_equal(result, test(t, file), "test(?#{t.chr}, #{file})")
if meth
assert_equal(result, FileTest.send(meth, file),
"FileTest.#{meth}(#{file})")
end
end
end
Windows.dont do
# Windows has no superuser semantics like UN*X, so we skip these tests.
# TODO: check if these tests actually do the right thing.
assert_equal(Process.euid == 0, test(?w, filew), "test(?#{t.chr}, #{filew})")
assert_equal(Process.euid == 0, FileTest.send(:writable?, filew),
"FileTest.writable?(#{filew})")
end
ensure
sock.close if sock
end
end
end
|