test: Run qemu/nspawn tests with "set -e"

This catches errors like "ninja not found", missing programs etc. early,
instead of silently ignoring them and trying to boot a broken VM.

In install_config_files(), allow some distro specific files to be absent
(such as /etc/sysconfig/init).
This commit is contained in:
Martin Pitt 2017-08-07 21:09:21 +02:00
parent 22077c9c91
commit 818567fce6
17 changed files with 51 additions and 38 deletions

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="Basic systemd setup" TEST_DESCRIPTION="Basic systemd setup"
. $TEST_BASE_DIR/test-functions . $TEST_BASE_DIR/test-functions

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="cryptsetup systemd setup" TEST_DESCRIPTION="cryptsetup systemd setup"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1
@ -78,9 +79,9 @@ EOF
} }
test_cleanup() { test_cleanup() {
umount $TESTDIR/root/var 2>/dev/null [ -d $TESTDIR/root/var ] && mountpoint $TESTDIR/root/var && umount $TESTDIR/root/var
[[ -b /dev/mapper/varcrypt ]] && cryptsetup luksClose /dev/mapper/varcrypt [[ -b /dev/mapper/varcrypt ]] && cryptsetup luksClose /dev/mapper/varcrypt
umount $TESTDIR/root 2>/dev/null umount $TESTDIR/root 2>/dev/null || true
[[ $LOOPDEV ]] && losetup -d $LOOPDEV [[ $LOOPDEV ]] && losetup -d $LOOPDEV
return 0 return 0
} }

View file

@ -1,4 +1,4 @@
#!/bin/bash -x #!/bin/bash -e
# Test merging of a --job-mode=ignore-dependencies job into a previously # Test merging of a --job-mode=ignore-dependencies job into a previously
# installed job. # installed job.
@ -10,7 +10,7 @@ while ! grep 'sleep\.service.*running' /root/list-jobs.txt; do
systemctl list-jobs > /root/list-jobs.txt systemctl list-jobs > /root/list-jobs.txt
done done
grep 'hello\.service.*waiting' /root/list-jobs.txt || exit 1 grep 'hello\.service.*waiting' /root/list-jobs.txt
# This is supposed to finish quickly, not wait for sleep to finish. # This is supposed to finish quickly, not wait for sleep to finish.
START_SEC=$(date -u '+%s') START_SEC=$(date -u '+%s')
@ -18,36 +18,36 @@ systemctl start --job-mode=ignore-dependencies hello
END_SEC=$(date -u '+%s') END_SEC=$(date -u '+%s')
ELAPSED=$(($END_SEC-$START_SEC)) ELAPSED=$(($END_SEC-$START_SEC))
[ "$ELAPSED" -lt 3 ] || exit 1 [ "$ELAPSED" -lt 3 ]
# sleep should still be running, hello not. # sleep should still be running, hello not.
systemctl list-jobs > /root/list-jobs.txt systemctl list-jobs > /root/list-jobs.txt
grep 'sleep\.service.*running' /root/list-jobs.txt || exit 1 grep 'sleep\.service.*running' /root/list-jobs.txt
grep 'hello\.service' /root/list-jobs.txt && exit 1 grep 'hello\.service' /root/list-jobs.txt && exit 1
systemctl stop sleep.service hello-after-sleep.target || exit 1 systemctl stop sleep.service hello-after-sleep.target
# Test for a crash when enqueuing a JOB_NOP when other job already exists # Test for a crash when enqueuing a JOB_NOP when other job already exists
systemctl start --no-block hello-after-sleep.target || exit 1 systemctl start --no-block hello-after-sleep.target
# hello.service should still be waiting, so these try-restarts will collapse # hello.service should still be waiting, so these try-restarts will collapse
# into NOPs. # into NOPs.
systemctl try-restart --job-mode=fail hello.service || exit 1 systemctl try-restart --job-mode=fail hello.service
systemctl try-restart hello.service || exit 1 systemctl try-restart hello.service
systemctl stop hello.service sleep.service hello-after-sleep.target || exit 1 systemctl stop hello.service sleep.service hello-after-sleep.target
# TODO: add more job queueing/merging tests here. # TODO: add more job queueing/merging tests here.
# Test for irreversible jobs # Test for irreversible jobs
systemctl start unstoppable.service || exit 1 systemctl start unstoppable.service
# This is expected to fail with 'job cancelled' # This is expected to fail with 'job cancelled'
systemctl stop unstoppable.service && exit 1 systemctl stop unstoppable.service && exit 1
# But this should succeed # But this should succeed
systemctl stop --job-mode=replace-irreversibly unstoppable.service || exit 1 systemctl stop --job-mode=replace-irreversibly unstoppable.service
# We're going to shutdown soon. Let's see if it succeeds when # We're going to shutdown soon. Let's see if it succeeds when
# there's an active service that tries to be unstoppable. # there's an active service that tries to be unstoppable.
# Shutdown of the container/VM will hang if not. # Shutdown of the container/VM will hang if not.
systemctl start unstoppable.service || exit 1 systemctl start unstoppable.service
# Test waiting for a started unit(s) to terminate again # Test waiting for a started unit(s) to terminate again
cat <<EOF > /run/systemd/system/wait2.service cat <<EOF > /run/systemd/system/wait2.service
@ -65,7 +65,7 @@ EOF
# wait2 succeeds # wait2 succeeds
START_SEC=$(date -u '+%s') START_SEC=$(date -u '+%s')
systemctl start --wait wait2.service || exit 1 systemctl start --wait wait2.service
END_SEC=$(date -u '+%s') END_SEC=$(date -u '+%s')
ELAPSED=$(($END_SEC-$START_SEC)) ELAPSED=$(($END_SEC-$START_SEC))
[[ "$ELAPSED" -ge 2 ]] && [[ "$ELAPSED" -le 4 ]] || exit 1 [[ "$ELAPSED" -ge 2 ]] && [[ "$ELAPSED" -le 4 ]] || exit 1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="Job-related tests" TEST_DESCRIPTION="Job-related tests"
. $TEST_BASE_DIR/test-functions . $TEST_BASE_DIR/test-functions

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="Journal-related tests" TEST_DESCRIPTION="Journal-related tests"
. $TEST_BASE_DIR/test-functions . $TEST_BASE_DIR/test-functions

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="Resource limits-related tests" TEST_DESCRIPTION="Resource limits-related tests"
. $TEST_BASE_DIR/test-functions . $TEST_BASE_DIR/test-functions

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="SELinux tests" TEST_DESCRIPTION="SELinux tests"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/1981" TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/1981"
TEST_NO_QEMU=1 TEST_NO_QEMU=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/2730" TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/2730"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/2691" TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/2691"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/2467" TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/2467"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/3166" TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/3166"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/3171" TEST_DESCRIPTION="https://github.com/systemd/systemd/issues/3171"
TEST_NO_QEMU=1 TEST_NO_QEMU=1

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="systemd-nspawn smoke test" TEST_DESCRIPTION="systemd-nspawn smoke test"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1
SKIP_INITRD=yes SKIP_INITRD=yes

