]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - tests/run.sh
fstrim shouldn't run inside a container
[thirdparty/util-linux.git] / tests / run.sh
index aad3acb0ddb927d281d3c437b25f36d656187cdb..57faf734c0d9d0a56d8806878f5305f122a2c68c 100755 (executable)
@@ -20,15 +20,30 @@ TS_TOPDIR=$(cd ${0%/*} && pwd)
 SUBTESTS=
 EXCLUDETESTS=
 OPTS=
+SYSCOMMANDS=
 
 top_srcdir=
 top_builddir=
 paraller_jobs=1
+has_asan_opt=
 
 function num_cpus()
 {
-       if lscpu -p &>/dev/null; then
-               lscpu -p | grep -cv '^#'
+       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
@@ -45,13 +60,25 @@ while [ -n "$1" ]; do
        case "$1" in
        --force |\
        --fake |\
-       --memcheck |\
+       --memcheck-valgrind |\
+       --nolocks |\
+       --show-diff |\
        --verbose  |\
        --skip-loopdevs |\
+       --noskip-commands |\
        --parsable)
                # these options are simply forwarded to the test scripts
                OPTS="$OPTS $1"
                ;;
+       --memcheck-asan)
+               OPTS="$OPTS $1"
+               has_asan_opt="yes"
+               ;;
+       --use-system-commands)
+               OPTS="$OPTS $1"
+               SYSCOMMANDS="yes"
+               ;;
+
        --nonroot)
                if [ $(id -ru) -eq 0 ]; then
                        echo "Ignore util-linux test suite [non-root UID expected]."
@@ -66,6 +93,10 @@ while [ -n "$1" ]; do
                ;;
        --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)
@@ -78,15 +109,20 @@ while [ -n "$1" ]; do
                echo "Usage: "
                echo "  $(basename $0) [options] [<component> ...]"
                echo "Options:"
-               echo "  --force           execute demanding tests"
-               echo "  --fake            do not run, setup tests only"
-               echo "  --memcheck        run with valgrind"
-               echo "  --verbose         verbose mode"
-               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 "  --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 "  --use-system-commands use PATH rather than builddir"
+               echo "  --noskip-commands     fail on missing commands"
+               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
                ;;
@@ -113,11 +149,19 @@ fi
 
 OPTS="$OPTS --srcdir=$top_srcdir --builddir=$top_builddir"
 
+# Auto-enable ASAN to avoid conflicts between tests and binaries
+if [ -z "$has_asan_opt" ]; then
+       asan=$(awk '/^ASAN_LDFLAGS/ { print $3 }' $top_builddir/Makefile)
+       if [ -n "$asan" ]; then
+               OPTS="$OPTS --memcheck-asan"
+       fi
+fi
+
 declare -a comps
 if [ -n "$SUBTESTS" ]; then
        # selected tests only
        for s in $SUBTESTS; do
-               if [ -d "$top_srcdir/tests/ts/$s" ]; then
+               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'"
@@ -125,7 +169,7 @@ if [ -n "$SUBTESTS" ]; then
                fi
        done
 else
-       if [ ! -f "$top_builddir/test_ttyutils" ]; then
+       if [ -z "$SYSCOMMANDS" -a ! -f "$top_builddir/test_ttyutils" ]; then
                echo "Tests not compiled! Run 'make check' to fix the problem."
                exit 1
        fi
@@ -160,8 +204,17 @@ echo "                    For development purpose only.                    "
 echo "                 Don't execute on production system!                 "
 echo
 
-if [ $paraller_jobs -gt 1 ]; then
-       echo "              Executing the tests in parallel ($paraller_jobs jobs)    "
+# TODO: add more information about system
+printf "%13s: %-30s    " "kernel" "$(uname -r)"
+echo
+echo
+echo "      options: $(echo $OPTS | sed 's/ / \\\n               /g')"
+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
@@ -172,6 +225,10 @@ 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