From ac9afcc31cd1f7c00c2747132e5f512173613fd9 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Sun, 27 Apr 2014 21:15:47 +0300 Subject: test: add test_write_lines helper API and implementation as suggested by Junio. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/README | 22 ++++++++++++++++++++++ t/test-lib-functions.sh | 5 +++++ 2 files changed, 27 insertions(+) (limited to 't') diff --git a/t/README b/t/README index caeeb9dedc..2d6232fbd3 100644 --- a/t/README +++ b/t/README @@ -596,6 +596,28 @@ library for your script to use. ... ' + - test_write_lines + + Split to white-space separated words and write it out on standard + output, one word per line. + Useful to prepare multi-line files in a compact form. + + Example: + + test_write_lines "a b c d e f g" >foo + + Is a more compact equivalent of: + cat >foo <<-EOF + a + b + c + d + e + f + g + EOF + + - test_pause This command is useful for writing and debugging tests and must be diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index aeae3ca769..213fd0f3c5 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -712,6 +712,11 @@ test_ln_s_add () { fi } +# This function writes out its parameters, one per line +test_write_lines () { + printf "%s\n" "$@" +} + perl () { command "$PERL_PATH" "$@" } -- cgit v1.2.1 From bb98b01ee8c5c6f66a6d70aa453b70184dd3d96f Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Mon, 5 May 2014 16:51:43 -0700 Subject: test doc: test_write_lines does not split its arguments test_write_lines carefully quotes its arguments as "$@", so test_write_lines "a b" c writes two lines as requested, not three. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- t/README | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 't') diff --git a/t/README b/t/README index 2d6232fbd3..8a9d4995f5 100644 --- a/t/README +++ b/t/README @@ -596,15 +596,14 @@ library for your script to use. ... ' - - test_write_lines + - test_write_lines - Split to white-space separated words and write it out on standard - output, one word per line. + Write on standard output, one line per argument. Useful to prepare multi-line files in a compact form. Example: - test_write_lines "a b c d e f g" >foo + test_write_lines a b c d e f g >foo Is a more compact equivalent of: cat >foo <<-EOF -- cgit v1.2.1 From 8f2514e95fe142954d1dd4408cc7cb413a275844 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Sun, 27 Apr 2014 21:15:51 +0300 Subject: patch-id-test: test stable and unstable behaviour Verify that patch ID supports an algorithm that is stable against diff split and reordering. Signed-off-by: Michael S. Tsirkin Signed-off-by: Junio C Hamano --- t/t4204-patch-id.sh | 102 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 11 deletions(-) (limited to 't') diff --git a/t/t4204-patch-id.sh b/t/t4204-patch-id.sh index d2c930de87..fe011f83ff 100755 --- a/t/t4204-patch-id.sh +++ b/t/t4204-patch-id.sh @@ -5,27 +5,44 @@ test_description='git patch-id' . ./test-lib.sh test_expect_success 'setup' ' - test_commit initial foo a && - test_commit first foo b && - git checkout -b same HEAD^ && - test_commit same-msg foo b && - git checkout -b notsame HEAD^ && - test_commit notsame-msg foo c + as="a a a a a a a a" && # eight a + test_write_lines $as >foo && + test_write_lines $as >bar && + git add foo bar && + git commit -a -m initial && + test_write_lines $as b >foo && + test_write_lines $as b >bar && + git commit -a -m first && + git checkout -b same master && + git commit --amend -m same-msg && + git checkout -b notsame master && + echo c >foo && + echo c >bar && + git commit --amend -a -m notsame-msg && + test_write_lines bar foo >bar-then-foo && + test_write_lines foo bar >foo-then-bar ' test_expect_success 'patch-id output is well-formed' ' - git log -p -1 | git patch-id > output && + git log -p -1 | git patch-id >output && grep "^[a-f0-9]\{40\} $(git rev-parse HEAD)$" output ' +#calculate patch id. Make sure output is not empty. calc_patch_id () { - git patch-id | - sed "s# .*##" > patch-id_"$1" + name="$1" + shift + git patch-id "$@" | + sed "s/ .*//" >patch-id_"$name" && + test_line_count -gt 0 patch-id_"$name" +} + +get_top_diff () { + git log -p -1 "$@" -O bar-then-foo -- } get_patch_id () { - git log -p -1 "$1" | git patch-id | - sed "s# .*##" > patch-id_"$1" + get_top_diff "$1" | calc_patch_id "$@" } test_expect_success 'patch-id detects equality' ' @@ -56,6 +73,69 @@ test_expect_success 'whitespace is irrelevant in footer' ' test_cmp patch-id_master patch-id_same ' +cmp_patch_id () { + if + test "$1" = "relevant" + then + ! test_cmp patch-id_"$2" patch-id_"$3" + else + test_cmp patch-id_"$2" patch-id_"$3" + fi +} + +test_patch_id_file_order () { + relevant="$1" + shift + name="order-${1}-$relevant" + shift + get_top_diff "master" | calc_patch_id "$name" "$@" && + git checkout same && + git format-patch -1 --stdout -O foo-then-bar | + calc_patch_id "ordered-$name" "$@" && + cmp_patch_id $relevant "$name" "ordered-$name" + +} + +# combined test for options: add more tests here to make them +# run with all options +test_patch_id () { + test_patch_id_file_order "$@" +} + +# small tests with detailed diagnostic for basic options. +test_expect_success 'file order is irrelevant with --stable' ' + test_patch_id_file_order irrelevant --stable --stable +' + +test_expect_success 'file order is relevant with --unstable' ' + test_patch_id_file_order relevant --unstable --unstable +' + +#Now test various option combinations. +test_expect_success 'default is unstable' ' + test_patch_id relevant default +' + +test_expect_success 'patchid.stable = true is stable' ' + test_config patchid.stable true && + test_patch_id irrelevant patchid.stable=true +' + +test_expect_success 'patchid.stable = false is unstable' ' + test_config patchid.stable false && + test_patch_id relevant patchid.stable=false +' + +test_expect_success '--unstable overrides patchid.stable = true' ' + test_config patchid.stable true && + test_patch_id relevant patchid.stable=true--unstable --unstable +' + +test_expect_success '--stable overrides patchid.stable = false' ' + test_config patchid.stable false && + test_patch_id irrelevant patchid.stable=false--stable --stable +' + test_expect_success 'patch-id supports git-format-patch MIME output' ' get_patch_id master && git checkout same && -- cgit v1.2.1