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

Re: Do test-path_is_{file,dir,exists} make sense anymore with -x?

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Feb 26, 2019, 19:39 UTC
Message-ID
<20190226193912.GD19739@szeder.dev>
In-Reply-To
<20190226174316.GD19606@sigill.intra.peff.net>
On Tue, Feb 26, 2019 at 12:43:17PM -0500, Jeff King wrote:
Show 21 quoted lines
> On Tue, Feb 26, 2019 at 06:04:00PM +0100, SZEDER Gábor wrote:
> 
> > > Whereas:
> > > 
> > >     + test -f doesnotexist
> > >     + echo File doesnotexist doesn't exist.
> > >     File doesnotexist doesn't exist.
> > >     + false
> > >     error: last command exited with $?=1
> > > 
> > > Gives me the same thing, but I have to read 5 lines instead of 2 that
> > > ultimately don't tell me any more (and a bit of "huh, 'false' returned
> > > 1? Of course! Oh! It's faking things up and it's the 'echo' that
> > > matters...").
> > 
> > I didn't find this to be an issue, but because of functions like
> > 'test_seq' and 'test_must_fail' I've thought about suppressing '-x'
> > output for test helpers (haven't actually done anything about it,
> > though).
> 
> I'd be curious how you'd do that.

Well, I started replying with "Dunno" and explaining why I don't think that it can be done with 'test_must_fail'... but then got a bit of a lightbulb moment. Now look at this:

diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 80402a428f..16adcd54c9 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -664,7 +664,15 @@ list_contains () {
 #     Currently recognized signal names are: sigpipe, success.
 #     (Don't use 'success', use 'test_might_fail' instead.)
 
+restore_tracing () {
+	if test -n "$trace"
+	then
+		set -x
+	fi
+} 2>/dev/null 4>/dev/null
+
 test_must_fail () {
+	{ set +x ; } 2>/dev/null 4>/dev/null
 	case "$1" in
 	ok=*)
 		_test_ok=${1#ok=}
@@ -679,24 +687,29 @@ test_must_fail () {
 	if test $exit_code -eq 0 && ! list_contains "$_test_ok" success
 	then
 		echo >&4 "test_must_fail: command succeeded: $*"
+		restore_tracing
 		return 1
 	elif test_match_signal 13 $exit_code && list_contains "$_test_ok" sigpipe
 	then
+		restore_tracing
 		return 0
 	elif test $exit_code -gt 129 && test $exit_code -le 192
 	then
 		echo >&4 "test_must_fail: died by signal $(($exit_code - 128)): $*"
+		restore_tracing
 		return 1
 	elif test $exit_code -eq 127
 	then
 		echo >&4 "test_must_fail: command not found: $*"
+		restore_tracing
 		return 1
 	elif test $exit_code -eq 126
 	then
 		echo >&4 "test_must_fail: valgrind error: $*"
+		restore_tracing
 		return 1
 	fi
-	return 0
+	restore_tracing
 } 7>&2 2>&4
 
 # Similar to test_must_fail, but tolerates success, too.  This is


Yeah, it's a hassle, especially in a function with as many return
paths as 'test_must_fail', but look at its output:

  + test_must_fail git rev-parse nope --
  fatal: bad revision 'nope'
  + test_must_fail git rev-parse HEAD --
  48ab21c1a5972e0fa9d87da7c5da9982872b8db2
  test_must_fail: command succeeded: git rev-parse HEAD --
  + return 1
  error: last command exited with $?=1

Not even the 'set +x' shows up in the trace output!  Unfortunately,
that line is not particularly pleasing on the eyes, but I don't see
any way around that...

Perhaps we could even go one step further with this 'restore_tracing'
helper and add a parameter specifying its return code, so we could
make it the last command invoked in the test helper function, and then
even that 'return 1' would disappear from the trace output.
Furthermore, this would be helpful in those functions where the last
command's return code is relevant, e.g: 

  test_cmp() {
        { set +x ; } 2>/dev/null 4>/dev/null
        $GIT_TEST_CMP "$@"
        restore_tracing $?
  }


There are a couple of tricky cases:

  - Some test helper functions call other test helper functions, and
    in those cases tracing would be enabled upon returning from the
    inner helper function.  This is not an issue with e.g.
    'test_might_fail' or 'test_cmp_config', because the inner helper
    function is the last command anyway.  However, there is
    'test_must_be_empty', 'test_dir_is_empty', 'test_config',
    'test_commit', etc. which call the other test helper functions
    right at the start or in the middle.

  - && chains in test helper functions; we must make sure that the
    tracing is restored even in case of a failure.
Previous: Jeff KingNext: Jeff King
Message 7 of 42 in “tests: replace test -(d|f) with test_path_is_(dir|file)”
  1. 0/1 [GSoC][PATCH] tests: replace test -(d|f) with test_path_is_(dir|file)Rohit Ashiwal via GitGitGadget, Feb 26, 2019
  2. 1/1 tests: replace `test -(d|f)` with test_path_is_(dir|file)Rohit Ashiwal via GitGitGadget, Feb 26, 2019
  3. Duy NguyenFeb 26, 2019
  4. Do test-path_is_{file,dir,exists} make sense anymore with -x?Ævar Arnfjörð Bjarmason, Feb 26, 2019
  5. SZEDER GáborFeb 26, 2019
  6. Jeff KingFeb 26, 2019
  7. SZEDER GáborFeb 26, 2019
  8. Jeff KingFeb 26, 2019
  9. SZEDER GáborMar 3, 2019
  10. Jeff KingMar 5, 2019
  11. SZEDER GáborMar 4, 2019
  12. Jeff KingMar 5, 2019
  13. Matthieu MoyFeb 26, 2019
  14. Jeff KingFeb 26, 2019
  15. Jeff KingFeb 26, 2019
  16. Johannes SchindelinFeb 26, 2019
  17. Jeff KingFeb 26, 2019
  18. Duy NguyenFeb 27, 2019
  19. Junio C HamanoMar 1, 2019
  20. Johannes SchindelinFeb 26, 2019
  21. Martin ÅgrenFeb 26, 2019
  22. Rohit AshiwalFeb 26, 2019
  23. Johannes SchindelinFeb 26, 2019
  24. Rohit AshiwalFeb 26, 2019
  25. Martin ÅgrenFeb 27, 2019
  26. 0/1 [GSoC][PATCH] t3600: use test_path_is_dir and test_path_is_fileRohit Ashiwal via GitGitGadget, Feb 26, 2019
  27. 1/1 t3600: use test_path_is_dir and test_path_is_fileRohit Ashiwal via GitGitGadget, Feb 26, 2019
  28. SZEDER GáborFeb 26, 2019
  29. Rohit AshiwalFeb 26, 2019
  30. Johannes SchindelinFeb 26, 2019
  31. Rohit AshiwalFeb 26, 2019
  32. 0/1 [GSoC][PATCH] t3600: use test_path_is_* helper functionsRohit Ashiwal via GitGitGadget, Feb 26, 2019
  33. 1/1 t3600: use test_path_is_* functionsRohit Ashiwal via GitGitGadget, Feb 26, 2019
  34. Duy NguyenFeb 27, 2019
  35. 0/1 [GSoC][PATCH] t3600: use test_path_is_* helper functionsRohit Ashiwal via GitGitGadget, Feb 28, 2019
  36. 1/1 t3600: use test_path_is_* functionsRohit Ashiwal via GitGitGadget, Feb 28, 2019
  37. [GSoC] acknowledging mistakesRohit Ashiwal, Feb 28, 2019
  38. Junio C HamanoMar 1, 2019
  39. Feeling confused a little bitRohit Ashiwal, Mar 1, 2019
  40. Rafael AscensãoMar 2, 2019
  41. Thomas GummererMar 2, 2019
  42. [GSoC] ThankingRohit Ashiwal, Mar 2, 2019

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.