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

通讯编程

开发平台:

Visual C++

  1. # Commands covered:  exec
  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) 1991-1994 The Regents of the University of California.
  8. # Copyright (c) 1994-1997 Sun Microsystems, Inc.
  9. # Copyright (c) 1998-1999 by Scriptics Corporation.
  10. #
  11. # See the file "license.terms" for information on usage and redistribution
  12. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  13. #
  14. # RCS: @(#) $Id: exec.test,v 1.16.2.7 2006/01/16 19:31:19 rmax Exp $
  15. package require tcltest 2
  16. namespace import -force ::tcltest::*
  17. # All tests require the "exec" command.
  18. # Skip them if exec is not defined.
  19. testConstraint exec [llength [info commands exec]]
  20. unset -nocomplain path
  21. set path(echo) [makeFile {
  22.     puts -nonewline [lindex $argv 0]
  23.     foreach str [lrange $argv 1 end] {
  24. puts -nonewline " $str"
  25.     }
  26.     puts {}
  27.     exit
  28. } echo]
  29. set path(cat) [makeFile {
  30.     if {$argv == {}} {
  31. set argv -
  32.     }
  33.     foreach name $argv {
  34. if {$name == "-"} {
  35.     set f stdin
  36. } elseif {[catch {open $name r} f] != 0} {
  37.     puts stderr $f
  38.     continue
  39. }
  40. while {[eof $f] == 0} {
  41.     puts -nonewline [read $f]
  42. }
  43. if {$f != "stdin"} {
  44.     close $f
  45. }
  46.     }
  47.     exit
  48. } cat]
  49. set path(wc) [makeFile {
  50.     set data [read stdin]
  51.     set lines [regsub -all "n" $data {} dummy]
  52.     set words [regsub -all "[^ tn]+" $data {} dummy]
  53.     set chars [string length $data]
  54.     puts [format "%8.d%8.d%8.d" $lines $words $chars]
  55.     exit
  56. } wc]
  57. set path(sh) [makeFile {
  58.     if {[lindex $argv 0] != "-c"} {
  59. error "sh: unexpected arguments $argv"
  60.     }
  61.     set cmd [lindex $argv 1]
  62.     lappend cmd ";"
  63.     set newcmd {}
  64.     
  65.     foreach arg $cmd {
  66. if {$arg == ";"} {
  67.     eval exec >@stdout 2>@stderr [list [info nameofexecutable]] $newcmd
  68.     set newcmd {}
  69.     continue
  70. }
  71. if {$arg == "1>&2"} {
  72.     set arg >@stderr
  73. }
  74. lappend newcmd $arg
  75.     }
  76.     exit
  77. } sh]
  78. set path(sleep) [makeFile {
  79.     after [expr $argv*1000]
  80.     exit
  81. } sleep]
  82. set path(exit) [makeFile {
  83.     exit $argv
  84. } exit]
  85. # Basic operations.
  86. test exec-1.1 {basic exec operation} {exec} {
  87.     exec [interpreter] $path(echo) a b c
  88. } "a b c"
  89. test exec-1.2 {pipelining} {exec stdio} {
  90.     exec [interpreter] $path(echo) a b c d | [interpreter] $path(cat) | [interpreter] $path(cat)
  91. } "a b c d"
  92. test exec-1.3 {pipelining} {exec stdio} {
  93.     set a [exec [interpreter] $path(echo) a b c d | [interpreter] $path(cat) | [interpreter] $path(wc)]
  94.     list [scan $a "%d %d %d" b c d] $b $c
  95. } {3 1 4}
  96. set arg {12345678901234567890123456789012345678901234567890}
  97. set arg "$arg$arg$arg$arg$arg$arg"
  98. test exec-1.4 {long command lines} {exec} {
  99.     exec [interpreter] $path(echo) $arg
  100. } $arg
  101. set arg {}
  102. # I/O redirection: input from Tcl command.
  103. test exec-2.1 {redirecting input from immediate source} {exec stdio} {
  104.     exec [interpreter] $path(cat) << "Sample text"
  105. } {Sample text}
  106. test exec-2.2 {redirecting input from immediate source} {exec stdio} {
  107.     exec << "Sample text" [interpreter] $path(cat) | [interpreter] $path(cat)
  108. } {Sample text}
  109. test exec-2.3 {redirecting input from immediate source} {exec stdio} {
  110.     exec [interpreter] $path(cat) << "Sample text" | [interpreter] $path(cat)
  111. } {Sample text}
  112. test exec-2.4 {redirecting input from immediate source} {exec stdio} {
  113.     exec [interpreter] $path(cat) | [interpreter] $path(cat) << "Sample text"
  114. } {Sample text}
  115. test exec-2.5 {redirecting input from immediate source} {exec} {
  116.     exec [interpreter] $path(cat) "<<Joined to arrows"
  117. } {Joined to arrows}
  118. test exec-2.6 {redirecting input from immediate source, with UTF} {exec} {
  119.     # If this fails, it may give back:
  120.     # "uC3uA9uC3uA0uC3uBCuC3uB1"
  121.     # If it does, this means that the UTF -> external conversion did not 
  122.     # occur before writing out the temp file.
  123.     exec [interpreter] $path(cat) << "uE9uE0uFCuF1"
  124. } "uE9uE0uFCuF1"
  125. # I/O redirection: output to file.
  126. set path(gorp.file) [makeFile {} gorp.file]
  127. file delete $path(gorp.file)
  128. test exec-3.1 {redirecting output to file} {exec} {
  129.     exec [interpreter] $path(echo) "Some simple words" > $path(gorp.file)
  130.     exec [interpreter] $path(cat) $path(gorp.file)
  131. } "Some simple words"
  132. test exec-3.2 {redirecting output to file} {exec stdio} {
  133.     exec [interpreter] $path(echo) "More simple words" | >$path(gorp.file) [interpreter] $path(cat) | [interpreter] $path(cat)
  134.     exec [interpreter] $path(cat) $path(gorp.file)
  135. } "More simple words"
  136. test exec-3.3 {redirecting output to file} {exec stdio} {
  137.     exec > $path(gorp.file) [interpreter] $path(echo) "Different simple words" | [interpreter] $path(cat) | [interpreter] $path(cat)
  138.     exec [interpreter] $path(cat) $path(gorp.file)
  139. } "Different simple words"
  140. test exec-3.4 {redirecting output to file} {exec} {
  141.     exec [interpreter] $path(echo) "Some simple words" >$path(gorp.file)
  142.     exec [interpreter] $path(cat) $path(gorp.file)
  143. } "Some simple words"
  144. test exec-3.5 {redirecting output to file} {exec} {
  145.     exec [interpreter] $path(echo) "First line" >$path(gorp.file)
  146.     exec [interpreter] $path(echo) "Second line" >> $path(gorp.file)
  147.     exec [interpreter] $path(cat) $path(gorp.file)
  148. } "First linenSecond line"
  149. test exec-3.6 {redirecting output to file} {exec} {
  150.     exec [interpreter] $path(echo) "First line" >$path(gorp.file)
  151.     exec [interpreter] $path(echo) "Second line" >>$path(gorp.file)
  152.     exec [interpreter] $path(cat) $path(gorp.file)
  153. } "First linenSecond line"
  154. test exec-3.7 {redirecting output to file} {exec} {
  155.     set f [open $path(gorp.file) w]
  156.     puts $f "Line 1"
  157.     flush $f
  158.     exec [interpreter] $path(echo) "More text" >@ $f
  159.     exec [interpreter] $path(echo) >@$f "Even more"
  160.     puts $f "Line 3"
  161.     close $f
  162.     exec [interpreter] $path(cat) $path(gorp.file)
  163. } "Line 1nMore textnEven morenLine 3"
  164. # I/O redirection: output and stderr to file.
  165. file delete $path(gorp.file)
  166. test exec-4.1 {redirecting output and stderr to file} {exec} {
  167.     exec [interpreter] "$path(echo)" "test output" >& $path(gorp.file)
  168.     exec [interpreter] "$path(cat)" "$path(gorp.file)"
  169. } "test output"
  170. test exec-4.2 {redirecting output and stderr to file} {exec} {
  171.     list [exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" >&$path(gorp.file)] 
  172.     [exec [interpreter] "$path(cat)" "$path(gorp.file)"]
  173. } {{} {foo bar}}
  174. test exec-4.3 {redirecting output and stderr to file} {exec} {
  175.     exec [interpreter] $path(echo) "first line" > $path(gorp.file)
  176.     list [exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" >>&$path(gorp.file)] 
  177.     [exec [interpreter] "$path(cat)" "$path(gorp.file)"]
  178. } "{} {first linenfoo bar}"
  179. test exec-4.4 {redirecting output and stderr to file} {exec} {
  180.     set f [open "$path(gorp.file)" w]
  181.     puts $f "Line 1"
  182.     flush $f
  183.     exec [interpreter] "$path(echo)" "More text" >&@ $f
  184.     exec [interpreter] "$path(echo)" >&@$f "Even more"
  185.     puts $f "Line 3"
  186.     close $f
  187.     exec [interpreter] "$path(cat)" "$path(gorp.file)"
  188. } "Line 1nMore textnEven morenLine 3"
  189. test exec-4.5 {redirecting output and stderr to file} {exec} {
  190.     set f [open "$path(gorp.file)" w]
  191.     puts $f "Line 1"
  192.     flush $f
  193.     exec >&@ $f [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2"
  194.     exec >&@$f [interpreter] "$path(sh)" -c ""$path(echo)" xyzzy 1>&2"
  195.     puts $f "Line 3"
  196.     close $f
  197.     exec [interpreter] "$path(cat)" "$path(gorp.file)"
  198. } "Line 1nfoo barnxyzzynLine 3"
  199. # I/O redirection: input from file.
  200. if { [set ::tcltest::testConstraints(exec)] } {
  201. exec [interpreter] $path(echo) "Just a few thoughts" > $path(gorp.file)
  202. }
  203. test exec-5.1 {redirecting input from file} {exec} {
  204.     exec [interpreter] $path(cat) < $path(gorp.file)
  205. } {Just a few thoughts}
  206. test exec-5.2 {redirecting input from file} {exec stdio} {
  207.     exec [interpreter] $path(cat) | [interpreter] $path(cat) < $path(gorp.file)
  208. } {Just a few thoughts}
  209. test exec-5.3 {redirecting input from file} {exec stdio} {
  210.     exec [interpreter] $path(cat) < $path(gorp.file) | [interpreter] $path(cat)
  211. } {Just a few thoughts}
  212. test exec-5.4 {redirecting input from file} {exec stdio} {
  213.     exec < $path(gorp.file) [interpreter] $path(cat) | [interpreter] $path(cat)
  214. } {Just a few thoughts}
  215. test exec-5.5 {redirecting input from file} {exec} {
  216.     exec [interpreter] $path(cat) <$path(gorp.file)
  217. } {Just a few thoughts}
  218. test exec-5.6 {redirecting input from file} {exec} {
  219.     set f [open $path(gorp.file) r]
  220.     set result [exec [interpreter] $path(cat) <@ $f]
  221.     close $f
  222.     set result
  223. } {Just a few thoughts}
  224. test exec-5.7 {redirecting input from file} {exec} {
  225.     set f [open $path(gorp.file) r]
  226.     set result [exec <@$f [interpreter] $path(cat)]
  227.     close $f
  228.     set result
  229. } {Just a few thoughts}
  230. # I/O redirection: standard error through a pipeline.
  231. test exec-6.1 {redirecting stderr through a pipeline} {exec stdio} {
  232.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar" |& [interpreter] "$path(cat)"
  233. } "foo bar"
  234. test exec-6.2 {redirecting stderr through a pipeline} {exec stdio} {
  235.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" |& [interpreter] "$path(cat)"
  236. } "foo bar"
  237. test exec-6.3 {redirecting stderr through a pipeline} {exec stdio} {
  238.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 
  239. |& [interpreter] "$path(sh)" -c ""$path(echo)" second msg 1>&2 ; "$path(cat)"" |& [interpreter] "$path(cat)"
  240. } "second msgnfoo bar"
  241. # I/O redirection: combinations.
  242. set path(gorp.file2) [makeFile {} gorp.file2]
  243. file delete $path(gorp.file2)
  244. test exec-7.1 {multiple I/O redirections} {exec} {
  245.     exec << "command input" > $path(gorp.file2) [interpreter] $path(cat) < $path(gorp.file)
  246.     exec [interpreter] $path(cat) $path(gorp.file2)
  247. } {Just a few thoughts}
  248. test exec-7.2 {multiple I/O redirections} {exec} {
  249.     exec < $path(gorp.file) << "command input" [interpreter] $path(cat)
  250. } {command input}
  251. # Long input to command and output from command.
  252. set a "0123456789 xxxxxxxxx abcdefghi ABCDEFGHIJKn"
  253. set a [concat $a $a $a $a]
  254. set a [concat $a $a $a $a]
  255. set a [concat $a $a $a $a]
  256. set a [concat $a $a $a $a]
  257. test exec-8.1 {long input and output} {exec} {
  258.     exec [interpreter] $path(cat) << $a
  259. } $a
  260. # More than 20 arguments to exec.
  261. test exec-8.2 {long input and output} {exec} {
  262.     exec [interpreter] $path(echo) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
  263. } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23}
  264. # Commands that return errors.
  265. test exec-9.1 {commands returning errors} {exec} {
  266.     set x [catch {exec gorp456} msg]
  267.     list $x [string tolower $msg] [string tolower $errorCode]
  268. } {1 {couldn't execute "gorp456": no such file or directory} {posix enoent {no such file or directory}}}
  269. test exec-9.2 {commands returning errors} {exec} {
  270.     string tolower [list [catch {exec [interpreter] echo foo | foo123} msg] $msg $errorCode]
  271. } {1 {couldn't execute "foo123": no such file or directory} {posix enoent {no such file or directory}}}
  272. test exec-9.3 {commands returning errors} {exec stdio} {
  273.     list [catch {exec [interpreter] $path(sleep) 1 | [interpreter] $path(exit) 43 | [interpreter] $path(sleep) 1} msg] $msg
  274. } {1 {child process exited abnormally}}
  275. test exec-9.4 {commands returning errors} {exec stdio} {
  276.     list [catch {exec [interpreter] $path(exit) 43 | [interpreter] $path(echo) "foo bar"} msg] $msg
  277. } {1 {foo bar
  278. child process exited abnormally}}
  279. test exec-9.5 {commands returning errors} {exec stdio} {
  280.     list [catch {exec gorp456 | [interpreter] echo a b c} msg] [string tolower $msg]
  281. } {1 {couldn't execute "gorp456": no such file or directory}}
  282. test exec-9.6 {commands returning errors} {exec} {
  283.     list [catch {exec [interpreter] "$path(sh)" -c ""$path(echo)" error msg 1>&2"} msg] $msg
  284. } {1 {error msg}}
  285. test exec-9.7 {commands returning errors} {exec stdio} {
  286.     list [catch {exec [interpreter] "$path(sh)" -c ""$path(echo)" error msg 1>&2" 
  287.      | [interpreter] "$path(sh)" -c ""$path(echo)" error msg 1>&2"} msg] $msg
  288. } {1 {error msg
  289. error msg}}
  290. set path(err) [makeFile {} err]
  291. test exec-9.8 {commands returning errors} {exec} {
  292.     set f [open $path(err) w]
  293.     puts $f {
  294. puts stdout out
  295. puts stderr err
  296.     }
  297.     close $f
  298.     list [catch {exec [interpreter] $path(err)} msg] $msg
  299. } {1 {out
  300. err}}
  301. # Errors in executing the Tcl command, as opposed to errors in the
  302. # processes that are invoked.
  303. test exec-10.1 {errors in exec invocation} {exec} {
  304.     list [catch {exec} msg] $msg
  305. } {1 {wrong # args: should be "exec ?switches? arg ?arg ...?"}}
  306. test exec-10.2 {errors in exec invocation} {exec} {
  307.     list [catch {exec | cat} msg] $msg
  308. } {1 {illegal use of | or |& in command}}
  309. test exec-10.3 {errors in exec invocation} {exec} {
  310.     list [catch {exec cat |} msg] $msg
  311. } {1 {illegal use of | or |& in command}}
  312. test exec-10.4 {errors in exec invocation} {exec} {
  313.     list [catch {exec cat | | cat} msg] $msg
  314. } {1 {illegal use of | or |& in command}}
  315. test exec-10.5 {errors in exec invocation} {exec} {
  316.     list [catch {exec cat | |& cat} msg] $msg
  317. } {1 {illegal use of | or |& in command}}
  318. test exec-10.6 {errors in exec invocation} {exec} {
  319.     list [catch {exec cat |&} msg] $msg
  320. } {1 {illegal use of | or |& in command}}
  321. test exec-10.7 {errors in exec invocation} {exec} {
  322.     list [catch {exec cat <} msg] $msg
  323. } {1 {can't specify "<" as last word in command}}
  324. test exec-10.8 {errors in exec invocation} {exec} {
  325.     list [catch {exec cat >} msg] $msg
  326. } {1 {can't specify ">" as last word in command}}
  327. test exec-10.9 {errors in exec invocation} {exec} {
  328.     list [catch {exec cat <<} msg] $msg
  329. } {1 {can't specify "<<" as last word in command}}
  330. test exec-10.10 {errors in exec invocation} {exec} {
  331.     list [catch {exec cat >>} msg] $msg
  332. } {1 {can't specify ">>" as last word in command}}
  333. test exec-10.11 {errors in exec invocation} {exec} {
  334.     list [catch {exec cat >&} msg] $msg
  335. } {1 {can't specify ">&" as last word in command}}
  336. test exec-10.12 {errors in exec invocation} {exec} {
  337.     list [catch {exec cat >>&} msg] $msg
  338. } {1 {can't specify ">>&" as last word in command}}
  339. test exec-10.13 {errors in exec invocation} {exec} {
  340.     list [catch {exec cat >@} msg] $msg
  341. } {1 {can't specify ">@" as last word in command}}
  342. test exec-10.14 {errors in exec invocation} {exec} {
  343.     list [catch {exec cat <@} msg] $msg
  344. } {1 {can't specify "<@" as last word in command}}
  345. test exec-10.15 {errors in exec invocation} {exec} {
  346.     list [catch {exec cat < a/b/c} msg] [string tolower $msg]
  347. } {1 {couldn't read file "a/b/c": no such file or directory}}
  348. test exec-10.16 {errors in exec invocation} {exec} {
  349.     list [catch {exec cat << foo > a/b/c} msg] [string tolower $msg]
  350. } {1 {couldn't write file "a/b/c": no such file or directory}}
  351. test exec-10.17 {errors in exec invocation} {exec} {
  352.     list [catch {exec cat << foo > a/b/c} msg] [string tolower $msg]
  353. } {1 {couldn't write file "a/b/c": no such file or directory}}
  354. set f [open $path(gorp.file) w]
  355. test exec-10.18 {errors in exec invocation} {exec} {
  356.     list [catch {exec cat <@ $f} msg] $msg
  357. } "1 {channel "$f" wasn't opened for reading}"
  358. close $f
  359. set f [open $path(gorp.file) r]
  360. test exec-10.19 {errors in exec invocation} {exec} {
  361.     list [catch {exec cat >@ $f} msg] $msg
  362. } "1 {channel "$f" wasn't opened for writing}"
  363. close $f
  364. test exec-10.20 {errors in exec invocation} {exec} {
  365.     list [catch {exec ~non_existent_user/foo/bar} msg] $msg
  366. } {1 {user "non_existent_user" doesn't exist}}
  367. test exec-10.21 {errors in exec invocation} {exec} {
  368.     list [catch {exec [interpreter] true | ~xyzzy_bad_user/x | false} msg] $msg
  369. } {1 {user "xyzzy_bad_user" doesn't exist}}
  370. test exec-10.22 {errors in exec invocation} 
  371. -constraints exec 
  372. -returnCodes 1 
  373. -body {exec echo test > ~non_existent_user/foo/bar} 
  374. -result {user "non_existent_user" doesn't exist}
  375. # Commands in background.
  376. test exec-11.1 {commands in background} {exec} {
  377.     set x [lindex [time {exec [interpreter] $path(sleep) 2 &}] 0]
  378.     expr $x<1000000
  379. } 1
  380. test exec-11.2 {commands in background} {exec} {
  381.     list [catch {exec [interpreter] $path(echo) a &b} msg] $msg
  382. } {0 {a &b}}
  383. test exec-11.3 {commands in background} {exec} {
  384.     llength [exec [interpreter] $path(sleep) 1 &]
  385. } 1
  386. test exec-11.4 {commands in background} {exec stdio} {
  387.     llength [exec [interpreter] $path(sleep) 1 | [interpreter] $path(sleep) 1 | [interpreter] $path(sleep) 1 &]
  388. } 3
  389. test exec-11.5 {commands in background} {exec} {
  390.     set f [open $path(gorp.file) w]
  391.     puts $f [list catch [list exec [info nameofexecutable] $path(echo) foo &]]
  392.     close $f
  393.     string compare "foo" [exec [interpreter] $path(gorp.file)]
  394. } 0
  395. # Make sure that background commands are properly reaped when
  396. # they eventually die.
  397. if { [set ::tcltest::testConstraints(exec)] } {
  398. exec [interpreter] $path(sleep) 3
  399. }
  400. test exec-12.1 {reaping background processes} 
  401. {exec unixOnly nonPortable} {
  402.     for {set i 0} {$i < 20} {incr i} {
  403. exec echo foo > /dev/null &
  404.     }
  405.     exec sleep 1
  406.     catch {exec ps | fgrep "echo foo" | fgrep -v fgrep | wc} msg
  407.     lindex $msg 0
  408. } 0
  409. test exec-12.2 {reaping background processes} 
  410. {exec unixOnly nonPortable} {
  411.     exec sleep 2 | sleep 2 | sleep 2 &
  412.     catch {exec ps | fgrep -i "sleep" | fgrep -i -v fgrep | wc} msg
  413.     set x [lindex $msg 0]
  414.     exec sleep 3
  415.     catch {exec ps | fgrep -i "sleep" | fgrep -i -v fgrep | wc} msg
  416.     list $x [lindex $msg 0]
  417. } {3 0}
  418. test exec-12.3 {reaping background processes} 
  419. {exec unixOnly nonPortable} {
  420.     exec sleep 1000 &
  421.     exec sleep 1000 &
  422.     set x [exec ps | fgrep "sleep" | fgrep -v fgrep]
  423.     set pids {}
  424.     foreach i [split $x n] {
  425. lappend pids [lindex $i 0]
  426.     }
  427.     foreach i $pids {
  428. catch {exec kill -STOP $i}
  429.     }
  430.     catch {exec ps | fgrep "sleep" | fgrep -v fgrep | wc} msg
  431.     set x [lindex $msg 0]
  432.     foreach i $pids {
  433. catch {exec kill -KILL $i}
  434.     }
  435.     catch {exec ps | fgrep "sleep" | fgrep -v fgrep | wc} msg
  436.     list $x [lindex $msg 0]
  437. } {2 0}
  438. # Make sure "errorCode" is set correctly.
  439. test exec-13.1 {setting errorCode variable} {exec} {
  440.     list [catch {exec [interpreter] $path(cat) < a/b/c} msg] [string tolower $errorCode]
  441. } {1 {posix enoent {no such file or directory}}}
  442. test exec-13.2 {setting errorCode variable} {exec} {
  443.     list [catch {exec [interpreter] $path(cat) > a/b/c} msg] [string tolower $errorCode]
  444. } {1 {posix enoent {no such file or directory}}}
  445. test exec-13.3 {setting errorCode variable} {exec} {
  446.     set x [catch {exec _weird_cmd_} msg]
  447.     list $x [string tolower $msg] [lindex $errorCode 0] 
  448.     [string tolower [lrange $errorCode 2 end]]
  449. } {1 {couldn't execute "_weird_cmd_": no such file or directory} POSIX {{no such file or directory}}}
  450. test exec-13.4 {extended exit result codes} {
  451.     -constraints {win}
  452.     -setup {
  453.         set tmp [makeFile {exit 0x00000101} tmpfile.exec-13.4]
  454.     }
  455.     -body {
  456.         list [catch {exec [interpreter] $tmp} err]
  457.             [lreplace $::errorCode 1 1 {}]
  458.     }
  459.     -cleanup {
  460.         removeFile $tmp
  461.     }
  462.     -result {1 {CHILDSTATUS {} 257}}
  463. }
  464. test exec-13.5 {extended exit result codes: max value} {
  465.     -constraints {win}
  466.     -setup {
  467.         set tmp [makeFile {exit 0x3fffffff} tmpfile.exec-13.5]
  468.     }
  469.     -body {
  470.         list [catch {exec [interpreter] $tmp} err]
  471.             [lreplace $::errorCode 1 1 {}]
  472.     }
  473.     -cleanup {
  474.         removeFile $tmp
  475.     }
  476.     -result {1 {CHILDSTATUS {} 1073741823}}
  477. }
  478. test exec-13.6 {extended exit result codes: signalled} {   
  479.     -constraints {win}
  480.     -setup {
  481.         set tmp [makeFile {exit 0xffffffff} tmpfile.exec-13.6]
  482.     }
  483.     -body {
  484.         list [catch {exec [interpreter] $tmp} err]
  485.             [lreplace $::errorCode 1 1 {}]
  486.     }
  487.     -cleanup {
  488.         removeFile $tmp
  489.     }
  490.     -result {1 {CHILDKILLED {} SIGABRT SIGABRT}}
  491. }
  492. # Switches before the first argument
  493. test exec-14.1 {-keepnewline switch} {exec} {
  494.     exec -keepnewline [interpreter] $path(echo) foo
  495. } "foon"
  496. test exec-14.2 {-keepnewline switch} {exec} {
  497.     list [catch {exec -keepnewline} msg] $msg
  498. } {1 {wrong # args: should be "exec ?switches? arg ?arg ...?"}}
  499. test exec-14.3 {unknown switch} {exec} {
  500.     list [catch {exec -gorp} msg] $msg
  501. } {1 {bad switch "-gorp": must be -keepnewline or --}}
  502. test exec-14.4 {-- switch} {exec} {
  503.     list [catch {exec -- -gorp} msg] [string tolower $msg]
  504. } {1 {couldn't execute "-gorp": no such file or directory}}
  505. # Redirecting standard error separately from standard output
  506. test exec-15.1 {standard error redirection} {exec} {
  507.     exec [interpreter] "$path(echo)" "First line" > "$path(gorp.file)"
  508.     list [exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 2> "$path(gorp.file)"] 
  509.     [exec [interpreter] "$path(cat)" "$path(gorp.file)"]
  510. } {{} {foo bar}}
  511. test exec-15.2 {standard error redirection} {exec stdio} {
  512.     list [exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 
  513. | [interpreter] "$path(echo)" biz baz >$path(gorp.file) 2> "$path(gorp.file2)"] 
  514.     [exec [interpreter] "$path(cat)" "$path(gorp.file)"] 
  515.     [exec [interpreter] "$path(cat)" "$path(gorp.file2)"]
  516. } {{} {biz baz} {foo bar}}
  517. test exec-15.3 {standard error redirection} {exec stdio} {
  518.     list [exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 
  519.         | [interpreter] "$path(echo)" biz baz 2>$path(gorp.file) > "$path(gorp.file2)"] 
  520.     [exec [interpreter] "$path(cat)" "$path(gorp.file)"] 
  521.     [exec [interpreter] "$path(cat)" "$path(gorp.file2)"]
  522. } {{} {foo bar} {biz baz}}
  523. test exec-15.4 {standard error redirection} {exec} {
  524.     set f [open "$path(gorp.file)" w]
  525.     puts $f "Line 1"
  526.     flush $f
  527.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 2>@ $f
  528.     puts $f "Line 3"
  529.     close $f
  530.     exec [interpreter] "$path(cat)" "$path(gorp.file)"
  531. } {Line 1
  532. foo bar
  533. Line 3}
  534. test exec-15.5 {standard error redirection} {exec} {
  535.     exec [interpreter] "$path(echo)" "First line" > "$path(gorp.file)"
  536.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 2>> "$path(gorp.file)"
  537.     exec [interpreter] "$path(cat)" "$path(gorp.file)"
  538. } {First line
  539. foo bar}
  540. test exec-15.6 {standard error redirection} {exec stdio} {
  541.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" > "$path(gorp.file2)" 2> "$path(gorp.file)" 
  542.     >& "$path(gorp.file)" 2> "$path(gorp.file2)" | [interpreter] "$path(echo)" biz baz
  543.     list [exec [interpreter] "$path(cat)" "$path(gorp.file)"] [exec [interpreter] "$path(cat)" "$path(gorp.file2)"]
  544. } {{biz baz} {foo bar}}
  545. test exec-15.7 {standard error redirection 2>@1} {exec stdio} {
  546.     # This redirects stderr output into normal result output from exec
  547.     exec [interpreter] "$path(sh)" -c ""$path(echo)" foo bar 1>&2" 2>@1
  548. } {foo bar}
  549. test exec-16.1 {flush output before exec} {exec} {
  550.     set f [open $path(gorp.file) w]
  551.     puts $f "First line"
  552.     exec [interpreter] $path(echo) "Second line" >@ $f
  553.     puts $f "Third line"
  554.     close $f
  555.     exec [interpreter] $path(cat) $path(gorp.file)
  556. } {First line
  557. Second line
  558. Third line}
  559. test exec-16.2 {flush output before exec} {exec} {
  560.     set f [open $path(gorp.file) w]
  561.     puts $f "First line"
  562.     exec [interpreter] << {puts stderr {Second line}} >&@ $f > $path(gorp.file2)
  563.     puts $f "Third line"
  564.     close $f
  565.     exec [interpreter] $path(cat) $path(gorp.file)
  566. } {First line
  567. Second line
  568. Third line}
  569. set path(script) [makeFile {} script]
  570. test exec-17.1 { inheriting standard I/O } {exec} {
  571.     set f [open $path(script) w]
  572.     puts -nonewline $f {close stdout
  573. set f [}
  574.     puts $f [list open $path(gorp.file) w]]
  575.     puts $f [list catch 
  576.     [list exec [info nameofexecutable] $path(echo) foobar &]]
  577.     puts $f [list exec [info nameofexecutable] $path(sleep) 2]
  578.     puts $f {close $f}
  579.     close $f
  580.     catch {exec [interpreter] $path(script)} result
  581.     set f [open $path(gorp.file) r]
  582.     lappend result [read $f]
  583.     close $f
  584.     set result
  585. } {{foobar
  586. }}
  587. test exec-18.1 { exec cat deals with weird file names} {exec tempNotWin} {
  588.     # This is cross-platform, but the cat isn't predictably correct on
  589.     # Windows.
  590.     set f "foo[{blah"
  591.     set path(fooblah) [makeFile {} $f]
  592.     set fout [open $path(fooblah) w]
  593.     puts $fout "contents"
  594.     close $fout
  595.     set res [list [catch {exec cat $path(fooblah)} msg] $msg]
  596.     removeFile $f
  597.     set res
  598. } {0 contents}
  599. # Note that this test cannot be adapted to work on Windows; that platform has
  600. # no kernel support for an analog of O_APPEND.
  601. test exec-19.1 {exec >> uses O_APPEND} {
  602.     -constraints {exec unix}
  603.     -setup {
  604. set tmpfile [makeFile {0} tmpfile.exec-19.1]
  605.     }
  606.     -body {
  607. # Note that we have to allow for the current contents of the
  608. # temporary file, which is why the result is 14 and not 12
  609. exec /bin/sh -c 
  610.     {for a in 1 2 3; do sleep 1; echo $a; done} >>$tmpfile &
  611. exec /bin/sh -c 
  612.     {for a in a b c; do sleep 1; echo $a; done} >>$tmpfile &
  613. # The above two shell invokations take about 3 seconds to
  614. # finish, so allow 5s (in case the machine is busy)
  615. after 5000
  616. # Check that no bytes have got lost through mixups with
  617. # overlapping appends, which is only guaranteed to work when
  618. # we set O_APPEND on the file descriptor in the [exec >>...]
  619. file size $tmpfile
  620.     }
  621.     -cleanup {
  622. removeFile $tmpfile
  623.     }
  624.     -result 14
  625. }
  626. # cleanup
  627. foreach file {script gorp.file gorp.file2 echo cat wc sh sleep exit err} {
  628.     removeFile $file
  629. }
  630. unset -nocomplain path
  631. ::tcltest::cleanupTests
  632. return