From: Andrei Rybak Date: Thu, 24 Jun 2021 19:23:14 GMT Subject: Re: [PATCH v3 1/4] test-lib-functions: introduce test_line_count_cmd Message-ID: <6ad6ac5a-18ac-102e-29dc-3c0987de08e7@gmail.com> In-Reply-To: <54bf7756-5578-4fe4-dbe5-f63b368c4d63@gmail.com> On 21/06/2021 11:08, Andrei Rybak wrote: > On 19/06/2021 03:30, Đoàn Trần Công Danh wrote: >> diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh >> index f0448daa74..e055a4f808 100644 >> --- a/t/test-lib-functions.sh >> +++ b/t/test-lib-functions.sh >> @@ -845,6 +845,86 @@ test_line_count () { >>       fi >>   } >> +# test_line_count_cmd checks the exit status, and the number of lines in >> +# the captured stdout of a command. >> +# >> +# SYNOPSIS: >> +# >> +#    test_line_count_cmd [!] cmd [args...] >> +# >> +# Expect succeed exit status when running >> +# >> +#    cmd [args...] >> +# >> +# then, run sh's "test <# of lines in stdout> " >> +# >> +# OPTIONS: >> +# !: >> +#    Instead of expecting "cmd [args...]" succeed, expect its failure. >> +#    Note, if the command under testing is "git", >> +#    test_must_fail should be used instead of "!". >> +# >> +# EXAMPLE: >> +#    test_line_count_cmd -ge 10 git tag --no-contains v1.0.0 >> +#    test_line_count_cmd -le 10 ! grep some-text a-file >> +#    test_line_count_cmd = 0 test_must_fail git rev-parse --verify >> abcd1234 >> +# >> +# NOTE: >> +# * a temporary file named test_line_count_cmd_.out will be created >> under >> +# $TRASH_DIRECTORY/.git/trash iff $TRASH_DIRECTORY/.git/ exists. >> +# Otherwise, created in $TRASH_DIRECTORY. This temporary file will be >> +# cleaned by test_when_finished >> +test_line_count_cmd () { >> +    { >> +        local outop outval outfile >> +        local expect_failure actual_failure >> +        local trashdir="$TRASH_DIRECTORY" >> + >> +        if test -d "$TRASH_DIRECTORY/.git" >> +        then >> +            trashdir="$TRASH_DIRECTORY/.git/trash" && >> +            mkdir -p "$trashdir" >> +        fi && >> +        if test $# -lt 3 >> +        then >> +            BUG "missing and " > > Nit: s/binary-ops/binop/ for consistency with documentation comment > above.  Also, technically the invocation of test_line_count_cmd could be > missing any of its required three parameters, including "cmd".  How > about something similar to the call to BUG in test_i18ngrep: > >     BUG "too few parameters to test_line_count_cmd" > > ? > >> +        fi && >> +        outop="$1" && >> +        outval="$2" && >> +        shift 2 && >> +        outfile="$trashdir/test_line_count_cmd_.out" && >> +        if test "x$1" = "x!" >> +        then >> +            shift && >> +            expect_failure=yes >> +        fi && >> +        if test $# = 0 >> +        then >> +            BUG "test_line_count_cmd: no command to be run" >> +        else >> +            test_when_finished "rm -f '$outfile'" && >> +            exec 8>"$outfile" >> +            # We need to redirect stderr to &9, >> +            # and redirect this function's 9>&2 >> +            # in order to not messed with -x >> +            if ! "$@" >&8 2>&9 >> +            then >> +                actual_failure=yes >> +            fi >> +        fi 8>&1 && >> +        case "$expect_failure,$actual_failure" in >> +        yes,) >> +            echo >&4 "error: '$@' succeed!" && > > It seems that function error() could be used here and below instead of > "echo >&4". After spending some time reading t/test-lib-functions.sh, now I don't think that using error() is a good suggestion. Closest relatives of test_line_count_cmd -- test_line_count and test_must_be_empty -- both just use "echo". Other usages of error() in t/test-lib.sh and t/test-lib-functions.sh suggest that error() is not meant to be used for reporting test failure messages, but internal failures. For example: error "You haven't built things yet, have you?" and error "Internal error: $stderr disappeared." > s/succeed/succeeded/ --- it might be worth borrowing wording from > test_must_fail().  Something like: > >     error "test_line_count_cmd: command succeeded: '$@'"