summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--tests/chanio.test54
-rw-r--r--tests/io.test54
3 files changed, 109 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 8cb6958..c2642b5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2008-04-04 Andreas Kupries <andreask@activestate.com>
+ * tests/io.test (io-53.9): Added testcase for [Bug 780533], based
+ * tests/chanio.test: on Alexandre's test script. Also fixed
+ problem with timer in preceding test, was not canceled properly
+ in the ok case.
+
+2008-04-04 Andreas Kupries <andreask@activestate.com>
+
* generic/tclIORChan.c (ReflectOutput): Allow zero return from
write when input was zero-length anyway. Otherwise keept it an
error, and separate the message from 'written too much'.
diff --git a/tests/chanio.test b/tests/chanio.test
index 4b492d1..57b115c 100644
--- a/tests/chanio.test
+++ b/tests/chanio.test
@@ -13,7 +13,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: chanio.test,v 1.4 2008/04/03 18:06:02 andreas_kupries Exp $
+# RCS: @(#) $Id: chanio.test,v 1.5 2008/04/04 20:14:19 andreas_kupries Exp $
if {[catch {package require tcltest 2}]} {
chan puts stderr "Skipping tests in [info script]. tcltest 2 required."
@@ -6915,11 +6915,12 @@ test chan-io-53.8 {CopyData: async callback and error handling, Bug 1932639} -se
lappend ::RES [expr {($sbs > 0) ? "sync/FAIL" : "sync/OK"}] $sbs
# Now let the async part happen. Should capture the error in cmd
# via bgerror. If not break the event loop via timer.
- after 1000 {
+ set token [after 1000 {
lappend ::RES {bgerror/FAIL timeout}
set ::forever has-been-reached
- }
+ }]
vwait ::forever
+ catch {after cancel $token}
# Report
set ::RES
} -cleanup {
@@ -6932,6 +6933,53 @@ test chan-io-53.8 {CopyData: async callback and error handling, Bug 1932639} -se
removeFile foo
removeFile bar
} -result {0 sync/OK 0 {CMD 2} {bgerror/OK !STOP}}
+test chan-io-53.9 {CopyData: -size and event interaction, Bug 780533} -setup {
+ set out [makeFile {} out]
+ set err [makeFile {} err]
+ set pipe [open "|[info nameofexecutable] 2> $err" r+]
+ chan configure $pipe -translation binary -buffering line
+ chan puts $pipe {
+ chan configure stdout -translation binary -buffering line
+ chan puts stderr Waiting...
+ after 1000
+ foreach x {a b c} {
+ chan puts stderr Looping...
+ chan puts $x
+ after 500
+ }
+ proc bye args {
+ if {[chan gets stdin line]<0} {
+ chan puts stderr "CHILD: EOF detected, exiting"
+ exit
+ } else {
+ chan puts stderr "CHILD: ignoring line: $line"
+ }
+ }
+ chan puts stderr Now-sleeping-forever
+ chan event stdin readable bye
+ vwait forever
+ }
+ proc ::done args {
+ set ::forever OK
+ return
+ }
+ set ::forever {}
+ set out [open $out w]
+} -constraints {stdio openpipe fcopy} -body {
+ chan copy $pipe $out -size 6 -command ::done
+ set token [after 5000 {
+ set ::forever {fcopy hangs}
+ }]
+ vwait ::forever
+ catch {after cancel $token}
+ set ::forever
+} -cleanup {
+ chan close $pipe
+ rename ::done {}
+ removeFile out
+ removeFile err
+ catch {unset ::forever}
+} -result OK
test chan-io-54.1 {Recursive channel events} {socket fileevent} {
# This test checks to see if file events are delivered during recursive
diff --git a/tests/io.test b/tests/io.test
index 6c092cb..488f28b 100644
--- a/tests/io.test
+++ b/tests/io.test
@@ -13,7 +13,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: io.test,v 1.81 2008/04/03 18:06:01 andreas_kupries Exp $
+# RCS: @(#) $Id: io.test,v 1.82 2008/04/04 20:14:17 andreas_kupries Exp $
if {[catch {package require tcltest 2}]} {
puts stderr "Skipping tests in [info script]. tcltest 2 required."
@@ -6915,11 +6915,12 @@ test io-53.8 {CopyData: async callback and error handling, Bug 1932639} -setup {
lappend ::RES [expr {($sbs > 0) ? "sync/FAIL" : "sync/OK"}] $sbs
# Now let the async part happen. Should capture the error in cmd
# via bgerror. If not break the event loop via timer.
- after 1000 {
+ set token [after 1000 {
lappend ::RES {bgerror/FAIL timeout}
set ::forever has-been-reached
- }
+ }]
vwait ::forever
+ catch {after cancel $token}
# Report
set ::RES
} -cleanup {
@@ -6932,6 +6933,53 @@ test io-53.8 {CopyData: async callback and error handling, Bug 1932639} -setup {
removeFile foo
removeFile bar
} -result {0 sync/OK 0 {CMD 2} {bgerror/OK !STOP}}
+test io-53.9 {CopyData: -size and event interaction, Bug 780533} -setup {
+ set out [makeFile {} out]
+ set err [makeFile {} err]
+ set pipe [open "|[info nameofexecutable] 2> $err" r+]
+ fconfigure $pipe -translation binary -buffering line
+ puts $pipe {
+ fconfigure stdout -translation binary -buffering line
+ puts stderr Waiting...
+ after 1000
+ foreach x {a b c} {
+ puts stderr Looping...
+ puts $x
+ after 500
+ }
+ proc bye args {
+ if {[gets stdin line]<0} {
+ puts stderr "CHILD: EOF detected, exiting"
+ exit
+ } else {
+ puts stderr "CHILD: ignoring line: $line"
+ }
+ }
+ puts stderr Now-sleeping-forever
+ fileevent stdin readable bye
+ vwait forever
+ }
+ proc ::done args {
+ set ::forever OK
+ return
+ }
+ set ::forever {}
+ set out [open $out w]
+} -constraints {stdio openpipe fcopy} -body {
+ fcopy $pipe $out -size 6 -command ::done
+ set token [after 5000 {
+ set ::forever {fcopy hangs}
+ }]
+ vwait ::forever
+ catch {after cancel $token}
+ set ::forever
+} -cleanup {
+ close $pipe
+ rename ::done {}
+ removeFile out
+ removeFile err
+ catch {unset ::forever}
+} -result OK
test io-54.1 {Recursive channel events} {socket fileevent} {
# This test checks to see if file events are delivered during recursive