From: Richard Hansen Date: Mon, 24 Feb 2025 00:21:23 +0000 (-0500) Subject: tests: test TAP stdout/stderr order with --merge --stderr-prefix X-Git-Tag: v1.17.90~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3aa705c45b06f85da7942f50fe071ba4bf754ef5;p=thirdparty%2Fautomake.git tests: test TAP stdout/stderr order with --merge --stderr-prefix * t/tap-stderr-prefix.tap: Add a test checking the processing order of stdout lines relative to stderr lines when the TAP driver is passed `--merge' and `--stderr-prefix'. --- diff --git a/t/tap-stderr-prefix.tap b/t/tap-stderr-prefix.tap index 718988991..7f2ea2457 100644 --- a/t/tap-stderr-prefix.tap +++ b/t/tap-stderr-prefix.tap @@ -124,6 +124,48 @@ command_ok_ "$PFXFLAG --merge: prefixed stderr in log" -- \ command_ok_ "$PFXFLAG --merge: missing final newline is added" -- \ grep -q '^##@%:@ final stderr line without newline terminator$' all.log + +# Test preserved stdout/stderr ordering. The sleeps between writes are +# necessary because stdout and stderr are independent and thus inherently race +# with each other. (The kernel can wake up the two downstream reader threads +# in the opposite order from the upstream writes. Or, if the TAP driver was +# changed to use select or poll, the upstream writer can write to both streams +# before the kernel wakes up the one downstream reader.) +PFXFLAG='--stderr-prefix "# "' +desc="$PFXFLAG --merge stdout/stderr ordering" +cat >all.test <&2 +sleep 1 +echo 'ok 1' +sleep 1 +echo 'stderr 2' >&2 +END +chmod a+x all.test || bailout_ "failed to make all.test executable" + +check_log_line_order() { + { + grep -xe "$1" all.log + grep -xe "$2" all.log + sed -n -e '/^\('"$1"'\)$/,${/^\('"$2"'\)$/p}' all.log | grep -xe "$2" + } >&2 # Write to stderr in case $1 or $2 looks like a TAP directive. +} + +command_ok_ "$desc: make check passes" -- \ + run_make -O AM_TEST_LOG_DRIVER_FLAGS="$PFXFLAG --merge" check +dumpf all.log +command_ok_ "$desc: result counts are correct" -- \ + count_test_results total=1 pass=1 fail=0 xpass=0 xfail=0 skip=0 error=0 +command_ok_ "$desc: '1..1' before 'stderr 1'" -- \ + check_log_line_order '1\.\.1' '# stderr 1' +command_ok_ "$desc: 'stderr 1' before 'ok 1'" -- \ + check_log_line_order '# stderr 1' 'ok 1' +command_ok_ "$desc: 'ok 1' before 'stderr 2'" -- \ + check_log_line_order 'ok 1' '# stderr 2' + + plan_ now :