Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup
v6 cover Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup
Hi,
Changes v5->v6:
Fixes bugs reported by Alexey:
* Removed wrong _tst_i increment in for loop
* Fix doc:
-When '$TST_TEST_DATA' is used with '$TST_CNT', here used with space as default -'$TST_TEST_DATA_IFS' value Similar it would be using these variables with -separate functions.
+'$TST_TEST_DATA' can be used with '$TST_CNT'. If '$TST_TEST_DATA_IFS' not specified, +space as default value is used. Of course, it's possible to use separate functions.
Hopefully ready to merge.
Kind regards,
Petr
Petr Vorel (5):
tst_test.sh: Hide "private" variables with "_tst_" prefix tst_test.sh: Warn about using "private" variable or function tst_test.sh: Filter out commented out lines from warnings tst_test.sh: s/resm/res/
tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS
doc/test-writing-guidelines.txt | 79 ++++++++++++++++++++++++++--- testcases/lib/tst_test.sh | 110 +++++++++++++++++++++++++--------------- 2 files changed, 141 insertions(+), 48 deletions(-)
Signature · 1 line
2.16.3
RFC PATCH v6 1/5 tst_test.sh: Hide "private" variables with "_tst_" prefix
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 | 57 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 29 deletions(-)
testcases/lib/tst_test.sh +28 -29
@@ -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,30 @@ tst_rescmp() tst_run() { - local tst_i + local _tst_i + local _tst_name 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 - 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 +349,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 _tst_res=$(_tst_resstr) + $TST_TESTFUNC$_tst_i + _tst_rescmp "$_tst_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 _tst_res=$(_tst_resstr) + $TST_TESTFUNC $_tst_i + _tst_rescmp "$_tst_res" TST_COUNT=$((TST_COUNT+1)) done fi else - local res=$(tst_resstr) + local _tst_res=$(_tst_resstr) $TST_TESTFUNC - tst_rescmp "$res" + _tst_rescmp "$_tst_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
RFC PATCH v6 2/5 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
@@ -260,6 +260,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 OPTIND=1
Signature · 1 line
2.16.3
RFC PATCH v6 3/5 tst_test.sh: Filter out commented out lines from warnings
In reply to Petr Vorel--- testcases/lib/tst_test.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
testcases/lib/tst_test.sh +10 -2
@@ -244,13 +244,21 @@ _tst_rescmp() fi } +_tst_get_used_var() +{ + local _tst_pattern="$1" + + grep $_tst_pattern "$TST_TEST_PATH" | grep -v '^[[:space:]]*#' | \ + sed "s/.*${_tst_pattern}//;"' s/[="} \t\/:`].*//' +} + tst_run() { local _tst_i local _tst_name if [ -n "$TST_TEST_PATH" ]; then - for _tst_i in $(grep TST_ "$TST_TEST_PATH" | sed 's/.*TST_//; s/[="} \t\/:`].*//'); do + for _tst_i in $(_tst_get_used_var "TST_"); do case "$_tst_i" in SETUP|CLEANUP|TESTFUNC|ID|CNT|MIN_KVER);; OPTS|USAGE|PARSE_ARGS|POS_ARGS);;
@@ -261,7 +269,7 @@ tst_run() esac done - for _tst_i in $(grep _tst_ "$TST_TEST_PATH" | sed 's/.*_tst_//; s/[="} \t\/:`].*//'); do + for _tst_i in $(_tst_get_used_var "_tst_"); do tst_res TWARN "Private variable or function _tst_$_tst_i used!" done fi
Signature · 1 line
2.16.3
RFC PATCH v6 3/5 tst_test.sh: Filter out commented out lines from warnings
Hi!
What is the usecase for this?
I know that comments does not count as a code but why would the test need to comment with a reserved name in it?
Quoted 9 lines
--- testcases/lib/tst_test.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)testcases/lib/tst_test.sh +0
-0
testcases/lib/tst_test.sh _tst_rescmp() · line 252
Quoted 9 lines
testcases/lib/tst_test.sh +6
-0@@ -244,13 +244,21 @@ _tst_rescmp() fi } +_tst_get_used_var() +{ + local _tst_pattern="$1" + + grep $_tst_pattern "$TST_TEST_PATH" | grep -v '^[[:space:]]*#' | \ + sed "s/.*${_tst_pattern}//;"' s/[="} \t\/:`].*//'
As far as I can tell this does not work for:
foo # run function foo
Quoted 1 line
testcases/lib/tst_test.sh +1
-0+}
Signature · 2 lines
Cyril Hrubis [email protected]
RFC PATCH v6 3/5 tst_test.sh: Filter out commented out lines from warnings
Hi Cyril,
Quoted 5 lines
Hi!
What is the usecase for this?I know that comments does not count as a code but why would the test need to comment with a reserved name in it?
OK, let's drop it.
Quoted 21 lines
Quoted 9 lines
--- testcases/lib/tst_test.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)testcases/lib/tst_test.sh +0
-0testcases/lib/tst_test.sh _tst_rescmp() · line 252
Quoted 9 lines
testcases/lib/tst_test.sh +6
-0@@ -244,13 +244,21 @@ _tst_rescmp() fi } +_tst_get_used_var() +{ + local _tst_pattern="$1" + + grep $_tst_pattern "$TST_TEST_PATH" | grep -v '^[[:space:]]*#' | \ + sed "s/.*${_tst_pattern}//;"' s/[="} \t\/:`].*//'As far as I can tell this does not work for:
Quoted 1 line
foo # run function foo
Not sure what you expected. The behavior is:
* no warning for:
# _tst_foo run function _tst_foo
* warning for:
_tst_foo # run function _tst_foo
I take it as your NACK anyway :).
Kind regards,
Petr
RFC PATCH v6 3/5 tst_test.sh: Filter out commented out lines from warnings
Hi!
Quoted 8 lines
Quoted 1 line
foo # run function foo
Not sure what you expected. The behavior is:
* no warning for:
#_tst_foorun function_tst_foo* warning for:
_tst_foo# run function_tst_foo
We will also get warning for:
tst_foo # we are not allowed to call _tst_foo
I was trying to point out that the solution is incomplete...
But anyway I see no point in proceeding further with the implemtation.
Signature · 2 lines
Cyril Hrubis [email protected]
RFC PATCH v6 4/5 tst_test.sh: s/resm/res/
In reply to Petr Vorelresm is for legacy API.
--- testcases/lib/tst_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
testcases/lib/tst_test.sh +1 -1
@@ -88,7 +88,7 @@ _tst_inc_res() TWARN) TST_WARN=$((TST_WARN+1));; TCONF) TST_CONF=$((TST_CONF+1));; TINFO) ;; - *) tst_brk TBROK "Invalid resm type '$1'";; + *) tst_brk TBROK "Invalid res type '$1'";; esac }
Signature · 1 line
2.16.3
RFC PATCH v6 5/5 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS
In reply to Petr VorelThis 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.
Introduced dependencies: cut tr wc.
--- doc/test-writing-guidelines.txt | 79 +++++++++++++++++++++++++++++++++++++---- testcases/lib/tst_test.sh | 59 +++++++++++++++++++----------- 2 files changed, 110 insertions(+), 28 deletions(-)
doc/test-writing-guidelines.txt +72 -7
@@ -1442,20 +1442,23 @@ 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 +# output: +# foo 1 TPASS: Test 1 passed +# foo 2 TPASS: Test 2 passed ------------------------------------------------------------------------------- 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,18 +1474,80 @@ 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 } tst_run +# output: +# foo 1 TPASS: Test 1 passed +# foo 2 TPASS: Test 2 passed ------------------------------------------------------------------------------- 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: +# foo 1 TPASS: Test 1 passed with data 'foo' +# foo 2 TPASS: Test 1 passed with data 'bar' +# foo 3 TPASS: Test 1 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: +# foo 1 TPASS: Test 1 passed with data 'foo' +# foo 2 TPASS: Test 2 passed with data 'foo' +# foo 3 TPASS: Test 1 passed with data 'bar' +# foo 4 TPASS: Test 2 passed with data 'bar' +------------------------------------------------------------------------------- + +'$TST_TEST_DATA' can be used with '$TST_CNT'. If '$TST_TEST_DATA_IFS' not specified, +space as default value is used. Of course, it's possible to use separate functions. + 2.3.2 Library variables ^^^^^^^^^^^^^^^^^^^^^^^
@@ -1587,8 +1652,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 +38 -21
90 lines not on this page · raw message
Signature · 1 line
2.16.3
RFC PATCH v6 5/5 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS
Hi!
Apart from the patch that we discussed the rest of the patchset looks good to me, acked.
Signature · 2 lines
Cyril Hrubis [email protected]
RFC PATCH v6 5/5 tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS
Hi Cyril, Alexey,
Quoted 3 lines
Hi!
Apart from the patch that we discussed the rest of the patchset looks good to me, acked.
I'll remove "3/5] tst_test.sh: Filter out commented out lines from warnings" and split comment in 2/5 into new line as it's too long.
Thanks both for your review, I'll add your ack.
Kind regards,
Petr