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

Re: [PATCH 2/2] test: cope better with use of return for errors

From
Jeff King <peff@peff.net>
Date
Aug 9, 2011, 15:36 UTC
Message-ID
<20110809153638.GA15687@sigill.intra.peff.net>
In-Reply-To
<4E40F3EA.8020406@viscovery.net>
On Tue, Aug 09, 2011 at 10:46:34AM +0200, Johannes Sixt wrote:
Show 24 quoted lines
> Am 8/8/2011 3:17, schrieb Jonathan Nieder:
> > +test_eval_ () {
> > +	# This is a separate function because some tests use
> > +	# "return" to end a test_expect_success block early.
> > +	eval >&3 2>&4 "$*"
> > +}
> > +
> >  test_run_ () {
> >  	test_cleanup=:
> >  	expecting_failure=$2
> > -	eval >&3 2>&4 "$1"
> > +	test_eval_ "$1"
> >  	eval_ret=$?
> >  
> >  	if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"
> >  	then
> > -		eval >&3 2>&4 "$test_cleanup"
> > +		test_eval_ "$test_cleanup"
> >  	fi
> >  	if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
> >  		echo ""
> 
> This invalidates at least t3900.29, which accesses an unexpanded $3
> from the test script. The patch below fixes this case.

Hmm. Isn't t3900 already broken, even without this patch? It does something like this:

  foo() {
    test_expect_success 'bar' 'echo $3'
  }

That can't possibly access the third positional parameter of foo, as we are already inside the test_expect_success function, no matter what functions we call after that.

If there is any regression here, it would be that we used to get the positional parameters of test_run_, and now we get them from test_eval_. So accessing "$2" used to get us $expecting_failure, but now gets nothing. I doubt it matters, and tests would be insane to rely on something internal like that. If it did, the right fix would be:

  -       test_eval_ "$1"
  +       test_eval_ "$@"
in test_run_.

So I don't see a problem in Jonathan's patches. But clearly t3900 is poorly written and should be fixed.

But:
Show 27 quoted lines
> diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
> index c06a5ee..3265fac 100755
> --- a/t/t3900-i18n-commit.sh
> +++ b/t/t3900-i18n-commit.sh
> @@ -136,6 +136,7 @@ done
>  test_commit_autosquash_flags () {
>  	H=$1
>  	flag=$2
> +	mopt=$3
>  	test_expect_success "commit --$flag with $H encoding" '
>  		git config i18n.commitencoding $H &&
>  		git checkout -b $H-$flag C0 &&
> @@ -147,7 +148,7 @@ test_commit_autosquash_flags () {
>  		git commit -a -m "intermediate commit" &&
>  		test_tick &&
>  		echo $H $flag >>F &&
> -		git commit -a --$flag HEAD~1 $3 &&
> +		git commit -a --$flag HEAD~1 $mopt &&
>  		E=$(git cat-file commit '$H-$flag' |
>  			sed -ne "s/^encoding //p") &&
>  		test "z$E" = "z$H" &&
> @@ -160,6 +161,6 @@ test_commit_autosquash_flags () {
>  
>  test_commit_autosquash_flags eucJP fixup
>  
> -test_commit_autosquash_flags ISO-2022-JP squash '-m "squash message"'
> +test_commit_autosquash_flags ISO-2022-JP squash '-m squash_message'

Can't we just drop $3 here? I don't see how it's actually doing anything. It makes us call:

  git commit --squash HEAD~1 -m squash_message
instead of just:
  git commit --squash HEAD~1

but then we never actually check to see that the included message becomes part of the squashed commit, anyway.

Also, a side note. These tests put their shell snippet inside single quotes. And then access the variables sometimes directly (assuming they are left unchanged inside the test functions), and sometimes using single quotes. Which actually places them outside the snippet's single quotes, and expands them in place. Which happens to be OK because they don't contain any spaces, but would otherwise pass extra arguments to test_expect_success.

So it's not a bug, but it does look unintentional and poor style.

Anyway. Your patch is fine and sufficient to solve the problem. Those were all just thoughtst I had while trying to figure out what the test was actually trying to do.

-Peff
Previous: Johannes SixtNext: Johannes Sixt
Message 27 of 67 in “revision.c: --merges, --no-merges and --merges-only”
  1. 0/2 revision.c: --merges, --no-merges and --merges-onlyMichael J Gruber, Mar 17, 2011
  2. 1/2 revision.c: rename --merges to --merges-onlyMichael J Gruber, Mar 17, 2011
  3. 2/2 revision.c: introduce --merges to undo --no-mergesMichael J Gruber, Mar 17, 2011
  4. Junio C HamanoMar 17, 2011
  5. Jeff KingMar 17, 2011
  6. Michael J GruberMar 18, 2011
  7. Junio C HamanoMar 18, 2011
  8. Michael J GruberMar 18, 2011
  9. Jeff KingMar 18, 2011
  10. 0/3 rev-list and friends: --min-parents, --max-parentsMichael J Gruber, Mar 18, 2011
  11. Michael J GruberMar 18, 2011
  12. Jeff KingMar 18, 2011
  13. Michael J GruberMar 21, 2011
  14. 0/3 rev-list and friends: --min-parents, --max-parentsMichael J Gruber, Mar 21, 2011
  15. Jeff KingMar 21, 2011
  16. 0/5 rev-list and friends: --min-parents, --max-parentsMichael J Gruber, Mar 23, 2011
  17. Jeff KingMar 23, 2011
  18. Junio C HamanoMar 23, 2011
  19. Junio C HamanoMar 23, 2011
  20. Jonathan NiederMar 24, 2011
  21. Michael J GruberMar 24, 2011
  22. Jonathan NiederMar 24, 2011
  23. 0/2 test_when_finished and returning earlyJonathan Nieder, Aug 8, 2011
  24. 1/2 test: simplify return value of test_run_Jonathan Nieder, Aug 8, 2011
  25. 2/2 test: cope better with use of return for errorsJonathan Nieder, Aug 8, 2011
  26. Johannes SixtAug 9, 2011
  27. Jeff KingAug 9, 2011
  28. t3900: do not reference numbered arguments from the test scriptJohannes Sixt, Aug 11, 2011
  29. Jonathan NiederAug 11, 2011
  30. Junio C HamanoAug 11, 2011
  31. Jeff KingAug 8, 2011
  32. 1/5 t6009: use test_commit() from test-lib.shMichael J Gruber, Mar 23, 2011
  33. 2/5 revision.c: introduce --min-parents and --max-parentsMichael J Gruber, Mar 23, 2011
  34. 3/5 squash! revision.c: introduce --min-parents and --max-parentsMichael J Gruber, Mar 23, 2011
  35. 4/5 rev-list --min-parents,--max-parents: doc, test and completionMichael J Gruber, Mar 23, 2011
  36. 5/5 fixup! rev-list --min-parents,--max-parents: doc, test and completionMichael J Gruber, Mar 23, 2011
  37. 1/3 t6009: use test_commit() from test-lib.shMichael J Gruber, Mar 21, 2011
  38. 2/3 revision.c: introduce --min-parents and --max-parentsMichael J Gruber, Mar 21, 2011
  39. Michael J GruberMar 21, 2011
  40. Junio C HamanoMar 21, 2011
  41. Jonathan NiederMar 21, 2011
  42. 3/3 rev-list --min-parents,--max-parents: doc and test and completionMichael J Gruber, Mar 21, 2011
  43. Jonathan NiederMar 21, 2011
  44. Michael J GruberMar 22, 2011
  45. Jonathan NiederMar 23, 2011
  46. 1/3 revision.c: introduce --min-parents and --max-parentsMichael J Gruber, Mar 18, 2011
  47. Jeff KingMar 18, 2011
  48. Michael J GruberMar 21, 2011
  49. Jonathan NiederMar 18, 2011
  50. Junio C HamanoMar 18, 2011
  51. Michael J GruberMar 21, 2011
  52. 2/3 t6009: use test_commit() from test-lib.shMichael J Gruber, Mar 18, 2011
  53. 3/3 rev-list --min-parents,--max-parents: doc and test and completionMichael J Gruber, Mar 18, 2011
  54. Jeff KingMar 18, 2011
  55. Michael J GruberMar 21, 2011
  56. Jeff KingMar 21, 2011
  57. Michael J GruberMar 21, 2011
  58. Junio C HamanoMar 21, 2011
  59. Michael J GruberMar 21, 2011
  60. Junio C HamanoMar 21, 2011
  61. Jonathan NiederMar 18, 2011
  62. Michael J GruberMar 21, 2011
  63. Jonathan NiederMar 21, 2011
  64. Michael J GruberMar 22, 2011
  65. Jeff KingMar 18, 2011
  66. Michael J GruberMar 18, 2011
  67. Jeff KingMar 18, 2011

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.