blob: 3db20dcd8949cf28dfb48ca3c9a58dd7592d0fa5 [file] [log] [blame]
#!/bin/bash
#
# Copyright (C) 2007 Karel Zak <kzak@redhat.com>
#
# This file is part of util-linux.
#
# This file 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 file 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.
#
TS_TOPDIR=$(cd ${0%/*} && pwd)
SUBTESTS=
EXCLUDETESTS=
OPTS=
top_srcdir=
top_builddir=
paraller_jobs=1
function num_cpus()
{
local num
# coreutils
if num=$(nproc --all 2>/dev/null); then
:
# BSD, OSX
elif num=$(sysctl -n hw.ncpu 2>/dev/null); then
:
else
num=$(grep -c "^processor" /proc/cpuinfo 2>/dev/null)
fi
# translate garbage output to "1"
if test "$num" -gt "0" 2>/dev/null ;then
echo "$num"
else
echo 1
fi
}
function find_test_scripts()
{
local searchdir="$1"
find "$searchdir" -type f -regex ".*/[^\.~]*" \
\( -perm -u=x -o -perm -g=x -o -perm -o=x \)
}
while [ -n "$1" ]; do
case "$1" in
--force |\
--fake |\
--memcheck-valgrind |\
--memcheck-asan |\
--nolocks |\
--show-diff |\
--verbose |\
--skip-loopdevs |\
--parsable)
# these options are simply forwarded to the test scripts
OPTS="$OPTS $1"
;;
--nonroot)
if [ $(id -ru) -eq 0 ]; then
echo "Ignore util-linux test suite [non-root UID expected]."
exit 0
fi
;;
--srcdir=*)
top_srcdir="${1##--srcdir=}"
;;
--builddir=*)
top_builddir="${1##--builddir=}"
;;
--parallel=*)
paraller_jobs="${1##--parallel=}"
if ! [ "$paraller_jobs" -ge 0 ] 2>/dev/null; then
echo "invalid argument '$paraller_jobs' for --parallel="
exit 1
fi
;;
--parallel)
paraller_jobs=$(num_cpus)
;;
--exclude=*)
EXCLUDETESTS="${1##--exclude=}"
;;
--*)
echo "Unknown option $1"
echo "Usage: "
echo " $(basename $0) [options] [<component> ...]"
echo "Options:"
echo " --force execute demanding tests"
echo " --fake do not run, setup tests only"
echo " --memcheck-valgrind run with valgrind"
echo " --memcheck-asan enable ASAN (requires ./configure --enable-asan)"
echo " --nolocks don't use flock to lock resources"
echo " --verbose verbose mode"
echo " --show-diff show diff from failed tests"
echo " --nonroot ignore test suite if user is root"
echo " --srcdir=<path> autotools top source directory"
echo " --builddir=<path> autotools top build directory"
echo " --parallel=<num> number of parallel test jobs, default: num cpus"
echo " --exclude=<list> exclude tests by list '<utilname>/<testname> ..'"
echo
exit 1
;;
*)
SUBTESTS="$SUBTESTS $1"
;;
esac
shift
done
# For compatibility with autotools is necessary to differentiate between source
# (with test scripts) and build (with temporary files) directories when
# executed by our build-system.
#
# The default is the source tree with this script.
#
if [ -z "$top_srcdir" ]; then
top_srcdir="$TS_TOPDIR/.."
fi
if [ -z "$top_builddir" ]; then
top_builddir="$TS_TOPDIR/.."
fi
OPTS="$OPTS --srcdir=$top_srcdir --builddir=$top_builddir"
declare -a comps
if [ -n "$SUBTESTS" ]; then
# selected tests only
for s in $SUBTESTS; do
if [ -e "$top_srcdir/tests/ts/$s" ]; then
comps+=( $(find_test_scripts "$top_srcdir/tests/ts/$s") ) || exit 1
else
echo "Unknown test component '$s'"
exit 1
fi
done
else
if [ ! -f "$top_builddir/test_ttyutils" ]; then
echo "Tests not compiled! Run 'make check' to fix the problem."
exit 1
fi
comps=( $(find_test_scripts "$top_srcdir/tests/ts") ) || exit 1
fi
if [ -n "$EXCLUDETESTS" ]; then
declare -a xcomps # temporary array
for ts in ${comps[@]}; do
tsname=${ts##*ts/} # test name
if [[ "$EXCLUDETESTS" == *${tsname}* ]]; then
#echo "Ignore ${tsname}."
true
else
xcomps+=($ts)
fi
done
comps=("${xcomps[@]}") # replace the array
fi
unset LIBMOUNT_DEBUG
unset LIBBLKID_DEBUG
unset LIBFDISK_DEBUG
unset LIBSMARTCOLS_DEBUG
echo
echo "-------------------- util-linux regression tests --------------------"
echo
echo " For development purpose only. "
echo " Don't execute on production system! "
echo
# TODO: add more information about system
printf "%13s: %-30s " "kernel" "$(uname -r)"
echo
echo
if [ "$paraller_jobs" -ne 1 ]; then
tmp=$paraller_jobs
[ "$paraller_jobs" -eq 0 ] && tmp=infinite
echo " Executing the tests in parallel ($tmp jobs) "
echo
OPTS="$OPTS --parallel"
fi
count=0
>| $top_builddir/tests/failures
printf "%s\n" ${comps[*]} |
sort |
xargs -I '{}' -P $paraller_jobs -n 1 bash -c "'{}' \"$OPTS\" ||
echo 1 >> $top_builddir/tests/failures"
if [ $? != 0 ]; then
echo "xargs error" >&2
exit 1
fi
declare -a fail_file
fail_file=( $( < $top_builddir/tests/failures ) ) || exit 1
rm -f $top_builddir/tests/failures
echo
echo "---------------------------------------------------------------------"
if [ ${#fail_file[@]} -eq 0 ]; then
echo " All ${#comps[@]} tests PASSED"
res=0
else
echo " ${#fail_file[@]} tests of ${#comps[@]} FAILED"
res=1
fi
echo "---------------------------------------------------------------------"
exit $res