Browse Source
A native windows Tcl 8.6 runner's text channels default the READ eofchar
to ctrl-z (\x1a; the default 9.x removed), so the multi-process child
capture read in runtests_run_child_process silently truncated child
stdout at the first \x1a. The MULTISHELL polyglot deliberately carries a
ctrl-z tailblock and the scriptwrap/dtplite suites echo polyglot content
into their output, so every such file misreported as missing-cleanupTests
with zero observed tests under an 8.6 -jobs run (children completed and
exited 0; byte-proven: text read 8689 chars of a 256523-byte capture,
first \x1a at offset 8762 - full via binary read). Fix: fconfigure
-eofchar {} on both the stdout and stderr capture reads, making 8.6 match
the 9.x read semantics (translation stays auto). Immune paths that
obscured the mechanism: 9.x parent, MSYS/unix-mode 8.6, singleproc
(in-process runx capture). An apparent file-count/concurrency dependence
during diagnosis was a red herring - the 'passing' repros had -jobs
placed after the trailing file-tail globs, silently running singleproc.
New regression pin runner/testsuites/capture/ctrlz_capture.test emits a
\x1a byte before its test result, so a truncating runner turns it into a
missing-cleanupTests warn in any future multiproc run.
Verified: scriptwrap family under tclsh86ts -jobs 8 went from 5 warned
files / 0 counted tests to 10 counted (9 pass + pre-existing isunix
skip); scriptwrap+punkboot+binscripts neighbourhoods now count 123 tests
on the 8.6 leg, identical to the 9.0 leg (18 tests across 6 files were
previously invisible); runner suites incl the pin pass on 86ts and 90s;
9.0 behaviour unchanged.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
master
2 changed files with 40 additions and 0 deletions
@ -0,0 +1,28 @@
|
||||
# -*- tcl -*- |
||||
#added 2026-08-09 (agent) - regression pin for the runtests.tcl multiproc capture read |
||||
#(runtests_run_child_process): a native windows Tcl 8.6 runner's text channels default to |
||||
#ctrl-z (\x1a) as the READ eofchar (9.x removed the default), which silently truncated the |
||||
#child stdout capture at the first \x1a in output. The MULTISHELL polyglot deliberately |
||||
#carries a ctrl-z tailblock and the scriptwrap/dtplite suites echo polyglot content, so |
||||
#every such file misreported as missing-cleanupTests with zero observed tests under an |
||||
#8.6 -jobs run. The capture reads now clear -eofchar (matching 9.x semantics). |
||||
# |
||||
#This file deliberately emits a ctrl-z byte on stdout BEFORE its test result and summary |
||||
#line: under a truncating runner the summary vanishes and THIS file reports |
||||
#missing-cleanupTests (warn status) - the pin is this file completing with its pass |
||||
#counted in any multiproc run on any supported runner interpreter. Singleproc runs |
||||
#capture in-process (shellrun runx) and were never affected; the fixture is harmless there. |
||||
package require tcltest |
||||
|
||||
namespace eval ::testspace { |
||||
namespace import ::tcltest::* |
||||
|
||||
#the ctrl-z byte on stdout IS the fixture - flushed so it precedes all tcltest output |
||||
puts stdout "ctrlz-capture-fixture: \x1a <- ctrl-z byte emitted before test output" |
||||
flush stdout |
||||
|
||||
test runtests_capture_survives_ctrlz {a ctrl-z byte in child output does not truncate the runner's capture of this file (8.6 read-eofchar class)} -body { |
||||
return 1 |
||||
} -result 1 |
||||
} |
||||
tcltest::cleanupTests |
||||
Loading…
Reference in new issue