File run-tests.sh of Package systemd-v237-testsuite

#!/bin/sh

function cleanup {
for id in 1 2 3; do
    [[ $(getent passwd systemdtestsuiteuser$id) ]] && userdel systemdtestsuiteuser$id
    [[ $(getent group systemdtestsuitegroup$id) ]] && groupdel systemdtestsuitegroup$id
done
for user in systemd-journal-upload systemd-journal-remote; do
    [[ $(getent passwd $user) ]] && userdel $user
done
for group in systemd-journal-upload systemd-journal-remote mail adm; do
    [[ $(getent group $group) ]] && groupdel $group
done
}

function testsuiteprepare {
     VERSION=$(rpm -q systemd | sed -n 's/systemd-\([[:digit:]]*\).*/\1/p')
     echo "Preparing tests for version $VERSION"
     echo -e "\nChecking required packages\n"

     case "$VERSION" in
        234|237)
             ARCH=$(uname -m)
             case $ARCH in
                x86_64|i*86)
                     QEMU_PKG=qemu-x86
                     ;;
                ppc64*)
                     QEMU_PKG="qemu-ppc qemu-vgabios"
                     ;;
                s390x)
                     QEMU_PKG=qemu-s390
                     ;;
                aarch64)
                     QEMU_PKG=qemu-arm
                     ;;
             esac
             progs="lz4 busybox qemu dhcp-client python3 plymouth yast2-firstboot binutils netcat-openbsd cryptsetup less $QEMU_PKG"
             [[ $VERSION == 237 ]] && progs+=" ninja quota ppp"
             for prog in $progs; do
                 rpm -q $prog || zypper -n in --no-recommends "$prog"
                 [[ $? -ne 0 ]] && { echo "error installing required packages"; exit 1; }
             done
             for id in 1 2 3; do
                 [[ $(getent group systemdtestsuitegroup$id) ]] || groupadd -g $id systemdtestsuitegroup$id
                 [[ $(getent passwd systemdtestsuiteuser$id) ]] || useradd -u $id -g $id systemdtestsuiteuser$id
             done
             for user in systemd-journal-upload systemd-journal-remote; do
                 [[ $(getent passwd $user) ]] || useradd $user
             done
             for group in systemd-journal-upload systemd-journal-remote mail adm; do
                 [[ $(getent group $group) ]] || groupadd $group
             done
             [[ -d /var/opt/systemd-tests/test/sys ]] || /var/opt/systemd-tests/sys-script.py /var/opt/systemd-tests/test
	     ;;
        228)
             zypper -n in python3-lxml || zypper in python3-lxml
             ;;
        210)
             ;;
          *)
             echo "unknown systemd version: $VERSION"
             cleanup
	     exit 1
             ;;
     esac

     echo ""
     #increase test timeout on slow machines
     sed -i 's/QEMU_TIMEOUT=[[:digit:]]*/QEMU_TIMEOUT=300/' /var/opt/systemd-tests/test/TEST-*/test.sh

     #export testdata directory
     export SYSTEMD_TEST_DATA=/var/opt/systemd-tests/test

     #create input files for test-catalog
     for i in $(ls /var/opt/systemd-tests/catalog/systemd.*.in); do mv $i ${i%%.in}; done
}


