unixFCmd.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  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.17.2.1 2003/04/14 15:45:57 vincentdarley Exp $
  13. if {[lsearch [namespace children] ::tcltest] == -1} {
  14.     package require tcltest
  15.     namespace import -force ::tcltest::*
  16. }
  17. # These tests really need to be run from a writable directory, which
  18. # it is assumed [temporaryDirectory] is.
  19. set oldcwd [pwd]
  20. cd [temporaryDirectory]
  21. # Several tests require need to match results against the unix username
  22. set user {}
  23. if {$tcl_platform(platform) == "unix"} {
  24.     catch {set user [exec whoami]}
  25.     if {$user == ""} {
  26. catch {regexp {^[^(]*(([^)]*))} [exec id] dummy user}
  27.     }
  28.     if {$user == ""} {
  29. set user "root"
  30.     }
  31. }
  32. proc openup {path} {
  33.     testchmod 777 $path
  34.     if {[file isdirectory $path]} {
  35. catch {
  36.     foreach p [glob -directory $path *] {
  37. openup $p
  38.     }
  39. }
  40.     }
  41. }
  42. proc cleanup {args} {
  43.     foreach p ". $args" {
  44. set x ""
  45. catch {
  46.     set x [glob -directory $p tf* td*]
  47. }
  48. foreach file $x {
  49.     if {[catch {file delete -force -- $file}]} {
  50. openup $file
  51. file delete -force -- $file
  52.     }
  53. }
  54.     }
  55. }
  56. test unixFCmd-1.1 {TclpRenameFile: EACCES} {unixOnly notRoot} {
  57.     cleanup
  58.     file mkdir td1/td2/td3
  59.     file attributes td1/td2 -permissions 0000
  60.     set msg [list [catch {file rename td1/td2/td3 td2} msg] $msg]
  61.     file attributes td1/td2 -permissions 0755
  62.     set msg
  63. } {1 {error renaming "td1/td2/td3": permission denied}}
  64. test unixFCmd-1.2 {TclpRenameFile: EEXIST} {unixOnly notRoot} {
  65.     cleanup
  66.     file mkdir td1/td2
  67.     file mkdir td2
  68.     list [catch {file rename td2 td1} msg] $msg
  69. } {1 {error renaming "td2" to "td1/td2": file already exists}}
  70. test unixFCmd-1.3 {TclpRenameFile: EINVAL} {unixOnly notRoot} {
  71.     cleanup
  72.     file mkdir td1
  73.     list [catch {file rename td1 td1} msg] $msg
  74. } {1 {error renaming "td1" to "td1/td1": trying to rename a volume or move a directory into itself}}
  75. test unixFCmd-1.4 {TclpRenameFile: EISDIR} {emptyTest unixOnly notRoot} {
  76.     # can't make it happen
  77. } {}
  78. test unixFCmd-1.5 {TclpRenameFile: ENOENT} {unixOnly notRoot} {
  79.     cleanup
  80.     file mkdir td1
  81.     list [catch {file rename td2 td1} msg] $msg
  82. } {1 {error renaming "td2": no such file or directory}}
  83. test unixFCmd-1.6 {TclpRenameFile: ENOTDIR} {emptyTest unixOnly notRoot} {
  84.     # can't make it happen
  85. } {}
  86. test unixFCmd-1.7 {TclpRenameFile: EXDEV} {unixOnly notRoot} {
  87.     cleanup
  88.     file mkdir foo/bar
  89.     file attr foo -perm 040555
  90.     set catchResult [catch {file rename foo/bar /tmp} msg]
  91.     set msg [lindex [split $msg :] end]
  92.     catch {file delete /tmp/bar}
  93.     catch {file attr foo -perm 040777}
  94.     catch {file delete -force foo}
  95.     list $catchResult $msg
  96. } {1 { permission denied}}
  97. test unixFCmd-1.8 {Checking EINTR Bug} {unixOnly notRoot nonPortable} {
  98.     testalarm 
  99.     after 2000
  100.     list [testgotsig] [testgotsig]
  101. } {1 0}
  102. test unixFCmd-1.9 {Checking EINTR Bug} {unixOnly notRoot nonPortable} {
  103.     cleanup
  104.     set f [open tfalarm w]
  105.     puts $f {
  106. after 2000
  107. puts "hello world"
  108. exit 0
  109.     }
  110.     close $f
  111.     testalarm 
  112.     set pipe [open "|[info nameofexecutable] tfalarm" r+]
  113.     set line [read $pipe 1]
  114.     catch {close $pipe}
  115.     list $line [testgotsig]
  116. } {h 1}
  117. test unixFCmd-2.1 {TclpCopyFile: target exists: lstat(dst) == 0} 
  118. {unixOnly notRoot} {
  119.     cleanup
  120.     close [open tf1 a]
  121.     close [open tf2 a]
  122.     file copy -force tf1 tf2
  123. } {}
  124. test unixFCmd-2.2.1 {TclpCopyFile: src is symlink} {unixOnly notRoot dontCopyLinks} {
  125.     # copying links should end up with real files
  126.     cleanup
  127.     close [open tf1 a]
  128.     file link -symbolic tf2 tf1
  129.     file copy tf2 tf3
  130.     file type tf3
  131. } {file}
  132. test unixFCmd-2.2.2 {TclpCopyFile: src is symlink} {unixOnly notRoot} {
  133.     # copying links should end up with the links copied
  134.     cleanup
  135.     close [open tf1 a]
  136.     file link -symbolic tf2 tf1
  137.     file copy tf2 tf3
  138.     file type tf3
  139. } {link}
  140. test unixFCmd-2.3 {TclpCopyFile: src is block} {unixOnly notRoot} {
  141.     cleanup
  142.     set null "/dev/null"
  143.     while {[file type $null] != "characterSpecial"} {
  144. set null [file join [file dirname $null] [file readlink $null]]
  145.     }
  146.     # file copy $null tf1
  147. } {}
  148. test unixFCmd-2.4 {TclpCopyFile: src is fifo} {unixOnly notRoot} {
  149.     cleanup
  150.     if [catch {exec mknod tf1 p}] {
  151. list 1
  152.     } else {
  153. file copy tf1 tf2
  154. expr {"[file type tf1]" == "[file type tf2]"}
  155.     }
  156. } {1}
  157. test unixFCmd-2.5 {TclpCopyFile: copy attributes} {unixOnly notRoot} {
  158.     cleanup
  159.     close [open tf1 a]
  160.     file attributes tf1 -permissions 0472
  161.     file copy tf1 tf2
  162.     file attributes tf2 -permissions
  163. } 00472 ;# i.e. perms field of [exec ls -l tf2] is -r--rwx-w-
  164. test unixFCmd-3.1 {CopyFile not done} {emptyTest unixOnly notRoot} {
  165. } {}
  166. test unixFCmd-4.1 {TclpDeleteFile not done} {emptyTest unixOnly notRoot} {
  167. } {}
  168. test unixFCmd-5.1 {TclpCreateDirectory not done} {emptyTest unixOnly notRoot} {
  169. } {}
  170. test unixFCmd-6.1 {TclpCopyDirectory not done} {emptyTest unixOnly notRoot} {
  171. } {}
  172. test unixFCmd-7.1 {TclpRemoveDirectory not done} {emptyTest unixOnly notRoot} {
  173. } {}
  174. test unixFCmd-8.1 {TraverseUnixTree not done} {emptyTest unixOnly notRoot} {
  175. } {}
  176. test unixFCmd-9.1 {TraversalCopy not done} {emptyTest unixOnly notRoot} {
  177. } {}
  178. test unixFCmd-10.1 {TraversalDelete not done} {emptyTest unixOnly notRoot} {
  179. } {}
  180. test unixFCmd-11.1 {CopyFileAttrs not done} {emptyTest unixOnly notRoot} {
  181. } {}
  182. test unixFCmd-12.1 {GetGroupAttribute - file not found} {unixOnly notRoot} {
  183.     catch {file delete -force -- foo.test}
  184.     list [catch {file attributes foo.test -group} msg] $msg
  185. } {1 {could not read "foo.test": no such file or directory}}
  186. test unixFCmd-12.2 {GetGroupAttribute - file found} {unixOnly notRoot} {
  187.     catch {file delete -force -- foo.test}
  188.     close [open foo.test w]
  189.     list [catch {file attributes foo.test -group}] [file delete -force -- foo.test]
  190. } {0 {}}
  191. test unixFCmd-13.1 {GetOwnerAttribute - file not found} {unixOnly notRoot} {
  192.     catch {file delete -force -- foo.test}
  193.     list [catch {file attributes foo.test -group} msg] $msg
  194. } {1 {could not read "foo.test": no such file or directory}}
  195. test unixFCmd-13.2 {GetOwnerAttribute} {unixOnly notRoot} {
  196.     catch {file delete -force -- foo.test}
  197.     close [open foo.test w]
  198.     list [catch {file attributes foo.test -owner} msg] 
  199.     [string compare $msg $user] [file delete -force -- foo.test]
  200. } {0 0 {}}
  201. test unixFCmd-14.1 {GetPermissionsAttribute - file not found} {unixOnly notRoot} {
  202.     catch {file delete -force -- foo.test}
  203.     list [catch {file attributes foo.test -permissions} msg] $msg
  204. } {1 {could not read "foo.test": no such file or directory}}
  205. test unixFCmd-14.2 {GetPermissionsAttribute} {unixOnly notRoot} {
  206.     catch {file delete -force -- foo.test}
  207.     close [open foo.test w]
  208.     list [catch {file attribute foo.test -permissions}] 
  209.     [file delete -force -- foo.test]
  210. } {0 {}}
  211. # Find a group that exists on this system, or else skip tests that require
  212. # groups
  213. set ::tcltest::testConstraints(foundGroup) 0
  214. if {$tcl_platform(platform) == "unix"} {
  215.     catch {
  216. set groupList [exec groups]
  217. set group [lindex $groupList 0]
  218. set ::tcltest::testConstraints(foundGroup) 1
  219.     }
  220. }
  221. #groups hard to test
  222. test unixFCmd-15.1 {SetGroupAttribute - invalid group} {unixOnly notRoot} {
  223.     catch {file delete -force -- foo.test}
  224.     list [catch {file attributes foo.test -group foozzz} msg] 
  225.     $msg [file delete -force -- foo.test]
  226. } {1 {could not set group for file "foo.test": group "foozzz" does not exist} {}}
  227. test unixFCmd-15.2 {SetGroupAttribute - invalid file} 
  228. {unixOnly notRoot foundGroup} {
  229.     catch {file delete -force -- foo.test}
  230.     list [catch {file attributes foo.test -group $group} msg] $msg
  231. } {1 {could not set group for file "foo.test": no such file or directory}}
  232. #changing owners hard to do
  233. test unixFCmd-16.1 {SetOwnerAttribute - current owner} {unixOnly notRoot} {
  234.     catch {file delete -force -- foo.test}
  235.     close [open foo.test w]
  236.     list [catch {file attributes foo.test -owner $user} msg] 
  237.     $msg [string compare [file attributes foo.test -owner] $user] 
  238.     [file delete -force -- foo.test]
  239. } {0 {} 0 {}}
  240. test unixFCmd-16.2 {SetOwnerAttribute - invalid file} {unixOnly notRoot} {
  241.     catch {file delete -force -- foo.test}
  242.     list [catch {file attributes foo.test -owner $user} msg] $msg
  243. } {1 {could not set owner for file "foo.test": no such file or directory}}
  244. test unixFCmd-16.3 {SetOwnerAttribute - invalid owner} {unixOnly notRoot} {
  245.     catch {file delete -force -- foo.test}
  246.     list [catch {file attributes foo.test -owner foozzz} msg] $msg
  247. } {1 {could not set owner for file "foo.test": user "foozzz" does not exist}}
  248. test unixFCmd-17.1 {SetPermissionsAttribute} {unixOnly notRoot} {
  249.     catch {file delete -force -- foo.test}
  250.     close [open foo.test w]
  251.     list [catch {file attributes foo.test -permissions 0000} msg] 
  252.     $msg [file attributes foo.test -permissions] 
  253.     [file delete -force -- foo.test]
  254. } {0 {} 00000 {}}
  255. test unixFCmd-17.2 {SetPermissionsAttribute} {unixOnly notRoot} {
  256.     catch {file delete -force -- foo.test}
  257.     list [catch {file attributes foo.test -permissions 0000} msg] $msg
  258. } {1 {could not set permissions for file "foo.test": no such file or directory}}
  259. test unixFCmd-17.3 {SetPermissionsAttribute} {unixOnly notRoot} {
  260.     catch {file delete -force -- foo.test}
  261.     close [open foo.test w]
  262.     list [catch {file attributes foo.test -permissions foo} msg] $msg 
  263.     [file delete -force -- foo.test]
  264. } {1 {unknown permission string format "foo"} {}}
  265. test unixFCmd-17.4 {SetPermissionsAttribute} {unixOnly notRoot} {
  266.     catch {file delete -force -- foo.test}
  267.     close [open foo.test w]
  268.     list [catch {file attributes foo.test -permissions ---rwx} msg] $msg 
  269.     [file delete -force -- foo.test]
  270. } {1 {unknown permission string format "---rwx"} {}}
  271. close [open foo.test w]
  272. set ::i 4
  273. proc permcheck {testnum permstr expected} {
  274.     test $testnum {SetPermissionsAttribute} {unixOnly notRoot} {
  275. file attributes foo.test -permissions $permstr
  276. file attributes foo.test -permissions
  277.     } $expected
  278. }
  279. permcheck unixFCmd-17.5   rwxrwxrwx 00777
  280. permcheck unixFCmd-17.6   r--r---w- 00442
  281. permcheck unixFCmd-17.7   0 00000
  282. permcheck unixFCmd-17.8   u+rwx,g+r 00740
  283. permcheck unixFCmd-17.9   u-w 00540
  284. permcheck unixFCmd-17.10   o+rwx 00547
  285. permcheck unixFCmd-17.11  --x--x--x 00111
  286. permcheck unixFCmd-17.12  a+rwx 00777
  287. file delete -force -- foo.test
  288. test unixFCmd-18.1 {Unix pwd} {nonPortable unixOnly notRoot} {
  289.     # This test is nonportable because SunOS generates a weird error
  290.     # message when the current directory isn't readable.
  291.     set cd [pwd]
  292.     set nd $cd/tstdir
  293.     file mkdir $nd
  294.     cd $nd
  295.     file attributes $nd -permissions 0000
  296.     set r [list [catch {pwd} res] [string range $res 0 36]];
  297.     cd $cd;
  298.     file attributes $nd -permissions 0755
  299.     file delete $nd
  300.     set r
  301. } {1 {error getting working directory name:}}
  302. # cleanup
  303. cleanup
  304. cd $oldcwd
  305. ::tcltest::cleanupTests
  306. return