aboutsummaryrefslogtreecommitdiff
path: root/tests/exec2.test
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2019-08-21 11:27:56 +1000
committerSteve Bennett <steveb@workware.net.au>2019-09-06 20:08:58 +1000
commitca4fa3865a730857b385e6e34af67db3471e0089 (patch)
treef0489c0f53f865c747461455a3955e98e0ae9d62 /tests/exec2.test
parent4dc539a582764fc4ae6788fc3f1dc0e6e7cd95d4 (diff)
downloadjimtcl-ca4fa3865a730857b385e6e34af67db3471e0089.zip
jimtcl-ca4fa3865a730857b385e6e34af67db3471e0089.tar.gz
jimtcl-ca4fa3865a730857b385e6e34af67db3471e0089.tar.bz2
signal: Add 'signal block' support
This allows a signal to be blocked by setting it's handler to SIG_IGN Can be used to block SIGPIPE for exec Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'tests/exec2.test')
-rw-r--r--tests/exec2.test32
1 files changed, 25 insertions, 7 deletions
diff --git a/tests/exec2.test b/tests/exec2.test
index 08f3d11..b4b42cc 100644
--- a/tests/exec2.test
+++ b/tests/exec2.test
@@ -5,12 +5,15 @@
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 commands pipe] ne "" && [env MSYSTEM ""] ne "MINGW32"} {
- testConstraint pipe 1
+if {[info exists env(MSYSTEM)] && $env(MSYSTEM) eq "MINGW32"} {
+ testConstraint nomingw32 0
} else {
- testConstraint pipe 0
+ testConstraint nomingw32 1
}
set d \"
@@ -58,7 +61,7 @@ test exec2-3.1 "close pipeline return value" {
list $rc $msg $status $exitcode
} {1 {child process exited abnormally} CHILDSTATUS 1}
-test exec2-3.2 "close pipeline return value" -constraints pipe -body {
+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
@@ -71,7 +74,23 @@ test exec2-3.2 "close pipeline return value" -constraints pipe -body {
list $rc $msg $status $exitcode
} -match glob -result {1 {child killed*} CHILDKILLED SIGPIPE}
-test exec2-3.4 "wait for background task" {
+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} {
@@ -79,7 +98,6 @@ test exec2-3.4 "wait for background task" {
} else {
list $status $exitcode
}
-} {CHILDSTATUS 0}
-
+} -result {CHILDSTATUS 0}
testreport