diff mbox series

[v2,1/5] test-lib-functions: introduce test_line_count_cmd

Message ID 20210615172038.28917-2-congdanhqx@gmail.com (mailing list archive)
State New, archived
Headers show
Series t: new helper test_line_count_cmd | expand

Commit Message

Đoàn Trần Công Danh June 15, 2021, 5:20 p.m. UTC
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(+)

Comments

Felipe Contreras June 17, 2021, 4:51 a.m. UTC | #1
Đoàn Trần Công Danh wrote:
> In Git project,

In _the_ Git project

> we have multiple occasions that requires checking number

multiple instances that require checking the number

> of lines of text in stdout and/or stderr of a command. One of such
> example is t6400,

One of such examples

> which checks number of files in various states.

that checks the number of files (see 'that' vs. 'which' [1]).

> Some of those commands are Git command,

are git commands,

> 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,

for a line count,

> thus loosing the exit status.

losing

> Introduce a helper function to check for number of lines in stdout and

the number of lines

> stderr from those commands.
> 
> This helper will create 2 temporary files in process,

the process

> thus it may affect output of some checks.

the output

> 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,

the exit status

> and the number of lines in

> +# captured stdout and/or stderr of a command.

the captured stdout...

> +#
> +# 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",

the command under...

> 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.

if $TRASH_DIRECTORY/.git/ exists

> +# Otherwise, they will be created in $TRASH_DIRECTORY.
> +# Those temporary files will be cleant by test_when_finished

will be cleaned by ...

Cheers.

[1] https://www.merriam-webster.com/words-at-play/when-to-use-that-and-which
diff mbox series

Patch

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"