git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Stephan Beyer <s-beyer@gmx.net>
To: git@vger.kernel.org
Cc: Stephan Beyer <s-beyer@gmx.net>,
	Christian Couder <christian.couder@gmail.com>,
	Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v2 05/21] t6030: generalize test to not rely on current implementation
Date: Sun, 10 Apr 2016 15:18:58 +0200	[thread overview]
Message-ID: <1460294354-7031-6-git-send-email-s-beyer@gmx.net> (raw)
In-Reply-To: <1460294354-7031-1-git-send-email-s-beyer@gmx.net>

The bisect algorithm allows different outcomes if, for example,
the number of commits between a good and a bad commit is even.
The current test relies on a specific behavior (for example,
the behavior of the halfway() implementation). By disabling
halfway(), some skip tests fail although the algorithm works.

This commit generalizes the test t6030 such that it works
even if the bisect algorithm uses its degree of freedom to
choose another commit.

While at it, fix some indentation issues: use tabs instead of
4 spaces.

Signed-off-by: Stephan Beyer <s-beyer@gmx.net>
---
 t/t6030-bisect-porcelain.sh | 167 ++++++++++++++++++++++----------------------
 1 file changed, 85 insertions(+), 82 deletions(-)

diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index 05bc639..645ccd9 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -10,36 +10,34 @@ exec </dev/null
 
 add_line_into_file()
 {
-    _line=$1
-    _file=$2
+	_line=$1
+	_file=$2
 
-    if [ -f "$_file" ]; then
-        echo "$_line" >> $_file || return $?
-        MSG="Add <$_line> into <$_file>."
-    else
-        echo "$_line" > $_file || return $?
-        git add $_file || return $?
-        MSG="Create file <$_file> with <$_line> inside."
-    fi
+	if [ -f "$_file" ]; then
+		echo "$_line" >> $_file || return $?
+		MSG="Add <$_line> into <$_file>."
+	else
+		echo "$_line" > $_file || return $?
+		git add $_file || return $?
+		MSG="Create file <$_file> with <$_line> inside."
+	fi
 
-    test_tick
-    git commit --quiet -m "$MSG" $_file
+	test_tick
+	git commit --quiet -m "$MSG" $_file
 }
 
-HASH1=
-HASH2=
-HASH3=
-HASH4=
-
 test_expect_success 'set up basic repo with 1 file (hello) and 4 commits' '
-     add_line_into_file "1: Hello World" hello &&
-     HASH1=$(git rev-parse --verify HEAD) &&
-     add_line_into_file "2: A new day for git" hello &&
-     HASH2=$(git rev-parse --verify HEAD) &&
-     add_line_into_file "3: Another new day for git" hello &&
-     HASH3=$(git rev-parse --verify HEAD) &&
-     add_line_into_file "4: Ciao for now" hello &&
-     HASH4=$(git rev-parse --verify HEAD)
+	add_line_into_file "1: Hello World" hello &&
+	HASH1=$(git rev-parse --verify HEAD) &&
+	add_line_into_file "2: A new day for git" hello &&
+	HASH2=$(git rev-parse --verify HEAD) &&
+	add_line_into_file "3: Another new day for git" hello &&
+	HASH3=$(git rev-parse --verify HEAD) &&
+	add_line_into_file "4: Ciao for now" hello &&
+	HASH4=$(git rev-parse --verify HEAD) &&
+	git checkout -b monday &&
+	add_line_into_file "5: Ok Monday, let us do it" hello &&
+	git checkout master
 '
 
 test_expect_success 'bisect starts with only one bad' '
@@ -84,9 +82,8 @@ test_expect_success 'bisect fails if given any junk instead of revs' '
 
 test_expect_success 'bisect reset: back in the master branch' '
 	git bisect reset &&
-	echo "* master" > branch.expect &&
 	git branch > branch.output &&
-	cmp branch.expect branch.output
+	grep "^* master" branch.output
 '
 
 test_expect_success 'bisect reset: back in another branch' '
@@ -95,16 +92,14 @@ test_expect_success 'bisect reset: back in another branch' '
 	git bisect good $HASH1 &&
 	git bisect bad $HASH3 &&
 	git bisect reset &&
-	echo "  master" > branch.expect &&
-	echo "* other" >> branch.expect &&
 	git branch > branch.output &&
