----- Original Message -----
> From: "Cyril Hrubis" <chru...@suse.cz>
> To: "Matus Marhefka" <mmarh...@redhat.com>
> Cc: ltp-list@lists.sourceforge.net
> Sent: Tuesday, 2 December, 2014 1:38:40 PM
> Subject: Re: [LTP] [PATCH] testcases/lib/test.sh: added tst_timeout()
> 
> Hi!
> > Function tst_timeout() added into LTP test interface:
> > 
> >     tst_timeout "command arg1 arg2 ..." timeout
> > 
> > Function enables waiting for specified command for timeout
> > seconds. Example usage:
> > 
> >     cmd_output=$(tst_timeout "ping -c 3 localhost" 5)
> >     if [ $? -ne 0 ]; then
> >             tst_brkm TBROK "timeout reached!"
> >     fi
> > 
> > where $cmd_output contains stdout and stderr of ping command.
> 
> Nice idea, comments below.
> 
> > Signed-off-by: Matus Marhefka <mmarh...@redhat.com>
> > ---
> >  testcases/lib/test.sh | 54
> >  +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 54 insertions(+)
> > 
> > diff --git a/testcases/lib/test.sh b/testcases/lib/test.sh
> > index eecbfba..1c5bdf2 100644
> > --- a/testcases/lib/test.sh
> > +++ b/testcases/lib/test.sh
> > @@ -129,6 +129,60 @@ tst_check_cmds()
> >     done
> >  }
> >  
> > +# tst_timeout "command arg1 arg2 ..." timeout
> > +# Runs command for specified timeout (in seconds).
> > +# Function returns retcode of command or 1 if arguments are invalid.
> > +tst_timeout()
> > +{
> > +   local command=$1
> > +   local timeout=$2
> > +   local usleep_time=100000
> > +
> > +   # command must be non-empty string with command to run
> > +   if [ -z "$command" ]; then
> > +           echo "first argument must be non-empty string"
> > +           return 1
> > +   fi
> > +
> > +   # accept only numbers as timeout
> > +   re='^[0-9]+$'
> > +   if ! [[ $timeout =~ $re ]]; then
> 
> This is bashism. The portable way to do this seems to be do
> tr -d [:digit:] on the string and checking if result is empty or use
> grep.
> 
> > +           echo "only numbers as second argument"
> > +           return 1
> > +   fi
> > +
> > +   if [ -z "$TMPDIR" ]; then
> > +           TMPDIR="/tmp"
> > +   fi
> 
> I guess that better solution would be to move this check from the
> tst_tmpdir() after the LTPROOT check in the test.sh so that we have only
> one copy of it.
> 
> > +   local output=$(mktemp --tmpdir=$TMPDIR)
> > +   sh -c "eval $command" >$output 2>&1 &
> 
> Do we really need to redirect the output to the file here? Shouldn't
> just redirecting stderr to stdout work?
> 
> > +   local pid=$!
> > +   timeout=$((timeout*1000000))
> > +   while [ $timeout -gt 0 ]; do
> > +           kill -s 0 $pid 2>/dev/null
> > +           if [ $? -ne 0 ]; then
> > +                   break
> > +           fi
> > +           timeout=$((timeout - usleep_time))
> > +           usleep $usleep_time
> 
> The usleep is bashism as well. What is not POSIX but tend to work is
> sleep with a real number, i.e. sleep 0.1 but it does not seems to be
> supported under BussyBox.
> 
> So we can either do the polling once a second or create our own
> tst_usleep C source that calls usleep().
> 
> Ah and I've found that coreutils even includes timeout command that
> can be used to fairly simplify the code.

It should be available since coreutils 7.0:
  
http://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=265c4b83a81c643f3359be926ef8034f28f321ed

So older distros (e.g. RHEL5) might not have it yet. Shall we fall
back to script above in that case or brkm(TCONF)?

Regards,
Jan

> 
> Try:
> 
> timeout $timeout sh -c "eval $command"
> echo $?
> 
> > +   done
> > +
> > +   local ret=0
> > +   if [ $timeout -le 0 ]; then
> > +           ret=128
> > +           kill -9 $pid
> > +
> > +   fi
> > +
> > +   wait $pid
> > +   ret=$((ret | $?))
> > +
> > +   cat $output
> > +   rm -f $output
> > +
> > +   return $ret
> > +}
> > +
> >  # Check that test name is set
> >  if [ -z "$TCID" ]; then
> >     tst_brkm TBROK "TCID is not defined"
> > --
> > 1.8.3.1
> > 
> > 
> > ------------------------------------------------------------------------------
> > Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> > from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> > with Interactivity, Sharing, Native Excel Exports, App Integration & more
> > Get technology previously reserved for billion-dollar corporations, FREE
> > http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
> > _______________________________________________
> > Ltp-list mailing list
> > Ltp-list@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/ltp-list
> 
> --
> Cyril Hrubis
> chru...@suse.cz
> 
> ------------------------------------------------------------------------------
> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
> from Actuate! Instantly Supercharge Your Business Reports and Dashboards
> with Interactivity, Sharing, Native Excel Exports, App Integration & more
> Get technology previously reserved for billion-dollar corporations, FREE
> http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
> _______________________________________________
> Ltp-list mailing list
> Ltp-list@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ltp-list
> 

------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to