summaryrefslogtreecommitdiffstats
path: root/test/test-functions
diff options
context:
space:
mode:
Diffstat (limited to 'test/test-functions')
-rw-r--r--test/test-functions206
1 files changed, 206 insertions, 0 deletions
diff --git a/test/test-functions b/test/test-functions
new file mode 100644
index 0000000..f76d930
--- /dev/null
+++ b/test/test-functions
@@ -0,0 +1,206 @@
+#!/bin/bash
+PATH=/usr/sbin:/usr/bin:/sbin:/bin
+export PATH
+
+# shellcheck disable=SC1090
+[[ -e .testdir${TEST_RUN_ID:+-$TEST_RUN_ID} ]] && . .testdir${TEST_RUN_ID:+-$TEST_RUN_ID}
+if [[ -z $TESTDIR ]] || [[ ! -d $TESTDIR ]]; then
+ TESTDIR=$(mktemp -d -p "/var/tmp" -t dracut-test.XXXXXX)
+fi
+echo "TESTDIR=\"$TESTDIR\"" > .testdir${TEST_RUN_ID:+-$TEST_RUN_ID}
+export TESTDIR
+
+KVERSION=${KVERSION-$(uname -r)}
+
+[ -z "$USE_NETWORK" ] && USE_NETWORK="network-legacy"
+
+if [[ -z $basedir ]]; then basedir="$(realpath ../..)"; fi
+
+DRACUT=${DRACUT-${basedir}/dracut.sh}
+PKGLIBDIR=${PKGLIBDIR-$basedir}
+
+test_dracut() {
+ TEST_DRACUT_ARGS+=" --local --no-hostonly --no-early-microcode --add test --kver $KVERSION"
+
+ # shellcheck disable=SC2162
+ IFS=' ' read -a TEST_DRACUT_ARGS_ARRAY <<< "$TEST_DRACUT_ARGS"
+
+ "$DRACUT" "$@" \
+ --kernel-cmdline "panic=1 oops=panic softlockup_panic=1 systemd.crash_reboot selinux=0 console=ttyS0,115200n81 $DEBUGFAIL" \
+ "${TEST_DRACUT_ARGS_ARRAY[@]}" || return 1
+}
+
+command -v test_check &> /dev/null || test_check() {
+ :
+}
+
+command -v test_cleanup &> /dev/null || test_cleanup() {
+ :
+}
+
+# terminal sequence to set color to a 'success' color (currently: green)
+function SETCOLOR_SUCCESS() { echo -en '\033[0;32m'; }
+# terminal sequence to set color to a 'failure' color (currently: red)
+function SETCOLOR_FAILURE() { echo -en '\033[0;31m'; }
+# terminal sequence to set color to a 'warning' color (currently: yellow)
+function SETCOLOR_WARNING() { echo -en '\033[0;33m'; }
+# terminal sequence to reset to the default color.
+function SETCOLOR_NORMAL() { echo -en '\033[0;39m'; }
+
+COLOR_SUCCESS='\033[0;32m'
+COLOR_FAILURE='\033[0;31m'
+COLOR_WARNING='\033[0;33m'
+COLOR_NORMAL='\033[0;39m'
+
+check_root() {
+ if ((EUID != 0)); then
+ SETCOLOR_FAILURE
+ echo "Tests must be run as root! Please use 'sudo'."
+ SETCOLOR_NORMAL
+ exit 1
+ fi
+}
+
+# generate qemu arguments for named raw disks
+#
+# qemu_add_drive_args <index> <args> <filename> <id-name> [<bootindex>]
+#
+# index: name of the index variable (set to 0 at start)
+# args: name of the argument array variable (set to () at start)
+# filename: filename of the raw disk image
+# id-name: name of the disk in /dev/disk/by-id -> /dev/disk/by-id/ata-disk_$name
+# size: optional file size in MiB (0 implies size is not set)
+# bootindex: optional bootindex number
+#
+# to be used later with `qemu … "${args[@]}" …`
+# The <index> variable will be incremented each time the function is called.
+#
+# can't be easier than this :-/
+#
+# # EXAMPLES
+# ```
+# declare -a disk_args=()
+# declare -i disk_index=0
+# qemu_add_drive_args disk_index disk_args "$TESTDIR"/root.ext3 root 0 1
+# qemu_add_drive_args disk_index disk_args "$TESTDIR"/client.img client
+# qemu_add_drive_args disk_index disk_args "$TESTDIR"/iscsidisk2.img iscsidisk2
+# qemu_add_drive_args disk_index disk_args "$TESTDIR"/iscsidisk3.img iscsidisk3
+# qemu "${disk_args[@]}"
+# ```
+qemu_add_drive_args() {
+ local index=${!1}
+ local file=$3
+ local name=${4:-$index}
+ local size=${5:-0}
+ local bootindex=$6
+
+ if [ "${size}" -ne 0 ]; then
+ dd if=/dev/zero of="${file}" bs=1MiB count="${size}"
+ fi
+
+ eval "${2}"'+=(' \
+ -drive "if=none,format=raw,file=${file},id=drive-sata${index}" \
+ -device "ide-hd,bus=ide.${index},drive=drive-sata${index},id=sata${index},${bootindex:+bootindex=$bootindex,}model=disk,serial=${name}" \
+ ')'
+
+ # shellcheck disable=SC2219
+ let "${1}++"
+}
+
+test_marker_reset() {
+ dd if=/dev/zero of="$TESTDIR"/marker.img bs=1MiB count=1
+}
+
+test_marker_check() {
+ local marker=${1:-dracut-root-block-success}
+ local file=${2:-marker.img}
+
+ grep -U --binary-files=binary -F -m 1 -q "$marker" "$TESTDIR/$file"
+ return $?
+}
+
+while (($# > 0)); do
+ case $1 in
+ --run)
+ check_root
+ echo "TEST RUN: $TEST_DESCRIPTION"
+ test_check && test_run
+ exit $?
+ ;;
+ --setup)
+ check_root
+ echo "TEST SETUP: $TEST_DESCRIPTION"
+ test_check && test_setup
+ exit $?
+ ;;
+ --clean)
+ echo "TEST CLEANUP: $TEST_DESCRIPTION"
+ test_cleanup
+ rm -fr -- "$TESTDIR"
+ rm -f -- .testdir${TEST_RUN_ID:+-$TEST_RUN_ID}
+ exit $?
+ ;;
+ --all)
+ check_root
+ if ! test_check 2 &> test${TEST_RUN_ID:+-$TEST_RUN_ID}.log; then
+ echo -e "TEST: $TEST_DESCRIPTION " "$COLOR_WARNING" "[SKIPPED]" "$COLOR_NORMAL"
+ exit 0
+ else
+ echo -e "TEST: $TEST_DESCRIPTION " "$COLOR_SUCCESS" "[STARTED]" "$COLOR_NORMAL"
+ fi
+ if [[ $V == "1" ]]; then
+ set -o pipefail
+ (
+ test_setup && test_run
+ ret=$?
+ test_cleanup
+ if ((ret != 0)) && [[ -f "$TESTDIR"/server.log ]]; then
+ mv "$TESTDIR"/server.log ./server${TEST_RUN_ID:+-$TEST_RUN_ID}.log
+ fi
+ rm -fr -- "$TESTDIR"
+ rm -f -- .testdir${TEST_RUN_ID:+-$TEST_RUN_ID}
+ exit $ret
+ ) < /dev/null 2>&1 | tee "test${TEST_RUN_ID:+-$TEST_RUN_ID}.log"
+ elif [[ $V == "2" ]]; then
+ set -o pipefail
+ (
+ test_setup && test_run
+ ret=$?
+ test_cleanup
+ if ((ret != 0)) && [[ -f "$TESTDIR"/server.log ]]; then
+ mv "$TESTDIR"/server.log ./server${TEST_RUN_ID:+-$TEST_RUN_ID}.log
+ fi
+ rm -fr -- "$TESTDIR"
+ rm -f -- .testdir${TEST_RUN_ID:+-$TEST_RUN_ID}
+ exit $ret
+ ) < /dev/null 2>&1 | "$basedir/logtee" "test${TEST_RUN_ID:+-$TEST_RUN_ID}.log"
+ else
+ (
+ test_setup && test_run
+ ret=$?
+ test_cleanup
+ rm -fr -- "$TESTDIR"
+ rm -f -- .testdir${TEST_RUN_ID:+-$TEST_RUN_ID}
+ exit $ret
+ ) < /dev/null > test${TEST_RUN_ID:+-$TEST_RUN_ID}.log 2>&1
+ fi
+ ret=$?
+ set +o pipefail
+ if [ $ret -eq 0 ]; then
+ rm -- test${TEST_RUN_ID:+-$TEST_RUN_ID}.log
+ echo -e "TEST: $TEST_DESCRIPTION " "$COLOR_SUCCESS" "[OK]" "$COLOR_NORMAL"
+ else
+ echo -e "TEST: $TEST_DESCRIPTION " "$COLOR_FAILURE" "[FAILED]" "$COLOR_NORMAL"
+ if [ "$V" == "2" ]; then
+ tail -c 1048576 "$(pwd)/server${TEST_RUN_ID:+-$TEST_RUN_ID}.log" "$(pwd)/test${TEST_RUN_ID:+-$TEST_RUN_ID}.log"
+ echo -e "TEST: $TEST_DESCRIPTION " "$COLOR_FAILURE" "[FAILED]" "$COLOR_NORMAL"
+ else
+ echo "see $(pwd)/test${TEST_RUN_ID:+-$TEST_RUN_ID}.log"
+ fi
+ fi
+ exit $ret
+ ;;
+ *) break ;;
+ esac
+ shift
+done