git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/2] test-lib: set BASH_XTRACEFD automatically

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
May 12, 2016, 15:44 UTC
Message-ID
<ffc132a9d6cdb97c49861bd9b6b2c6aca42cec93.1463067811.git.johannes.schindelin@gmx.de>
In-Reply-To
<cover.1463067811.git.johannes.schindelin@gmx.de>
From: Jeff King <peff@peff.net>

Passing "-x" to a test script enables the shell's "set -x" tracing, which can help with tracking down the command that is causing a failure. Unfortunately, it can also _cause_ failures in some tests that redirect the stderr of a shell function. Inside the function the shell continues to respect "set -x", and the trace output is collected along with whatever stderr is generated normally by the function.

You can see an example of this by running:
  ./t0040-parse-options.sh -x -i

which will fail immediately in the first test, as it expects:

  test_must_fail some-cmd 2>output.err

to leave output.err empty (but with "-x" it has our trace output).

Unfortunately there isn't a portable or scalable solution to this. We could teach test_must_fail to disable "set -x", but that doesn't help any of the other functions or subshells.

However, we can work around it by pointing the "set -x" output to our descriptor 4, which always points to the original stderr of the test script. Unfortunately this only works for bash, but it's better than nothing (and other shells will just ignore the BASH_XTRACEFD variable).

The patch itself is a simple one-liner, but note the caveats in the accompanying comments.

Automatic tests for our "-x" option may be a bit too meta (and a pain, because they are bash-specific), but I did confirm that it works correctly both with regular "-x" and with "--verbose-only=1". This works because the latter flips "set -x" off and on for particular tests (if it didn't, we would get tracing for all tests, as going to descriptor 4 effectively circumvents the verbose flag).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 t/README      |  6 +++---
 t/test-lib.sh | 13 +++++++++++++
 2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/t/README b/t/README
index 1dc908e..76a0daa 100644
--- a/t/README
+++ b/t/README
@@ -84,9 +84,9 @@ appropriately before running "make".
 
 -x::
 	Turn on shell tracing (i.e., `set -x`) during the tests
-	themselves. Implies `--verbose`. Note that this can cause
-	failures in some tests which redirect and test the
-	output of shell functions. Use with caution.
+	themselves. Implies `--verbose`. Note that in non-bash shells,
+	this can cause failures in some tests which redirect and test
+	the output of shell functions. Use with caution.
 
 -d::
 --debug::
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 286c5f3..0055ebb 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -322,6 +322,19 @@ else
 	exec 4>/dev/null 3>/dev/null
 fi
 
+# Send any "-x" output directly to stderr to avoid polluting tests
+# which capture stderr. We can do this unconditionally since it
+# has no effect if tracing isn't turned on.
+#
+# Note that this sets up the trace fd as soon as we assign the variable, so it
+# must come after the creation of descriptor 4 above. Likewise, we must never
+# unset this, as it has the side effect of closing descriptor 4, which we
+# use to show verbose tests to the user.
+#
+# Note also that we don't need or want to export it. The tracing is local to
+# this shell, and we would not want to influence any shells we exec.
+BASH_XTRACEFD=4
+
 test_failure=0
 test_count=0
 test_fixed=0
-- 
2.8.2.465.gb077790
Previous: Johannes SchindelinNext: Junio C Hamano
Message 13 of 17 in “Work on t3404 in preparation for rebase--helper”
  1. 0/2 Work on t3404 in preparation for rebase--helperJohannes Schindelin, May 10, 2016
  2. 1/2 t3404: fix typoJohannes Schindelin, May 10, 2016
  3. 2/2 t3404: be resilient against running with the -x flagJohannes Schindelin, May 10, 2016
  4. Junio C HamanoMay 10, 2016
  5. Jeff KingMay 10, 2016
  6. Junio C HamanoMay 10, 2016
  7. test-lib: set BASH_XTRACEFD automaticallyJeff King, May 10, 2016
  8. Junio C HamanoMay 10, 2016
  9. test-lib: set BASH_XTRACEFD automaticallyJeff King, May 11, 2016
  10. Johannes SchindelinMay 12, 2016
  11. 0/2 Work on t3404 in preparation for rebase--helperJohannes Schindelin, May 12, 2016
  12. 1/2 t3404: fix typoJohannes Schindelin, May 12, 2016
  13. 2/2 test-lib: set BASH_XTRACEFD automaticallyJohannes Schindelin, May 12, 2016
  14. Junio C HamanoMay 12, 2016
  15. Johannes SchindelinMay 13, 2016
  16. Junio C HamanoMay 13, 2016
  17. Johannes SchindelinMay 16, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.