From mboxrd@z Thu Jan 1 00:00:00 1970 From: Cyril Hrubis Date: Mon, 22 Aug 2016 14:31:40 +0200 Subject: [LTP] [RFC PATCH] test.sh: add SHOULD_PASS, SHOULD_FAIL functions In-Reply-To: <1471617816-15339-1-git-send-email-stanislav.kholmanskikh@oracle.com> References: <1471617816-15339-1-git-send-email-stanislav.kholmanskikh@oracle.com> Message-ID: <20160822123140.GA18142@rei> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ltp@lists.linux.it Hi! > Sometimes we need to execute a command and call tst_resm TPASS/TFAIL > based on the command's exit status. > > The existing ROD() function can make 99% of the job, we just > need to let it know how the command's exit code should be > interpreted. This patch does it and introduce a couple of new > functions to help with the described situation. > > Signed-off-by: Stanislav Kholmanskikh > --- > This is to help with situations like: > > echo 1.0 > memory.limit_in_bytes 2> /dev/null > if [ $? -ne 0 ]; then > tst_resm TPASS "return value is $?" > else > tst_resm TFAIL "return value is 0" > fi > > which could be transformed to: > > SHOULD_FAIL echo 1.0 \> memory.limit_in_bytes This is quite nice. Maybe it would better be named EXPECT_FAIL and EXPECT_PASS or something but SHOULD_ prefix is fine as well. We should include documentation for these in this commit as well. A few comments to the implementation below. > testcases/lib/test.sh | 50 +++++++++++++++++++++++++++++++++++++++++++++--- > 1 files changed, 46 insertions(+), 4 deletions(-) > > diff --git a/testcases/lib/test.sh b/testcases/lib/test.sh > index bd66109..ca2c00b 100644 > --- a/testcases/lib/test.sh > +++ b/testcases/lib/test.sh > @@ -220,12 +220,17 @@ ROD_SILENT() > fi > } > > -ROD() > +ROD_DISPATCHER() > { > + local act > local cmd > local arg > local file > local flag > + local ret > + > + act="$1" > + shift > > for arg; do > file="${arg#\>}" > @@ -251,9 +256,46 @@ ROD() > $@ > fi > > - if [ $? -ne 0 ]; then > - tst_brkm TBROK "$@ failed" > - fi > + ret=$? Why don't we just return from this function here and let the caller examine the $? > + case "$act" in > + 0) # break on failure > + if [ $ret -ne 0 ]; then > + tst_brkm TBROK "$@ failed" > + fi;; > + > + 1) # the command should pass > + if [ $ret -eq 0 ]; then > + tst_resm TPASS "$@ passed as expected" > + else > + tst_resm TFAIL "$@ failed unexpectedly" > + fi;; > + > + 2) # the command should fail > + if [ $ret -ne 0 ]; then > + tst_resm TPASS "$@ failed as expected" > + else > + tst_resm TFAIL "$@ passed unexpectedly" > + fi;; > + > + *) tst_brkm TBROK "unknown action '$act'";; > + esac > +} > + > +ROD() > +{ > + ROD_DISPATCHER 0 $@ > +} > + > +SHOULD_PASS() > +{ > + ROD_DISPATCHER 1 $@ > +} > + > +SHOULD_FAIL() > +{ > + # redirect stderr since we expect the command to fail > + ROD_DISPATCHER 2 $@ 2> /dev/null > } I think that we should quote the $@ in these functions. Try for yourself: 8<------------------------------------ #!/bin/sh d() { echo "-------------" for i; do echo $i done echo "-------------" } dd() { d "$@" } d a b c dd a b c d "a b c" dd "a b c" 8<------------------------------------ If you unquote the $@ in dd() the "a b c" in the last call would be separated on spaces. -- Cyril Hrubis chrubis@suse.cz