test-lib-functions: improve diagnostic output for trace2 data assertions
test_trace2_data is a bare grep that silently exits on failure. Add a more informative variant that verifies the event appears exactly once and reports what went wrong: key not found, multiple entries, or value mismatch. Diagnostics go to FD 4 like test_grep. Before (value mismatch): $ test_trace2_data status count/changed 999 <trace2.txt $ echo $? 1 (no output) After: $ test_trace2_data_singular status count/changed 999 <trace2.txt error: trace2 data 'status/count/changed' expected: 999 actual: 0 Signed-off-by: Kristofer Karlsson <krka@spotify.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Kristofer Karlsson committed
Jul 11, 2026 at 13:27 UTC
e69450189128ae285871bd821f78c71e9f729599
1 file changed
+36
t/test-lib-functions.sh
+36
index 809c662124..3521efe5d7 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -1996,6 +1996,42 @@ test_trace2_data () {
grep -e '"category":"'"$1"'","key":"'"$2"'","value":"'"$3"'"'
}
+# Check that the given trace2 data event has the expected value and
+# appears exactly once. Produces a diagnostic on failure.
+#
+# test_trace2_data_singular <category> <key> <value> [<label>]
+test_trace2_data_singular () {
+ local category="$1" key="$2" expect_val="$3"
+ local label_suffix="${4:+ [$4]}"
+ local kv_pattern='"category":"'"$category"'","key":"'"$key"'","value":"\([^"]*\)"'
+ local actual
+
+ actual=$(sed -n "s|.*${kv_pattern}.*|\1|p") &&
+
+ if test -z "$actual"
+ then
+ echo >&4 "error: trace2 data '$category/$key'$label_suffix not found"
+ return 1
+ fi &&
+
+ case "$actual" in
+ *"
+"*)
+ echo >&4 "error: trace2 data '$category/$key'$label_suffix has multiple entries, expected 1"
+ printf '%s\n' "$actual" | sed 's/^/ actual: /' >&4
+ return 1
+ ;;
+ esac &&
+
+ if test "$actual" != "$expect_val"
+ then
+ echo >&4 "error: trace2 data '$category/$key'$label_suffix"
+ echo >&4 " expected: $expect_val"
+ echo >&4 " actual: $actual"
+ return 1
+ fi
+}
+
# Given a GIT_TRACE2_EVENT log over stdin, writes to stdout a list of URLs
# sent to git-remote-https child processes.
test_remote_https_urls() {