diff options
Diffstat (limited to 'tests/exec2.test')
-rw-r--r-- | tests/exec2.test | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/exec2.test b/tests/exec2.test index e43bba0..b4b42cc 100644 --- a/tests/exec2.test +++ b/tests/exec2.test @@ -5,6 +5,16 @@ source [file dirname [info script]]/testing.tcl needs cmd exec +foreach i {pipe signal wait} { + testConstraint $i [expr {[info commands $i] ne ""}] +} +# Some Windows platforms (e.g. AppVeyor) produce ENOSPC rather than killing +# the child with SIGPIPE). So turn off this test for that platform +if {[info exists env(MSYSTEM)] && $env(MSYSTEM) eq "MINGW32"} { + testConstraint nomingw32 0 +} else { + testConstraint nomingw32 1 +} set d \" set s ' @@ -44,4 +54,50 @@ test exec2-2.4 "Remove all env var" { array set env [array get saveenv] +test exec2-3.1 "close pipeline return value" { + set f [open |false] + set rc [catch {close $f} msg opts] + lassign [dict get $opts -errorcode] status pid exitcode + list $rc $msg $status $exitcode +} {1 {child process exited abnormally} CHILDSTATUS 1} + +test exec2-3.2 "close pipeline return value" -constraints {pipe nomingw32} -body { + # Create a pipe and immediately close the read end + lassign [pipe] r w + close $r + # Write more than 64KB which is maximum size of the pipe buffers + # on all systems we have seen + set bigstring [string repeat a 100000] + set f [open [list |cat << $bigstring >$@w]] + set rc [catch {close $f} msg opts] + lassign [dict get $opts -errorcode] status pid exitcode + list $rc $msg $status $exitcode +} -match glob -result {1 {child killed*} CHILDKILLED SIGPIPE} + +test exec2-3.3 "close pipeline with SIGPIPE blocked" -constraints {pipe signal nomingw32} -body { + # Create a pipe and immediately close the read end + lassign [pipe] r w + close $r + signal block SIGPIPE + # Write more than 64KB which is maximum size of the pipe buffers + # on all systems we have seen + set bigstring [string repeat a 100000] + set f [open [list |cat << $bigstring >$@w 2>/dev/null]] + set rc [catch {close $f} msg opts] + lassign [dict get $opts -errorcode] status pid exitcode + list $rc $msg $status $exitcode +} -match glob -result {1 {child process exited*} CHILDSTATUS 1} -cleanup { + signal default SIGPIPE +} + +test exec2-3.4 "wait for background task" -constraints wait -body { + set pid [exec sleep 0.1 &] + lassign [wait $pid] status newpid exitcode + if {$pid != $newpid} { + error "Got wrong pid from wait" + } else { + list $status $exitcode + } +} -result {CHILDSTATUS 0} + testreport |