[Openvpn-devel,v3] introduce V= level to manage t_client.sh output verbosity

Message ID 20220920132351.27718-1-gert@greenie.muc.de
State Accepted
Headers show
Series [Openvpn-devel,v3] introduce V= level to manage t_client.sh output verbosity | expand

Commit Message

Gert Doering Sept. 20, 2022, 3:23 a.m. UTC
If t_client.sh is run interactively, more verbose output is useful
to quickly see what it is doing.  If run from a CI environment, going
through lots of output for successful tests just to find the one that
failed is non-useful.

Introduce V=<n> environment variable to control output verbosity

 V=0 - do not print any per-test output at all, just overall summary
 V=1 - print single header line for each successful test
       print full output for failing tests
 V=99 - print full output, always, as before

default is V=1 now

Signed-off-by: Gert Doering <gert@greenie.muc.de>

v2:
 fix erroneous test on "-n"
 do not accumulate extra "\n" in outbuf (V=1)
 fix missing "-e" at "test failures. FAIL." message
 fix missing "\n" when including "diff" output
 fix missing "-n" when printing outbuf (= extra newline)
 (and more newlines being shuffled around)

v3:
 fix quoting on inclusion of "ifconfig/route diff", with newlines...
---
 tests/t_client.sh.in | 91 +++++++++++++++++++++++++++++---------------
 1 file changed, 60 insertions(+), 31 deletions(-)

Comments

Frank Lichtenheld Sept. 26, 2022, 11:43 p.m. UTC | #1
On Tue, Sep 20, 2022 at 03:23:51PM +0200, Gert Doering wrote:
> If t_client.sh is run interactively, more verbose output is useful
> to quickly see what it is doing.  If run from a CI environment, going
> through lots of output for successful tests just to find the one that
> failed is non-useful.
> 
> Introduce V=<n> environment variable to control output verbosity
> 
>  V=0 - do not print any per-test output at all, just overall summary
>  V=1 - print single header line for each successful test
>        print full output for failing tests
>  V=99 - print full output, always, as before
> 
> default is V=1 now
> 

Seems to do what it is supposed to do.

Acked-By: Frank Lichtenheld <frank@lichtenheld.com>

Regards,
Antonio Quartulli Sept. 27, 2022, 12:10 a.m. UTC | #2
Hi,

On 27/09/2022 11:43, Frank Lichtenheld wrote:
> On Tue, Sep 20, 2022 at 03:23:51PM +0200, Gert Doering wrote:
>> If t_client.sh is run interactively, more verbose output is useful
>> to quickly see what it is doing.  If run from a CI environment, going
>> through lots of output for successful tests just to find the one that
>> failed is non-useful.
>>
>> Introduce V=<n> environment variable to control output verbosity
>>
>>   V=0 - do not print any per-test output at all, just overall summary
>>   V=1 - print single header line for each successful test
>>         print full output for failing tests
>>   V=99 - print full output, always, as before
>>
>> default is V=1 now
>>
> 
> Seems to do what it is supposed to do.
> 
> Acked-By: Frank Lichtenheld <frank@lichtenheld.com>

I also second this verdict:

Acked-by: Antonio Quartulli <a@unstable.cc>
Gert Doering Sept. 27, 2022, 6:10 a.m. UTC | #3
Thanks for the review & testing ;-)

Patch has been applied to the master branch.

commit 398f73094a692ba46be7e3205b65d915d2593a64
Author: Gert Doering
Date:   Tue Sep 20 15:23:51 2022 +0200

     introduce V= level to manage t_client.sh output verbosity

     Signed-off-by: Gert Doering <gert@greenie.muc.de>
     Acked-by: Frank Lichtenheld <frank@lichtenheld.com>
     Acked-by: Antonio Quartulli <a@unstable.cc>
     Message-Id: <20220920132351.27718-1-gert@greenie.muc.de>
     URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25285.html
     Signed-off-by: Gert Doering <gert@greenie.muc.de>


--
kind regards,

Gert Doering

Patch

diff --git a/tests/t_client.sh.in b/tests/t_client.sh.in
index 76ac9b22..d90fe638 100755
--- a/tests/t_client.sh.in
+++ b/tests/t_client.sh.in
@@ -121,17 +121,43 @@  else
     exit 1
 fi
 
