netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Haller <thaller@redhat.com>
To: NetFilter <netfilter-devel@vger.kernel.org>
Cc: Thomas Haller <thaller@redhat.com>
Subject: [PATCH nft 03/11] tests/shell: colorize terminal output with test result
Date: Fri,  8 Sep 2023 00:07:15 +0200	[thread overview]
Message-ID: <20230907220833.2435010-4-thaller@redhat.com> (raw)
In-Reply-To: <20230907220833.2435010-1-thaller@redhat.com>

Colors help to see what is important.

It honors the common NO_COLOR=<anything> to disable coloring. It also
does not colorize, if [ -t 1 ] indicates that stdout is not a terminal.

Signed-off-by: Thomas Haller <thaller@redhat.com>
---
 tests/shell/run-tests.sh | 71 ++++++++++++++++++++++++++++++++++------
 1 file changed, 61 insertions(+), 10 deletions(-)

diff --git a/tests/shell/run-tests.sh b/tests/shell/run-tests.sh
index e0adb27ad104..c8688587bbc4 100755
--- a/tests/shell/run-tests.sh
+++ b/tests/shell/run-tests.sh
@@ -1,15 +1,26 @@
 #!/bin/bash
 
+GREEN=""
+YELLOW=""
+RED=""
+RESET=""
+if [[ -t 1 && -z "$NO_COLOR" ]] ; then
+	GREEN=$'\e[32m'
+	YELLOW=$'\e[33m'
+	RED=$'\e[31m'
+	RESET=$'\e[0m'
+fi
+
 _msg() {
 	local level="$1"
 	shift
-	local msg
 
-	msg="$level: $*"
-	if [ "$level" = E -o "$level" = W ] ; then
-		printf '%s\n' "$msg" >&2
+	if [ "$level" = E ] ; then
+		printf '%s\n' "$RED$level$RESET: $*" >&2
+	elif [ "$level" = W ] ; then
+		printf '%s\n' "$YELLOW$level$RESET: $*" >&2
 	else
-		printf '%s\n' "$msg"
+		printf '%s\n' "$level: $*"
 	fi
 	if [ "$level" = E ] ; then
 		exit 1
@@ -28,6 +39,39 @@ msg_info() {
 	_msg I "$@"
 }
 
+align_text() {
+	local _OUT_VARNAME="$1"
+	local _LEFT_OR_RIGHT="$2"
+	local _INDENT="$3"
+	shift 3
+	local _text="$*"
+	local _text_plain
+	local _text_align
+	local _text_result
+	local _i
+
+	# This function is needed, because "$text" might contain color escape
+	# sequences. A plain `printf '%12s' "$text"` will not align properly.
+
+	# strip escape sequences
+	_text_plain="${_text//$'\e['[0-9]m/}"
+	_text_plain="${_text_plain//$'\e['[0-9][0-9]m/}"
+
+	_text_align=""
+	for (( _i = "${#_text_plain}" ; "$_i" < "$_INDENT" ; _i++ )) ; do
+		_text_align="$_text_align "
+	done
+
+	if [ "$_LEFT_OR_RIGHT" = left ] ; then
+		_text_result="$(printf "%s$_text_align-" "$_text")"
+	else
+		_text_result="$(printf "$_text_align%s-" "$_text")"
+	fi
+	_text_result="${_text_result%-}"
+
+	eval "$_OUT_VARNAME=\"\$_text_result\""
+}
+
 bool_n() {
 	case "$1" in
 		n|N|no|No|NO|0|false|False|FALSE)
@@ -459,8 +503,7 @@ print_test_header() {
 	local suffix="$4"
 	local text
 
-	text="[$status]"
-	text="$(printf '%-12s' "$text")"
+	align_text text left 12 "[$status]"
 	_msg "$msglevel" "$text $testfile${suffix:+: $suffix}"
 }
 
@@ -477,10 +520,10 @@ print_test_result() {
 
 	if [ "$rc_got" -eq 0 ] ; then
 		((ok++))
-		result_msg_status="OK"
+		result_msg_status="${GREEN}OK$RESET"
 	elif [ "$rc_got" -eq 77 ] ; then
 		((skipped++))
-		result_msg_status="SKIPPED"
+		result_msg_status="${YELLOW}SKIPPED$RESET"
 	else
 		((failed++))
 		result_msg_level="W"
@@ -492,6 +535,7 @@ print_test_result() {
 			result_msg_status="FAILED"
 			result_msg_suffix="got $rc_got"
 		fi
+		result_msg_status="$RED$result_msg_status$RESET"
 		result_msg_files=( "$NFT_TEST_TESTTMPDIR/testout.log" )
 	fi
 
@@ -578,7 +622,14 @@ echo ""
 kmemleak_found=0
 check_kmemleak_force
 
-msg_info "results: [OK] $ok [SKIPPED] $skipped [FAILED] $failed [TOTAL] $((ok+skipped+failed))"
+if [ "$failed" -gt 0 ] ; then
+	RR="$RED"
+elif [ "$skipped" -gt 0 ] ; then
+	RR="$YELLOW"
+else
+	RR="$GREEN"
+fi
+msg_info "${RR}results$RESET: [OK] $GREEN$ok$RESET [SKIPPED] $YELLOW$skipped$RESET [FAILED] $RED$failed$RESET [TOTAL] $((ok+skipped+failed))"
 
 kernel_cleanup
 
-- 
2.41.0


  parent reply	other threads:[~2023-09-07 22:09 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-07 22:07 [PATCH nft 00/11] tests/shell: colorize output, fix VALGRIND mode Thomas Haller
2023-09-07 22:07 ` [PATCH nft 01/11] tests/shell: cleanup result handling in "test-wrapper.sh" Thomas Haller
2023-09-07 22:07 ` [PATCH nft 02/11] tests/shell: cleanup print_test_result() and show TAINTED error code Thomas Haller
2023-09-07 22:07 ` Thomas Haller [this message]
2023-09-07 22:07 ` [PATCH nft 04/11] tests/shell: fix handling failures with VALGRIND=y Thomas Haller
2023-09-07 22:07 ` [PATCH nft 05/11] tests/shell: print the NFT setting with the VALGRIND=y wrapper Thomas Haller
2023-09-07 22:07 ` [PATCH nft 06/11] tests/shell: don't redirect error/warning messages to stderr Thomas Haller
2023-09-07 22:07 ` [PATCH nft 07/11] tests/shell: redirect output of test script to file too Thomas Haller
2023-09-07 22:07 ` [PATCH nft 08/11] tests/shell: print "kernel is tainted" separate from test result Thomas Haller
2023-09-07 22:07 ` [PATCH nft 09/11] tests/shell: no longer enable verbose output when selecting a test Thomas Haller
2023-09-07 22:07 ` [PATCH nft 10/11] tests/shell: record wall time of test run in result data Thomas Haller
2023-09-07 22:07 ` [PATCH nft 11/11] tests/shell: set NFT_TEST_JOBS based on $(nproc) Thomas Haller

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230907220833.2435010-4-thaller@redhat.com \
    --to=thaller@redhat.com \
    --cc=netfilter-devel@vger.kernel.org \
    /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.
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 NNTP newsgroup(s).