A followup to:
https://sourceware.org/pipermail/cygwin-patches/2025q2/013674.html

--
Regards,
Christian

From b0a5ba548cc9041246b1d6396d16292c77399605 Mon Sep 17 00:00:00 2001
From: Christian Franke <christian.fra...@t-online.de>
Date: Mon, 28 Apr 2025 14:32:34 +0200
Subject: [PATCH] Cygwin: CI: cygstress: improve error handling and add verbose
 mode

Check for unexpected output (Cygwin error messages).  Combine multiple
error findings into one FAILURE line per test.  Avoid a race in the
watchdog process.  Print all outputs if the new -v option is used.

Signed-off-by: Christian Franke <christian.fra...@t-online.de>
---
 winsup/testsuite/stress/cygstress | 53 +++++++++++++++++--------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/winsup/testsuite/stress/cygstress 
b/winsup/testsuite/stress/cygstress
index 670f5d660..9c274ea32 100755
--- a/winsup/testsuite/stress/cygstress
+++ b/winsup/testsuite/stress/cygstress
@@ -7,7 +7,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 #
 
-set -e -o pipefail
+set -e -o pipefail # pipefail is required
 
 usage()
 {
@@ -19,6 +19,7 @@ Usage: ${0##*/} [OPTION...] {CI|WORK|FAIL|test...}
   -c LIST   set CPU affinity to LIST
   -s PATH   stress-ng executable [default: stress-ng]
   -t N      run each test for at least N seconds [default: 5]
+  -v        print stress-ng output always [default: on error only]
   -w N      start N workers for each test [default: 2]
 
   CI        run all tests tagged CI
@@ -445,7 +446,7 @@ stress_tests='
 
 stress_ng="stress-ng"
 timeout=5; workers=2
-dryrun=false; force=false
+dryrun=false; force=false; verbose=false
 taskset=
 
 while :; do case $1 in
@@ -454,6 +455,7 @@ while :; do case $1 in
   -n) dryrun=true ;;
   -s) shift; stress_ng=$1 ;;
   -t) shift; timeout=$1 ;;
+  -v) verbose=true ;;
   -w) shift; workers=$1 ;;
   -*) usage ;;
   *) break ;;
@@ -479,7 +481,7 @@ stress_ng_name=${stress_ng##*/}
 tempdir=${TMP:-/tmp}
 logdir=${LOGDIR:-/tmp/logdir}
 
-mkdir -p ${logdir}
+mkdir -p "$logdir"
 
 find_stress()
 {
@@ -509,15 +511,16 @@ stress()
   test -z "$taskset" || cmd+=(--taskset "$taskset")
   cmd+=(--"$name" "$workers" "$@")
 
-  if $dryrun; then
+  if $dryrun || $verbose; then
     echo '$' "${cmd[@]}"
-    return 0
+    ! $dryrun || return 0
   fi
 
   (
     t=$(date +%s); : $((t += timeout + 30)); sleep 1
     while [ "$(date +%s)" -lt "$t" ]; do sleep 1; done
-    stop_stress & # TODO: without '&', 'exit 0' below is not reached (Hmm...)
+    # Another delay to let 'exit 0' occur before 'kill $watchdog'
+    ( sleep 1; stop_stress ) &
     exit 0
   ) &
   local watchdog=$!
@@ -525,41 +528,43 @@ stress()
 
   mkdir "$td"
   local rc=0
-  "${cmd[@]}" >$logfile 2>&1 || rc=$?
+  if $verbose; then
+    # This requires '-o pipefail'
+    "${cmd[@]}" 2>&1 | tee "$logfile" || rc=$?
+  else
+    "${cmd[@]}" >"$logfile" 2>&1 || rc=$?
+  fi
 
   kill $watchdog 2>/dev/null ||:
   trap - SIGINT SIGTERM
 
-  local ok=true
+  local errs=
   if wait $watchdog; then
     sleep 2
-    echo ">>> FAILURE: $name" "$@" "(command hangs)"
-    ok=false
+    errs=", command hangs"
   fi
 
   local p
   if p=$(find_stress); then
-    echo ">>> FAILURE: $name" "$@" "(processes left, exit status $rc):"
-    echo "$p"
+    errs+=", processes left"
     stop_stress
     sleep 2
-    ok=false
   fi
 
-  if ! rmdir "$td" 2>/dev/null; then
-    echo ">>> FAILURE: $name" "$@" "(files left in '$td', exit status $rc)"
-    ok=false
-  fi
+  rmdir "$td" 2>/dev/null || errs+=", files left in '$td'"
 
-  if ! $ok; then
-    return 1
-  fi
-  if [ $rc != 0 ]; then
-    cat ${logfile}
-    echo ">>> FAILURE: $name" "$@" "(exit status $rc)"; echo
+  ! grep -Eqv '^(stress-ng|info):' "$logfile" || errs+=", unexpected output"
+
+  if [ "${rc}${errs:+t}" != "0" ]; then
+    $verbose || cat "$logfile"
+    echo ">>> FAILURE: $name" "$@" "(exit status ${rc}${errs})"
+    ! [ ${p:+t} ] || echo "$p"
+    echo
     return 1
   fi
-  echo ">>> SUCCESS: $name" "$@" ""
+  echo ">>> SUCCESS: $name" "$@"
+  ! $verbose || echo
+  return 0
 }
 
 if p=$(find_stress); then
-- 
2.45.1

Reply via email to