-	cmp branch.expect branch.output
+	grep "^* other" branch.output
 '
 
 test_expect_success 'bisect reset when not bisecting' '
 	git bisect reset &&
 	git branch > branch.output &&
-	cmp branch.expect branch.output
+	grep "^* other" branch.output
 '
 
 test_expect_success 'bisect reset removes packed refs' '
@@ -180,14 +175,15 @@ test_expect_success 'bisect start: no ".git/BISECT_START" if checkout error' '
 	git checkout HEAD hello
 '
 
-# $HASH1 is good, $HASH4 is bad, we skip $HASH3
+# $HASH1 is good, monday is bad, we skip $HASH3
 # but $HASH2 is bad,
 # so we should find $HASH2 as the first bad commit
 test_expect_success 'bisect skip: successful result' '
 	test_when_finished git bisect reset &&
 	git bisect reset &&
-	git bisect start $HASH4 $HASH1 &&
+	git bisect start monday $HASH1 &&
 	git bisect skip &&
+	( test_cmp_rev HEAD $HASH2 || git bisect bad ) &&
 	git bisect bad > my_bisect_log.txt &&
 	grep "$HASH2 is the first bad commit" my_bisect_log.txt
 '
@@ -207,18 +203,22 @@ test_expect_success 'bisect skip: cannot tell between 3 commits' '
 	grep $HASH4 my_bisect_log.txt
 '
 
-# $HASH1 is good, $HASH4 is bad, we skip $HASH3
-# but $HASH2 is good,
+# $HASH1 is good, monday is bad, we skip $HASH3
+# but $HASH2 is good and $HASH4 is bad,
 # so we should not be able to tell the first bad commit
 # among $HASH3 and $HASH4
 test_expect_success 'bisect skip: cannot tell between 2 commits' '
 	test_when_finished git bisect reset &&
-	git bisect start $HASH4 $HASH1 &&
+	git bisect start monday $HASH1 &&
 	git bisect skip &&
-	test_expect_code 2 git bisect good >my_bisect_log.txt &&
+	next="$(test_cmp_rev HEAD $HASH4 && echo bad || echo good)" &&
+	git bisect $next &&
+	next2="$(test "$next" = "good" && echo bad || echo good)" &&
+	test_expect_code 2 git bisect $next2 >my_bisect_log.txt &&
 	grep "first bad commit could be any of" my_bisect_log.txt &&
 	! grep $HASH1 my_bisect_log.txt &&
 	! grep $HASH2 my_bisect_log.txt &&
+	! grep "$(git rev-parse monday)" my_bisect_log.txt &&
 	grep $HASH3 my_bisect_log.txt &&
 	grep $HASH4 my_bisect_log.txt
 '
@@ -244,36 +244,35 @@ test_expect_success 'bisect skip: with commit both bad and skipped' '
 
 # We want to automatically find the commit that
 # introduced "Another" into hello.
-test_expect_success \
-    '"git bisect run" simple case' \
-    'echo "#"\!"/bin/sh" > test_script.sh &&
-     echo "grep Another hello > /dev/null" >> test_script.sh &&
-     echo "test \$? -ne 0" >> test_script.sh &&
-     chmod +x test_script.sh &&
-     git bisect start &&
-     git bisect good $HASH1 &&
-     git bisect bad $HASH4 &&
-     git bisect run ./test_script.sh > my_bisect_log.txt &&
-     grep "$HASH3 is the first bad commit" my_bisect_log.txt &&
-     git bisect reset'
+test_expect_success '"git bisect run" simple case' '
+	echo "#"\!"/bin/sh" > test_script.sh &&
+	echo "grep Another hello > /dev/null" >> test_script.sh &&
+	echo "test \$? -ne 0" >> test_script.sh &&
+	chmod +x test_script.sh &&
+	git bisect start &&
+	git bisect good $HASH1 &&
+	git bisect bad $HASH4 &&
+	git bisect run ./test_script.sh > my_bisect_log.txt &&
+	grep "$HASH3 is the first bad commit" my_bisect_log.txt &&
+	git bisect reset
+'
 
 # We want to automatically find the commit that
 # introduced "Ciao" into hello.
