* [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup
@ 2018-05-25 21:57 Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 1/5] tst_test.sh: Hide "private" variables with "_tst_" prefix Petr Vorel
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Petr Vorel @ 2018-05-25 21:57 UTC (permalink / raw)
To: ltp
Hi,
hope I replaced all variables, which are needed and updated all places
in docs.
changes v4->v5:
* Loop in TST_TEST_DATA with for loop instead of while. It's needed to
allow having empty parameter (needed for IPsec network tests). This
brought dependencies to: cut tr wc.
* Updated docs correctly.
* Added commit "tst_test.sh: Filter out commented out lines from warnings"
* Added commit "tst_test.sh: s/resm/res/"
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 | 80 ++++++++++++++++++++++++++---
testcases/lib/tst_test.sh | 111 +++++++++++++++++++++++++---------------
2 files changed, 143 insertions(+), 48 deletions(-)
--
2.16.3
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 1/5] tst_test.sh: Hide "private" variables with "_tst_" prefix
2018-05-25 21:57 [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup Petr Vorel
@ 2018-05-25 21:57 ` Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function Petr Vorel
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Petr Vorel @ 2018-05-25 21:57 UTC (permalink / raw)
To: ltp
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.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
testcases/lib/tst_test.sh | 57 +++++++++++++++++++++++------------------------
1 file changed, 28 insertions(+), 29 deletions(-)
diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
index 779383392..337d33ca4 100644
--- a/testcases/lib/tst_test.sh
+++ b/testcases/lib/tst_test.sh
@@ -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"
--
2.16.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function
2018-05-25 21:57 [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 1/5] tst_test.sh: Hide "private" variables with "_tst_" prefix Petr Vorel
@ 2018-05-25 21:57 ` Petr Vorel
2018-05-30 15:47 ` Alexey Kodanev
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 3/5] tst_test.sh: Filter out commented out lines from warnings Petr Vorel
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Petr Vorel @ 2018-05-25 21:57 UTC (permalink / raw)
To: ltp
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
testcases/lib/tst_test.sh | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
index 337d33ca4..de5d65039 100644
--- a/testcases/lib/tst_test.sh
+++ b/testcases/lib/tst_test.sh
@@ -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
--
2.16.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 3/5] tst_test.sh: Filter out commented out lines from warnings
2018-05-25 21:57 [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 1/5] tst_test.sh: Hide "private" variables with "_tst_" prefix Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function Petr Vorel
@ 2018-05-25 21:57 ` Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 4/5] tst_test.sh: s/resm/res/ Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 5/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS Petr Vorel
4 siblings, 0 replies; 9+ messages in thread
From: Petr Vorel @ 2018-05-25 21:57 UTC (permalink / raw)
To: ltp
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
testcases/lib/tst_test.sh | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
index de5d65039..098ff7bd2 100644
--- a/testcases/lib/tst_test.sh
+++ b/testcases/lib/tst_test.sh
@@ -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
--
2.16.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 4/5] tst_test.sh: s/resm/res/
2018-05-25 21:57 [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup Petr Vorel
` (2 preceding siblings ...)
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 3/5] tst_test.sh: Filter out commented out lines from warnings Petr Vorel
@ 2018-05-25 21:57 ` Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 5/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS Petr Vorel
4 siblings, 0 replies; 9+ messages in thread
From: Petr Vorel @ 2018-05-25 21:57 UTC (permalink / raw)
To: ltp
resm is for legacy API.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
testcases/lib/tst_test.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
index 098ff7bd2..621e3eec0 100644
--- a/testcases/lib/tst_test.sh
+++ b/testcases/lib/tst_test.sh
@@ -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
}
--
2.16.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 5/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS
2018-05-25 21:57 [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup Petr Vorel
` (3 preceding siblings ...)
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 4/5] tst_test.sh: s/resm/res/ Petr Vorel
@ 2018-05-25 21:57 ` Petr Vorel
2018-05-30 15:54 ` Alexey Kodanev
4 siblings, 1 reply; 9+ messages in thread
From: Petr Vorel @ 2018-05-25 21:57 UTC (permalink / raw)
To: ltp
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.
Introduced dependencies: cut tr wc.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
doc/test-writing-guidelines.txt | 80 +++++++++++++++++++++++++++++++++++++----
testcases/lib/tst_test.sh | 60 ++++++++++++++++++++-----------
2 files changed, 112 insertions(+), 28 deletions(-)
diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt
index fb7dcb591..8177e64e8 100644
--- a/doc/test-writing-guidelines.txt
+++ b/doc/test-writing-guidelines.txt
@@ -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,81 @@ 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'
+-------------------------------------------------------------------------------
+
+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.
+
2.3.2 Library variables
^^^^^^^^^^^^^^^^^^^^^^^
@@ -1587,8 +1653,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]
-------------------------------------------------------------------------------
diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
index 621e3eec0..97b82f308 100644
--- a/testcases/lib/tst_test.sh
+++ b/testcases/lib/tst_test.sh
@@ -255,6 +255,8 @@ _tst_get_used_var()
tst_run()
{
local _tst_i
+ local _tst_data
+ local _tst_max
local _tst_name
if [ -n "$TST_TEST_PATH" ]; then
@@ -264,7 +266,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
@@ -359,27 +361,16 @@ 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 _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 _tst_res=$(_tst_resstr)
- $TST_TESTFUNC $_tst_i
- _tst_rescmp "$_tst_res"
- TST_COUNT=$((TST_COUNT+1))
- done
- fi
+ if [ -n "$TST_TEST_DATA" ]; then
+ tst_check_cmds cut tr wc
+ _tst_max=$(( $(echo $TST_TEST_DATA | tr -cd "$TST_TEST_DATA_IFS" | wc -c) +1))
+ for _tst_i in $(seq $_tst_max); do
+ _tst_data="$(echo "$TST_TEST_DATA" | cut -d"$TST_TEST_DATA_IFS" -f$_tst_i)"
+ _tst_run_tests "$_tst_data"
+ _tst_i=$((_tst_i+1))
+ done
else
- local _tst_res=$(_tst_resstr)
- $TST_TESTFUNC
- _tst_rescmp "$_tst_res"
- TST_COUNT=$((TST_COUNT+1))
+ _tst_run_tests
fi
TST_ITERATIONS=$((TST_ITERATIONS-1))
done
@@ -387,6 +378,31 @@ tst_run()
_tst_do_exit
}
+_tst_run_tests()
+{
+ local _tst_data="$1"
+ local _tst_i
+
+ for _tst_i in $(seq ${TST_CNT:-1}); do
+ if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
+ _tst_run_test "$TST_TESTFUNC$_tst_i" $_tst_i "$_tst_data"
+ else
+ _tst_run_test "$TST_TESTFUNC" $_tst_i "$_tst_data"
+ fi
+ done
+}
+
+_tst_run_test()
+{
+ local _tst_res=$(_tst_resstr)
+ local _tst_fnc="$1"
+ shift
+
+ $_tst_fnc "$@"
+ _tst_rescmp "$_tst_res"
+ TST_COUNT=$((TST_COUNT+1))
+}
+
if [ -z "$TST_ID" ]; then
_tst_filename=$(basename $0)
TST_ID=${_tst_filename%%.*}
@@ -411,6 +427,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"
--
2.16.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function Petr Vorel
@ 2018-05-30 15:47 ` Alexey Kodanev
2018-05-31 5:55 ` Petr Vorel
0 siblings, 1 reply; 9+ messages in thread
From: Alexey Kodanev @ 2018-05-30 15:47 UTC (permalink / raw)
To: ltp
On 26.05.2018 00:57, Petr Vorel wrote:
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> testcases/lib/tst_test.sh | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
> index 337d33ca4..de5d65039 100644
> --- a/testcases/lib/tst_test.sh
> +++ b/testcases/lib/tst_test.sh
> @@ -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!"
Hi Petr,
For example "do_virt_dev_tst_01()" function name in the test, it is
also a private function name?
> + done
> fi
>
> OPTIND=1
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 5/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 5/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS Petr Vorel
@ 2018-05-30 15:54 ` Alexey Kodanev
0 siblings, 0 replies; 9+ messages in thread
From: Alexey Kodanev @ 2018-05-30 15:54 UTC (permalink / raw)
To: ltp
On 26.05.2018 00:57, Petr Vorel wrote:
> 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.
>
> Introduced dependencies: cut tr wc.
>
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> doc/test-writing-guidelines.txt | 80 +++++++++++++++++++++++++++++++++++++----
> testcases/lib/tst_test.sh | 60 ++++++++++++++++++++-----------
> 2 files changed, 112 insertions(+), 28 deletions(-)
>
> diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt
> index fb7dcb591..8177e64e8 100644
> --- a/doc/test-writing-guidelines.txt
> +++ b/doc/test-writing-guidelines.txt
> @@ -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,81 @@ 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'
> +-------------------------------------------------------------------------------
> +
> +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
The description doesn't look quite right, at least, "Similar" typo?
> +separate functions.
> +
> 2.3.2 Library variables
> ^^^^^^^^^^^^^^^^^^^^^^^
>
> @@ -1587,8 +1653,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'
^
function
> +and, if option has argument, its value in the '$2'.
>
> [source,sh]
> -------------------------------------------------------------------------------
> diff --git a/testcases/lib/tst_test.sh b/testcases/lib/tst_test.sh
> index 621e3eec0..97b82f308 100644
> --- a/testcases/lib/tst_test.sh
> +++ b/testcases/lib/tst_test.sh
> @@ -255,6 +255,8 @@ _tst_get_used_var()
> tst_run()
> {
> local _tst_i
> + local _tst_data
> + local _tst_max
> local _tst_name
>
> if [ -n "$TST_TEST_PATH" ]; then
> @@ -264,7 +266,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
> @@ -359,27 +361,16 @@ 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 _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 _tst_res=$(_tst_resstr)
> - $TST_TESTFUNC $_tst_i
> - _tst_rescmp "$_tst_res"
> - TST_COUNT=$((TST_COUNT+1))
> - done
> - fi
> + if [ -n "$TST_TEST_DATA" ]; then
> + tst_check_cmds cut tr wc
> + _tst_max=$(( $(echo $TST_TEST_DATA | tr -cd "$TST_TEST_DATA_IFS" | wc -c) +1))
> + for _tst_i in $(seq $_tst_max); do
> + _tst_data="$(echo "$TST_TEST_DATA" | cut -d"$TST_TEST_DATA_IFS" -f$_tst_i)"
> + _tst_run_tests "$_tst_data"
> + _tst_i=$((_tst_i+1)
$_tst_i is being set by the 'for' loop, so no need to increment it here.
And the rest looks good.
> + done
> else
> - local _tst_res=$(_tst_resstr)
> - $TST_TESTFUNC
> - _tst_rescmp "$_tst_res"
> - TST_COUNT=$((TST_COUNT+1))
> + _tst_run_tests
> fi
> TST_ITERATIONS=$((TST_ITERATIONS-1))
> done
> @@ -387,6 +378,31 @@ tst_run()
> _tst_do_exit
> }
>
> +_tst_run_tests()
> +{
> + local _tst_data="$1"
> + local _tst_i
> +
> + for _tst_i in $(seq ${TST_CNT:-1}); do
> + if type ${TST_TESTFUNC}1 > /dev/null 2>&1; then
> + _tst_run_test "$TST_TESTFUNC$_tst_i" $_tst_i "$_tst_data"
> + else
> + _tst_run_test "$TST_TESTFUNC" $_tst_i "$_tst_data"
> + fi
> + done
> +}
> +
> +_tst_run_test()
> +{
> + local _tst_res=$(_tst_resstr)
> + local _tst_fnc="$1"
> + shift
> +
> + $_tst_fnc "$@"
> + _tst_rescmp "$_tst_res"
> + TST_COUNT=$((TST_COUNT+1))
> +}
> +
> if [ -z "$TST_ID" ]; then
> _tst_filename=$(basename $0)
> TST_ID=${_tst_filename%%.*}
> @@ -411,6 +427,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"
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function
2018-05-30 15:47 ` Alexey Kodanev
@ 2018-05-31 5:55 ` Petr Vorel
0 siblings, 0 replies; 9+ messages in thread
From: Petr Vorel @ 2018-05-31 5:55 UTC (permalink / raw)
To: ltp
Hi Alexey,
...
> > + 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!"
> Hi Petr,
> For example "do_virt_dev_tst_01()" function name in the test, it is
> also a private function name?
No, the goal was to separate library names (e.g. anything in tst_test.sh) from test
itself. I.e. we can use any name in test, just avoid using namespace _tst_ (or TST_ except
doing the setup itself.
Kind regards,
Petr
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-05-31 5:55 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-05-25 21:57 [LTP] [RFC PATCH v5 0/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS + cleanup Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 1/5] tst_test.sh: Hide "private" variables with "_tst_" prefix Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 2/5] tst_test.sh: Warn about using "private" variable or function Petr Vorel
2018-05-30 15:47 ` Alexey Kodanev
2018-05-31 5:55 ` Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 3/5] tst_test.sh: Filter out commented out lines from warnings Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 4/5] tst_test.sh: s/resm/res/ Petr Vorel
2018-05-25 21:57 ` [LTP] [RFC PATCH v5 5/5] tst_test.sh: Add TST_TEST_DATA and TST_TEST_DATA_IFS Petr Vorel
2018-05-30 15:54 ` Alexey Kodanev
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox