| #!/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 |