blob: 1c324045796a3f87ffb3f697867e2ca22e40a467 [file] [log] [blame]
#!/bin/bash
#
#
# Copyright (C) International Business Machines Corp., 2004
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
# the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# NAME
# tsstests.sh
#
# DESCRIPTION
# This is a simple bash script to run all tests in the ltp-tss/tcg
# subdirectories.
#
# ALGORITHM
# None.
#
# USAGE
#
# HISTORY
# Megan Schneider, mschnei@us.ibm.com, 6/04.
# kyoder@users.sf.net, Added shifts to the option processing
# Added output format options
#
# RESTRICTIONS
# None.
##
export TSS_VERSION=1.2
export TESTSUITE_OWNER_SECRET=luigi
export TESTSUITE_SRK_SECRET=luigi
LOGDIR=$PWD
export LOGFILE=$LOGDIR/tsstests.log
LOGGING=0
INIT=0
QUIET=0
export ERR_SUMMARY=../../err.summary
SPECIFIC_TEST_DIR=
TEST_RUN=
TEST_OUTPUT=
OUTPUT_FORMAT="standard"
# this variable needs to be changed to testcases/tcg/ for ltp compatibility
TESTCASEDIR=testsuite/tcg/
cd ..
export LTPTSSROOT=$PWD
cd $TESTCASEDIR
usage()
{
cat <<-END >&2
usage: ./tsstests.sh [-v <version>] [-l <logfile>] [-e <errfile>] [-d <dir>] [-h]
This script will run all tspi-related tests unless the <dir> option is provided.
-v version of the TSS spec to use, 1.1 or 1.2
-l logfile to redirect output to (default is command line)
-f error output format: "wiki" or "standard"
-h display this help
-q run quietly - display only total number of tests passed/failed
-e file name to log errors to
-d <dir> a specific directory to run tests from (to run a subset of all tests)
END
exit -1
}
# Parse the options
while getopts v:l:f:hqd:e: arg
do
case $arg in
v)
export TSS_VERSION=$OPTARG
;;
l)
if test $QUIET -eq 1; then
echo "Conflicting args: -q and -l"
exit -1
fi
export LOGFILE="$LOGDIR/"$OPTARG""
LOGGING=1
touch $LOGFILE
;;
f)
OUTPUT_FORMAT=$OPTARG
;;
h)
usage
;;
q)
if test $LOGGING -eq 1; then
echo "Conflicting args: -q and -l"
exit -1
fi
QUIET=1
;;
e)
export ERR_SUMMARY=../../$OPTARG
;;
d)
if test -d ${LTPTSSROOT}/${TESTCASEDIR}/$OPTARG; then
SPECIFIC_TEST_DIR=$OPTARG
echo "Only running tests found in ${LTPTSSROOT}/${TESTCASEDIR}/$OPTARG"
else
echo "Unknown option: $OPTARG."
usage
fi
;;
?)
usage
;;
esac
done
#echo "DEBUG DOLLARSTAR: $*"
# Verify the output format
case "$OUTPUT_FORMAT" in
*standard*)
echo "Using output format: $OUTPUT_FORMAT"
;;
*wiki*)
echo "Using output format: $OUTPUT_FORMAT"
;;
*)
echo "Unknown format: $OUTPUT_FORMAT"
usage
;;
esac
# Print the final total test run info based on output format
# $1 = number passed
# $2 = number failed
# $3 = number not implemented
# $4 = number not applicable
# $5 = number segfaulted
print_totals()
{
case "$OUTPUT_FORMAT" in
*standard*)
if test $LOGGING -eq 1; then
echo -e "PASSED: $1\nFAILED: $2 (NOTIMPL: $3)\nNOT APPLICABLE: $4\nSEGFAULTED: $5\n" >> $LOGFILE
fi
echo -e "PASSED: $1\nFAILED: $2 (NOTIMPL: $3)\nNOT APPLICABLE: $4\nSEGFAULTED: $5\n" >> $ERR_SUMMARY
;;
*wiki*)
# Print a new header
echo "Total Passed | " >> $ERR_SUMMARY
echo " Total Failed |" >> $ERR_SUMMARY
echo " Total Not Implemented |" >> $ERR_SUMMARY
echo " Total Not Applicable |" >> $ERR_SUMMARY
echo " Total segfaulted" >> $ERR_SUMMARY
# Print the final info
echo "$1 | " >> $ERR_SUMMARY
echo " $2 |" >> $ERR_SUMMARY
echo " $3 |" >> $ERR_SUMMARY
echo " $4 |" >> $ERR_SUMMARY
echo " $5" >> $ERR_SUMMARY
;;
*)
echo "Unknown output format!"
exit -1
;;
esac
}
# Print the final total test run info based on output format
# $1 = Testcase name and version string
# $2 = The stderr from the testcase
# $3 = The return code received from $?
print_error()
{
case "$OUTPUT_FORMAT" in
*standard*)
if test $3 -gt 126; then
echo "Test segfaulted or returned unknown error (rc=$3): $1" >> $ERR_SUMMARY
elif test $3 -lt 126; then
echo $2 >> $ERR_SUMMARY
fi
;;
*wiki*)
echo "$1 | " >> $ERR_SUMMARY
echo " $2 |" >> $ERR_SUMMARY
echo " $3 |" >> $ERR_SUMMARY
if test $3 -gt 126; then
echo " (segfault counted as failure) |" >> $ERR_SUMMARY
else
echo " . |" >> $ERR_SUMMARY
fi
echo " ." >> $ERR_SUMMARY
;;
*)
echo "Unknown output format!"
exit -1
;;
esac
}
# Print any initial output based on output format
print_init()
{
if test $INIT -eq 1; then
return
fi
case "$OUTPUT_FORMAT" in
*standard*)
;;
*wiki*)
echo "Test Name / Version | " >> $ERR_SUMMARY
echo " Test Output |" >> $ERR_SUMMARY
echo " Test Return Code |" >> $ERR_SUMMARY
echo " . |" >> $ERR_SUMMARY
echo " ." >> $ERR_SUMMARY
;;
*)
echo "Unknown output format!"
exit -1
;;
esac
INIT=1
}
# $1 = the test command line
execute_test()
{
if test $LOGGING -eq 1; then
# capture stderr and send stdout to the logfile
TEST_STDERR=$( $1 -v ${TSS_VERSION} 2>&1 >> $LOGFILE )
else
$1 -v ${TSS_VERSION}
fi
RUNRESULT=$?
if test $RUNRESULT -ne 0; then
if test $RUNRESULT -gt 126; then
SEGFAULTED=$(( $SEGFAULTED + 1))
FAILED=$(( $FAILED + 1));
elif test $RUNRESULT -eq 126; then
# 126 is a special number used in testsuite/tcg/common/common.c::print_NA()
# and is triggered when a testcase is not applicable to the TSS version
# being tested
NA=$(( $NA + 1))
elif test $RUNRESULT -eq 6; then
NOTIMPL=$(( $NOTIMPL + 1))
else
FAILED=$(( $FAILED + 1))
fi
if test $LOGGING -eq 1; then
print_error "$1 -v ${TSS_VERSION}" "$TEST_STDERR" $RUNRESULT
fi
else
if test $LOGGING -eq 1; then
echo $TEST_STDERR >> $LOGFILE
else
echo $TEST_STDERR
fi
PASSED=$(( $PASSED + 1))
fi
}
# main is called at the very end of this script
# $1 = a specific directory to go to run tests
main()
{
PASSED=0
FAILED=0
SEGFAULTED=0
NOTIMPL=0
NA=0
if test x$1 != x; then
DIRS_TO_RUN=$1
else
DIRS_TO_RUN=`ls */Makefile | sed "s/Makefile//g" | sed "s/common\///g" | sed "s/highlevel\///g"`
fi
for DIRECTORY in $DIRS_TO_RUN
do
TESTS_TO_RUN=
if test $QUIET -eq 0; then
echo $DIRECTORY
cd ${LTPTSSROOT}/${TESTCASEDIR}/$DIRECTORY
TESTS_TO_RUN=`ls *.c | sed "s/\.c//g"`
cd ../../bin &> /dev/null
else
cd ${LTPTSSROOT}/${TESTCASEDIR}/$DIRECTORY &> /dev/null
TESTS_TO_RUN=`ls *.c | sed "s/\.c//g"`
cd ../../bin &> /dev/null
fi
print_init
for TEST in $TESTS_TO_RUN
do
execute_test ./$TEST
# Printing totals here is a special case: if you're watching the output
# roll by (not going to a log file), its good to know a general pass/fail
# count so you can kill the run if something is obviously wrong
if test $QUIET -eq 0; then
if test $LOGGING -eq 0; then
echo -e "PASSED: $PASSED\nFAILED: $FAILED (NOTIMPL: $NOTIMPL)\nNOT APPLICABLE: $NA\nSEGFAULTED: $SEGFAULTED"
fi
fi
done
done
if test $QUIET -eq 0; then
print_totals $PASSED $FAILED $NOTIMPL $NA $SEGFAULTED
echo "<<< Test suite run completed >>>"
fi
}
main $SPECIFIC_TEST_DIR
exit 0