Re: [PATCH 01/10] cat-file tests: test bad usage
From: Eric Sunshine <hidden>
Date: 2021-11-07 01:07:33
On Sat, Nov 6, 2021 at 5:47 PM Ævar Arnfjörð Bjarmason [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Stress test the usage emitted when options are combined in ways that isn't supported. Let's test various option combinations, some of these we buggily allow right now. E.g. this reveals a bug in 321459439e1 (cat-file: support --textconv/--filters in batch mode, 2016-09-09) that we'll fix in a subsequent commit. We're supposed to be emitting a relevant message when --batch-all-objects is combined with --textconv or --filters, but we don't. Signed-off-by: Ævar Arnfjörð Bjarmason <redacted> ---diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh@@ -4,6 +4,96 @@ test_description='git cat-file' +test_cmdmode_usage() {
Style nit: add space before ()
+ test_expect_code 129 "$@" 2>err && + grep "^error:.*is incompatible with" err +} + +test_expect_success 'usage: cmdmode' ' + test_cmdmode_usage git cat-file -e -p && + test_cmdmode_usage git cat-file -p -t && + test_cmdmode_usage git cat-file -t -s && + test_cmdmode_usage git cat-file -s --textconv && + test_cmdmode_usage git cat-file --textconv --filters +'
A minor observation: I usually avoid combining tests into a conglomerate since it makes it harder to discover at a glance the problematic test if one does start failing. I'd probably have used a separate test_expect_success() invocation for each allowed switch combination (in other words, five distinct tests instead of all five cases stuffed into a single test). Not a big deal.
+test_incompatible_usage() {Style nit: add space before ()
+ test_expect_code 129 "$@" 2>err && + grep -E "^error:.*$switch.*needs" err +}
What is `$switch`? There doesn't seem to be any such variable defined
which means the regex is really:
^error:.*.*needs
thus matches "by accident".
+for opt in $short_modes +do + test_expect_success "usage: $opt requires another option" ' + test_expect_code 129 git cat-file $opt + ' + + for opt2 in --batch \ + --batch-check \ + --follow-symlinks + do + test_expect_failure "usage: incompatible options: $opt and $opt2" ' + test_incompatible_usage git cat-file $opt $opt2 + ' + done + + opt2="--path=foo HEAD:some-path.txt" + test_expect_success "usage: incompatible options: $opt and $opt2" ' + test_incompatible_usage git cat-file $opt $opt2 + ' +done
So, the only reason the final `opt2` is not part of the for-loop:
for opt2 in --batch \
--batch-check \
--follow-symlinks \
"--path=foo HEAD:some-path.txt"
is that it succeeds but the others fail?
+for opt in --buffer \ + --follow-symlinks \ + --batch-all-objects +do + status=success + if test $opt = "--buffer" + then + status=failure + fi + test_expect_$status "usage: bad option combination: $opt without batch mode" ' + test_expect_code 129 git cat-file $opt && + test_expect_code 129 git cat-file $opt commit HEAD + ' +done
In this case, `status` differentiates between success and failure...