From: Marc Herbert <marc.herb...@linux.intel.com>

Stop relying on the imprecise bash $SECONDS variable as a test start
timestamp when scanning the logs for issues.

$SECONDS was convenient because it came "for free" and did not require
any time_init(). But it was not fine-grained enough and its rounding
process is not even documented. Keep using $SECONDS in log messages
where it is easy to use and more user-friendly than bare timestamps, but
switch the critical journalctl scan to a new, absolute NDTEST_START
timestamp initialized when test/common is sourced. Use a SECONDS-based,
rough sanity check in time_init() to make sure test/common is always
sourced early.

Signed-off-by: Marc Herbert <marc.herb...@linux.intel.com>
---
 test/common | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 2 deletions(-)

diff --git a/test/common b/test/common
index 2d076402ef7c..0214c6aaed5f 100644
--- a/test/common
+++ b/test/common
@@ -15,6 +15,25 @@ err()
        exit "$rc"
 }
 
+# Initialize the NDTEST_START timestamp used to scan the logs.
+# Insert an anchor/bookmark in the logs to quickly locate the start of any 
test.
+time_init()
+{
+       # Refuse to run if anything lasted for too long before this point
+       # because that would make NDTEST_START incorrect.
+       test "$SECONDS" -le 1 || err 'test/common must be included first!'
+
+       NDTEST_START=$(LC_TIME=C date '+%F %T.%3N')
+
+       # Log anchor, especially useful when running tests back to back
+       printf "<5>%s@%ds: sourcing test/common: NDTEST_START=%s\n" \
+               "$test_basename" "$SECONDS" "$NDTEST_START" > /dev/kmsg
+
+       # Default value, can be overridden by the environment
+       : "${NDTEST_LOG_DBG:=false}"
+}
+time_init
+
 # Global variables
 
 # NDCTL
@@ -147,11 +166,40 @@ json2var()
 # $1: line number where this is called
 check_dmesg()
 {
+       if "$NDTEST_LOG_DBG"; then
+               # Keep a record of which log lines we scanned
+               journalctl -q -b --since "$NDTEST_START" \
+                       -o short-precise > journal-"$(basename "$0")".log
+       fi
+       # After enabling with `NDTEST_LOG_DBG=true meson test`, inspect with:
+       #    head -n 7 $(ls -1t build/journal-*.log | tac)
+       #    journalctl --since='- 5 min' -o short-precise -g 'test/common'
+
        # validate no WARN or lockdep report during the run
-       sleep 1
-       log=$(journalctl -r -k --since "-$((SECONDS+1))s")
+       log=$(journalctl -r -k --since "$NDTEST_START")
        grep -q "Call Trace" <<< "$log" && err "$1"
        true
+
+       # Log anchor, especially useful when running tests back to back
+       printf "<5>%s@%ds: test/common: check_dmesg() OK\n" "$test_basename" 
"$SECONDS" > /dev/kmsg
+
+       if "$NDTEST_LOG_DBG"; then
+           log_stress from_check_dmesg
+       fi
+}
+
+# While they should, many tests don't use check_dmesg(). So double down here. 
Also, this
+# runs later which is better.
+# Before enabling NDTEST_LOG_DBG=true, make sure no test started defining its 
own
+# EXIT trap.
+if "$NDTEST_LOG_DBG"; then
+    trap 'log_stress from_trap' EXIT
+fi
+
+log_stress()
+{
+       printf '<3>%s@%ds: NDTEST_LOG_DBG Call Trace; trying to break the next 
check_dmesg() %s\n' \
+               "$test_basename" "$SECONDS" "$1" > /dev/kmsg
 }
 
 # CXL COMMON
-- 
2.50.1


Reply via email to