summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/avr/avrtest/tools/runtest.in
blob: b3e48312d4ce88bef2fa5d53db7d5f859c60b04a (plain) (tree)


































































































































































































































                                                                                         
#!@KSH@ -p
#
#  $Id$
#
# Run rtems tests on the M32C simulator includeed with GDB
#

# progname=`basename $0`
progname=${0##*/}        # fast basename hack for ksh, bash

USAGE=\
"usage: $progname [ -opts ] test [ test ... ]
        -o options  -- specify options to be passed to simulator
	-v	    -- verbose
        -l logdir   -- specify log directory (default is 'logdir')

  Specify test as 'test' or 'test.exe' or 'test.ralf'.
  All multiprocessing tests *must* be specified simply as 'mp01', etc.
"

# export everything
set -a

#   log an error to stderr
prerr()
{
    echo "$*" >&2
}

fatal() {
    [ "$1" ] && prerr $*
    prerr "$USAGE"
    exit 1
}

warn() {
    [ "$1" ] && prerr $*
}

# print args, 1 per line
ml_echo()
{
    for l
    do
       echo "$l"
    done
}

# run at normal and signalled exit
test_exit()
{
    exit_code=$1

    rm -f ${statfile}* ${logfile}.tmp*
    [ "$sim_pid" ] && kill -9 $sim_pid

    exit $exit_code
}

#
# process the options
#
# defaults for getopt vars
#
# max_run_time is defaulted to 3 minutes
#

verbose=""
extra_options=""
stdio_setup="yes"
run_to_completion="yes"
logdir=log
update_on_tick="no"
max_run_time=$((30))
using_print_buffer="yes"

while getopts vhr12o:c:sl:t OPT
do
    case "$OPT" in
	v)
	    verbose="yes";;
        l)
            logdir="$OPTARG";;
        o)
            extra_options="$OPTARG";;
        *)
            fatal;;
    esac
done

let $((shiftcount = $OPTIND - 1))
shift $shiftcount

args=$*

#
# Run the tests
#

tests="$args"
if [ ! "$tests" ]
then
     set -- `ls -1 *.exe *.ralf 2>/dev/null`
     tests="$*"
fi

[ -d $logdir ] ||
  mkdir $logdir || fatal "could not create log directory ($logdir)"

# where the tmp files go
statfile=/tmp/stats$$

trap "test_exit" 1 2 3 13 14 15

for tfile in $tests
do

   echo $tfile | grep "exe$" >/dev/null
   if [ $? -eq 0 ] ; then
     ext=.exe
   else
     ext=.ralf
   fi
   tname=`basename $tfile ${ext}`
   TEST_TYPE="single"

   case $tname in
       capture* | monitor* | termios* | fileio* | pppd*)
           if [ $run_to_completion = "yes" ]
           then
                warn "Skipping $tname; it is interactive"
                continue
           fi
           ;;
       *-node2*)
           fatal "MP tests not supported"
           warn "Skipping $tname; 'runtest' runs both nodes when for *-node1"
           continue;;
      *-node1*)
           warn "Running both nodes associated with $tname"
           variant=`echo $tname | sed 's/.*-node[12]//' | sed "s/${ext}/"`
           tname=`echo $tname | sed 's/-node.*//'`
           TEST_TYPE="mp"
           ;;
       sp39*|sp41*)
           warn "Skipping $tname; it does not complete long on sis"
           continue
           ;;
       minimum*|stackchk*|*fatal*|termio*)
           warn "Skipping $tname; it locks up or takes a VERY long time to run"
           continue
           ;;
   esac

   # Change the title bar to indicate which test we are running
   # The simulator screen doesn't provide any indication

   logfile=$logdir/$tname
   infofile=$logfile.info

   rm -f ${statfile}* ${logfile}.tmp*

   date=`date`
   echo "Starting $tname at $date"

   # Spin off the simulator in the background
   # @target_alias@-run ${tfile} >${logfile}.tmp 2>&1 &
   /home/joel/work-gnat/svn/m32c-install/bin/m32c-elf-run ${tfile} >${logfile}.tmp 2>&1 &
   sim_pid=$!

   # Make sure it won't run forever...
   {
       time_run=0
       while [ $time_run -lt $max_run_time ]
       do
           # sleep 1s at a time waiting for job to finish or timer to expire
           # if job has exited, then we exit, too.
           sleep 1
           if kill -0 $sim_pid 2>/dev/null
           then
                grep "Memory exception " ${logfile}.tmp >/dev/null
                if [ $? -eq 0 ] ; then
                  break
                fi

                time_run=$((time_run + 1))
           else
                exit 0
           fi
       done

       kill -2 $sim_pid 2>/dev/null
       { sleep 5; kill -9 $sim_pid 2>/dev/null; } &
   } &

   wait $sim_pid
   status=$?
   if [ $status -ne 0 ]
   then
       ran_too_long="yes"
   else
       ran_too_long="no"
   fi

   sim_pid=""

   # fix up the printf output from the test
   case $TEST_TYPE in
       mp)
           fatal "MP not supported"
           ;;
       *)
           output_it=1
           cat ${logfile}.tmp > ${logfile}
           ;;
   esac

   rm -f ${logfile}.tmp*

done

test_exit 0

# Local Variables: ***
# mode:ksh ***
# End: ***