-test_expect_success \
-    '"git bisect run" with more complex "git bisect start"' \
-    'echo "#"\!"/bin/sh" > test_script.sh &&
-     echo "grep Ciao hello > /dev/null" >> test_script.sh &&
-     echo "test \$? -ne 0" >> test_script.sh &&
-     chmod +x test_script.sh &&
-     git bisect start $HASH4 $HASH1 &&
-     git bisect run ./test_script.sh > my_bisect_log.txt &&
-     grep "$HASH4 is the first bad commit" my_bisect_log.txt &&
-     git bisect reset'
+test_expect_success '"git bisect run" with more complex "git bisect start"' '
+	echo "#"\!"/bin/sh" > test_script.sh &&
+	echo "grep Ciao hello > /dev/null" >> test_script.sh &&
+	echo "test \$? -ne 0" >> test_script.sh &&
+	chmod +x test_script.sh &&
+	git bisect start $HASH4 $HASH1 &&
+	git bisect run ./test_script.sh > my_bisect_log.txt &&
+	grep "$HASH4 is the first bad commit" my_bisect_log.txt &&
+	git bisect reset
+'
 
 # $HASH1 is good, $HASH5 is bad, we skip $HASH3
 # but $HASH4 is good,
 # so we should find $HASH5 as the first bad commit
-HASH5=
 test_expect_success 'bisect skip: add line and then a new test' '
 	add_line_into_file "5: Another new line." hello &&
 	HASH5=$(git rev-parse --verify HEAD) &&
@@ -291,7 +290,6 @@ test_expect_success 'bisect skip and bisect replay' '
 	git bisect reset
 '
 
-HASH6=
 test_expect_success 'bisect run & skip: cannot tell between 2' '
 	add_line_into_file "6: Yet a line." hello &&
 	HASH6=$(git rev-parse --verify HEAD) &&
@@ -315,7 +313,6 @@ test_expect_success 'bisect run & skip: cannot tell between 2' '
 	fi
 '
 
-HASH7=
 test_expect_success 'bisect run & skip: find first bad' '
 	git bisect reset &&
 	add_line_into_file "7: Should be the last line." hello &&
@@ -368,17 +365,19 @@ test_expect_success 'bisect errors out if bad and good are mistaken' '
 
 test_expect_success 'bisect does not create a "bisect" branch' '
 	git bisect reset &&
-	git bisect start $HASH7 $HASH1 &&
+	git bisect start $HASH6 $HASH1 &&
 	git branch bisect &&
-	test_cmp_rev HEAD $HASH4 &&
+	next="$(test_cmp_rev HEAD $HASH4 && echo good || echo bad)" &&
+	hash1="$(test "$next" = "good" && echo $HASH5 || echo $HASH2)" &&
+	hash2="$(test "$next" = "good" && echo $HASH6 || echo $HASH2)" &&
 	git branch -D bisect &&
-	git bisect good &&
+	git bisect $next &&
 	git branch bisect &&
-	test_cmp_rev HEAD $HASH6 &&
-	git bisect good > my_bisect_log.txt &&
-	grep "$HASH7 is the first bad commit" my_bisect_log.txt &&
+	test_cmp_rev HEAD $hash1 &&
+	git bisect $next > my_bisect_log.txt &&
+	grep "$hash2 is the first bad commit" my_bisect_log.txt &&
 	git bisect reset &&
-	test_cmp_rev bisect $HASH6 &&
+	test_cmp_rev bisect $hash1 &&
 	git branch -D bisect
 '
 
@@ -400,14 +399,15 @@ test_expect_success 'side branch creation' '
 '
 
 test_expect_success 'good merge base when good and bad are siblings' '
-	git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&
+	git bisect start "$HASH6" "$SIDE_HASH7" > my_bisect_log.txt &&
 	grep "merge base must be tested" my_bisect_log.txt &&
 	grep $HASH4 my_bisect_log.txt &&
 	git bisect good > my_bisect_log.txt &&
 	test_must_fail grep "merge base must be tested" my_bisect_log.txt &&
-	grep $HASH6 my_bisect_log.txt &&
+	grep $HASH5 my_bisect_log.txt &&
 	git bisect reset
 '
+
 test_expect_success 'skipped merge base when good and bad are siblings' '
 	git bisect start "$SIDE_HASH7" "$HASH7" > my_bisect_log.txt &&
 	grep "merge base must be tested" my_bisect_log.txt &&
@@ -446,6 +446,9 @@ test_expect_success 'many merge bases creation' '
 	git checkout "$SIDE_HASH5" &&
 	git merge -m "merge HASH5 and SIDE_HASH5" "$HASH5" &&
 	A_HASH=$(git rev-parse --verify HEAD) &&