+# verbosity, defaults to "1"
+V="${V:-1}"
+
 exit_code=0
 
 # ----------------------------------------------------------
 # helper functions
 # ----------------------------------------------------------
 
+# output progress information
+#  depending on verbosity level, collect & print only on failure
+output_start()
+{
+    case $V in
+	0) outbuf="" ;;			# no per-test output at all
+	1) echo -e "$@"			# compact, details only on failure
+           outbuf="\n" ;;
+	*) echo -e "\n$@\n" ;;		# print all, with a bit formatting
+    esac
+}
+
+output()
+{
+    NO_NL=''; if [ "X$1" = "X-n" ] ; then NO_NL=$1 ; shift ; fi
+    case $V in
+	0) ;;				# no per-test output at all
+	1) outbuf="$outbuf$@" 		# print details only on failure
+	   test -z "$NO_NL" && outbuf="$outbuf\n"
+           ;;
+	*) echo -e $NO_NL "$@" ;;	# print everything
+    esac
+}
+
 # print failure message, increase FAIL counter
 fail()
 {
-    echo ""
-    echo "FAIL: $@" >&2
+    output "FAIL: $@\n"
     fail_count=$(( $fail_count + 1 ))
 }
 
@@ -236,7 +262,7 @@  run_ping_tests()
 
     for bytes in $sizes_list
     do
-	echo "run IPv$proto ping tests ($want), $bytes byte packets..."
+	output "run IPv$proto ping tests ($want), $bytes byte packets..."
 
 	echo "$cmd -b $bytes -C 20 -p 250 -q $FPING_EXTRA_ARGS $targetlist" >>$LOGDIR/$SUF:fping.out
 	$cmd -b $bytes -C 20 -p 250 -q $FPING_EXTRA_ARGS $targetlist >>$LOGDIR/$SUF:fping.out 2>&1
@@ -287,32 +313,32 @@  do
         up=""
     fi
 
-    echo -e "\n### test run $SUF: '$test_run_title' ###\n"
+    output_start "### test run $SUF: '$test_run_title' ###"
     fail_count=0
 
     if [ -n "$test_prep" ]; then
-        echo -e "running preparation: '$test_prep'"
+        output "running preparation: '$test_prep'"
         eval $test_prep
     fi
 
-    echo "save pre-openvpn ifconfig + route"
+    output "save pre-openvpn ifconfig + route"
     get_ifconfig_route >$LOGDIR/$SUF:ifconfig_route_pre.txt
 
-    echo -e "\nrun pre-openvpn ping tests - targets must not be reachable..."
+    output "\nrun pre-openvpn ping tests - targets must not be reachable..."
     run_ping_tests 4 want_fail "$ping4_hosts"
     run_ping_tests 6 want_fail "$ping6_hosts"
     if [ "$fail_count" = 0 ] ; then
-        echo -e "OK.\n"
+        output "OK.\n"
     else
-	echo -e "FAIL: make sure that ping hosts are ONLY reachable via VPN, SKIP test $SUF".
+	fail "make sure that ping hosts are ONLY reachable via VPN, SKIP test $SUF."
 	SUMMARY_FAIL="$SUMMARY_FAIL $SUF"
 	exit_code=31
-	continue
+	echo -e "$outbuf" ; continue
     fi
 
     pidfile="${top_builddir}/tests/$LOGDIR/openvpn-$SUF.pid"
     openvpn_conf="$openvpn_conf --writepid $pidfile $up"
-    echo " run openvpn $openvpn_conf"
+    output " run openvpn $openvpn_conf"
     echo "# src/openvpn/openvpn $openvpn_conf" >$LOGDIR/$SUF:openvpn.log
     umask 022
     $RUN_SUDO "${top_builddir}/src/openvpn/openvpn" $openvpn_conf >>$LOGDIR/$SUF:openvpn.log &
@@ -335,25 +361,25 @@  do
 
     opid=`cat $pidfile`
     if [ -n "$opid" ]; then
-        echo "  OpenVPN running with PID $opid"
+        output "  OpenVPN running with PID $opid"
     else
-        echo "  Could not read OpenVPN PID file" >&2
+        output "  Could not read OpenVPN PID file"
     fi
 
     # If OpenVPN did not start
     if [ $ovpn_init_success -ne 1 -o -z "$opid" ]; then
-        echo "$0:  OpenVPN did not initialize in a reasonable time" >&2
+        output "$0:  OpenVPN did not initialize in a reasonable time"
         if [ -n "$opid" ]; then
            $RUN_SUDO $KILL_EXEC $opid
         fi
         $RUN_SUDO $KILL_EXEC $sudopid
-	echo "tail -5 $SUF:openvpn.log" >&2
-	tail -5 $LOGDIR/$SUF:openvpn.log >&2
-	echo -e "\nFAIL. skip rest of sub-tests for test run $SUF.\n" >&2
+	output "tail -5 $SUF:openvpn.log"
+	output "`tail -5 $LOGDIR/$SUF:openvpn.log`"
+	fail "skip rest of sub-tests for test run $SUF."
 	trap - 0 1 2 3 15
 	SUMMARY_FAIL="$SUMMARY_FAIL $SUF"
 	exit_code=30
-	continue
+	echo -e "$outbuf" ; continue
     fi
 
     # make sure openvpn client is terminated in case shell exits
@@ -361,21 +387,21 @@  do
     trap "$RUN_SUDO $KILL_EXEC $opid ; trap - 0 ; exit 1" 1 2 3 15
 
     # compare whether anything changed in ifconfig/route setup?
-    echo "save ifconfig+route"
+    output "save ifconfig+route"
     get_ifconfig_route >$LOGDIR/$SUF:ifconfig_route.txt
 
-    echo -n "compare pre-openvpn ifconfig+route with current values..."
+    output -n "compare pre-openvpn ifconfig+route with current values..."
     if diff $LOGDIR/$SUF:ifconfig_route_pre.txt \
 	    $LOGDIR/$SUF:ifconfig_route.txt >/dev/null
     then
 	fail "no differences between ifconfig/route before OpenVPN start and now."
     else
-	echo -e " OK!\n"
+	output " OK!\n"
     fi
 
     # post init script needed?
     if [ -n "$test_postinit" ]; then
-        echo -e "running post-init cmd: '$test_postinit'"
+        output "running post-init cmd: '$test_postinit'"
         eval $test_postinit
     fi
 
@@ -385,9 +411,9 @@  do
 
     run_ping_tests 4 want_ok "$ping4_hosts"
     run_ping_tests 6 want_ok "$ping6_hosts"
-    echo -e "ping tests done.\n"
+    output "ping tests done.\n"
 
-    echo "stopping OpenVPN"
+    output "stopping OpenVPN"
     $RUN_SUDO $KILL_EXEC $opid
     wait $!
     rc=$?
@@ -395,23 +421,26 @@  do
 	fail "OpenVPN return code $rc, expect 0"
     fi
 
-    echo -e "\nsave post-openvpn ifconfig + route..."
+    output "\nsave post-openvpn ifconfig + route..."
     get_ifconfig_route >$LOGDIR/$SUF:ifconfig_route_post.txt
 
-    echo -n "compare pre- and post-openvpn ifconfig + route..."
+    output -n "compare pre- and post-openvpn ifconfig + route..."
     if diff $LOGDIR/$SUF:ifconfig_route_pre.txt \
 	    $LOGDIR/$SUF:ifconfig_route_post.txt >$LOGDIR/$SUF:ifconfig_route_diff.txt
     then
-	echo -e " OK.\n"
+	output " OK.\n"
     else
-	cat $LOGDIR/$SUF:ifconfig_route_diff.txt >&2
-	fail "differences between pre- and post-ifconfig/route"
+	output "\n\n" "`cat $LOGDIR/$SUF:ifconfig_route_diff.txt`" "\n"
+	fail "differences between pre- and post-ifconfig/route."
     fi
     if [ "$fail_count" = 0 ] ; then
-        echo -e "test run $SUF: all tests OK.\n"
+        output "test run $SUF: all tests OK.\n"
 	SUMMARY_OK="$SUMMARY_OK $SUF"
     else
-	echo -e "test run $SUF: $fail_count test failures. FAIL.\n";
+	if [ "$V" -gt 0 ] ; then
+	    echo -e -n "$outbuf"
+	    echo -e "test run $SUF: $fail_count test failures. FAIL.\n"
+        fi
 	SUMMARY_FAIL="$SUMMARY_FAIL $SUF"
 	exit_code=30
     fi