[25] | 1 | # This file tests the tclUnixFCmd.c file. |
---|
| 2 | # |
---|
| 3 | # This file contains a collection of tests for one or more of the Tcl |
---|
| 4 | # built-in commands. Sourcing this file into Tcl runs the tests and |
---|
| 5 | # generates output for errors. No output means no errors were found. |
---|
| 6 | # |
---|
| 7 | # Copyright (c) 1996 Sun Microsystems, Inc. |
---|
| 8 | # |
---|
| 9 | # See the file "license.terms" for information on usage and redistribution |
---|
| 10 | # of this file, and for a DISCLAIMER OF ALL WARRANTIES. |
---|
| 11 | # |
---|
| 12 | # RCS: @(#) $Id: unixFCmd.test,v 1.24 2006/03/21 11:12:29 dkf Exp $ |
---|
| 13 | |
---|
| 14 | if {[lsearch [namespace children] ::tcltest] == -1} { |
---|
| 15 | package require tcltest |
---|
| 16 | namespace import -force ::tcltest::* |
---|
| 17 | } |
---|
| 18 | |
---|
| 19 | testConstraint testchmod [llength [info commands testchmod]] |
---|
| 20 | |
---|
| 21 | # These tests really need to be run from a writable directory, which |
---|
| 22 | # it is assumed [temporaryDirectory] is. |
---|
| 23 | set oldcwd [pwd] |
---|
| 24 | cd [temporaryDirectory] |
---|
| 25 | |
---|
| 26 | # Several tests require need to match results against the unix username |
---|
| 27 | set user {} |
---|
| 28 | if {[testConstraint unix]} { |
---|
| 29 | catch {set user [exec whoami]} |
---|
| 30 | if {$user == ""} { |
---|
| 31 | catch {regexp {^[^(]*\(([^)]*)\)} [exec id] dummy user} |
---|
| 32 | } |
---|
| 33 | if {$user == ""} { |
---|
| 34 | set user "root" |
---|
| 35 | } |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | # Find a group that exists on this system, or else skip tests that require |
---|
| 39 | # groups |
---|
| 40 | testConstraint foundGroup 0 |
---|
| 41 | if {[testConstraint unix]} { |
---|
| 42 | catch { |
---|
| 43 | set groupList [exec groups] |
---|
| 44 | set group [lindex $groupList 0] |
---|
| 45 | testConstraint foundGroup 1 |
---|
| 46 | } |
---|
| 47 | } |
---|
| 48 | |
---|
| 49 | # check whether -readonly attribute is supported |
---|
| 50 | testConstraint readonlyAttr 0 |
---|
| 51 | if {[testConstraint unix]} { |
---|
| 52 | set f [makeFile "whatever" probe] |
---|
| 53 | catch { |
---|
| 54 | file attributes $f -readonly |
---|
| 55 | testConstraint readonlyAttr 1 |
---|
| 56 | } |
---|
| 57 | removeFile probe |
---|
| 58 | } |
---|
| 59 | |
---|
| 60 | proc openup {path} { |
---|
| 61 | testchmod 777 $path |
---|
| 62 | if {[file isdirectory $path]} { |
---|
| 63 | catch { |
---|
| 64 | foreach p [glob -directory $path *] { |
---|
| 65 | openup $p |
---|
| 66 | } |
---|
| 67 | } |
---|
| 68 | } |
---|
| 69 | } |
---|
| 70 | |
---|
| 71 | proc cleanup {args} { |
---|
| 72 | foreach p ". $args" { |
---|
| 73 | set x "" |
---|
| 74 | catch { |
---|
| 75 | set x [glob -directory $p tf* td*] |
---|
| 76 | } |
---|
| 77 | foreach file $x { |
---|
| 78 | if { |
---|
| 79 | [catch {file delete -force -- $file}] |
---|
| 80 | && [testConstraint testchmod] |
---|
| 81 | } then { |
---|
| 82 | openup $file |
---|
| 83 | file delete -force -- $file |
---|
| 84 | } |
---|
| 85 | } |
---|
| 86 | } |
---|
| 87 | } |
---|
| 88 | |
---|
| 89 | test unixFCmd-1.1 {TclpRenameFile: EACCES} {unix notRoot} { |
---|
| 90 | cleanup |
---|
| 91 | file mkdir td1/td2/td3 |
---|
| 92 | file attributes td1/td2 -permissions 0000 |
---|
| 93 | set msg [list [catch {file rename td1/td2/td3 td2} msg] $msg] |
---|
| 94 | file attributes td1/td2 -permissions 0755 |
---|
| 95 | set msg |
---|
| 96 | } {1 {error renaming "td1/td2/td3": permission denied}} |
---|
| 97 | test unixFCmd-1.2 {TclpRenameFile: EEXIST} {unix notRoot} { |
---|
| 98 | cleanup |
---|
| 99 | file mkdir td1/td2 |
---|
| 100 | file mkdir td2 |
---|
| 101 | list [catch {file rename td2 td1} msg] $msg |
---|
| 102 | } {1 {error renaming "td2" to "td1/td2": file already exists}} |
---|
| 103 | test unixFCmd-1.3 {TclpRenameFile: EINVAL} {unix notRoot} { |
---|
| 104 | cleanup |
---|
| 105 | file mkdir td1 |
---|
| 106 | list [catch {file rename td1 td1} msg] $msg |
---|
| 107 | } {1 {error renaming "td1" to "td1/td1": trying to rename a volume or move a directory into itself}} |
---|
| 108 | test unixFCmd-1.4 {TclpRenameFile: EISDIR} {emptyTest unix notRoot} { |
---|
| 109 | # can't make it happen |
---|
| 110 | } {} |
---|
| 111 | test unixFCmd-1.5 {TclpRenameFile: ENOENT} {unix notRoot} { |
---|
| 112 | cleanup |
---|
| 113 | file mkdir td1 |
---|
| 114 | list [catch {file rename td2 td1} msg] $msg |
---|
| 115 | } {1 {error renaming "td2": no such file or directory}} |
---|
| 116 | test unixFCmd-1.6 {TclpRenameFile: ENOTDIR} {emptyTest unix notRoot} { |
---|
| 117 | # can't make it happen |
---|
| 118 | } {} |
---|
| 119 | test unixFCmd-1.7 {TclpRenameFile: EXDEV} {unix notRoot} { |
---|
| 120 | cleanup |
---|
| 121 | file mkdir foo/bar |
---|
| 122 | file attr foo -perm 040555 |
---|
| 123 | set catchResult [catch {file rename foo/bar /tmp} msg] |
---|
| 124 | set msg [lindex [split $msg :] end] |
---|
| 125 | catch {file delete /tmp/bar} |
---|
| 126 | catch {file attr foo -perm 040777} |
---|
| 127 | catch {file delete -force foo} |
---|
| 128 | list $catchResult $msg |
---|
| 129 | } {1 { permission denied}} |
---|
| 130 | test unixFCmd-1.8 {Checking EINTR Bug} {unix notRoot nonPortable} { |
---|
| 131 | testalarm |
---|
| 132 | after 2000 |
---|
| 133 | list [testgotsig] [testgotsig] |
---|
| 134 | } {1 0} |
---|
| 135 | test unixFCmd-1.9 {Checking EINTR Bug} {unix notRoot nonPortable} { |
---|
| 136 | cleanup |
---|
| 137 | set f [open tfalarm w] |
---|
| 138 | puts $f { |
---|
| 139 | after 2000 |
---|
| 140 | puts "hello world" |
---|
| 141 | exit 0 |
---|
| 142 | } |
---|
| 143 | close $f |
---|
| 144 | testalarm |
---|
| 145 | set pipe [open "|[info nameofexecutable] tfalarm" r+] |
---|
| 146 | set line [read $pipe 1] |
---|
| 147 | catch {close $pipe} |
---|
| 148 | list $line [testgotsig] |
---|
| 149 | } {h 1} |
---|
| 150 | |
---|
| 151 | test unixFCmd-2.1 {TclpCopyFile: target exists: lstat(dst) == 0} \ |
---|
| 152 | {unix notRoot} { |
---|
| 153 | cleanup |
---|
| 154 | close [open tf1 a] |
---|
| 155 | close [open tf2 a] |
---|
| 156 | file copy -force tf1 tf2 |
---|
| 157 | } {} |
---|
| 158 | test unixFCmd-2.2.1 {TclpCopyFile: src is symlink} {unix notRoot dontCopyLinks} { |
---|
| 159 | # copying links should end up with real files |
---|
| 160 | cleanup |
---|
| 161 | close [open tf1 a] |
---|
| 162 | file link -symbolic tf2 tf1 |
---|
| 163 | file copy tf2 tf3 |
---|
| 164 | file type tf3 |
---|
| 165 | } {file} |
---|
| 166 | test unixFCmd-2.2.2 {TclpCopyFile: src is symlink} {unix notRoot} { |
---|
| 167 | # copying links should end up with the links copied |
---|
| 168 | cleanup |
---|
| 169 | close [open tf1 a] |
---|
| 170 | file link -symbolic tf2 tf1 |
---|
| 171 | file copy tf2 tf3 |
---|
| 172 | file type tf3 |
---|
| 173 | } {link} |
---|
| 174 | test unixFCmd-2.3 {TclpCopyFile: src is block} {unix notRoot} { |
---|
| 175 | cleanup |
---|
| 176 | set null "/dev/null" |
---|
| 177 | while {[file type $null] != "characterSpecial"} { |
---|
| 178 | set null [file join [file dirname $null] [file readlink $null]] |
---|
| 179 | } |
---|
| 180 | # file copy $null tf1 |
---|
| 181 | } {} |
---|
| 182 | test unixFCmd-2.4 {TclpCopyFile: src is fifo} {unix notRoot} { |
---|
| 183 | cleanup |
---|
| 184 | if [catch {exec mknod tf1 p}] { |
---|
| 185 | list 1 |
---|
| 186 | } else { |
---|
| 187 | file copy tf1 tf2 |
---|
| 188 | expr {"[file type tf1]" == "[file type tf2]"} |
---|
| 189 | } |
---|
| 190 | } {1} |
---|
| 191 | test unixFCmd-2.5 {TclpCopyFile: copy attributes} {unix notRoot} { |
---|
| 192 | cleanup |
---|
| 193 | close [open tf1 a] |
---|
| 194 | file attributes tf1 -permissions 0472 |
---|
| 195 | file copy tf1 tf2 |
---|
| 196 | file attributes tf2 -permissions |
---|
| 197 | } 00472 ;# i.e. perms field of [exec ls -l tf2] is -r--rwx-w- |
---|
| 198 | |
---|
| 199 | test unixFCmd-3.1 {CopyFile not done} {emptyTest unix notRoot} { |
---|
| 200 | } {} |
---|
| 201 | |
---|
| 202 | test unixFCmd-4.1 {TclpDeleteFile not done} {emptyTest unix notRoot} { |
---|
| 203 | } {} |
---|
| 204 | |
---|
| 205 | test unixFCmd-5.1 {TclpCreateDirectory not done} {emptyTest unix notRoot} { |
---|
| 206 | } {} |
---|
| 207 | |
---|
| 208 | test unixFCmd-6.1 {TclpCopyDirectory not done} {emptyTest unix notRoot} { |
---|
| 209 | } {} |
---|
| 210 | |
---|
| 211 | test unixFCmd-7.1 {TclpRemoveDirectory not done} {emptyTest unix notRoot} { |
---|
| 212 | } {} |
---|
| 213 | |
---|
| 214 | test unixFCmd-8.1 {TraverseUnixTree not done} {emptyTest unix notRoot} { |
---|
| 215 | } {} |
---|
| 216 | |
---|
| 217 | test unixFCmd-9.1 {TraversalCopy not done} {emptyTest unix notRoot} { |
---|
| 218 | } {} |
---|
| 219 | |
---|
| 220 | test unixFCmd-10.1 {TraversalDelete not done} {emptyTest unix notRoot} { |
---|
| 221 | } {} |
---|
| 222 | |
---|
| 223 | test unixFCmd-11.1 {CopyFileAttrs not done} {emptyTest unix notRoot} { |
---|
| 224 | } {} |
---|
| 225 | |
---|
| 226 | test unixFCmd-12.1 {GetGroupAttribute - file not found} {unix notRoot} { |
---|
| 227 | catch {file delete -force -- foo.test} |
---|
| 228 | list [catch {file attributes foo.test -group} msg] $msg |
---|
| 229 | } {1 {could not read "foo.test": no such file or directory}} |
---|
| 230 | test unixFCmd-12.2 {GetGroupAttribute - file found} {unix notRoot} { |
---|
| 231 | catch {file delete -force -- foo.test} |
---|
| 232 | close [open foo.test w] |
---|
| 233 | list [catch {file attributes foo.test -group}] [file delete -force -- foo.test] |
---|
| 234 | } {0 {}} |
---|
| 235 | |
---|
| 236 | test unixFCmd-13.1 {GetOwnerAttribute - file not found} {unix notRoot} { |
---|
| 237 | catch {file delete -force -- foo.test} |
---|
| 238 | list [catch {file attributes foo.test -group} msg] $msg |
---|
| 239 | } {1 {could not read "foo.test": no such file or directory}} |
---|
| 240 | test unixFCmd-13.2 {GetOwnerAttribute} {unix notRoot} { |
---|
| 241 | catch {file delete -force -- foo.test} |
---|
| 242 | close [open foo.test w] |
---|
| 243 | list [catch {file attributes foo.test -owner} msg] \ |
---|
| 244 | [string compare $msg $user] [file delete -force -- foo.test] |
---|
| 245 | } {0 0 {}} |
---|
| 246 | |
---|
| 247 | test unixFCmd-14.1 {GetPermissionsAttribute - file not found} {unix notRoot} { |
---|
| 248 | catch {file delete -force -- foo.test} |
---|
| 249 | list [catch {file attributes foo.test -permissions} msg] $msg |
---|
| 250 | } {1 {could not read "foo.test": no such file or directory}} |
---|
| 251 | test unixFCmd-14.2 {GetPermissionsAttribute} {unix notRoot} { |
---|
| 252 | catch {file delete -force -- foo.test} |
---|
| 253 | close [open foo.test w] |
---|
| 254 | list [catch {file attribute foo.test -permissions}] \ |
---|
| 255 | [file delete -force -- foo.test] |
---|
| 256 | } {0 {}} |
---|
| 257 | |
---|
| 258 | #groups hard to test |
---|
| 259 | test unixFCmd-15.1 {SetGroupAttribute - invalid group} {unix notRoot} { |
---|
| 260 | catch {file delete -force -- foo.test} |
---|
| 261 | list [catch {file attributes foo.test -group foozzz} msg] \ |
---|
| 262 | $msg [file delete -force -- foo.test] |
---|
| 263 | } {1 {could not set group for file "foo.test": group "foozzz" does not exist} {}} |
---|
| 264 | test unixFCmd-15.2 {SetGroupAttribute - invalid file} \ |
---|
| 265 | {unix notRoot foundGroup} { |
---|
| 266 | catch {file delete -force -- foo.test} |
---|
| 267 | list [catch {file attributes foo.test -group $group} msg] $msg |
---|
| 268 | } {1 {could not set group for file "foo.test": no such file or directory}} |
---|
| 269 | |
---|
| 270 | #changing owners hard to do |
---|
| 271 | test unixFCmd-16.1 {SetOwnerAttribute - current owner} {unix notRoot} { |
---|
| 272 | catch {file delete -force -- foo.test} |
---|
| 273 | close [open foo.test w] |
---|
| 274 | list [catch {file attributes foo.test -owner $user} msg] \ |
---|
| 275 | $msg [string compare [file attributes foo.test -owner] $user] \ |
---|
| 276 | [file delete -force -- foo.test] |
---|
| 277 | } {0 {} 0 {}} |
---|
| 278 | test unixFCmd-16.2 {SetOwnerAttribute - invalid file} {unix notRoot} { |
---|
| 279 | catch {file delete -force -- foo.test} |
---|
| 280 | list [catch {file attributes foo.test -owner $user} msg] $msg |
---|
| 281 | } {1 {could not set owner for file "foo.test": no such file or directory}} |
---|
| 282 | test unixFCmd-16.3 {SetOwnerAttribute - invalid owner} {unix notRoot} { |
---|
| 283 | catch {file delete -force -- foo.test} |
---|
| 284 | list [catch {file attributes foo.test -owner foozzz} msg] $msg |
---|
| 285 | } {1 {could not set owner for file "foo.test": user "foozzz" does not exist}} |
---|
| 286 | |
---|
| 287 | |
---|
| 288 | test unixFCmd-17.1 {SetPermissionsAttribute} {unix notRoot} { |
---|
| 289 | catch {file delete -force -- foo.test} |
---|
| 290 | close [open foo.test w] |
---|
| 291 | list [catch {file attributes foo.test -permissions 0000} msg] \ |
---|
| 292 | $msg [file attributes foo.test -permissions] \ |
---|
| 293 | [file delete -force -- foo.test] |
---|
| 294 | } {0 {} 00000 {}} |
---|
| 295 | test unixFCmd-17.2 {SetPermissionsAttribute} {unix notRoot} { |
---|
| 296 | catch {file delete -force -- foo.test} |
---|
| 297 | list [catch {file attributes foo.test -permissions 0000} msg] $msg |
---|
| 298 | } {1 {could not set permissions for file "foo.test": no such file or directory}} |
---|
| 299 | test unixFCmd-17.3 {SetPermissionsAttribute} {unix notRoot} { |
---|
| 300 | catch {file delete -force -- foo.test} |
---|
| 301 | close [open foo.test w] |
---|
| 302 | list [catch {file attributes foo.test -permissions foo} msg] $msg \ |
---|
| 303 | [file delete -force -- foo.test] |
---|
| 304 | } {1 {unknown permission string format "foo"} {}} |
---|
| 305 | test unixFCmd-17.4 {SetPermissionsAttribute} {unix notRoot} { |
---|
| 306 | catch {file delete -force -- foo.test} |
---|
| 307 | close [open foo.test w] |
---|
| 308 | list [catch {file attributes foo.test -permissions ---rwx} msg] $msg \ |
---|
| 309 | [file delete -force -- foo.test] |
---|
| 310 | } {1 {unknown permission string format "---rwx"} {}} |
---|
| 311 | |
---|
| 312 | close [open foo.test w] |
---|
| 313 | set ::i 4 |
---|
| 314 | proc permcheck {testnum permstr expected} { |
---|
| 315 | test $testnum {SetPermissionsAttribute} {unix notRoot} { |
---|
| 316 | file attributes foo.test -permissions $permstr |
---|
| 317 | file attributes foo.test -permissions |
---|
| 318 | } $expected |
---|
| 319 | } |
---|
| 320 | permcheck unixFCmd-17.5 rwxrwxrwx 00777 |
---|
| 321 | permcheck unixFCmd-17.6 r--r---w- 00442 |
---|
| 322 | permcheck unixFCmd-17.7 0 00000 |
---|
| 323 | permcheck unixFCmd-17.8 u+rwx,g+r 00740 |
---|
| 324 | permcheck unixFCmd-17.9 u-w 00540 |
---|
| 325 | permcheck unixFCmd-17.10 o+rwx 00547 |
---|
| 326 | permcheck unixFCmd-17.11 --x--x--x 00111 |
---|
| 327 | permcheck unixFCmd-17.12 a+rwx 00777 |
---|
| 328 | file delete -force -- foo.test |
---|
| 329 | |
---|
| 330 | test unixFCmd-18.1 {Unix pwd} {nonPortable unix notRoot} { |
---|
| 331 | # This test is nonportable because SunOS generates a weird error |
---|
| 332 | # message when the current directory isn't readable. |
---|
| 333 | set cd [pwd] |
---|
| 334 | set nd $cd/tstdir |
---|
| 335 | file mkdir $nd |
---|
| 336 | cd $nd |
---|
| 337 | file attributes $nd -permissions 0000 |
---|
| 338 | set r [list [catch {pwd} res] [string range $res 0 36]]; |
---|
| 339 | cd $cd; |
---|
| 340 | file attributes $nd -permissions 0755 |
---|
| 341 | file delete $nd |
---|
| 342 | set r |
---|
| 343 | } {1 {error getting working directory name:}} |
---|
| 344 | |
---|
| 345 | test unixFCmd-19.1 {GetReadOnlyAttribute - file not found} {unix notRoot readonlyAttr} { |
---|
| 346 | catch {file delete -force -- foo.test} |
---|
| 347 | list [catch {file attributes foo.test -readonly} msg] $msg |
---|
| 348 | } {1 {could not read "foo.test": no such file or directory}} |
---|
| 349 | test unixFCmd-19.2 {GetReadOnlyAttribute} {unix notRoot readonlyAttr} { |
---|
| 350 | catch {file delete -force -- foo.test} |
---|
| 351 | close [open foo.test w] |
---|
| 352 | list [catch {file attribute foo.test -readonly} msg] $msg \ |
---|
| 353 | [file delete -force -- foo.test] |
---|
| 354 | } {0 0 {}} |
---|
| 355 | |
---|
| 356 | test unixFCmd-20.1 {SetReadOnlyAttribute} {unix notRoot readonlyAttr} { |
---|
| 357 | catch {file delete -force -- foo.test} |
---|
| 358 | close [open foo.test w] |
---|
| 359 | list [catch {file attributes foo.test -readonly 1} msg] $msg \ |
---|
| 360 | [catch {file attribute foo.test -readonly} msg] $msg \ |
---|
| 361 | [catch {file delete -force -- foo.test}] \ |
---|
| 362 | [catch {file attributes foo.test -readonly 0} msg] $msg \ |
---|
| 363 | [catch {file attribute foo.test -readonly} msg] $msg \ |
---|
| 364 | [file delete -force -- foo.test] |
---|
| 365 | } {0 {} 0 1 1 0 {} 0 0 {}} |
---|
| 366 | test unixFCmd-20.2 {SetReadOnlyAttribute} {unix notRoot readonlyAttr} { |
---|
| 367 | catch {file delete -force -- foo.test} |
---|
| 368 | list [catch {file attributes foo.test -readonly 1} msg] $msg |
---|
| 369 | } {1 {could not read "foo.test": no such file or directory}} |
---|
| 370 | |
---|
| 371 | # cleanup |
---|
| 372 | cleanup |
---|
| 373 | cd $oldcwd |
---|
| 374 | ::tcltest::cleanupTests |
---|
| 375 | return |
---|
| 376 | |
---|
| 377 | # Local Variables: |
---|
| 378 | # mode: tcl |
---|
| 379 | # End: |
---|