function summary {
    ws='[   ]'
    results=$(echo logs/*.trs)
    [[ -n "$results" ]] || results=/dev/null
    all=`grep "^$ws*:test-result:" $results | wc -l`
    pass=`grep "^$ws*:test-result:$ws*PASS" $results | wc -l`
    fail=`grep "^$ws*:test-result:$ws*FAIL" $results | wc -l`
    skip=`grep "^$ws*:test-result:$ws*SKIP" $results | wc -l`
    xfail=`grep "^$ws*:test-result:$ws*XFAIL" $results | wc -l`
    xpass=`grep "^$ws*:test-result:$ws*XPASS" $results | wc -l`
    error=`grep "^$ws*:test-result:$ws*ERROR" $results | wc -l`
    if [ $(expr $fail + $xpass + $error) -eq 0 ]; then
      success=0;
    else
      success=1;\
    fi

    echo
    echo "============================================================================"
    echo "Testsuite summary for systemd $VERSION"
    echo "============================================================================"
    echo -e "# TOTAL: $all"
    echo -e '\033[0;32m'"# PASS:  $pass"
    echo -e '\033[1;34m'"# SKIP:  $skip"
    #echo -e '\033[m'"# XFAIL: $xfail"
    echo -e '\033[0;31m'"# FAIL:  $fail"
    #echo -e '\033[m'"# XPASS: $xpass"
    echo -e '\033[m'"# ERROR: $error"
    echo "============================================================================"
    echo -e "See logs/\$testname.log\n"
}


if [ "$1" == "--help" ]; then
	echo "Usage: ./run-tests.sh [--skip=\$tests]"
        echo "       \$tests is a space separated list of test names"
	exit 0
fi

[ -d logs ] || mkdir logs

rm -f logs/*


testsuiteprepare

testfiles=$(echo test-*)" "
testfiles+="test/udev-test.pl
test/hwdb-test.sh
test/rule-syntax-check.py
hwdb/parse_hwdb.py
test/sysv-generator-test.py"

skiptests="test-coredump-vacuum test-qcow2 test-patch-uid test-ns test-hostname test-ask-password-api test-dissect-image test-ipcrm test-btrfs test-netlink-manual test-cgroup test-install test-udev test-nss test-bus-benchmark test-ipv4ll-manual test-acd test-inhibit "
skiptests+="*.sh test-driver "

for toskip in ${@##--skip=}; do
	[[ "$testfiles" =~ "$toskip" ]] && skiptests+=" $toskip"
done

echo -e "\nrunning basic tests\n"

[[ -f /proc/sys/kernel/nmi_watchdog ]] && WD=$(cat /proc/sys/kernel/nmi_watchdog)
[[ "$WD" == 1 ]] && echo 0 > /proc/sys/kernel/nmi_watchdog

for test in $testfiles; do
        for skip in $skiptests; do
                [[ $skip == $test ]] && continue 2;
        done
        [[ "$test" == "test/rule-syntax-check.py" ]] && testname=rule-syntax-check-run.sh || testname=$test

        ./test-driver --test-name $testname --log-file logs/${test#*/}.log --trs-file logs/${test#*/}.trs --color-tests yes
done

if [ "$1" != "--all" ]; then
        summary
        exit $success
fi

[[ "$WD" == 1 ]] && echo 1 > /proc/sys/kernel/nmi_watchdog

echo -e "\nrunning extended tests\n"

#route package not available in openSUSE
sed -i 's/route //' test/test-functions

export TEST_BASE_DIR='/var/opt/systemd-tests/test'
TESTDIR='none'
for dir in $(echo test/TEST-*); do
        [[ "$dir" == "test/TEST-06-SELINUX" ]] && continue
        cd $dir
        sed -i '/SKIP_INITRD=yes/d' test.sh
        testname=$(basename $dir)
        ./test.sh --clean &> /dev/null
        ./test.sh --setup &> ${TEST_BASE_DIR%%/test}/logs/$testname-setup.log
        [[ $? == 0 ]] && ./test.sh --run &> ${TEST_BASE_DIR%%/test}/logs/$testname-run.log
        [[ $? == 0 ]] && TESTRES='\033[0;32m'"PASS" || TESTRES='\033[0;31m'"FAIL"
        echo -e "$TESTRES:" '\033[m'"$testname"
        echo ":test-result: ${TESTRES##*m}" > ${TEST_BASE_DIR%%/test}/logs/$testname.trs
        losetup -D
        TESTDIR=$(sed -n '/systemd-test.*system.journal/s/.*\(systemd-test.[[:alnum:]]*\)\/.*/\1/p' ${TEST_BASE_DIR%%/test}/logs/$testname-run.log)
        [[ -n "$TESTDIR" ]] && [[ "$TESTRES" =~ "PASS" ]] && rm -rf /var/tmp/$TESTDIR &>/dev/null
        cd ${TEST_BASE_DIR%%/test}
done

summary
cleanup

exit $success