+	git checkout "$SIDE_HASH5" &&
+	git merge -m "merge HASH6 and SIDE_HASH5" "$HASH6" &&
+	A6_HASH=$(git rev-parse --verify HEAD) &&
 	git checkout side &&
 	git merge -m "merge HASH7 and SIDE_HASH7" "$HASH7" &&
 	B_HASH=$(git rev-parse --verify HEAD) &&
@@ -478,9 +481,8 @@ test_expect_success 'optimized merge base checks' '
 	grep "$HASH4" my_bisect_log.txt &&
 	git bisect good > my_bisect_log2.txt &&
 	test -f ".git/BISECT_ANCESTORS_OK" &&
-	test_cmp_rev HEAD $HASH6 &&
-	git bisect bad > my_bisect_log3.txt &&
-	git bisect good "$A_HASH" > my_bisect_log4.txt &&
+	next="$(test_cmp_rev HEAD $HASH5 && echo $A_HASH || echo $A6_HASH)" &&
+	git bisect good "$next" > my_bisect_log4.txt &&
 	grep "merge base must be tested" my_bisect_log4.txt &&
 	test_must_fail test -f ".git/BISECT_ANCESTORS_OK"
 '
@@ -529,10 +531,10 @@ test_expect_success 'restricting bisection on one dir' '
 test_expect_success 'restricting bisection on one dir and a file' '
 	git bisect reset &&
 	git bisect start HEAD $HASH1 -- dir1 hello &&
+	( test_cmp_rev HEAD $HASH6 && git bisect skip || : ) &&
 	test_cmp_rev HEAD "$PARA_HASH4" &&
 	git bisect bad &&
-	test_cmp_rev HEAD $HASH3 &&
-	git bisect good &&
+	( test_cmp_rev HEAD $HASH3 && git bisect good || : ) &&
 	test_cmp_rev HEAD $HASH4 &&
 	git bisect good &&
 	test_cmp_rev HEAD "$PARA_HASH1" &&
@@ -542,9 +544,9 @@ test_expect_success 'restricting bisection on one dir and a file' '
 
 test_expect_success 'skipping away from skipped commit' '
 	git bisect start $PARA_HASH7 $HASH1 &&
-	test_cmp_rev HEAD "$PARA_HASH4" &&
+	test_cmp_rev HEAD $PARA_HASH4 $HASH7 &&
 	git bisect skip &&
-	test_cmp_rev HEAD $HASH7 &&
+	test_cmp_rev HEAD $HASH7 $PARA_HASH4 &&
 	git bisect skip &&
 	test_cmp_rev HEAD "$PARA_HASH3"
 '
@@ -621,7 +623,7 @@ EOF
 
 test_expect_success 'bisect fails if tree is broken on start commit' '
 	git bisect reset &&
-	test_must_fail git bisect start BROKEN_HASH7 BROKEN_HASH4 2>error.txt &&
+	test_must_fail git bisect start BROKEN_HASH8 BROKEN_HASH4 2>error.txt &&
 	test_cmp expected.missing-tree.default error.txt
 '
 
@@ -635,7 +637,7 @@ test_expect_success 'bisect fails if tree is broken on trial commit' '
 
 test_expect_success 'bisect: --no-checkout - start commit bad' '
 	git bisect reset &&
-	git bisect start BROKEN_HASH7 BROKEN_HASH4 --no-checkout &&
+	git bisect start BROKEN_HASH8 BROKEN_HASH4 --no-checkout &&
 	test_cmp_rev BISECT_HEAD BROKEN_HASH6 &&
 	git bisect reset
 '
@@ -672,9 +674,10 @@ test_expect_success 'bisect: --no-checkout - target in breakage' '
 test_expect_success 'bisect: --no-checkout - target after breakage' '
 	git bisect reset &&
 	git bisect start broken BROKEN_HASH4 --no-checkout &&
+	( test_cmp_rev BISECT_HEAD BROKEN_HASH6 || git bisect good BISECT_HEAD ) &&
 	test_cmp_rev BISECT_HEAD BROKEN_HASH6 &&
 	git bisect good BISECT_HEAD &&
-	test_cmp_rev BISECT_HEAD BROKEN_HASH8 &&
+	test_cmp_rev BISECT_HEAD BROKEN_HASH8 BROKEN_HASH7 &&
 	git bisect good BISECT_HEAD &&
 	test_cmp_rev bisect/bad BROKEN_HASH9 &&
 	git bisect reset
