]> git.ipfire.org Git - thirdparty/automake.git/commitdiff
tests: test TAP stdout/stderr order with --merge --stderr-prefix
authorRichard Hansen <rhansen@rhansen.org>
Mon, 24 Feb 2025 00:21:23 +0000 (19:21 -0500)
committerKarl Berry <karl@freefriends.org>
Mon, 24 Feb 2025 22:25:39 +0000 (14:25 -0800)
* 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'.

t/tap-stderr-prefix.tap

index 718988991a22d801a644976300a988bdc0d48e82..7f2ea2457dd44e94b08c62f2eac75be56f84e876 100644 (file)
@@ -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 <<END || bailout_ "failed to create all.test"
+#!/bin/sh
+echo '1..1'
+sleep 1
+echo 'stderr 1' >&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
 
 :