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

Re: [PATCH 01/25] t/test-lib: introduce --chain-lint option

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Mar 25, 2015, 02:53 UTC
Message-ID
<20150325035352.Horde.wlh5PImm_EGVzNTHeSEb7g1@webmail.informatik.kit.edu>
In-Reply-To
<20150320100548.GA12543@peff.net>
Quoting Jeff King <peff@peff.net>:
Show 12 quoted lines
> However, there are a number of places it cannot reach:
>
>  - it cannot find a failure to break out of loops on error,
>    like:
>
>      cmd1 &&
>      for i in a b c; do
> 	     cmd2 $i
>      done &&
>      cmd3
>
>    which will not notice failures of "cmd2 a" or "cmd b"
s/cmd b/cmd2 b/ ?
Show 12 quoted lines
>  - it cannot find a missing &&-chain inside a block or
>    subfunction, like:
>
>      foo () {
> 	     cmd1
> 	     cmd2
>      }
>
>      foo &&
>      bar
>
>    which will not notice a failure of cmd1.

And inside subshells. I think it's worth mentioning, too, because subshells are used frequently when setting environment variables

   ( GIT_FOO=bar && export GIT_FOO && cmd1 && ... ) && test_cmp
or changing directory
   ( cd subdir && cmd1 && ... ) && test_cmp

I was wondering whether we could do better here with helper functions, something along the lines of:

   # Set and export environment variable, automatically unsetting it after
   # the test is over
   test_setenv () {
       eval "$1=\$2" &&
       export "$1" &&
       # sane_unset, to allow unsetting during the test
       test_when_finished "sane_unset '$1'"
   }
   # Change to given directory, automatically return to current working
   # directory after the test is over
   test_cd () {
       test_when_finished "cd '$PWD'" &&
       cd "$1"
   }
With these the above examples would become
   test_setenv GIT_FOO bar && cmd1 && ... && test_cmp
and
   test_cd subdir && cmd1 && ... && test_cmp
which means increased coverage for --chain-lint.

Thanks for working on this. I looked into this after seeing Jonathan's patch back then, got quite far but never reached a chain-lint-clean state, and only sent patches for the two most amusing breakages (ddeaf7ef0d, 056f34bbcd). I'm glad it's off my TODO list and I don't have to rebase a 1.5 year old branch to current master :)

