summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/fileutil/pathops.test
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/fileutil/pathops.test')
-rw-r--r--tcllib/modules/fileutil/pathops.test515
1 files changed, 515 insertions, 0 deletions
diff --git a/tcllib/modules/fileutil/pathops.test b/tcllib/modules/fileutil/pathops.test
new file mode 100644
index 0000000..0ff6866
--- /dev/null
+++ b/tcllib/modules/fileutil/pathops.test
@@ -0,0 +1,515 @@
+# -*- tcl -*-
+# Tests for the find function.
+#
+# Sourcing this file into Tcl runs the tests and generates output for errors.
+# No output means no errors were found.
+#
+# Copyright (c) 1998-2000 by Ajuba Solutions.
+# Copyright (c) 2001 by ActiveState Tool Corp.
+# Copyright (c) 2005-2009 by Andreas Kupries <andreas_kupries@users.sourceforge.net>
+# All rights reserved.
+#
+# RCS: @(#) $Id: pathops.test,v 1.2 2009/10/27 19:16:34 andreas_kupries Exp $
+
+# -------------------------------------------------------------------------
+
+source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+testsNeedTcl 8.2
+testsNeedTcltest 1.0
+
+testing {
+ useLocal fileutil.tcl fileutil
+}
+
+# -------------------------------------------------------------------------
+
+set dir $::tcltest::temporaryDirectory
+
+# -------------------------------------------------------------------------
+
+test jail-1.0 {jail error} {
+ catch {::fileutil::jail} res
+ set res
+} [tcltest::wrongNumArgs {::fileutil::jail} {jail filename} 0]
+
+test jail-1.2 {jail error} {
+ catch {::fileutil::jail a} res
+ set res
+} [tcltest::wrongNumArgs {::fileutil::jail} {jail filename} 1]
+
+test jail-1.3 {jail error} {
+ catch {::fileutil::jail a b c} res
+ set res
+} [tcltest::tooManyArgs {::fileutil::jail} {jail filename}]
+
+test jail-2.0 {jail relative} {
+ ::fileutil::jail /var/www a/b/c
+} /var/www/a/b/c
+
+test jail-2.1 {jail absolute outside} {
+ ::fileutil::jail /var/www /a/b/c
+} /var/www/a/b/c
+
+test jail-2.1.1 {jail absolute outside, spaces} {
+ ::fileutil::jail /var/www {/a/b/c d}
+} {/var/www/a/b/c d}
+
+test jail-2.2 {jail absolute inside} {
+ ::fileutil::jail /var/www /var/www/a/b/c
+} /var/www/a/b/c
+
+test jail-2.2.1 {jail absolute inside} {
+ ::fileutil::jail /var/www {/var/www/a/b/c d}
+} {/var/www/a/b/c d}
+
+test jail-2.3 {try to escape from jail} {
+ ::fileutil::jail /var/www ../../etc/passwd
+} /var/www/etc/passwd
+
+test jail-2.4 {jail is relative itself} {
+ ::fileutil::jail a b
+} [file join $dir a b]
+
+test jail-2.4.1 {jail is relative itself, spaces in path} {
+ ::fileutil::jail a {b c}
+} [file join $dir a {b c}]
+
+test jail-2.4.2 {jail is relative itself, spaces in path} {
+ ::fileutil::jail {a b} {c d}
+} [file join $dir {a b} {c d}]
+
+
+# Need tests using non-existing paths for sure. Similar tests for
+# 'normalize' as well.
+
+# Tests for the internal 'Normalize' command. This is our forward
+# compatibility wrapper and it should behave identical to the
+# 8.4. builtin 'file normalize'. We pilfered the test cases from the
+# test suite for 'file normalize' in the Tcl core.
+
+if {![string equal $::tcl_platform(platform) windows]} {
+
+ set dirfile [makeDirectory dir.file]
+ set dirbfile [makeDirectory dir2.file]
+ set insidefile [makeFile "test file in directory" dir.file/inside.file]
+ set gorpfile [makeFile "test file" gorp.file]
+
+ # Paths for the links.
+
+ set linkfile [tempPath link.file]
+ set dirlink [tempPath dir.link]
+ set dirblink [tempPath dir2.link]
+ set linkinsidefile [tempPath $dirfile/linkinside.file]
+ set dirbblink [tempPath $dirbfile/dir2.link]]
+
+ # Create the links. Unix specific.
+
+ exec ln -s gorp.file $linkfile
+ exec ln -s inside.file $linkinsidefile
+ exec ln -s dir.file $dirlink
+ exec ln -s dir.link $dirblink
+ exec ln -s ../dir2.link $dirbblink
+
+ # File/Directory structure created by the above.
+ #
+ # /FOO/dir2.link -> dir.link
+ # /FOO/dir.link -> dir.file
+ # /FOO/dir.file/
+ # /FOO/dir.file/linkinside.file -> inside.file
+ # /FOO/dir.file/inside.file
+ #
+ # /FOO/link.file -> gorp.file
+ # /FOO/gorp.file
+ #
+ # /FOO/dir2.file/
+ # /FOO/dir2.file/dir2.link -> ../dir2.link
+}
+
+
+test fu-normalize-1.0 {link normalisation} {unixOnly} {
+ # Symlink of last path element is not resolved.
+ string equal \
+ [::fileutil::Normalize $gorpfile] \
+ [::fileutil::Normalize $linkfile]
+} {0}
+
+test fu-normalize-1.1 {link normalisation} {unixOnly} {
+ # Symlink of last path element is not resolved.
+ string equal \
+ [::fileutil::Normalize $dirfile] \
+ [::fileutil::Normalize $dirlink]
+} {0}
+
+test fu-normalize-1.2 {link normalisation} {unixOnly} {
+ # Link higher in path is resolved (File!, non-existing last component).
+ string equal \
+ [::fileutil::Normalize [file join $gorpfile foo]] \
+ [::fileutil::Normalize [file join $linkfile foo]]
+} {1}
+
+test fu-normalize-1.3 {link normalisation} {unixOnly} {
+ # Link higher in path is resolved (Directory, non-existing last component).
+ string equal \
+ [::fileutil::Normalize [file join $dirfile foo]] \
+ [::fileutil::Normalize [file join $dirlink foo]]
+} {1}
+
+test fu-normalize-1.4 {link normalisation} {unixOnly} {
+ # Link higher in path is resolved (Directory, existing last component).
+ string equal \
+ [::fileutil::Normalize $insidefile] \
+ [::fileutil::Normalize [file join $dirlink inside.file]]
+} {1}
+
+test fu-normalize-1.5 {link normalisation} {unixOnly} {
+ # Identical paths.
+ string equal \
+ [::fileutil::Normalize $linkinsidefile] \
+ [::fileutil::Normalize $linkinsidefile]
+} {1}
+
+test fu-normalize-1.6 {link normalisation} {unixOnly} {
+ # Double link, one in last component, that one not resolved.
+ string equal \
+ [::fileutil::Normalize $linkinsidefile] \
+ [::fileutil::Normalize [file join $dirlink inside.file]]
+} {0}
+
+test fu-normalize-1.7 {link normalisation} {unixOnly} {
+ # Double link, both higher up, second is file!, both resolved
+ string equal \
+ [::fileutil::Normalize [file join $dirlink linkinside.file foo]] \
+ [::fileutil::Normalize [file join $insidefile foo]]
+} {1}
+
+test fu-normalize-1.8 {link normalisation} {unixOnly} {
+ # Directory link, and bad last component
+ string equal \
+ [::fileutil::Normalize ${linkinsidefile}foo] \
+ [::fileutil::Normalize [file join $dirlink inside.filefoo]]
+} {0}
+
+if 0 {
+ test fu-normalize-1.9 {link normalisation} {unixOnly} {
+ file delete -force $dirlink
+ file link $dirlink [file nativename $dirfile]
+ string equal \
+ [::fileutil::Normalize [file join $linkinsidefile foo]] \
+ [::fileutil::Normalize [file join $dirlink inside.file foo]]
+ } {1}
+}
+
+test fu-normalize-1.10 {link normalisation: double link} {unixOnly} {
+ # Double symlink in one component.
+ string equal \
+ [::fileutil::Normalize [file join $linkinsidefile foo]] \
+ [::fileutil::Normalize [file join $dirblink inside.file foo]]
+} {1}
+
+
+test fu-normalize-1.11 {link normalisation: double link, back in tree} {unixOnly} {
+ # Double link and back up in the tree.
+
+ string equal \
+ [::fileutil::Normalize [file join $linkinsidefile foo]] \
+ [::fileutil::Normalize [file join $dirbblink inside.file foo]]
+} {1}
+
+
+test fu-normalize-2.0 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::Normalize /a/b/c
+} /a/b/c
+
+test fu-normalize-2.1 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::Normalize /a/../b/c
+} /b/c
+
+test fu-normalize-2.2 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::Normalize /a/./b/c
+} /a/b/c
+
+test fu-normalize-2.3 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::Normalize /../b/c
+} /b/c
+
+test fu-normalize-2.4 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::Normalize /a/../../b/c
+} /b/c
+
+
+
+# Based on the internal Normalize, a fullnormalize (which resolves a
+# link in the last element as well.
+
+test fu-fullnormalize-1.0 {link normalisation} {unixOnly} {
+ # Symlink of last path element _is_ resolved.
+ string equal \
+ [::fileutil::fullnormalize $gorpfile] \
+ [::fileutil::fullnormalize $linkfile]
+} {1}
+
+test fu-fullnormalize-1.1 {link normalisation} {unixOnly} {
+ # Symlink of last path element _is_ resolved.
+ string equal \
+ [::fileutil::fullnormalize $dirfile] \
+ [::fileutil::fullnormalize $dirlink]
+} {1}
+
+test fu-fullnormalize-1.2 {link normalisation} {unixOnly} {
+ # Link higher in path is resolved (File!, non-existing last component).
+ string equal \
+ [::fileutil::fullnormalize [file join $gorpfile foo]] \
+ [::fileutil::fullnormalize [file join $linkfile foo]]
+} {1}
+
+test fu-fullnormalize-1.3 {link normalisation} {unixOnly} {
+ # Link higher in path is resolved (Directory, non-existing last component).
+ string equal \
+ [::fileutil::fullnormalize [file join $dirfile foo]] \
+ [::fileutil::fullnormalize [file join $dirlink foo]]
+} {1}
+
+test fu-fullnormalize-1.4 {link normalisation} {unixOnly} {
+ # Link higher in path is resolved (Directory, existing last component).
+ string equal \
+ [::fileutil::fullnormalize $insidefile] \
+ [::fileutil::fullnormalize [file join $dirlink inside.file]]
+} {1}
+
+test fu-fullnormalize-1.5 {link normalisation} {unixOnly} {
+ # Identical paths.
+ string equal \
+ [::fileutil::fullnormalize $linkinsidefile] \
+ [::fileutil::fullnormalize $linkinsidefile]
+} {1}
+
+test fu-fullnormalize-1.6 {link normalisation} {unixOnly} {
+ # Double link, one in last component, this one is resolved.
+ string equal \
+ [::fileutil::fullnormalize $linkinsidefile] \
+ [::fileutil::fullnormalize [file join $dirlink inside.file]]
+} {1}
+
+test fu-fullnormalize-1.7 {link normalisation} {unixOnly} {
+ # Double link, both higher up, second is file!, both resolved
+ string equal \
+ [::fileutil::fullnormalize [file join $dirlink linkinside.file foo]] \
+ [::fileutil::fullnormalize [file join $insidefile foo]]
+} {1}
+
+test fu-fullnormalize-1.8 {link normalisation} {unixOnly} {
+ # Directory link, and bad last component
+ string equal \
+ [::fileutil::fullnormalize ${linkinsidefile}foo] \
+ [::fileutil::fullnormalize [file join $dirlink inside.filefoo]]
+} {0}
+
+test fu-fullnormalize-1.10 {link normalisation: double link} {unixOnly} {
+ # Double symlink in one component.
+ string equal \
+ [::fileutil::fullnormalize [file join $linkinsidefile foo]] \
+ [::fileutil::fullnormalize [file join $dirblink inside.file foo]]
+} {1}
+
+
+test fu-fullnormalize-2.0 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::fullnormalize /a/b/c
+} /a/b/c
+
+test fu-fullnormalize-2.1 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::fullnormalize /a/../b/c
+} /b/c
+
+test fu-fullnormalize-2.2 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::fullnormalize /a/./b/c
+} /a/b/c
+
+test fu-fullnormalize-2.3 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::fullnormalize /../b/c
+} /b/c
+
+test fu-fullnormalize-2.4 {normalisation, non-existing paths} {unixOnly} {
+ ::fileutil::fullnormalize /a/../../b/c
+} /b/c
+
+# Cleaning up after.
+
+removeFile find3/find4/file5
+removeDirectory find3/find4
+removeDirectory find3
+removeDirectory touchTest
+removeDirectory installDst
+removeDirectory installSrc
+removeDirectory {find 1}
+removeDirectory dotfiles
+removeDirectory grepTest
+
+if {![string equal $::tcl_platform(platform) windows]} {
+ file delete -force $linkfile
+ file delete -force $dirlink
+ file delete -force $dirblink
+ file delete -force $linkinsidefile
+ file delete -force $dirbblink
+
+ removeFile dir.file/inside.file
+ removeFile gorp.file
+ removeDirectory dir.file
+ removeDirectory dir2.file
+}
+
+# -------------------------------------------------------------------------
+# Computation of paths relative to a base.
+
+test fu-relative-1.0 {fileutil::relative, wrong#args} {
+ catch {fileutil::relative} msg
+ set msg
+} [tcltest::wrongNumArgs fileutil::relative {base dst} 0]
+
+test fu-relative-1.1 {fileutil::relative, wrong#args} {
+ catch {fileutil::relative a} msg
+ set msg
+} [tcltest::wrongNumArgs fileutil::relative {base dst} 1]
+
+test fu-relative-1.2 {fileutil::relative, wrong#args} {
+ catch {fileutil::relative a b c} msg
+ set msg
+} [tcltest::tooManyArgs fileutil::relative {base dst}]
+
+foreach {n base dst result} {
+ 0 /base /base/destination destination
+ 1 /base /destination ../destination
+ 2 base base/destination destination
+ 3 base destination ../destination
+ 4 /sub/base /sub/sub/destination ../sub/destination
+ 5 /sub/sub/base /sub/destination ../../destination
+ 6 sub/base sub/sub/destination ../sub/destination
+ 7 sub/sub/base sub/destination ../../destination
+ 8 /base /base .
+ 9 base base .
+ 10 /base/sub /base/sub .
+ 11 base/sub base/sub .
+ 12 /base/sub /base ..
+ 13 base/sub base ..
+ 14 base/sub destination ../../destination
+ 15 base/tcl base/common ../common
+ 16 base/tcl/x base/common ../../common
+ 17 /base/tcl /base/common ../common
+ 18 /base/tcl/x /base/common ../../common
+} {
+ test fu-relative-2.$n {fileutil::relative} {
+ fileutil::relative $base $dst
+ } $result
+}
+
+foreach {n base dst ra rb} {
+ 0 /base base/destination absolute relative
+ 1 base /destination relative absolute
+} {
+ test fu-relative-3.$n {fileutil::relative, bad mix} unixOnly {
+ catch {fileutil::relative $base $dst} msg
+ set msg
+ } "Unable to compute relation for paths of different pathtypes: $ra vs. $rb, ($base vs. $dst)"
+}
+
+foreach {n base dst ra rb} {
+ 0 /base base/destination volumerelative relative
+ 1 base /destination relative volumerelative
+} {
+ test fu-relative-4.$n {fileutil::relative, bad mix} winOnly {
+ catch {fileutil::relative $base $dst} msg
+ set msg
+ } "Unable to compute relation for paths of different pathtypes: $ra vs. $rb, ($base vs. $dst)"
+}
+
+test fu-relativeurl-1.0 {fileutil::relativeUrl, wrong#args} {
+ catch {fileutil::relativeUrl} msg
+ set msg
+} [tcltest::wrongNumArgs fileutil::relativeUrl {base dst} 0]
+
+test fu-relativeurl-1.1 {fileutil::relativeUrl, wrong#args} {
+ catch {fileutil::relativeUrl a} msg
+ set msg
+} [tcltest::wrongNumArgs fileutil::relativeUrl {base dst} 1]
+
+test fu-relativeurl-1.2 {fileutil::relativeUrl, wrong#args} {
+ catch {fileutil::relativeUrl a b c} msg
+ set msg
+} [tcltest::tooManyArgs fileutil::relativeUrl {base dst}]
+
+foreach {n base dst result} {
+ 0 /base/file.html /base/destination/xx.html destination/xx.html
+ 1 /base/file.html /destination/xx.html ../destination/xx.html
+ 2 base/file.html base/destination/xx.html destination/xx.html
+ 3 base/file.html destination/xx.html ../destination/xx.html
+ 4 /sub/base/file.html /sub/sub/destination/xx.html ../sub/destination/xx.html
+ 5 /sub/sub/base/file.html /sub/destination/xx.html ../../destination/xx.html
+ 6 sub/base/file.html sub/sub/destination/xx.html ../sub/destination/xx.html
+ 7 sub/sub/base/file.html sub/destination/xx.html ../../destination/xx.html
+ 8 /base/file.html /base/xx.html xx.html
+ 9 base/file.html base/xx.html xx.html
+ 10 /base/sub/file.html /base/sub/xx.html xx.html
+ 11 base/sub/file.html base/sub/xx.html xx.html
+ 12 /base/sub/file.html /base/xx.html ../xx.html
+ 13 base/sub/file.html base/xx.html ../xx.html
+ 14 base/sub/file.html xx.html ../../xx.html
+ 15 base/tcl/a.html base/common/../common/./style.css ../common/style.css
+ 16 base/tcl/x/a.html base/common/../common/./style.css ../../common/style.css
+ 17 /base/tcl/a.html /base/common/../common/./style.css ../common/style.css
+ 18 /base/tcl/x/a.html /base/common/../common/./style.css ../../common/style.css
+} {
+ test fu-relativeurl-2.$n {fileutil::relativeUrl} {
+ fileutil::relativeUrl $base $dst
+ } $result
+}
+
+foreach {n base dst ra rb} {
+ 0 /base/file.html base/destination/xx.html absolute relative
+ 1 base/file.html /destination/xx.html relative absolute
+} {
+ test fu-relativeurl-3.$n {fileutil::relativeUrl, bad mix} unixOnly {
+ catch {fileutil::relativeUrl $base $dst} msg
+ set msg
+ } "Unable to compute relation for paths of different pathtypes: $ra vs. $rb, ($base vs. $dst)"
+}
+
+foreach {n base dst ra rb} {
+ 0 /base/file.html base/destination/xx.html volumerelative relative
+ 1 base/file.html /destination/xx.html relative volumerelative
+} {
+ test fu-relativeurl-4.$n {fileutil::relativeUrl, bad mix} winOnly {
+ catch {fileutil::relativeUrl $base $dst} msg
+ set msg
+ } "Unable to compute relation for paths of different pathtypes: $ra vs. $rb, ($base vs. $dst)"
+}
+
+if {[llength [info commands ::fileutil::LexNormalize]]} {
+
+ # Check an internal command. May not exist (i.e. an accelerator
+ # may not define it).
+
+ foreach {n base dst} {
+ 0 a/../b b
+ 1 a/./b a/b
+ 2 a a
+ 3 a/b a/b
+ 4 ./a a
+ 5 ../a a
+ 6 /../a /a
+ 7 /./a /a
+ 8 /a/../b /b
+ 9 /foo/bar/../snafu/../gobble /foo/gobble
+ } {
+ test fu-lexnormalize-1.$n "fileutil::LexNormalize $base" {
+ fileutil::LexNormalize $base
+ } $dst
+ }
+}
+
+# -------------------------------------------------------------------------
+
+unset dir
+testsuiteCleanup
+return