diff options
Diffstat (limited to 'tests/fileSystem.test')
-rw-r--r-- | tests/fileSystem.test | 804 |
1 files changed, 642 insertions, 162 deletions
diff --git a/tests/fileSystem.test b/tests/fileSystem.test index f42e776..2acdbd2 100644 --- a/tests/fileSystem.test +++ b/tests/fileSystem.test @@ -11,106 +11,135 @@ package require tcltest 2 namespace eval ::tcl::test::fileSystem { + namespace import ::tcltest::* catch { - namespace import ::tcltest::cleanupTests - namespace import ::tcltest::makeDirectory - namespace import ::tcltest::makeFile - namespace import ::tcltest::removeDirectory - namespace import ::tcltest::removeFile - namespace import ::tcltest::test - } - - catch { file delete -force link.file file delete -force dir.link - file delete -force [file join dir.file linkinside.file] + file delete -force [file join dir.dir linkinside.file] } +# Test for commands defined in Tcltest executable +testConstraint testfilesystem [llength [info commands ::testfilesystem]] +testConstraint testsetplatform [llength [info commands ::testsetplatform]] +testConstraint testsimplefilesystem [llength [info commands ::testsimplefilesystem]] + cd [tcltest::temporaryDirectory] makeFile "test file" gorp.file -makeDirectory dir.file -makeFile "test file in directory" [file join dir.file inside.file] +makeDirectory dir.dir +makeDirectory [file join dir.dir dirinside.dir] +makeFile "test file in directory" [file join dir.dir inside.file] + +testConstraint unusedDrive 0 +set drive {} +if {[testConstraint win]} { + set vols [string map [list :/ {}] [file volumes]] + for {set i 0} {$i < 26} {incr i} { + set drive [format %c [expr {$i + 65}]] + if {[lsearch -exact $vols $drive] == -1} { + testConstraint unusedDrive 1 + break + } + } + unset i vols + # The variable 'drive' will be used below +} -if {[catch { - file link link.file gorp.file - file link \ - [file join dir.file linkinside.file] \ - [file join dir.file inside.file] - file link dir.link dir.file -}]} { - tcltest::testConstraint hasLinks 0 -} else { - tcltest::testConstraint hasLinks 1 +testConstraint moreThanOneDrive 0 +set drives [list] +if {[testConstraint win]} { + set dir [pwd] + foreach vol [file volumes] { + if {![catch {cd $vol}]} { + lappend drives $vol + } + } + if {[llength $drives] > 1} { + testConstraint moreThanOneDrive 1 + } + # The variable 'drives' will be used below + unset vol + cd $dir + unset dir } -tcltest::testConstraint testsimplefilesystem \ - [string equal testsimplefilesystem [info commands testsimplefilesystem]] +proc testPathEqual {one two} { + if {$one eq $two} { + return 1 + } else { + return "not equal: $one $two" + } +} + +testConstraint hasLinks [expr {![catch { + file link link.file gorp.file + cd dir.dir + file link \ + [file join linkinside.file] \ + [file join inside.file] + cd .. + file link dir.link dir.dir + cd dir.dir + file link [file join dirinside.link] \ + [file join dirinside.dir] + cd .. +}]}] + +if {[testConstraint testsetplatform]} { + set platform [testgetplatform] +} test filesystem-1.0 {link normalisation} {hasLinks} { string equal [file normalize gorp.file] [file normalize link.file] } {0} - test filesystem-1.1 {link normalisation} {hasLinks} { - string equal [file normalize dir.file] [file normalize dir.link] + string equal [file normalize dir.dir] [file normalize dir.link] } {0} - -test filesystem-1.2 {link normalisation} {hasLinks macOrUnix} { - string equal [file normalize [file join gorp.file foo]] \ - [file normalize [file join link.file foo]] +test filesystem-1.2 {link normalisation} {hasLinks unix} { + testPathEqual [file normalize [file join gorp.file foo]] \ + [file normalize [file join link.file foo]] } {1} - test filesystem-1.3 {link normalisation} {hasLinks} { - string equal [file normalize [file join dir.file foo]] \ - [file normalize [file join dir.link foo]] + testPathEqual [file normalize [file join dir.dir foo]] \ + [file normalize [file join dir.link foo]] } {1} - test filesystem-1.4 {link normalisation} {hasLinks} { - string equal [file normalize [file join dir.file inside.file]] \ - [file normalize [file join dir.link inside.file]] + testPathEqual [file normalize [file join dir.dir inside.file]] \ + [file normalize [file join dir.link inside.file]] } {1} - test filesystem-1.5 {link normalisation} {hasLinks} { - string equal [file normalize [file join dir.file linkinside.file]] \ - [file normalize [file join dir.file linkinside.file]] + testPathEqual [file normalize [file join dir.dir linkinside.file]] \ + [file normalize [file join dir.dir linkinside.file]] } {1} - test filesystem-1.6 {link normalisation} {hasLinks} { - string equal [file normalize [file join dir.file linkinside.file]] \ + string equal [file normalize [file join dir.dir linkinside.file]] \ [file normalize [file join dir.link inside.file]] } {0} - -test filesystem-1.7 {link normalisation} {hasLinks macOrUnix} { - string equal [file normalize [file join dir.link linkinside.file foo]] \ - [file normalize [file join dir.file inside.file foo]] +test filesystem-1.7 {link normalisation} {hasLinks unix} { + testPathEqual [file normalize [file join dir.link linkinside.file foo]] \ + [file normalize [file join dir.dir inside.file foo]] } {1} - test filesystem-1.8 {link normalisation} {hasLinks} { - string equal [file normalize [file join dir.file linkinside.filefoo]] \ - [file normalize [file join dir.link inside.filefoo]] + string equal [file normalize [file join dir.dir linkinside.filefoo]] \ + [file normalize [file join dir.link inside.filefoo]] } {0} - -test filesystem-1.9 {link normalisation} {macOrUnix hasLinks} { +test filesystem-1.9 {link normalisation} {unix hasLinks} { file delete -force dir.link - file link dir.link [file nativename dir.file] - string equal [file normalize [file join dir.file linkinside.file foo]] \ - [file normalize [file join dir.link inside.file foo]] + file link dir.link [file nativename dir.dir] + testPathEqual [file normalize [file join dir.dir linkinside.file foo]] \ + [file normalize [file join dir.link inside.file foo]] } {1} - -test filesystem-1.10 {link normalisation: double link} {macOrUnix hasLinks} { +test filesystem-1.10 {link normalisation: double link} {unix hasLinks} { file link dir2.link dir.link - string equal [file normalize [file join dir.file linkinside.file foo]] \ - [file normalize [file join dir2.link inside.file foo]] + testPathEqual [file normalize [file join dir.dir linkinside.file foo]] \ + [file normalize [file join dir2.link inside.file foo]] } {1} - makeDirectory dir2.file - -test filesystem-1.11 {link normalisation: double link, back in tree} {macOrUnix hasLinks} { - file link [file join dir2.file dir2.link] dir2.link - string equal [file normalize [file join dir.file linkinside.file foo]] \ - [file normalize [file join dir2.file dir2.link inside.file foo]] +test filesystem-1.11 {link normalisation: double link, back in tree} {unix hasLinks} { + file link [file join dir2.file dir2.link] [file join .. dir2.link] + testPathEqual [file normalize [file join dir.dir linkinside.file foo]] \ + [file normalize [file join dir2.file dir2.link inside.file foo]] } {1} - test filesystem-1.12 {file new native path} {} { for {set i 0} {$i < 10} {incr i} { foreach f [lsort [glob -nocomplain -type l *]] { @@ -120,24 +149,352 @@ test filesystem-1.12 {file new native path} {} { # If we reach here we've succeeded. We used to crash above. expr 1 } {1} - -test filesystem-1.13 {file normalisation} {winOnly} { +test filesystem-1.13 {file normalisation} {win} { # This used to be broken file normalize C:/thislongnamedoesntexist } {C:/thislongnamedoesntexist} - -test filesystem-1.14 {file normalisation} {winOnly} { +test filesystem-1.14 {file normalisation} {win} { # This used to be broken file normalize c:/ } {C:/} - +test filesystem-1.15 {file normalisation} {win} { + file normalize c:/../ +} {C:/} +test filesystem-1.16 {file normalisation} {win} { + file normalize c:/. +} {C:/} +test filesystem-1.17 {file normalisation} {win} { + file normalize c:/.. +} {C:/} +test filesystem-1.17.1 {file normalisation} {win} { + file normalize c:\\.. +} {C:/} +test filesystem-1.18 {file normalisation} {win} { + file normalize c:/./ +} {C:/} +test filesystem-1.19 {file normalisation} {win unusedDrive} { + file normalize ${drive}:/./../../.. +} "${drive}:/" +test filesystem-1.20 {file normalisation} {win} { + file normalize //name/foo/../ +} {//name/foo} +test filesystem-1.21 {file normalisation} {win} { + file normalize C:///foo/./ +} {C:/foo} +test filesystem-1.22 {file normalisation} {win} { + file normalize //name/foo/. +} {//name/foo} +test filesystem-1.23 {file normalisation} {win} { + file normalize c:/./foo +} {C:/foo} +test filesystem-1.24 {file normalisation} {win unusedDrive} { + file normalize ${drive}:/./../../../a +} "${drive}:/a" +test filesystem-1.25 {file normalisation} {win unusedDrive} { + file normalize ${drive}:/./.././../../a +} "${drive}:/a" +test filesystem-1.25.1 {file normalisation} {win unusedDrive} { + file normalize ${drive}:/./.././..\\..\\a\\bb +} "${drive}:/a/bb" +test filesystem-1.26 {link normalisation: link and ..} {hasLinks} { + file delete -force dir2.link + set dir [file join dir2 foo bar] + file mkdir $dir + file link dir2.link [file join dir2 foo bar] + set res [list [file normalize [file join dir2 foo x]] \ + [file normalize [file join dir2.link .. x]]] + if {![string equal [lindex $res 0] [lindex $res 1]]} { + set res "$res not equal" + } else { + set res "ok" + } +} {ok} +test filesystem-1.27 {file normalisation: up and down with ..} { + set dir [file join dir2 foo bar] + file mkdir $dir + set dir2 [file join dir2 .. dir2 foo .. foo bar] + set res [list [file normalize $dir] [file normalize $dir2]] + set res2 [list [file exists $dir] [file exists $dir2]] + if {![string equal [lindex $res 0] [lindex $res 1]]} { + set res "exists: $res2, $res not equal" + } else { + set res "ok: $res2" + } +} {ok: 1 1} +test filesystem-1.28 {link normalisation: link with .. and ..} {hasLinks} { + file delete -force dir2.link + set dir [file join dir2 foo bar] + file mkdir $dir + set to [file join dir2 .. dir2 foo .. foo bar] + file link dir2.link $to + set res [list [file normalize [file join dir2 foo x]] \ + [file normalize [file join dir2.link .. x]]] + if {![string equal [lindex $res 0] [lindex $res 1]]} { + set res "$res not equal" + } else { + set res "ok" + } +} {ok} +test filesystem-1.29 {link normalisation: link with ..} {hasLinks} { + file delete -force dir2.link + set dir [file join dir2 foo bar] + file mkdir $dir + set to [file join dir2 .. dir2 foo .. foo bar] + file link dir2.link $to + set res [file normalize [file join dir2.link x yyy z]] + if {[string first ".." $res] != -1} { + set res "$res must not contain '..'" + } else { + set res "ok" + } +} {ok} +test filesystem-1.29.1 {link normalisation with two consecutive links} {hasLinks} { + testPathEqual [file normalize [file join dir.link dirinside.link abc]] \ + [file normalize [file join dir.dir dirinside.dir abc]] +} {1} file delete -force dir2.file file delete -force dir2.link file delete -force link.file dir.link -removeFile [file join dir.file inside.file] -removeDirectory dir.file +file delete -force dir2 +file delete -force [file join dir.dir dirinside.link] +removeFile [file join dir.dir inside.file] +removeDirectory [file join dir.dir dirinside.dir] +removeDirectory dir.dir +test filesystem-1.30 {normalisation of nonexistent user} { + list [catch {file normalize ~noonewiththisname} err] $err +} {1 {user "noonewiththisname" doesn't exist}} +test filesystem-1.31 {link normalisation: link near filesystem root} {testsetplatform} { + testsetplatform unix + file normalize /foo/../bar +} {/bar} +test filesystem-1.32 {link normalisation: link near filesystem root} {testsetplatform} { + testsetplatform unix + file normalize /../bar +} {/bar} +test filesystem-1.33 {link normalisation: link near filesystem root} {testsetplatform} { + testsetplatform windows + set res [file normalize C:/../bar] + if {[testConstraint unix]} { + # Some unices go further in normalizing this -- not really + # a problem since this is a Windows test + regexp {C:/bar$} $res res + } + set res +} {C:/bar} +if {[testConstraint testsetplatform]} { + testsetplatform $platform +} +test filesystem-1.34 {file normalisation with '/./'} { + set res [file normalize /foo/bar/anc/./.tml] + if {[string first "/./" $res] != -1} { + set res "normalization of /foo/bar/anc/./.tml is: $res" + } else { + set res "ok" + } + set res +} {ok} +test filesystem-1.35 {file normalisation with '/./'} { + set res [file normalize /ffo/bar/anc/./foo/.tml] + if {[string first "/./" $res] != -1 || ([regsub -all "foo" $res "" reg] == 2)} { + set res "normalization of /ffo/bar/anc/./foo/.tml is: $res" + } else { + set res "ok" + } + set res +} {ok} +test filesystem-1.36 {file normalisation with '/./'} { + set res [file normalize /foo/bar/anc/././asdasd/.tml] + if {[string first "/./" $res] != -1 || ([regsub -all "asdasd" $res "" reg] == 2) } { + set res "normalization of /foo/bar/anc/././asdasd/.tml is: $res" + } else { + set res "ok" + } + set res +} {ok} +test filesystem-1.37 {file normalisation with '/./'} { + set fname "/abc/./def/./ghi/./asda/.././.././asd/x/../../../../....." + set res [file norm $fname] + if {[string first "//" $res] != -1} { + set res "normalization of $fname is: $res" + } else { + set res "ok" + } + set res +} {ok} +test filesystem-1.38 {file normalisation with volume relative} \ + {win moreThanOneDrive} { + set path "[string range [lindex $drives 0] 0 1]foo" + set dir [pwd] + cd [lindex $drives 1] + set res [file norm $path] + cd $dir + set res +} "[lindex $drives 0]foo" +test filesystem-1.39 {file normalisation with volume relative} {win} { + set drv C:/ + set dir [lindex [glob -type d -dir $drv *] 0] + set old [pwd] + cd $dir + set res [file norm [string range $drv 0 1]] + cd $old + if {[string index $res end] eq "/"} { + set res "Bad normalized path: $res" + } else { + set res "ok" + } +} {ok} +test filesystem-1.40 {file normalisation with repeated separators} { + set a [file norm foo////bar] + set b [file norm foo/bar] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.41 {file normalisation with repeated separators} {win} { + set a [file norm foo\\\\\\bar] + set b [file norm foo/bar] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.42 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/..] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.42.1 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/../] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.43 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/foo/../..] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.43.1 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/foo/../../] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.44 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/foo/../../bar] + set b [file norm /bar] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.45 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/../../bar] + set b [file norm /bar] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.46 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /xxx/../bar] + set b [file norm /bar] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.47 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /..] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.48 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /../] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.49 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /.] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.50 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /./] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.51 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /../..] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} +test filesystem-1.51.1 {file normalisation .. beyond root (Bug 1379287)} { + set a [file norm /../../] + set b [file norm /] + + if {![string equal $a $b]} { + set res "Paths should be equal: $a , $b" + } else { + set res "ok" + } +} {ok} -test filesystem-2.0 {new native path} {unixOnly} { +test filesystem-2.0 {new native path} {unix} { foreach f [lsort [glob -nocomplain /usr/bin/c*]] { catch {file readlink $f} } @@ -145,52 +502,37 @@ test filesystem-2.0 {new native path} {unixOnly} { expr 1 } {1} -if {[catch {package require tcltest 2}]} { - puts stderr "Skipping tests filesystem-{3,4}.*: tcltest 2 required." -} else { - namespace import ::tcltest::testConstraint - - # Is the Tcltest package loaded? - # - that is, the special C-coded testing commands in tclTest.c - # - tests use testing commands introduced in Tcltest 8.4 - testConstraint Tcltest [expr { - [llength [package provide Tcltest]] - && [package vsatisfies [package provide Tcltest] 8.4]}] - # Make sure the testfilesystem hasn't been registered. -while {![catch {testfilesystem 0}]} {} +if {[testConstraint testfilesystem]} { + while {![catch {testfilesystem 0}]} {} +} -test filesystem-3.0 {Tcl_FSRegister} Tcltest { +test filesystem-3.0 {Tcl_FSRegister} testfilesystem { testfilesystem 1 } {registered} - -test filesystem-3.1 {Tcl_FSUnregister} Tcltest { +test filesystem-3.1 {Tcl_FSUnregister} testfilesystem { testfilesystem 0 } {unregistered} - -test filesystem-3.2 {Tcl_FSUnregister} Tcltest { +test filesystem-3.2 {Tcl_FSUnregister} testfilesystem { list [catch {testfilesystem 0} err] $err } {1 failed} - -test filesystem-3.3 {Tcl_FSRegister} Tcltest { +test filesystem-3.3 {Tcl_FSRegister} testfilesystem { testfilesystem 1 testfilesystem 1 testfilesystem 0 testfilesystem 0 } {unregistered} - -test filesystem-3.4 {Tcl_FSRegister} Tcltest { +test filesystem-3.4 {Tcl_FSRegister} testfilesystem { testfilesystem 1 file system bar } {reporting} - -test filesystem-3.5 {Tcl_FSUnregister} Tcltest { +test filesystem-3.5 {Tcl_FSUnregister} testfilesystem { testfilesystem 0 lindex [file system bar] 0 } {native} test filesystem-4.0 {testfilesystem} { - -constraints Tcltest + -constraints testfilesystem -match glob -body { testfilesystem 1 @@ -199,11 +541,10 @@ test filesystem-4.0 {testfilesystem} { testfilesystem 0 set filesystemReport } - -result {* {access foo}} + -result {*{access foo}} } - test filesystem-4.1 {testfilesystem} { - -constraints Tcltest + -constraints testfilesystem -match glob -body { testfilesystem 1 @@ -212,11 +553,10 @@ test filesystem-4.1 {testfilesystem} { testfilesystem 0 set filesystemReport } - -result {* {stat foo}} + -result {*{stat foo}} } - test filesystem-4.2 {testfilesystem} { - -constraints Tcltest + -constraints testfilesystem -match glob -body { testfilesystem 1 @@ -225,11 +565,10 @@ test filesystem-4.2 {testfilesystem} { testfilesystem 0 set filesystemReport } - -result {* {lstat foo}} + -result {*{lstat foo}} } - test filesystem-4.3 {testfilesystem} { - -constraints Tcltest + -constraints testfilesystem -match glob -body { testfilesystem 1 @@ -238,14 +577,14 @@ test filesystem-4.3 {testfilesystem} { testfilesystem 0 set filesystemReport } - -result {* {matchindirectory *}*} + -result {*{matchindirectory *}*} } test filesystem-5.1 {cache and ~} { - -constraints Tcltest + -constraints testfilesystem -match regexp -body { - set orig $env(HOME) + set orig $::env(HOME) set ::env(HOME) /foo/bar/blah set testdir ~ set res1 "Parent of ~ (/foo/bar/blah) is [file dirname $testdir]" @@ -254,143 +593,112 @@ test filesystem-5.1 {cache and ~} { set ::env(HOME) $orig list $res1 $res2 } - -result {{Parent of ~ \(/foo/bar/blah\) is (/foo/bar|foo:bar)} {Parent of ~ \(/a/b/c\) is (/a/b|a:b)}} + -result {{Parent of ~ \(/foo/bar/blah\) is ([a-zA-Z]:)?(/foo/bar|foo:bar)} {Parent of ~ \(/a/b/c\) is ([a-zA-Z]:)?(/a/b|a:b)}} } test filesystem-6.1 {empty file name} { list [catch {open ""} msg] $msg } {1 {couldn't open "": no such file or directory}} - test filesystem-6.2 {empty file name} { list [catch {file stat "" arr} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.3 {empty file name} { list [catch {file atime ""} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.4 {empty file name} { list [catch {file attributes ""} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.5 {empty file name} { list [catch {file copy "" ""} msg] $msg } {1 {error copying "": no such file or directory}} - test filesystem-6.6 {empty file name} { list [catch {file delete ""} msg] $msg } {0 {}} - test filesystem-6.7 {empty file name} { list [catch {file dirname ""} msg] $msg } {0 .} - test filesystem-6.8 {empty file name} { list [catch {file executable ""} msg] $msg } {0 0} - test filesystem-6.9 {empty file name} { list [catch {file exists ""} msg] $msg } {0 0} - test filesystem-6.10 {empty file name} { list [catch {file extension ""} msg] $msg } {0 {}} - test filesystem-6.11 {empty file name} { list [catch {file isdirectory ""} msg] $msg } {0 0} - test filesystem-6.12 {empty file name} { list [catch {file isfile ""} msg] $msg } {0 0} - test filesystem-6.13 {empty file name} { list [catch {file join ""} msg] $msg } {0 {}} - test filesystem-6.14 {empty file name} { list [catch {file link ""} msg] $msg } {1 {could not read link "": no such file or directory}} - test filesystem-6.15 {empty file name} { list [catch {file lstat "" arr} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.16 {empty file name} { list [catch {file mtime ""} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.17 {empty file name} { list [catch {file mtime "" 0} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.18 {empty file name} { list [catch {file mkdir ""} msg] $msg } {1 {can't create directory "": no such file or directory}} - test filesystem-6.19 {empty file name} { list [catch {file nativename ""} msg] $msg } {0 {}} - test filesystem-6.20 {empty file name} { list [catch {file normalize ""} msg] $msg } {0 {}} - test filesystem-6.21 {empty file name} { list [catch {file owned ""} msg] $msg } {0 0} - test filesystem-6.22 {empty file name} { list [catch {file pathtype ""} msg] $msg } {0 relative} - test filesystem-6.23 {empty file name} { list [catch {file readable ""} msg] $msg } {0 0} - test filesystem-6.24 {empty file name} { list [catch {file readlink ""} msg] $msg } {1 {could not readlink "": no such file or directory}} - test filesystem-6.25 {empty file name} { list [catch {file rename "" ""} msg] $msg } {1 {error renaming "": no such file or directory}} - test filesystem-6.26 {empty file name} { list [catch {file rootname ""} msg] $msg } {0 {}} - test filesystem-6.27 {empty file name} { list [catch {file separator ""} msg] $msg } {1 {Unrecognised path}} - test filesystem-6.28 {empty file name} { list [catch {file size ""} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.29 {empty file name} { list [catch {file split ""} msg] $msg } {0 {}} - test filesystem-6.30 {empty file name} { list [catch {file system ""} msg] $msg } {1 {Unrecognised path}} - test filesystem-6.31 {empty file name} { list [catch {file tail ""} msg] $msg } {0 {}} - test filesystem-6.32 {empty file name} { list [catch {file type ""} msg] $msg } {1 {could not read "": no such file or directory}} - test filesystem-6.33 {empty file name} { list [catch {file writable ""} msg] $msg } {0 0} # Make sure the testfilesystem hasn't been registered. -while {![catch {testfilesystem 0}]} {} +if {[testConstraint testfilesystem]} { + while {![catch {testfilesystem 0}]} {} } test filesystem-7.1 {load from vfs} {win testsimplefilesystem} { @@ -406,24 +714,205 @@ test filesystem-7.1 {load from vfs} {win testsimplefilesystem} { set res "ok" # The real result of this test is what happens when Tcl exits. } {ok} - test filesystem-7.2 {cross-filesystem copy from vfs maintains mtime} \ {testsimplefilesystem} { set dir [pwd] cd [tcltest::temporaryDirectory] # We created this file several tests ago. set origtime [file mtime gorp.file] + set res [file exists gorp.file] + if {[catch { + testsimplefilesystem 1 + file delete -force theCopy + file copy simplefs:/gorp.file theCopy + testsimplefilesystem 0 + set newtime [file mtime theCopy] + file delete theCopy + } err]} { + lappend res $err + set newtime "" + } + cd $dir + lappend res [expr {$origtime == $newtime}] +} {1 1} +test filesystem-7.3 {glob in simplefs} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file mkdir simpledir + close [open [file join simpledir simplefile] w] testsimplefilesystem 1 - file delete -force theCopy - file copy simplefs:/gorp.file theCopy + set res [glob -nocomplain -dir simplefs:/simpledir *] testsimplefilesystem 0 - set newtime [file mtime theCopy] - file delete theCopy + file delete -force simpledir cd $dir - expr {$origtime == $newtime} -} {1} - + set res +} {simplefs:/simpledir/simplefile} +test filesystem-7.3.1 {glob in simplefs: no path/dir} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file mkdir simpledir + close [open [file join simpledir simplefile] w] + testsimplefilesystem 1 + set res [glob -nocomplain simplefs:/simpledir/*] + eval lappend res [glob -nocomplain simplefs:/simpledir] + testsimplefilesystem 0 + file delete -force simpledir + cd $dir + set res +} {simplefs:/simpledir/simplefile simplefs:/simpledir} +test filesystem-7.3.2 {glob in simplefs: no path/dir, no subdirectory} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file mkdir simpledir + close [open [file join simpledir simplefile] w] + testsimplefilesystem 1 + set res [glob -nocomplain simplefs:/s*] + testsimplefilesystem 0 + file delete -force simpledir + cd $dir + if {[llength $res] > 0} { + set res "ok" + } else { + set res "no files found with 'glob -nocomplain simplefs:/s*'" + } +} {ok} +test filesystem-7.3.3 {glob in simplefs: pattern is a volume} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file mkdir simpledir + close [open [file join simpledir simplefile] w] + testsimplefilesystem 1 + set res [glob -nocomplain simplefs:/*] + testsimplefilesystem 0 + file delete -force simpledir + cd $dir + if {[llength $res] > 0} { + set res "ok" + } else { + set res "no files found with 'glob -nocomplain simplefs:/*'" + } +} {ok} +test filesystem-7.4 {cross-filesystem file copy with -force} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + set fout [open [file join simplefile] w] + puts -nonewline $fout "1234567890" + close $fout + testsimplefilesystem 1 + # First copy should succeed + set res [catch {file copy simplefs:/simplefile file2} err] + lappend res $err + # Second copy should fail (no -force) + lappend res [catch {file copy simplefs:/simplefile file2} err] + lappend res $err + # Third copy should succeed (-force) + lappend res [catch {file copy -force simplefs:/simplefile file2} err] + lappend res $err + lappend res [file exists file2] + testsimplefilesystem 0 + file delete -force simplefile + file delete -force file2 + cd $dir + set res +} {0 10 1 {error copying "simplefs:/simplefile" to "file2": file already exists} 0 10 1} +test filesystem-7.5 {cross-filesystem file copy with -force} {testsimplefilesystem unix} { + set dir [pwd] + cd [tcltest::temporaryDirectory] + set fout [open [file join simplefile] w] + puts -nonewline $fout "1234567890" + close $fout + testsimplefilesystem 1 + # First copy should succeed + set res [catch {file copy simplefs:/simplefile file2} err] + lappend res $err + file attributes file2 -permissions 0000 + # Second copy should fail (no -force) + lappend res [catch {file copy simplefs:/simplefile file2} err] + lappend res $err + # Third copy should succeed (-force) + lappend res [catch {file copy -force simplefs:/simplefile file2} err] + lappend res $err + lappend res [file exists file2] + testsimplefilesystem 0 + file delete -force simplefile + file delete -force file2 + cd $dir + set res +} {0 10 1 {error copying "simplefs:/simplefile" to "file2": file already exists} 0 10 1} +test filesystem-7.6 {cross-filesystem dir copy with -force} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file delete -force simpledir + file mkdir simpledir + file mkdir dir2 + set fout [open [file join simpledir simplefile] w] + puts -nonewline $fout "1234567890" + close $fout + testsimplefilesystem 1 + # First copy should succeed + set res [catch {file copy simplefs:/simpledir dir2} err] + lappend res $err + # Second copy should fail (no -force) + lappend res [catch {file copy simplefs:/simpledir dir2} err] + lappend res $err + # Third copy should succeed (-force) + lappend res [catch {file copy -force simplefs:/simpledir dir2} err] + lappend res $err + lappend res [file exists [file join dir2 simpledir]] \ + [file exists [file join dir2 simpledir simplefile]] + testsimplefilesystem 0 + file delete -force simpledir + file delete -force dir2 + cd $dir + set res +} {0 {} 1 {error copying "simplefs:/simpledir" to "dir2/simpledir": file already exists} 0 {} 1 1} +test filesystem-7.7 {cross-filesystem dir copy with -force} {testsimplefilesystem unix} { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file delete -force simpledir + file mkdir simpledir + file mkdir dir2 + set fout [open [file join simpledir simplefile] w] + puts -nonewline $fout "1234567890" + close $fout + testsimplefilesystem 1 + # First copy should succeed + set res [catch {file copy simplefs:/simpledir dir2} err] + lappend res $err + # Second copy should fail (no -force) + lappend res [catch {file copy simplefs:/simpledir dir2} err] + lappend res $err + # Third copy should succeed (-force) + # I've noticed on some Unices that this only succeeds + # intermittently (some runs work, some fail). This needs + # examining further. + lappend res [catch {file copy -force simplefs:/simpledir dir2} err] + lappend res $err + lappend res [file exists [file join dir2 simpledir]] \ + [file exists [file join dir2 simpledir simplefile]] + testsimplefilesystem 0 + file delete -force simpledir + file delete -force dir2 + cd $dir + set res +} {0 {} 1 {error copying "simplefs:/simpledir" to "dir2/simpledir": file already exists} 0 {} 1 1} removeFile gorp.file +test filesystem-7.8 {vfs cd} testsimplefilesystem { + set dir [pwd] + cd [tcltest::temporaryDirectory] + file delete -force simpledir + file mkdir simpledir + testsimplefilesystem 1 + # This can variously cause an infinite loop or simply have + # no effect at all (before certain bugs were fixed, of course). + cd simplefs:/simpledir + set res [pwd] + cd [tcltest::temporaryDirectory] + testsimplefilesystem 0 + file delete -force simpledir + cd $dir + set res +} {simplefs:/simpledir} test filesystem-8.1 {relative path objects and caching of pwd} { set dir [pwd] @@ -448,7 +937,6 @@ test filesystem-8.1 {relative path objects and caching of pwd} { cd $dir set res } {1 1 0 0} - test filesystem-8.2 {relative path objects and use of pwd} { set origdir [pwd] cd [tcltest::temporaryDirectory] @@ -463,12 +951,10 @@ test filesystem-8.2 {relative path objects and use of pwd} { cd $origdir set res } {1} - test filesystem-8.3 {path objects and empty string} { set anchor "" set dst foo set res $dst - set yyy [file split $anchor] set dst [file join $anchor $dst] lappend res $dst $yyy @@ -500,7 +986,6 @@ test filesystem-9.1 {path objects and join and object rep} { cd $origdir set res } {{a/b/./c found: 1} {is dir a dir? 1} {a/b/./c found: 1}} - test filesystem-9.2 {path objects and join and object rep} { set origdir [pwd] cd [tcltest::temporaryDirectory] @@ -510,7 +995,6 @@ test filesystem-9.2 {path objects and join and object rep} { cd $origdir set res } {{a/b/./c found: 1} {is dir a dir? 1} {a/b/./c found: 1}} - test filesystem-9.2.1 {path objects and join and object rep} { set origdir [pwd] cd [tcltest::temporaryDirectory] @@ -520,7 +1004,6 @@ test filesystem-9.2.1 {path objects and join and object rep} { cd $origdir set res } {{a/b/. found: 1} {is dir a dir? 1} {a/b/. found: 1}} - test filesystem-9.3 {path objects and join and object rep} { set origdir [pwd] cd [tcltest::temporaryDirectory] @@ -530,7 +1013,6 @@ test filesystem-9.3 {path objects and join and object rep} { cd $origdir set res } {{a/b/../b/c found: 1} {is dir a dir? 1} {a/b/../b/c found: 1}} - test filesystem-9.4 {path objects and join and object rep} { set origdir [pwd] cd [tcltest::temporaryDirectory] @@ -540,7 +1022,6 @@ test filesystem-9.4 {path objects and join and object rep} { cd $origdir set res } {{a/b/../b/c found: 1} {is dir a dir? 1} {a/b/../b/c found: 1}} - test filesystem-9.5 {path objects and file tail and object rep} { set origdir [pwd] cd [tcltest::temporaryDirectory] @@ -554,15 +1035,13 @@ test filesystem-9.5 {path objects and file tail and object rep} { cd $origdir set res } {test test} - -test filesystem-9.6 {path objects and file join and object rep} {winOnly} { +test filesystem-9.6 {path objects and file tail and object rep} win { set res {} set p "C:\\toto" lappend res [file join $p toto] file isdirectory $p lappend res [file join $p toto] } {C:/toto/toto C:/toto/toto} - test filesystem-9.7 {path objects and glob and file tail and tilde} { set res {} set origdir [pwd] @@ -616,6 +1095,7 @@ test filesystem-9.9 {path objects and glob and file tail and tilde} { } {0 0 0 0 1} cleanupTests +unset -nocomplain drive } namespace delete ::tcl::test::fileSystem return |