From: "Đoàn Trần Công Danh" <congdanhqx@gmail.com>
To: git@vger.kernel.org
Cc: "Đoàn Trần Công Danh" <congdanhqx@gmail.com>,
"Eric Sunshine" <sunshine@sunshineco.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Junio C Hamano" <gitster@pobox.com>,
"Bagas Sanjaya" <bagasdotme@gmail.com>,
"Phillip Wood" <phillip.wood123@gmail.com>,
"Felipe Contreras" <felipe.contreras@gmail.com>
Subject: [PATCH v2 1/5] test-lib-functions: introduce test_line_count_cmd
Date: Wed, 16 Jun 2021 00:20:34 +0700 [thread overview]
Message-ID: <20210615172038.28917-2-congdanhqx@gmail.com> (raw)
In-Reply-To: <20210615172038.28917-1-congdanhqx@gmail.com>
In Git project, we have multiple occasions that requires checking number
of lines of text in stdout and/or stderr of a command. One of such
example is t6400, which checks number of files in various states.
Some of those commands are Git command, and we would like to check their
exit status. In some of those checks, we pipe the stdout of those
commands to "wc -l" to check for line count, thus loosing the exit status.
Introduce a helper function to check for number of lines in stdout and
stderr from those commands.
This helper will create 2 temporary files in process, thus it may affect
output of some checks.
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
---
t/test-lib-functions.sh | 117 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index f0448daa74..b3281409de 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -845,6 +845,123 @@ test_line_count () {
fi
}
+# test_line_count_cmd checks exit status, and the number of lines in
+# captured stdout and/or stderr of a command.
+#
+# Usage:
+#
+# test_line_count_cmd [--[out|err] <binop> <value>]... [--] [!] cmd [args...]
+#
+# Options:
+# --out <binop> <value>:
+# --err <binop> <value>:
+# Run sh's "test <# of lines> <binop> <value>" on # of lines in stdout
+# (for --out) or stderr (for --err)
+# !:
+# Instead of expecting "cmd [args...]" succeed, expect its failure.
+# Note, if command under testing is "git", test_must_fail should be used
+# instead of "!".
+#
+# Example:
+# test_line_count_cmd --out -ge 10 --err = 0 git tag --no-contains v1.0.0
+# test_line_count_cmd --out -le 10 ! grep some-text a-file
+# test_line_count_cmd --out = 0 test_must_fail git rev-parse --verify abcd1234
+#
+# NOTE:
+# * if "--out" is specified, a temporary file named test_line_count_cmd_.out
+# will be created.
+# * if "--err" is specified, a temporary file named test_line_count_cmd_.err
+# will be created.
+# Those temporary files will be created under $TRASH_DIRECTORY/.git/trash
+# if $TRASH_DIRECTORY/.git directory existed.
+# Otherwise, they will be created in $TRASH_DIRECTORY.
+# Those temporary files will be cleant by test_when_finished
+test_line_count_cmd () {
+ {
+ local outop outval outfile
+ local errop errval errfile
+ 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 &&
+ while test $# != 0
+ do
+ case "$1" in
+ --out)
+ outop="$2" &&
+ outval="$3" &&
+ outfile="$trashdir/test_line_count_cmd_.out" &&
+ shift 3
+ ;;
+ --err)
+ errop="$2" &&
+ errval="$3" &&
+ errfile="$trashdir/test_line_count_cmd_.err" &&
+ shift 3
+ ;;
+ --)
+ shift &&
+ break
+ ;;
+ -*)
+ BUG "test_line_count_cmd: unknown options: '$1'"
+ ;;
+ *)
+ break
+ ;;
+ esac
+ done &&
+ 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"
+ elif test -z "$outop$errop"
+ then
+ BUG "test_line_count_cmd: check which stream?"
+ else
+ if test -n "$outfile"
+ then
+ test_when_finished "rm -f '$outfile'" &&
+ exec 8>"$outfile"
+ fi &&
+ if test -n "$errfile"
+ then
+ test_when_finished "rm -f '$errfile'" &&
+ exec 9>"$errfile"
+ fi &&
+ if ! "$@" >&8 2>&9
+ then
+ actual_failure=yes
+ fi
+ fi 8>&1 &&
+ case "$expect_failure,$actual_failure" in
+ yes,)
+ echo >&4 "error: '$@' succeed!"
+ return 1
+ ;;
+ ,yes)
+ echo >&4 "error: '$@' run into failure!"
+ return 1
+ esac &&
+ if test -n "$outop"
+ then
+ test_line_count "$outop" "$outval" "$outfile" >&4
+ fi &&
+ if test -n "$errop"
+ then
+ test_line_count "$errop" "$errval" "$errfile" >&4
+ fi
+ } 9>&2 2>&4
+}
+
test_file_size () {
test "$#" -ne 1 && BUG "1 param"
test-tool path-utils file-size "$1"
--
2.32.0.278.gd42b80f139
next prev parent reply other threads:[~2021-06-15 17:20 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-15 17:20 [PATCH v2 0/5] t: new helper test_line_count_cmd Đoàn Trần Công Danh
2021-06-15 17:20 ` Đoàn Trần Công Danh [this message]
2021-06-17 4:51 ` [PATCH v2 1/5] test-lib-functions: introduce test_line_count_cmd Felipe Contreras
2021-06-15 17:20 ` [PATCH v2 2/5] t6402: use find(1) builtin to filter instead of grep Đoàn Trần Công Danh
2021-06-15 17:20 ` [PATCH v2 3/5] t0041: use test_line_count_cmd to check std{out,err} Đoàn Trần Công Danh
2021-06-16 3:06 ` Junio C Hamano
2021-06-16 14:21 ` Đoàn Trần Công Danh
2021-06-17 0:18 ` Junio C Hamano
2021-06-15 17:20 ` [PATCH v2 4/5] t6400: use test_line_count_cmd to count # of lines in stdout Đoàn Trần Công Danh
2021-06-15 17:20 ` [PATCH v2 5/5] t6402: " Đoàn Trần Công Danh
2021-06-19 1:30 ` [PATCH v3 0/4] t: new helper test_line_count_cmd Đoàn Trần Công Danh
2021-06-19 5:50 ` Eric Sunshine
2021-06-19 6:17 ` Junio C Hamano
2021-06-19 6:26 ` Eric Sunshine
2021-06-19 6:50 ` Junio C Hamano
2021-06-21 23:52 ` Đoàn Trần Công Danh
2021-06-22 0:43 ` Eric Sunshine
2021-06-19 1:30 ` [PATCH v3 1/4] test-lib-functions: introduce test_line_count_cmd Đoàn Trần Công Danh
2021-06-21 9:08 ` Andrei Rybak
2021-06-24 19:23 ` Andrei Rybak
2021-06-19 1:30 ` [PATCH v3 2/4] t6402: use find(1) builtin to filter instead of grep Đoàn Trần Công Danh
2021-06-21 8:17 ` Andrei Rybak
2021-06-21 23:54 ` Đoàn Trần Công Danh
2021-06-19 1:30 ` [PATCH v3 3/4] t6400: use test_line_count_cmd to count # of lines in stdout Đoàn Trần Công Danh
2021-06-19 1:30 ` [PATCH v3 4/4] t6402: " Đoàn Trần Công Danh
2021-06-29 13:57 ` [PATCH v4 0/2] t640{0,2}: preserve ls-files exit status code Đoàn Trần Công Danh
2021-06-29 13:57 ` [PATCH v4 1/2] t6400: preserve git " Đoàn Trần Công Danh
2021-06-29 14:11 ` Eric Sunshine
2021-06-29 22:49 ` Junio C Hamano
2021-06-30 1:57 ` Eric Sunshine
2021-06-30 3:36 ` Junio C Hamano
2021-06-30 11:01 ` Đoàn Trần Công Danh
2021-06-30 20:44 ` Junio C Hamano
2021-06-29 13:57 ` [PATCH v4 2/2] t6402: preserve git " Đoàn Trần Công Danh
2021-06-29 20:49 ` [PATCH v4 0/2] t640{0,2}: preserve ls-files " Junio C Hamano
2021-07-04 5:46 ` [PATCH v5 0/3] new test-libs-function: test_stdout_line_count Đoàn Trần Công Danh
2021-07-04 5:46 ` [PATCH v5 1/3] test-lib-functions: introduce test_stdout_line_count Đoàn Trần Công Danh
2021-07-04 5:56 ` Eric Sunshine
2021-07-06 19:24 ` Junio C Hamano
2021-07-07 3:03 ` Đoàn Trần Công Danh
2021-07-04 5:46 ` [PATCH v5 2/3] t6400: preserve git ls-files exit status code Đoàn Trần Công Danh
2021-07-04 5:46 ` [PATCH v5 3/3] t6402: preserve git " Đoàn Trần Công Danh
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=20210615172038.28917-2-congdanhqx@gmail.com \
--to=congdanhqx@gmail.com \
--cc=avarab@gmail.com \
--cc=bagasdotme@gmail.com \
--cc=felipe.contreras@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=phillip.wood123@gmail.com \
--cc=sunshine@sunshineco.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).