| #! /bin/bash | |
| # Shell script to run test suite. | |
| set -e | |
| usage() | |
| { | |
| echo "Usage: tests/runtests [-v] [-v] [--valgrind] [test]" | |
| echo " -v (or --verbose) prints each test as it is run" | |
| echo " -vv (very verbose) traces test execution" | |
| echo " --valgrind runs the test programs using the valgrind memory checker" | |
| echo "The TEST_ENDIAN and TEST_BITS variables can be used to limit which" | |
| echo "endianess (le, be) and bitness (32, 64) will be tested" | |
| exit | |
| } | |
| while [ $# != 0 ]; do | |
| case "$1" in | |
| -v) | |
| if [ -z "$VERBOSE" ]; then | |
| VERBOSE=1 | |
| else | |
| EXTRA_ARGS=-x | |
| fi | |
| ;; | |
| -vv) | |
| VERBOSE=1 | |
| EXTRA_ARGS=-x | |
| ;; | |
| --valgrind) | |
| VALGRIND=1 | |
| ;; | |
| -h|--help|-*) | |
| usage | |
| ;; | |
| *) | |
| [ -n "$TEST" ] && usage | |
| TEST="$1" | |
| ;; | |
| esac | |
| shift | |
| done | |
| # Creates a temporary file and exports the name of the file to | |
| # the provided argument. Exits on error. | |
| # | |
| # Usage: create_tempfile TEMPFILE | |
| # | |
| create_tempfile() | |
| { | |
| if test $# = 0 | |
| then | |
| echo "No argument passed to create_tempfile()" | |
| exit 1 | |
| fi | |
| if [ -x /bin/tempfile ] | |
| then | |
| # Debian | |
| export $1="`tempfile`" | |
| elif [ -x /bin/mktemp ] | |
| then | |
| # RedHat et. al. | |
| export $1="`mktemp /tmp/modtest.XXXXXX`" | |
| else | |
| echo "Don't know how to make a temporary file on this " | |
| echo "system, sorry." | |
| exit 1 | |
| fi | |
| if [ $? -ne 0 ] | |
| then | |
| echo "Can't create temporary file." | |
| exit 1 | |
| fi | |
| } | |
| export -f create_tempfile | |
| if [ ! -e "tests/build" ]; then | |
| echo Making build directory for tests | |
| mkdir tests/build | |
| fi | |
| if [ ! -e "tests/tmp" ]; then | |
| echo Making temporary directory for tests | |
| mkdir tests/tmp | |
| fi | |
| : ${TEST_ENDIAN:=-be -le} | |
| _tmp= | |
| for e in $TEST_ENDIAN; do | |
| case $e in | |
| -be | -le) | |
| _tmp="$_tmp $e" | |
| ;; | |
| be | le) | |
| _tmp="$_tmp -$e" | |
| ;; | |
| *) | |
| echo "Unknown endian: $e, valid values are \"be\" and \"le\"" >&2 | |
| exit 1 | |
| esac | |
| done | |
| TEST_ENDIAN="$_tmp" | |
| : ${TEST_BITS:=32 64} | |
| for b in $TEST_BITS; do | |
| case $b in | |
| 32 | 64) | |
| ;; | |
| *) | |
| echo "Unknown word size: $b, valid values are 32 and 64" >&2 | |
| exit 1 | |
| esac | |
| done | |
| for config in --enable-zlib --disable-zlib; do | |
| echo Building with $config... | |
| cd tests/build | |
| ../../configure $config CFLAGS="-DJUST_TESTING -g -Wall" >/dev/null | |
| make clean >/dev/null | |
| # ismod.static doesn't build with -DJUST_TESTING and --enable-zlib | |
| make insmod.static >/dev/null 2>&1 || touch insmod.static | |
| make all >/dev/null | |
| cd ../.. | |
| echo Testing with $config... | |
| if grep -q CONFIG_USE_ZLIB=1 tests/build/Makefile; then | |
| CONFIG_HAVE_ZLIB=1 | |
| export CONFIG_HAVE_ZLIB | |
| else | |
| unset CONFIG_HAVE_ZLIB | |
| fi | |
| # Create endianness links | |
| case `file tests/build/modprobe` in | |
| *MSB*) ENDIAN=be;; | |
| *LSB*) ENDIAN=le;; | |
| *) echo Unknown endian! >&2; exit 1;; | |
| esac | |
| ln -sfn 64-$ENDIAN tests/data/64 | |
| ln -sfn 32-$ENDIAN tests/data/32 | |
| # Make them run the valgrind wrappers if requested. | |
| if [ -n "$VALGRIND" ]; then | |
| PATH=`pwd`/tests/valgrind:$PATH | |
| else | |
| PATH=`pwd`/tests/build:$PATH | |
| fi | |
| # By default, we want to look like a new kernel. | |
| MODTEST_UNAME=2.6.27 | |
| export MODTEST_UNAME | |
| MODTEST_OVERRIDE_ROOT=tests/tmp | |
| export MODTEST_OVERRIDE_ROOT | |
| if [ -n "$TEST" ]; then DOING=0; else DOING=1; fi | |
| for dir in `find tests/test-* -type d | sort` | |
| do | |
| if [ -z "$VERBOSE" ]; then | |
| echo -n Running tests for $dir. | |
| else | |
| echo Running tests for $dir. | |
| fi | |
| shopt -s nullglob | |
| for f in $dir/[0-9]*.sh; do | |
| if [ $DOING -eq 0 ]; then | |
| case "$f" in *$TEST*) DOING=1;; *) continue;; esac | |
| fi | |
| rm -rf tests/tmp/* | |
| if sh -e $EXTRA_ARGS $f; then | |
| if [ -z "$VERBOSE" ]; then | |
| echo -n . | |
| else | |
| echo Tests $f succeeded. | |
| fi | |
| else | |
| echo Test for $f failed. | |
| exit 1 | |
| fi | |
| done | |
| if [ -z "$VERBOSE" ]; then echo; fi | |
| done | |
| done | |
| exit 0 |