git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / mirror / Atom feed
From: Josh Steadmon <steadmon@google.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, git@grubix.eu, martin.agren@gmail.com
Subject: [PATCH v4 1/4] t7503: verify proper hook execution
Date: Mon,  5 Aug 2019 15:43:36 -0700
Message-ID: <50857290955c5467ef6f75083395c695340fa284.1565044345.git.steadmon@google.com> (raw)
In-Reply-To: <cover.1565044345.git.steadmon@google.com>

t7503 did not verify that the expected hooks actually ran during
testing. Fix that by making the hook scripts write their $0 into a file
so that we can compare actual execution vs. expected execution.

While we're at it, do some test style cleanups, such as using
write_script() and doing setup inside a test_expect_success block.

Improved-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Josh Steadmon <steadmon@google.com>
---
 t/t7503-pre-commit-hook.sh | 157 +++++++++++++++++++++----------------
 1 file changed, 89 insertions(+), 68 deletions(-)

diff --git a/t/t7503-pre-commit-hook.sh b/t/t7503-pre-commit-hook.sh
index 984889b39d..a71ec31222 100755
--- a/t/t7503-pre-commit-hook.sh
+++ b/t/t7503-pre-commit-hook.sh
@@ -4,124 +4,144 @@ test_description='pre-commit hook'
 
 . ./test-lib.sh
 
-test_expect_success 'with no hook' '
+HOOKDIR="$(git rev-parse --git-dir)/hooks"
+PRECOMMIT="$HOOKDIR/pre-commit"
+
+# Prepare sample scripts that write their $0 to actual_hooks
+test_expect_success 'sample script setup' '
+	mkdir -p "$HOOKDIR" &&
+	write_script "$HOOKDIR/success.sample" <<-\EOF &&
+	echo $0 >>actual_hooks
+	exit 0
+	EOF
+	write_script "$HOOKDIR/fail.sample" <<-\EOF &&
+	echo $0 >>actual_hooks
+	exit 1
+	EOF
+	write_script "$HOOKDIR/non-exec.sample" <<-\EOF &&
+	echo $0 >>actual_hooks
+	exit 1
+	EOF
+	chmod -x "$HOOKDIR/non-exec.sample" &&
+	write_script "$HOOKDIR/require-prefix.sample" <<-\EOF &&
+	echo $0 >>actual_hooks
+	test $GIT_PREFIX = "success/"
+	EOF
+	write_script "$HOOKDIR/check-author.sample" <<-\EOF
+	echo $0 >>actual_hooks
+	test "$GIT_AUTHOR_NAME" = "New Author" &&
+	test "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"
+	EOF
+'
 
-	echo "foo" > file &&
+test_expect_success 'with no hook' '
+	test_when_finished "rm -f actual_hooks" &&
+	echo "foo" >file &&
 	git add file &&
-	git commit -m "first"
-
+	git commit -m "first" &&
+	test_path_is_missing actual_hooks
 '
 
 test_expect_success '--no-verify with no hook' '
-
-	echo "bar" > file &&
+	test_when_finished "rm -f actual_hooks" &&
+	echo "bar" >file &&
 	git add file &&
-	git commit --no-verify -m "bar"
-
+	git commit --no-verify -m "bar" &&
+	test_path_is_missing actual_hooks
 '
 
-# now install hook that always succeeds
-HOOKDIR="$(git rev-parse --git-dir)/hooks"
-HOOK="$HOOKDIR/pre-commit"
-mkdir -p "$HOOKDIR"
-cat > "$HOOK" <<EOF
-#!/bin/sh
-exit 0
-EOF
-chmod +x "$HOOK"
-
 test_expect_success 'with succeeding hook' '
-
-	echo "more" >> file &&
+	test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
+	ln -s "success.sample" "$PRECOMMIT" &&
+	echo "$PRECOMMIT" >expected_hooks &&
+	echo "more" >>file &&
 	git add file &&
-	git commit -m "more"
-
+	git commit -m "more" &&
+	test_cmp expected_hooks actual_hooks
 '
 
 test_expect_success '--no-verify with succeeding hook' '
-
-	echo "even more" >> file &&
+	test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" &&
+	ln -s "success.sample" "$PRECOMMIT" &&
+	echo "even more" >>file &&
 	git add file &&
-	git commit --no-verify -m "even more"
-
+	git commit --no-verify -m "even more" &&
+	test_path_is_missing actual_hooks
 '
 
-# now a hook that fails
-cat > "$HOOK" <<EOF
-#!/bin/sh
-exit 1
-EOF
-
 test_expect_success 'with failing hook' '
-
-	echo "another" >> file &&
+	test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
+	ln -s "fail.sample" "$PRECOMMIT" &&
+	echo "$PRECOMMIT" >expected_hooks &&
+	echo "another" >>file &&
 	git add file &&
-	test_must_fail git commit -m "another"
-
+	test_must_fail git commit -m "another" &&
+	test_cmp expected_hooks actual_hooks
 '
 
 test_expect_success '--no-verify with failing hook' '
-
-	echo "stuff" >> file &&
+	test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" &&
+	ln -s "fail.sample" "$PRECOMMIT" &&
+	echo "stuff" >>file &&
 	git add file &&
-	git commit --no-verify -m "stuff"
-
+	git commit --no-verify -m "stuff" &&
+	test_path_is_missing actual_hooks
 '
 
-chmod -x "$HOOK"
 test_expect_success POSIXPERM 'with non-executable hook' '
-
-	echo "content" >> file &&
+	test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" &&
+	ln -s "non-exec.sample" "$PRECOMMIT" &&
+	echo "content" >>file &&
 	git add file &&
-	git commit -m "content"
-
+	git commit -m "content" &&
+	test_path_is_missing actual_hooks
 '
 
 test_expect_success POSIXPERM '--no-verify with non-executable hook' '
-
-	echo "more content" >> file &&
+	test_when_finished "rm -f \"$PRECOMMIT\" actual_hooks" &&
+	ln -s "non-exec.sample" "$PRECOMMIT" &&
+	echo "more content" >>file &&
 	git add file &&
-	git commit --no-verify -m "more content"
-
+	git commit --no-verify -m "more content" &&
+	test_path_is_missing actual_hooks
 '
-chmod +x "$HOOK"
-
-# a hook that checks $GIT_PREFIX and succeeds inside the
-# success/ subdirectory only
-cat > "$HOOK" <<EOF
-#!/bin/sh
-test \$GIT_PREFIX = success/
-EOF
 
 test_expect_success 'with hook requiring GIT_PREFIX' '
-
-	echo "more content" >> file &&
+	test_when_finished "rm -rf \"$PRECOMMIT\" expected_hooks actual_hooks success" &&
+	ln -s "require-prefix.sample" "$PRECOMMIT" &&
+	echo "$PRECOMMIT" >expected_hooks &&
+	echo "more content" >>file &&
 	git add file &&
 	mkdir success &&
 	(
 		cd success &&
 		git commit -m "hook requires GIT_PREFIX = success/"
 	) &&
-	rmdir success
+	test_cmp expected_hooks actual_hooks
 '
 
 test_expect_success 'with failing hook requiring GIT_PREFIX' '
-
-	echo "more content" >> file &&
+	test_when_finished "rm -rf \"$PRECOMMIT\" expected_hooks actual_hooks fail" &&
+	ln -s "require-prefix.sample" "$PRECOMMIT" &&
+	echo "$PRECOMMIT" >expected_hooks &&
+	echo "more content" >>file &&
 	git add file &&
 	mkdir fail &&
 	(
 		cd fail &&
 		test_must_fail git commit -m "hook must fail"
 	) &&
-	rmdir fail &&
-	git checkout -- file
+	git checkout -- file &&
+	test_cmp expected_hooks actual_hooks
 '
 
 test_expect_success 'check the author in hook' '
-	write_script "$HOOK" <<-\EOF &&
-	test "$GIT_AUTHOR_NAME" = "New Author" &&
-	test "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"
+	test_when_finished "rm -f \"$PRECOMMIT\" expected_hooks actual_hooks" &&
+	ln -s "check-author.sample" "$PRECOMMIT" &&
+	cat >expected_hooks <<-EOF &&
+	$PRECOMMIT
+	$PRECOMMIT
+	$PRECOMMIT
 	EOF
 	test_must_fail git commit --allow-empty -m "by a.u.thor" &&
 	(
@@ -133,7 +153,8 @@ test_expect_success 'check the author in hook' '
 	) &&
 	git commit --author="New Author <newauthor@example.com>" \
 		--allow-empty -m "by new.author via command line" &&
-	git show -s
+	git show -s &&
+	test_cmp expected_hooks actual_hooks
 '
 
 test_done
-- 
2.22.0.770.g0f2c4a37fd-goog


  reply	other threads:[~2019-08-05 22:43 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-22 12:04 [PATCH 0/4] pre-merge hook Michael J Gruber
2017-09-22 12:04 ` [PATCH 1/4] git-merge: Honor " Michael J Gruber
2017-09-22 19:52   ` Stefan Beller
2017-09-23  0:04   ` Martin Ågren
2017-09-22 12:04 ` [PATCH 2/4] merge: do no-verify like commit Michael J Gruber
2017-09-22 19:55   ` Stefan Beller
2017-09-22 12:04 ` [PATCH 3/4] merge: --no-verify to bypass pre-merge hook Michael J Gruber
2017-09-23 23:48   ` Junio C Hamano
2017-09-25 10:54     ` Michael J Gruber
2017-09-22 12:04 ` [PATCH 4/4] t7503: add tests for pre-merge-hook Michael J Gruber
2017-09-22 20:01   ` Stefan Beller
2017-10-02  5:54 ` [PATCH 0/4] pre-merge hook Junio C Hamano
2017-10-02 16:59   ` Stefan Beller
2017-10-17  4:05 ` Junio C Hamano
2019-07-18 22:57   ` [PATCH v2 " Josh Steadmon
2019-07-18 23:56   ` Josh Steadmon
2019-07-18 22:57     ` [PATCH v2 1/4] git-merge: Honor " Josh Steadmon
2019-07-29 20:00       ` Martin Ågren
2019-07-18 22:57     ` [PATCH v2 2/4] merge: do no-verify like commit Josh Steadmon
2019-07-18 22:57     ` [PATCH v2 3/4] merge: --no-verify to bypass pre-merge hook Josh Steadmon
2019-07-29 20:02       ` Martin Ågren
2019-07-29 23:33         ` Josh Steadmon
2019-07-18 22:57     ` [PATCH v2 4/4] t7503: add tests for pre-merge-hook Josh Steadmon
2019-07-29 20:04       ` Martin Ågren
2019-07-29 23:43         ` Josh Steadmon
2019-07-30  7:13           ` Martin Ågren
2019-07-31 18:34             ` Josh Steadmon
2019-07-29 20:09     ` [PATCH v2 0/4] pre-merge hook Martin Ågren
2019-07-29 23:29       ` Josh Steadmon
2019-07-29 20:29     ` Martin Ågren
2019-07-29 23:39       ` Josh Steadmon
2019-08-01 22:20     ` [PATCH v3 0/4] pre-merge-commit hook Josh Steadmon
2019-08-01 22:20       ` [PATCH v3 1/4] t7503: verify proper hook execution Josh Steadmon
2019-08-02  9:43         ` Martin Ågren
2019-08-01 22:20       ` [PATCH v3 2/4] merge: do no-verify like commit Josh Steadmon
2019-08-01 22:20       ` [PATCH v3 3/4] git-merge: honor pre-merge-commit hook Josh Steadmon
2019-08-02  9:45         ` Martin Ågren
2019-08-02 22:20           ` Josh Steadmon
2019-08-01 22:20       ` [PATCH v3 4/4] merge: --no-verify to bypass " Josh Steadmon
2019-08-02  9:56       ` [PATCH v3 0/4] " Martin Ågren
2019-08-02  9:56         ` [PATCH 1/5] t7503: use "&&" in "test_when_finished" rather than ";" Martin Ågren
2019-08-02  9:56         ` [PATCH 2/5] t7503: avoid touch when mtime doesn't matter Martin Ågren
2019-08-02  9:56         ` [PATCH 3/5] t7503: simplify file-juggling Martin Ågren
2019-08-02  9:56         ` [PATCH 4/5] t7503: don't create "actual_hooks" for later appending Martin Ågren
2019-08-02  9:56         ` [PATCH 5/5] t7503: test failing merge with both hooks available Martin Ågren
2019-08-02 22:18         ` [PATCH v3 0/4] pre-merge-commit hook Josh Steadmon
2019-08-05 22:43       ` [PATCH v4 " Josh Steadmon
2019-08-05 22:43         ` Josh Steadmon [this message]
2019-08-06 18:14           ` [PATCH v4 1/4] t7503: verify proper hook execution Junio C Hamano
2019-08-07 18:11             ` Josh Steadmon
2019-08-05 22:43         ` [PATCH v4 2/4] merge: do no-verify like commit Josh Steadmon
2019-08-05 22:43         ` [PATCH v4 3/4] git-merge: honor pre-merge-commit hook Josh Steadmon
2019-08-05 22:43         ` [PATCH v4 4/4] merge: --no-verify to bypass " Josh Steadmon
2019-08-07 18:57         ` [PATCH v5 0/4] " Josh Steadmon
2019-08-07 18:57           ` [PATCH v5 1/4] t7503: verify proper hook execution Josh Steadmon
2019-08-07 18:57           ` [PATCH v5 2/4] merge: do no-verify like commit Josh Steadmon
2019-08-07 18:57           ` [PATCH v5 3/4] git-merge: honor pre-merge-commit hook Josh Steadmon
2019-08-07 18:57           ` [PATCH v5 4/4] merge: --no-verify to bypass " Josh Steadmon
2019-08-08 13:08           ` [PATCH v5 0/4] " Martin Ågren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50857290955c5467ef6f75083395c695340fa284.1565044345.git.steadmon@google.com \
    --to=steadmon@google.com \
    --cc=git@grubix.eu \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=martin.agren@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

git@vger.kernel.org list mirror (unofficial, one of many)

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://public-inbox.org/git
	git clone --mirror http://ou63pmih66umazou.onion/git
	git clone --mirror http://czquwvybam4bgbro.onion/git
	git clone --mirror http://hjrcffqmbrq6wope.onion/git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 git git/ https://public-inbox.org/git \
		git@vger.kernel.org
	public-inbox-index git

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.version-control.git
	nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git
	nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git
	nntp://news.gmane.io/gmane.comp.version-control.git
 note: .onion URLs require Tor: https://www.torproject.org/

code repositories for the project(s) associated with this inbox:

	https://80x24.org/mirrors/git.git

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git