@@ -738,7 +741,7 @@ test_expect_success '"git bisect bad HEAD" behaves as "git bisect bad"' '
 	git bisect start HEAD $HASH1 &&
 	git bisect good HEAD &&
 	git bisect bad HEAD &&
-	test_cmp_rev HEAD $HASH6 &&
+	test_cmp_rev HEAD $HASH6 $PARA_HASH1 &&
 	git bisect reset
 '
 
-- 
2.8.1.137.g522756c

  parent reply	other threads:[~2016-04-10 13:20 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-10 13:18 [PATCH v2 00/21] git bisect improvements Stephan Beyer
2016-04-10 13:18 ` [PATCH v2 01/21] bisect: write about `bisect next` in documentation Stephan Beyer
2016-04-10 13:18 ` [PATCH v2 02/21] bisect: allow 'bisect run' if no good commit is known Stephan Beyer
2016-04-10 13:18 ` [PATCH v2 03/21] t/test-lib-functions.sh: generalize test_cmp_rev Stephan Beyer
2016-04-11  0:07   ` Eric Sunshine
2016-04-15 20:00   ` Junio C Hamano
2016-04-24 19:51     ` Stephan Beyer
2016-04-25 18:08       ` Junio C Hamano
2016-04-10 13:18 ` [PATCH v2 04/21] t: use test_cmp_rev() where appropriate Stephan Beyer
2016-04-11  0:07   ` Eric Sunshine
2016-04-15 20:48   ` Junio C Hamano
2016-04-10 13:18 ` Stephan Beyer [this message]
2016-04-10 13:47   ` [PATCH v2 05/21] t6030: generalize test to not rely on current implementation Torsten Bögershausen
2016-04-10 19:16     ` Junio C Hamano
2016-04-10 19:37       ` Stephan Beyer
2016-04-11  0:23     ` Eric Sunshine
2016-04-15 21:07   ` Junio C Hamano
2016-04-10 13:18 ` [PATCH v2 06/21] bisect: add test for the bisect algorithm Stephan Beyer
2016-04-15 21:13   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 07/21] bisect: plug the biggest memory leak Stephan Beyer
2016-04-15 21:18   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 08/21] bisect: make bisect compile if DEBUG_BISECT is set Stephan Beyer
2016-04-15 21:22   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 09/21] bisect: make algorithm behavior independent of DEBUG_BISECT Stephan Beyer
2016-04-15 21:25   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 10/21] bisect: get rid of recursion in count_distance() Stephan Beyer
2016-04-15 21:31   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 11/21] bisect: use struct node_data array instead of int array Stephan Beyer
2016-04-12 23:02   ` Christian Couder
2016-04-15 21:47   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 12/21] bisect: replace clear_distance() by unique markers Stephan Beyer
2016-04-12 23:20   ` Christian Couder
2016-04-15 22:07   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 13/21] bisect: use commit instead of commit list as arguments when appropriate Stephan Beyer
2016-04-15 22:08   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 14/21] bisect: extract get_distance() function from code duplication Stephan Beyer
2016-04-15 22:08   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 15/21] bisect: introduce distance_direction() Stephan Beyer
2016-04-15 22:10   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 16/21] bisect: make total number of commits global Stephan Beyer
2016-04-13 13:23   ` Christian Couder
2016-04-15 22:11   ` Junio C Hamano
2016-04-16  0:44   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 17/21] bisect: rename count_distance() to compute_weight() Stephan Beyer
2016-04-13 13:32   ` Christian Couder
2016-04-15 22:12   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 18/21] bisect: prepare for different algorithms based on find_all Stephan Beyer
2016-04-15 22:36   ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 19/21] bisect: use a bottom-up traversal to find relevant weights Stephan Beyer
2016-04-13 14:11   ` Christian Couder
2016-04-15 22:47   ` Junio C Hamano
2016-04-15 22:49   ` Junio C Hamano
2016-04-26 18:27   ` Junio C Hamano
2016-04-10 13:24 ` [PATCH v2 20/21] bisect: compute best bisection in compute_relevant_weights() Stephan Beyer
2016-04-10 13:24   ` [PATCH v2 21/21] bisect: get back halfway shortcut Stephan Beyer
2016-04-15 22:53     ` Junio C Hamano

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=1460294354-7031-6-git-send-email-s-beyer@gmx.net \
    --to=s-beyer@gmx.net \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).