Gábor
Show 80 quoted lines
>  - it only checks tests that you run; every platform will
>    have some tests skipped due to missing prequisites,
>    so it's impossible to say from one run that the test
>    suite is free of broken &&-chains. However, all tests get
>    run by _somebody_, so eventually we will notice problems.
>
>  - it does not operate on test_when_finished or prerequisite
>    blocks. It could, but these tends to be much shorter and
>    less of a problem, so I punted on them in this patch.
>
> This patch was inspired by an earlier patch by Jonathan
> Nieder:
>
>   http://article.gmane.org/gmane.comp.version-control.git/235913
>
> This implementation and all bugs are mine.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  t/README      | 10 ++++++++++
>  t/test-lib.sh | 16 ++++++++++++++++
>  2 files changed, 26 insertions(+)
>
> diff --git a/t/README b/t/README
> index d5bb0c9..35438bc 100644
> --- a/t/README
> +++ b/t/README
> @@ -168,6 +168,16 @@ appropriately before running "make".
>  	Using this option with a RAM-based filesystem (such as tmpfs)
>  	can massively speed up the test suite.
>
> +--chain-lint::
> +--no-chain-lint::
> +	If --chain-lint is enabled, the test harness will check each
> +	test to make sure that it properly "&&-chains" all commands (so
> +	that a failure in the middle does not go unnoticed by the final
> +	exit code of the test). This check is performed in addition to
> +	running the tests themselves. You may also enable or disable
> +	this feature by setting the GIT_TEST_CHAIN_LINT environment
> +	variable to "1" or "0", respectively.
> +
>  You can also set the GIT_TEST_INSTALLED environment variable to
>  the bindir of an existing git installation to test that installation.
>  You still need to have built this git sandbox, from which various
> diff --git a/t/test-lib.sh b/t/test-lib.sh
> index c096778..50b3d3f 100644
> --- a/t/test-lib.sh
> +++ b/t/test-lib.sh
> @@ -232,6 +232,12 @@ do
>  	--root=*)
>  		root=$(expr "z$1" : 'z[^=]*=\(.*\)')
>  		shift ;;
> +	--chain-lint)
> +		GIT_TEST_CHAIN_LINT=1
> +		shift ;;
> +	--no-chain-lint)
> +		GIT_TEST_CHAIN_LINT=0
> +		shift ;;
>  	-x)
>  		trace=t
>  		verbose=t
> @@ -524,6 +530,16 @@ test_eval_ () {
>  test_run_ () {
>  	test_cleanup=:
>  	expecting_failure=$2
> +
> +	if test "${GIT_TEST_CHAIN_LINT:-0}" != 0; then
> +		# 117 is magic because it is unlikely to match the exit
> +		# code of other programs
> +		test_eval_ "(exit 117) && $1"
> +		if test "$?" != 117; then
> +			error "bug in the test script: broken &&-chain: $1"
> +		fi
> +	fi
> +
>  	setup_malloc_check
>  	test_eval_ "$1"
>  	eval_ret=$?
> --
> 2.3.3.520.g3cfbb5d
Previous: Jeff KingNext: Jeff King
Message 3 of 68 in “detecting &&-chain breakage”
  1. 0/25 detecting &&-chain breakageJeff King, Mar 20, 2015
  2. 01/25 t/test-lib: introduce --chain-lint optionJeff King, Mar 20, 2015
  3. SZEDER GáborMar 25, 2015
  4. Jeff KingMar 25, 2015
  5. 02/25 t: fix severe &&-chain breakageJeff King, Mar 20, 2015
  6. 03/25 t: fix moderate &&-chain breakageJeff King, Mar 20, 2015
  7. 04/25 t: fix trivial &&-chain breakageJeff King, Mar 20, 2015
  8. 05/25 t: assume test_cmp produces verbose outputJeff King, Mar 20, 2015
  9. 06/25 t: use verbose instead of hand-rolled errorsJeff King, Mar 20, 2015
  10. 07/25 t: use test_must_fail instead of hand-rolled blocksJeff King, Mar 20, 2015
  11. 08/25 t: fix &&-chaining issues around setup which might failJeff King, Mar 20, 2015
  12. 09/25 t: use test_might_fail for diff and grepJeff King, Mar 20, 2015
  13. 10/25 t: use test_expect_code instead of hand-rolled comparisonJeff King, Mar 20, 2015
  14. 11/25 t: wrap complicated expect_code users in a blockJeff King, Mar 20, 2015
  15. 12/25 t: avoid using ":" for commentsJeff King, Mar 20, 2015
  16. 13/25 t3600: fix &&-chain breakage for setup commandsJeff King, Mar 20, 2015
  17. 14/25 t7201: fix &&-chain breakageJeff King, Mar 20, 2015
  18. 15/25 t9502: fix &&-chain breakageJeff King, Mar 20, 2015
  19. Johannes SixtMar 20, 2015
  20. Jeff KingMar 20, 2015
  21. 16/25 t6030: use modern test_* helpersJeff King, Mar 20, 2015
  22. 17/25 t0020: use modern test_* helpersJeff King, Mar 20, 2015
  23. SZEDER GáborMar 25, 2015
  24. Jeff KingMar 25, 2015
  25. 0/8 more &&-chaining test fixupsJeff King, Mar 25, 2015
  26. 1/8 perf-lib: fix ignored exit code inside loopJeff King, Mar 25, 2015
  27. 2/8 t0020: fix ignored exit code inside loopsJeff King, Mar 25, 2015
  28. 3/8 t3305: fix ignored exit code inside loopJeff King, Mar 25, 2015
  29. Johan HerlandMar 25, 2015
  30. 4/8 t7701: fix ignored exit code inside loopJeff King, Mar 25, 2015
  31. 5/8 t: fix some trivial cases of ignored exit codes in loopsJeff King, Mar 25, 2015
  32. 6/8 t: simplify loop exit-code status variablesJeff King, Mar 25, 2015
  33. Junio C HamanoMar 25, 2015
  34. Jeff KingMar 25, 2015
  35. 7/8 t0020: use test_* helpers instead of hand-rolled messagesJeff King, Mar 25, 2015
  36. 8/8 t9001: drop save_confirm helperJeff King, Mar 25, 2015
  37. Junio C HamanoMar 25, 2015
  38. 18/25 t1301: use modern test_* helpersJeff King, Mar 20, 2015
  39. SZEDER GáborMar 24, 2015
  40. Jeff KingMar 25, 2015
  41. 19/25 t6034: use modern test_* helpersJeff King, Mar 20, 2015
  42. SZEDER GáborMar 24, 2015
  43. 20/25 t4117: use modern test_* helpersJeff King, Mar 20, 2015
  44. 21/25 t9001: use test_when_finishedJeff King, Mar 20, 2015
  45. SZEDER GáborMar 25, 2015
  46. Jeff KingMar 25, 2015
  47. 22/25 t0050: appease --chain-lintJeff King, Mar 20, 2015
  48. 23/25 t7004: fix embedded single-quotesJeff King, Mar 20, 2015
  49. 24/25 t0005: fix broken &&-chainsJeff King, Mar 20, 2015
  50. 25/25 t4104: drop hand-rolled error reportingJeff King, Mar 20, 2015
  51. Jeff KingMar 20, 2015
  52. Michael J GruberMar 20, 2015
  53. 26/27 t/*svn*: fix moderate &&-chain breakageMichael J Gruber, Mar 20, 2015
  54. Junio C HamanoMar 20, 2015
  55. Junio C HamanoMar 20, 2015
  56. Jeff KingMar 20, 2015
  57. Jeff KingMar 20, 2015
  58. Michael J GruberMar 23, 2015
  59. 27/27 t9104: fix test for following larger parentsMichael J Gruber, Mar 20, 2015
  60. Jeff KingMar 20, 2015
  61. Junio C HamanoMar 20, 2015
  62. Junio C HamanoMar 20, 2015
  63. Jeff KingMar 20, 2015
  64. Junio C HamanoMar 20, 2015
  65. Eric SunshineMar 20, 2015
  66. Jeff KingMar 21, 2015
  67. Junio C HamanoMar 21, 2015
  68. Jeff KingMar 21, 2015

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.