Re: [PATCH v3 1/4] test-lib-functions: introduce test_line_count_cmd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <binop> <value> [!] cmd [args...]
+#
+# Expect succeed exit status when running
+#
+#    cmd [args...]
+#
+# then, run sh's "test <# of lines in stdout> <binop> <value>"
+#
+# 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 <binary-ops> and <value>"

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: '$@'"



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux