Skip to contentSkip to conversation

lib/tst_test.sh: Fix test name function detection for TST_CNT

RFC PATCH New Petr Vorel 2 participants 9 messages May 24, 2018 – May 25, 2018

lore
Share & tools
lore

Petr Vorel

author
#0 lore raw

RFC PATCH v4 1/4 lib/tst_test.sh: Fix test name function detection for TST_CNT

---
 testcases/lib/tst_test.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
testcases/lib/tst_test.sh +1 -1
index 464c4c41e..779383392 100644
@@ -349,7 +349,7 @@ tst_run()
 	#TODO check that test reports some results for each test function call
 	while [ $TST_ITERATIONS -gt 0 ]; do
 		if [ -n "$TST_CNT" ]; then
-			if type test1 > /dev/null 2>&1; then
+			if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
 				for tst_i in $(seq $TST_CNT); do
 					local res=$(tst_resstr)
 					$TST_TESTFUNC$tst_i
Signature · 1 line
2.16.3
author
#1 lore raw

RFC PATCH v4 1/4 lib/tst_test.sh: Fix test name function detection for TST_CNT

Hi,

Quoted 11 lines
---
 testcases/lib/tst_test.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
testcases/lib/tst_test.sh +0 -0
index 464c4c41e..779383392 100644

testcases/lib/tst_test.sh tst_run() · line 355

Quoted 8 lines
testcases/lib/tst_test.sh +1 -1
@@ -349,7 +349,7 @@ tst_run()
 	#TODO check that test reports some results for each test function call
 	while [ $TST_ITERATIONS -gt 0 ]; do
 		if [ -n "$TST_CNT" ]; then
-			if type test1 > /dev/null 2>&1; then
+			if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
 				for tst_i in $(seq $TST_CNT); do
 					local res=$(tst_resstr)
 					$TST_TESTFUNC$tst_i

Pushed.

Kind regards,
Petr

author
#2 lore raw

RFC PATCH v4 2/4 lib/tst_test.sh: Hide "private" variables with "_tst_" prefix

In reply to Petr Vorel

Variables in tst_run and out of functions are visible to the test. Adding prefix "_tst_" manifest they're private.

NOTE: kept $res from tst_run() as it's going to be moved into separate function in new commit.

---
 testcases/lib/tst_test.sh | 56 +++++++++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 28 deletions(-)
testcases/lib/tst_test.sh +28 -28
index 779383392..a5f0ab288 100644
@@ -32,7 +32,7 @@ export TST_TMPDIR_RHOST=0
 
 . tst_ansi_color.sh
 
-tst_do_exit()
+_tst_do_exit()
 {
 	local ret=0
 
@@ -79,7 +79,7 @@ tst_do_exit()
 	exit $ret
 }
 
-tst_inc_res()
+_tst_inc_res()
 {
 	case "$1" in
 	TPASS) TST_PASS=$((TST_PASS+1));;
@@ -100,7 +100,7 @@ tst_res()
 	tst_color_enabled
 	local color=$?
 
-	tst_inc_res "$res"
+	_tst_inc_res "$res"
 
 	printf "$TST_ID $TST_COUNT "
 	tst_print_colored $res "$res: "
@@ -113,7 +113,7 @@ tst_brk()
 	shift
 
 	tst_res "$res" "$@"
-	tst_do_exit
+	_tst_do_exit
 }
 
 ROD_SILENT()
@@ -230,14 +230,14 @@ tst_usage()
 	echo "-i n    Execute test n times"
 }
 
-tst_resstr()
+_tst_resstr()
 {
 	echo "$TST_PASS$TST_FAIL$TST_CONF"
 }
 
-tst_rescmp()
+_tst_rescmp()
 {
-	local res=$(tst_resstr)
+	local res=$(_tst_resstr)
 
 	if [ "$1" = "$res" ]; then
 		tst_brk TBROK "Test didn't report any results"
@@ -246,31 +246,31 @@ tst_rescmp()
 
 tst_run()
 {
-	local tst_i
+	local _tst_i
 
 	if [ -n "$TST_TEST_PATH" ]; then
-		for tst_i in $(grep TST_ "$TST_TEST_PATH" | sed 's/.*TST_//; s/[="} \t\/:`].*//'); do
-			case "$tst_i" in
+		for _tst_i in $(grep TST_ "$TST_TEST_PATH" | sed 's/.*TST_//; s/[="} \t\/:`].*//'); do
+			case "$_tst_i" in
 			SETUP|CLEANUP|TESTFUNC|ID|CNT|MIN_KVER);;
 			OPTS|USAGE|PARSE_ARGS|POS_ARGS);;
 			NEEDS_ROOT|NEEDS_TMPDIR|NEEDS_DEVICE|DEVICE);;
 			NEEDS_CMDS|NEEDS_MODULE|MODPATH|DATAROOT);;
 			IPV6);;
-			*) tst_res TWARN "Reserved variable TST_$tst_i used!";;
+			*) tst_res TWARN "Reserved variable TST_$_tst_i used!";;
 			esac
 		done
 	fi
 
-	local name
+	local _tst_name
 
 	OPTIND=1
 
-	while getopts "hi:$TST_OPTS" name $TST_ARGS; do
-		case $name in
+	while getopts "hi:$TST_OPTS" _tst_name $TST_ARGS; do
+		case $_tst_name in
 		'h') tst_usage; exit 0;;
 		'i') TST_ITERATIONS=$OPTARG;;
 		'?') tst_usage; exit 2;;
-		*) $TST_PARSE_ARGS "$name" "$OPTARG";;
+		*) $TST_PARSE_ARGS "$_tst_name" "$OPTARG";;
 		esac
 	done
 
@@ -350,35 +350,35 @@ tst_run()
 	while [ $TST_ITERATIONS -gt 0 ]; do
 		if [ -n "$TST_CNT" ]; then
 			if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
-				for tst_i in $(seq $TST_CNT); do
-					local res=$(tst_resstr)
-					$TST_TESTFUNC$tst_i
-					tst_rescmp "$res"
+				for _tst_i in $(seq $TST_CNT); do
+					local res=$(_tst_resstr)
+					$TST_TESTFUNC$_tst_i
+					_tst_rescmp "$res"
 					TST_COUNT=$((TST_COUNT+1))
 				done
 			else
-				for tst_i in $(seq $TST_CNT); do
-					local res=$(tst_resstr)
-					$TST_TESTFUNC $tst_i
-					tst_rescmp "$res"
+				for _tst_i in $(seq $TST_CNT); do
+					local res=$(_tst_resstr)
+					$TST_TESTFUNC $_tst_i
+					_tst_rescmp "$res"
 					TST_COUNT=$((TST_COUNT+1))
 				done
 			fi
 		else
-			local res=$(tst_resstr)
+			local res=$(_tst_resstr)
 			$TST_TESTFUNC
-			tst_rescmp "$res"
+			_tst_rescmp "$res"
 			TST_COUNT=$((TST_COUNT+1))
 		fi
 		TST_ITERATIONS=$((TST_ITERATIONS-1))
 	done
 
-	tst_do_exit
+	_tst_do_exit
 }
 
 if [ -z "$TST_ID" ]; then
-	filename=$(basename $0)
-	TST_ID=${filename%%.*}
+	_tst_filename=$(basename $0)
+	TST_ID=${_tst_filename%%.*}
 fi
 export TST_ID="$TST_ID"
 
Signature · 1 line
2.16.3
author
#3 lore raw

RFC PATCH v4 3/4 lib/tst_test.sh: Warn about using "private" variable or function

In reply to Petr Vorel
---
 testcases/lib/tst_test.sh | 4 ++++
 1 file changed, 4 insertions(+)
testcases/lib/tst_test.sh +4 -0
index a5f0ab288..cdcd33ced 100644
@@ -259,6 +259,10 @@ tst_run()
 			*) tst_res TWARN "Reserved variable TST_$_tst_i used!";;
 			esac
 		done
+
+		for _tst_i in $(grep _tst_ "$TST_TEST_PATH" | sed 's/.*_tst_//; s/[="} \t\/:`].*//'); do
+			tst_res TWARN "Private variable or function _tst_$_tst_i used!"
+		done
 	fi
 
 	local _tst_name
Signature · 1 line
2.16.3
author
#4 lore raw

RFC PATCH v4 4/4 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS

In reply to Petr Vorel

This is specific only for shell.

Each run of tst_run gets passed sequence number of a test being run as '$1' and corresponding part of data from TST_TEST_DATA as '$2'.

Also create internal functions _tst_run_tests() and _tst_run_test() to reduce duplicity.

---
 doc/test-writing-guidelines.txt | 75 +++++++++++++++++++++++++++++++++++++----
 testcases/lib/tst_test.sh       | 61 +++++++++++++++++++++------------
 2 files changed, 107 insertions(+), 29 deletions(-)
doc/test-writing-guidelines.txt +68 -7
index fb7dcb591..1f6b05279 100644
@@ -1442,12 +1442,12 @@ TST_CNT=2
 
 test1()
 {
-	tst_res TPASS "Test 1 passed"
+	tst_res TPASS "Test $1 passed"
 }
 
 test2()
 {
-	tst_res TPASS "Test 2 passed"
+	tst_res TPASS "Test $1 passed"
 }
 
 tst_run
@@ -1455,7 +1455,8 @@ tst_run
 
 If '$TST_CNT' is set, the test library looks if there are functions named
 '$\{TST_TESTFUNC\}1', ..., '$\{TST_TESTFUNC\}$\{TST_CNT\}' and if these are
-found they are executed one by one.
+found they are executed one by one. The test number is passed to it in the '$1'.
+
 
 [source,sh]
 -------------------------------------------------------------------------------
@@ -1471,8 +1472,8 @@ TST_CNT=2
 do_test()
 {
 	case $1 in
-	1) tst_res TPASS "Test 1 passed";;
-	2) tst_res TPASS "Test 2 passed";;
+	1) tst_res TPASS "Test $1 passed";;
+	2) tst_res TPASS "Test $1 passed";;
 	esac
 }
 
@@ -1483,6 +1484,66 @@ Otherwise, if '$TST_CNT' is set but there is no '$\{TST_TESTFUNC\}1', etc.,
 the '$TST_TESTFUNC' is executed '$TST_CNT' times and the test number is passed
 to it in the '$1'.
 
+[source,sh]
+-------------------------------------------------------------------------------
+#!/bin/sh
+#
+# Example test with tests in a single function, using $TST_TEST_DATA and
+# $TST_TEST_DATA_IFS
+#
+
+TST_TESTFUNC=do_test
+TST_TEST_DATA="foo:bar:d dd"
+TST_TEST_DATA_IFS=":"
+. tst_test.sh
+
+do_test()
+{
+	tst_res TPASS "Test $1 passed with data '$2'"
+}
+
+tst_run
+# output:
+# test 1 TPASS: Test 1 passed with data 'foo'
+# test 2 TPASS: Test 2 passed with data 'bar'
+# test 3 TPASS: Test 3 passed with data 'd dd'
+
+-------------------------------------------------------------------------------
+
+It's possible to pass data for function with '$TST_TEST_DATA'. Optional
+'$TST_TEST_DATA_IFS' is used for splitting, default value is space.
+
+[source,sh]
+-------------------------------------------------------------------------------
+#!/bin/sh
+#
+# Example test with tests in a single function, using $TST_TEST_DATA and $TST_CNT
+#
+
+TST_TESTFUNC=do_test
+TST_CNT=2
+TST_TEST_DATA="foo bar"
+. tst_test.sh
+
+do_test()
+{
+	case $1 in
+	1) tst_res TPASS "Test $1 passed with data '$2'";;
+	2) tst_res TPASS "Test $1 passed with data '$2'";;
+	esac
+}
+
+tst_run
+# output:
+# test 1 TPASS: Test 1 passed with data 'foo'
+# test 2 TPASS: Test 2 passed with data 'bar'
+
+-------------------------------------------------------------------------------
+When '$TST_TEST_DATA' is used with '$TST_CNT', it's passed as whole string in
+'$2' ($1 is for the test number), '$TST_TEST_DATA_IFS' for splitting is not
+specified, therefore using space as the default value. Similar it would be
+using these variables with separate functions.
+
 2.3.2 Library variables
 ^^^^^^^^^^^^^^^^^^^^^^^
 
@@ -1587,8 +1648,8 @@ these can be listed with passing help '-h' option to any test.
 The function that prints the usage is passed in '$TST_USAGE', the help for
 the options implemented in the library is appended when usage is printed.
 
-Lastly the fucntion '$PARSE_ARGS' is called with the option name in '$1' and,
-if option has argument, its value in '$2'.
+Lastly the fucntion '$PARSE_ARGS' is called with the option name in the '$1'
+and, if option has argument, its value in the '$2'.
 
 [source,sh]
 -------------------------------------------------------------------------------
testcases/lib/tst_test.sh +39 -22

92 lines not on this page · raw message

Signature · 1 line
2.16.3
#5 lore raw

RFC PATCH v4 4/4 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS

Hi!

Quoted 13 lines

+[source,sh]
+-------------------------------------------------------------------------------

doc/test-writing-guidelines.txt +11 -0
+#!/bin/sh
+#
+# Example test with tests in a single function, using $TST_TEST_DATA and
+# $TST_TEST_DATA_IFS
+#
+
+TST_TESTFUNC=do_test
+TST_TEST_DATA="foo:bar:d dd"
+TST_TEST_DATA_IFS=":"
+. tst_test.sh
+

doc/test-writing-guidelines.txt Otherwise, if '$TST_CNT' is set but there is no '$\{TST_TESTFUNC\}1', etc., · line 1509

Quoted 10 lines
doc/test-writing-guidelines.txt +10 -0
+do_test()
+{
+	tst_res TPASS "Test $1 passed with data '$2'"
+}
+
+tst_run
+# output:
+# test 1 TPASS: Test 1 passed with data 'foo'
+# test 2 TPASS: Test 2 passed with data 'bar'
+# test 3 TPASS: Test 3 passed with data 'd dd'

^
These should be now just 1 for all three tests, since it is the actual number of the test not position in the test data array, I guess that we may pass that in $3 if ever needed.

Quoted 19 lines

+-------------------------------------------------------------------------------

doc/test-writing-guidelines.txt +18 -0
+
+It's possible to pass data for function with '$TST_TEST_DATA'. Optional
+'$TST_TEST_DATA_IFS' is used for splitting, default value is space.
+
+[source,sh]
+-------------------------------------------------------------------------------
+#!/bin/sh
+#
+# Example test with tests in a single function, using $TST_TEST_DATA and $TST_CNT
+#
+
+TST_TESTFUNC=do_test
+TST_CNT=2
+TST_TEST_DATA="foo bar"
+. tst_test.sh
+
+do_test()
+{

doc/test-writing-guidelines.txt Otherwise, if '$TST_CNT' is set but there is no '$\{TST_TESTFUNC\}1', etc., · line 1539

Quoted 10 lines
doc/test-writing-guidelines.txt +10 -0
+	case $1 in
+	1) tst_res TPASS "Test $1 passed with data '$2'";;
+	2) tst_res TPASS "Test $1 passed with data '$2'";;
+	esac
+}
+
+tst_run
+# output:
+# test 1 TPASS: Test 1 passed with data 'foo'
+# test 2 TPASS: Test 2 passed with data 'bar'

Shouldn't this now be?

# test 1 TPASS: Test 1 passed with data 'foo'
# test 2 TPASS: Test 2 passed with data 'foo'
# test 1 TPASS: Test 1 passed with data 'bar'
# test 2 TPASS: Test 2 passed with data 'bar'
Quoted 2 lines

+-------------------------------------------------------------------------------
+When '$TST_TEST_DATA' is used with '$TST_CNT', it's passed as whole string in

^
This is no longer true right?

Quoted 55 lines

+'$2' ($1 is for the test number), '$TST_TEST_DATA_IFS' for splitting is not

doc/test-writing-guidelines.txt +5 -2
+specified, therefore using space as the default value. Similar it would be
+using these variables with separate functions.
+
 2.3.2 Library variables
 ^^^^^^^^^^^^^^^^^^^^^^^
@@ -1587,8 +1648,8 @@ these can be listed with passing help '-h' option to any test.
 The function that prints the usage is passed in '$TST_USAGE', the help for
 the options implemented in the library is appended when usage is printed.
 
-Lastly the fucntion '$PARSE_ARGS' is called with the option name in '$1' and,
-if option has argument, its value in '$2'.
+Lastly the fucntion '$PARSE_ARGS' is called with the option name in the '$1'
+and, if option has argument, its value in the '$2'.
 
 [source,sh]
 -------------------------------------------------------------------------------
testcases/lib/tst_test.sh +2 -13
index cdcd33ced..34b2188ac 100644
@@ -246,7 +246,7 @@ _tst_rescmp()
 
 tst_run()
 {
-	local _tst_i
+	local _tst_i _tst_data
 
 	if [ -n "$TST_TEST_PATH" ]; then
 		for _tst_i in $(grep TST_ "$TST_TEST_PATH" | sed 's/.*TST_//; s/[="} \t\/:`].*//'); do
@@ -255,7 +255,7 @@ tst_run()
 			OPTS|USAGE|PARSE_ARGS|POS_ARGS);;
 			NEEDS_ROOT|NEEDS_TMPDIR|NEEDS_DEVICE|DEVICE);;
 			NEEDS_CMDS|NEEDS_MODULE|MODPATH|DATAROOT);;
-			IPV6);;
+			IPV6|TEST_DATA|TEST_DATA_IFS);;
 			*) tst_res TWARN "Reserved variable TST_$_tst_i used!";;
 			esac
 		done
@@ -352,27 +352,17 @@ tst_run()
 
 	#TODO check that test reports some results for each test function call
 	while [ $TST_ITERATIONS -gt 0 ]; do
-		if [ -n "$TST_CNT" ]; then
-			if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
-				for _tst_i in $(seq $TST_CNT); do
-					local res=$(_tst_resstr)
-					$TST_TESTFUNC$_tst_i
-					_tst_rescmp "$res"
-					TST_COUNT=$((TST_COUNT+1))
-				done
-			else
-				for _tst_i in $(seq $TST_CNT); do
-					local res=$(_tst_resstr)

testcases/lib/tst_test.sh tst_run() · line 359

Quoted 10 lines
testcases/lib/tst_test.sh +5 -5
-					$TST_TESTFUNC $_tst_i
-					_tst_rescmp "$res"
-					TST_COUNT=$((TST_COUNT+1))
-				done
-			fi
+		if [ -n "$TST_TEST_DATA" ]; then
+			_tst_i=1
+			tst_check_cmds cut
+			while true; do
+				tst_data="$(echo "$TST_TEST_DATA" | cut -d"$TST_TEST_DATA_IFS" -f$_tst_i)"

^
_tst_data here and below

Quoted 14 lines
testcases/lib/tst_test.sh +5 -4
+				[ -z "$tst_data" ] && break
+				_tst_run_tests "$tst_data"
+				_tst_i=$((_tst_i+1))
+			done
 		else
-			local res=$(_tst_resstr)
-			$TST_TESTFUNC
-			_tst_rescmp "$res"
-			TST_COUNT=$((TST_COUNT+1))
+			_tst_run_tests
 		fi
 		TST_ITERATIONS=$((TST_ITERATIONS-1))
 	done

testcases/lib/tst_test.sh tst_run() · line 376

Quoted 7 lines
testcases/lib/tst_test.sh +4 -0
@@ -380,6 +370,31 @@ tst_run()
 	_tst_do_exit
 }
 
+_tst_run_tests()
+{
+	local data="$1"
+	local i

Shouldn't we prefix these two variables with _tst_ prefix as well?

Quoted 4 lines
testcases/lib/tst_test.sh +4 -0
+	for i in $(seq ${TST_CNT:-1}); do
+		if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
+			_tst_run_test "$TST_TESTFUNC$i" $i "$data"
+		else

testcases/lib/tst_test.sh tst_run() · line 391

Quoted 10 lines
testcases/lib/tst_test.sh +10 -0
+			_tst_run_test "$TST_TESTFUNC" $i "$data"
+		fi
+	done
+}
+
+_tst_run_test()
+{
+	local res=$(_tst_resstr)
+	local fnc="$1"
+	shift

And here as well, the _tst_ prefix?

Quoted 20 lines
testcases/lib/tst_test.sh +7 -0
+	$fnc "$@"
+	_tst_rescmp "$res"
+	TST_COUNT=$((TST_COUNT+1))
+}
+
 if [ -z "$TST_ID" ]; then
 	_tst_filename=$(basename $0)
 	TST_ID=${_tst_filename%%.*}
@@ -404,6 +419,8 @@ if [ -z "$TST_NO_DEFAULT_RUN" ]; then
 		tst_brk TBROK "TST_TESTFUNC is not defined"
 	fi
 
+	TST_TEST_DATA_IFS="${TST_TEST_DATA_IFS:- }"
+
 	if [ -n "$TST_CNT" ]; then
 		if ! tst_is_int "$TST_CNT"; then
 			tst_brk TBROK "TST_CNT must be integer"
Signature · 1 line
2.16.3
Signature · 2 lines
Cyril Hrubis
[email protected]
author
#6 lore raw

RFC PATCH v4 4/4 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS

Hi Cyril,

thanks for review, I'll fix bugs.

Quoted 6 lines

testcases/lib/tst_test.sh tst_run() · line 376

Quoted 4 lines
testcases/lib/tst_test.sh +4 -0
+_tst_run_tests()
+{
+	local data="$1"
+	local i

Shouldn't we prefix these two variables with _tst_ prefix as well?

IMHO no, as _tst_run_test and _tst_run_tests is private and these variables are local. I thought we need to change tst_run as it's run by the tests and all variables which are.

Quoted 7 lines

testcases/lib/tst_test.sh tst_run() · line 391

Quoted 5 lines
testcases/lib/tst_test.sh +5 -0
+_tst_run_test()
+{
+	local res=$(_tst_resstr)
+	local fnc="$1"
+	shift

And here as well, the _tst_ prefix?

Dtto.

Kind regards,
Petr

#7 lore raw

RFC PATCH v4 4/4 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS

Hi!

Quoted 8 lines
Quoted 6 lines

testcases/lib/tst_test.sh tst_run() · line 376

Quoted 4 lines
testcases/lib/tst_test.sh +4 -0
+_tst_run_tests()
+{
+	local data="$1"
+	local i

Shouldn't we prefix these two variables with _tst_ prefix as well?

IMHO no, as _tst_run_test and _tst_run_tests is private and these variables are local. I thought we need to change tst_run as it's run by the tests and all variables which are.

As far as I can tell these still leak into the fnc function, or am I mistaken?

Signature · 2 lines
Cyril Hrubis
[email protected]
author
#8 lore raw

RFC PATCH v4 4/4 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS

Hi Cyril,

Quoted 11 lines
Quoted 8 lines
Quoted 6 lines

testcases/lib/tst_test.sh tst_run() · line 376

Quoted 4 lines
testcases/lib/tst_test.sh +4 -0
+_tst_run_tests()
+{
+	local data="$1"
+	local i

Shouldn't we prefix these two variables with _tst_ prefix as well?

IMHO no, as _tst_run_test and _tst_run_tests is private and these variables are local. I thought we need to change tst_run as it's run by the tests and all variables which are.

As far as I can tell these still leak into the fnc function, or am I mistaken?

Uh, you're right. I didn't know that sourcing will absorb local function data outside of function :(. I'll fix it in v5.

Kind regards,
Petr