View file

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="Basic systemd setup" TEST_DESCRIPTION="Basic systemd setup"
TEST_NO_NSPAWN=1 TEST_NO_NSPAWN=1
SKIP_INITRD=yes SKIP_INITRD=yes

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh # ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
TEST_DESCRIPTION="Dropin tests" TEST_DESCRIPTION="Dropin tests"
TEST_NO_QEMU=1 TEST_NO_QEMU=1

View file

@ -4,9 +4,9 @@
PATH=/sbin:/bin:/usr/sbin:/usr/bin PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH export PATH
LOOKS_LIKE_DEBIAN=$(source /etc/os-release && [[ "$ID" = "debian" || "$ID_LIKE" = "debian" ]] && echo yes) LOOKS_LIKE_DEBIAN=$(source /etc/os-release && [[ "$ID" = "debian" || "$ID_LIKE" = "debian" ]] && echo yes || true)
LOOKS_LIKE_ARCH=$(source /etc/os-release && [[ "$ID" = "arch" ]] && echo yes) LOOKS_LIKE_ARCH=$(source /etc/os-release && [[ "$ID" = "arch" ]] && echo yes || true)
LOOKS_LIKE_SUSE=$(source /etc/os-release && [[ "$ID_LIKE" = "suse" ]] && echo yes) LOOKS_LIKE_SUSE=$(source /etc/os-release && [[ "$ID_LIKE" = "suse" ]] && echo yes || true)
KERNEL_VER=${KERNEL_VER-$(uname -r)} KERNEL_VER=${KERNEL_VER-$(uname -r)}
KERNEL_MODS="/lib/modules/$KERNEL_VER/" KERNEL_MODS="/lib/modules/$KERNEL_VER/"
QEMU_TIMEOUT="${QEMU_TIMEOUT:-infinity}" QEMU_TIMEOUT="${QEMU_TIMEOUT:-infinity}"
@ -427,7 +427,8 @@ install_execs() {
egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/{$systemdsystemunitdir,$systemduserunitdir}/*.service \ egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/{$systemdsystemunitdir,$systemduserunitdir}/*.service \
| while read i; do | while read i; do
i=${i##Exec*=}; i=${i##-} i=${i##Exec*=}; i=${i##-}
inst $i # some {rc,halt}.local scripts and programs are okay to not exist, the rest should
inst $i || [ "${i%.local}" != "$i" ] || [ "${i%systemd-update-done}" != "$i" ]
done done
) )
} }
@ -462,15 +463,15 @@ install_ld_so_conf() {
} }
install_config_files() { install_config_files() {
inst /etc/sysconfig/init inst /etc/sysconfig/init || true
inst /etc/passwd inst /etc/passwd
inst /etc/shadow inst /etc/shadow
inst /etc/login.defs inst /etc/login.defs
inst /etc/group inst /etc/group
inst /etc/shells inst /etc/shells
inst /etc/nsswitch.conf inst /etc/nsswitch.conf
inst /etc/pam.conf inst /etc/pam.conf || true
inst /etc/securetty inst /etc/securetty || true
inst /etc/os-release inst /etc/os-release
inst /etc/localtime inst /etc/localtime
# we want an empty environment # we want an empty environment
@ -520,12 +521,12 @@ install_dbus() {
install_pam() { install_pam() {
( (
[[ "$LOOKS_LIKE_DEBIAN" ]] && type -p dpkg-architecture &>/dev/null && find "/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/security" -xtype f if [[ "$LOOKS_LIKE_DEBIAN" ]] && type -p dpkg-architecture &>/dev/null; then
find \ find "/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/security" -xtype f
/etc/pam.d \ else
/etc/security \ find /lib*/security -xtype f
/lib64/security \ fi
/lib/security -xtype f \ find /etc/pam.d /etc/security -xtype f
) | while read file; do ) | while read file; do
inst $file inst $file
done done
@ -923,7 +924,7 @@ inst_library() {
# Create additional symlinks. See rev_symlinks description. # Create additional symlinks. See rev_symlinks description.
for _symlink in $(rev_lib_symlinks $_src) $(rev_lib_symlinks $_reallib); do for _symlink in $(rev_lib_symlinks $_src) $(rev_lib_symlinks $_reallib); do
[[ ! -e $initdir/$_symlink ]] && { [[ -e $initdir/$_symlink ]] || {
ddebug "Creating extra symlink: $_symlink" ddebug "Creating extra symlink: $_symlink"
inst_symlink $_symlink inst_symlink $_symlink
} }
@ -1387,7 +1388,7 @@ setup_suse() {
# can be overridden in specific test # can be overridden in specific test
test_cleanup() { test_cleanup() {
umount $TESTDIR/root 2>/dev/null || true umount $TESTDIR/root 2>/dev/null || true
[[ $LOOPDEV ]] && losetup -d $LOOPDEV [[ $LOOPDEV ]] && losetup -d $LOOPDEV || true
return 0 return 0
} }
@ -1433,9 +1434,7 @@ do_test() {
case $1 in case $1 in
--run) --run)
echo "TEST RUN: $TEST_DESCRIPTION" echo "TEST RUN: $TEST_DESCRIPTION"
test_run if test_run; then
ret=$?
if [ $ret -eq 0 ]; then
echo "TEST RUN: $TEST_DESCRIPTION [OK]" echo "TEST RUN: $TEST_DESCRIPTION [OK]"
else else
echo "TEST RUN: $TEST_DESCRIPTION [FAILED]" echo "TEST RUN: $TEST_DESCRIPTION [FAILED]"
@ -1444,14 +1443,15 @@ do_test() {
--setup) --setup)
echo "TEST SETUP: $TEST_DESCRIPTION" echo "TEST SETUP: $TEST_DESCRIPTION"
test_setup test_setup
exit $?;; ;;
--clean) --clean)
echo "TEST CLEANUP: $TEST_DESCRIPTION" echo "TEST CLEANUP: $TEST_DESCRIPTION"
test_cleanup test_cleanup
rm -fr "$TESTDIR" rm -fr "$TESTDIR"
rm -f "$STATEFILE" rm -f "$STATEFILE"
exit $?;; ;;
--all) --all)
ret=0
echo -n "TEST: $TEST_DESCRIPTION "; echo -n "TEST: $TEST_DESCRIPTION ";
( (
test_setup && test_run test_setup && test_run
@ -1460,8 +1460,7 @@ do_test() {
rm -fr "$TESTDIR" rm -fr "$TESTDIR"
rm -f "$STATEFILE" rm -f "$STATEFILE"
exit $ret exit $ret
) </dev/null >"$TESTLOG" 2>&1 ) </dev/null >"$TESTLOG" 2>&1 || ret=$?
ret=$?
if [ $ret -eq 0 ]; then if [ $ret -eq 0 ]; then
rm "$TESTLOG" rm "$TESTLOG"
echo "[OK]" echo "[OK]"