forked from Imagelibrary/rtems
332 lines
7.1 KiB
Plaintext
332 lines
7.1 KiB
Plaintext
#!@KSH@ -p
|
|
#
|
|
# $Id$
|
|
#
|
|
# Run rtems tests on the c4x simulator built into gdb
|
|
# This program generates a simulator script to run each test
|
|
# Typically the test is then run, although it can be generated
|
|
# and left as a file using -s
|
|
#
|
|
|
|
# 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
|
|
-s -- generate script file (as 'test'.ss) and exit
|
|
-l logdir -- specify log directory (default is 'logdir')
|
|
|
|
Specify test as 'test' or 'test.exe'.
|
|
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}* ${scriptfile}* ${logfile}.tmp*
|
|
[ "$sim_pid" ] && kill -9 $sim_pid
|
|
|
|
exit $exit_code
|
|
}
|
|
|
|
#
|
|
# process the options
|
|
#
|
|
# defaults for getopt vars
|
|
#
|
|
# max_run_time is defaulted to 5 minutes
|
|
#
|
|
|
|
verbose=""
|
|
extra_options=""
|
|
script_and_exit=""
|
|
stdio_setup="yes"
|
|
run_to_completion="yes"
|
|
logdir=log
|
|
update_on_tick="no"
|
|
max_run_time=$((6 * 60)) # is 5 on other simulators.
|
|
using_print_buffer="yes"
|
|
|
|
while getopts vhr12o:c:sl:t OPT
|
|
do
|
|
case "$OPT" in
|
|
v)
|
|
verbose="yes";;
|
|
s)
|
|
script_and_exit="yes"
|
|
run_to_completion="no"
|
|
stdio_setup="no";;
|
|
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 -- `echo *.exe`
|
|
tests="$*"
|
|
fi
|
|
|
|
[ -d $logdir ] ||
|
|
mkdir $logdir || fatal "could not create log directory ($logdir)"
|
|
|
|
cpus=1
|
|
|
|
# where the tmp files go
|
|
statfile=/tmp/stats$$
|
|
scriptfile=/tmp/script$$
|
|
|
|
trap "test_exit" 1 2 3 13 14 15
|
|
|
|
for tfile in $tests
|
|
do
|
|
|
|
tname=`basename $tfile .exe`
|
|
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*)
|
|
fatal "MP tests not supported"
|
|
warn "Running both nodes associated with $tname"
|
|
tname=`echo $tname | sed 's/-node.*//'`
|
|
TEST_TYPE="mp"
|
|
;;
|
|
stackchk*|*fatal*|malloctest*|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}* ${scriptfile}* ${logfile}.tmp*
|
|
|
|
date=`date`
|
|
echo "Starting $tname at $date"
|
|
|
|
# Generate a script file to get the work done.
|
|
# The script file must do the following:
|
|
#
|
|
# load the program (programs if MP test)
|
|
# arrange for capture of output
|
|
# run the program
|
|
# produce statistics
|
|
|
|
{
|
|
case $TEST_TYPE in
|
|
"mp")
|
|
fatal "MP tests not supported"
|
|
;;
|
|
|
|
# All other tests (single-processor)
|
|
*)
|
|
echo "target sim -3"
|
|
echo "sim m r 0"
|
|
echo "sim m w 0"
|
|
echo "load"
|
|
echo ""
|
|
echo "printf \"START_OF_TEST\\n\""
|
|
echo "run"
|
|
echo "printf \"END_OF_TEST\\n\""
|
|
echo "quit"
|
|
;;
|
|
esac
|
|
|
|
} > ${scriptfile}
|
|
|
|
if [ "$script_and_exit" = "yes" ]
|
|
then
|
|
mv ${scriptfile} $tname.ss
|
|
warn "script left in $tname.ss"
|
|
test_exit 0
|
|
fi
|
|
|
|
# Spin off the simulator in the background
|
|
c4x-rtems-gdb $extra_options -n \
|
|
--command ${scriptfile} ${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 10s at a time waiting for job to finish or timer to expire
|
|
# if job has exited, then we exit, too.
|
|
sleep 10
|
|
if kill -0 $sim_pid 2>/dev/null
|
|
then
|
|
time_run=$((time_run + 10))
|
|
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=0
|
|
clean_exit=0
|
|
sed -e '1,9d' \
|
|
-e 's/
|
|
//' -e '/^$/d' < ${logfile}.tmp |
|
|
while read line
|
|
do
|
|
if [ $output_it -eq 1 ] ; then
|
|
case $line in
|
|
END_OF_TEST*)
|
|
output_it=0
|
|
;;
|
|
*simio.c:86*)
|
|
output_it=0
|
|
clean_exit=1
|
|
;;
|
|
*)
|
|
echo "$line"
|
|
;;
|
|
esac
|
|
else
|
|
if [ "$line" = "START_OF_TEST" ] ; then
|
|
output_it=1
|
|
fi
|
|
fi
|
|
done > ${logfile}_1
|
|
if [ ${clean_exit} -eq 0 ] ; then
|
|
mv ${logfile}_1 ${logfile}_1.XXX
|
|
sed -e '/^Program received signal SIGTRAP/d' \
|
|
<${logfile}_1.XXX >${logfile}_1
|
|
rm -f ${logfile}_1.XXX
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# Create the info files
|
|
for cpu in $cpus
|
|
do
|
|
{
|
|
echo "$date"
|
|
echo "Test run on: `uname -n` ( `uname -a` )"
|
|
|
|
output_it=1
|
|
sed -e 's/
|
|
//' < ${logfile}.tmp |
|
|
while read line
|
|
do
|
|
if [ $output_it -eq 0 ] ; then
|
|
if [ "$line" = "END_OF_TEST" ] ; then
|
|
output_it=1
|
|
fi
|
|
else
|
|
if [ "$line" = "START_OF_TEST" ] ; then
|
|
output_it=0
|
|
else
|
|
echo "$line"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
|
|
if [ "$ran_too_long" = "yes" ]
|
|
then
|
|
echo "Test did NOT finish normally; killed after $max_run_time seconds"
|
|
fi
|
|
|
|
echo
|
|
date;
|
|
} > ${infofile}_$cpu
|
|
done
|
|
|
|
rm -f ${logfile}.tmp*
|
|
|
|
if [ "$cpus" = "1" ]
|
|
then
|
|
mv ${infofile}_1 ${infofile}
|
|
mv ${logfile}_1 ${logfile}
|
|
fi
|
|
|
|
done
|
|
|
|
test_exit 0
|
|
|
|
# Local Variables: ***
|
|
# mode:ksh ***
|
|
# End: ***
|
|
|