diff --git a/test/TEST-63-DRACUT-CPIO/Makefile b/test/TEST-63-DRACUT-CPIO/Makefile new file mode 100644 index 00000000..2dcab816 --- /dev/null +++ b/test/TEST-63-DRACUT-CPIO/Makefile @@ -0,0 +1 @@ +-include ../Makefile.testdir diff --git a/test/TEST-63-DRACUT-CPIO/test.sh b/test/TEST-63-DRACUT-CPIO/test.sh new file mode 100755 index 00000000..8e319bf2 --- /dev/null +++ b/test/TEST-63-DRACUT-CPIO/test.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# This file is part of dracut. +# SPDX-License-Identifier: GPL-2.0-or-later + +# shellcheck disable=SC2034 +TEST_DESCRIPTION="kernel cpio extraction tests for dracut-cpio" +# see dracut-cpio source for unit tests + +test_check() { + if ! [[ -x $basedir/dracut-cpio ]]; then + echo "Test needs dracut-cpio... Skipping" + return 1 + fi +} + +test_dracut_cpio() { + local tdir="${CPIO_TESTDIR}/${1}" + shift + # --enhanced-cpio tells dracut to use dracut-cpio instead of GNU cpio + local dracut_cpio_params=("--enhanced-cpio" "$@") + + mkdir -p "$tdir" + + # VM script to print sentinel on boot + # write to kmsg so that sysrq messages don't race with console output + cat > "$tdir/init.sh" << EOF +echo "Image with ${dracut_cpio_params[*]} booted successfully" > /dev/kmsg +echo 1 > /proc/sys/kernel/sysrq +echo o > /proc/sysrq-trigger +sleep 20 +EOF + + "$basedir"/dracut.sh -l --drivers "" \ + "${dracut_cpio_params[@]}" \ + --modules "bash base" \ + --include "$tdir/init.sh" /lib/dracut/hooks/emergency/00-init.sh \ + --no-hostonly --no-hostonly-cmdline \ + "$tdir/initramfs" \ + || return 1 + + "$testdir"/run-qemu \ + -watchdog i6300esb -watchdog-action poweroff \ + -daemonize -pidfile "$tdir/vm.pid" \ + -serial "file:$tdir/console.out" \ + -append "panic=1 oops=panic softlockup_panic=1 loglevel=7 console=ttyS0 rd.shell=1" \ + -initrd "$tdir/initramfs" || return 1 + + timeout=120 + while [[ -f $tdir/vm.pid ]] \ + && ps -p "$(head -n1 "$tdir/vm.pid")" > /dev/null; do + echo "$timeout - awaiting VM shutdown" + sleep 1 + [[ $((timeout--)) -le 0 ]] && return 1 + done + + cat "$tdir/console.out" + grep -q "Image with ${dracut_cpio_params[*]} booted successfully" \ + "$tdir/console.out" +} + +test_run() { + set -x + + # dracut-cpio is typically used with compression and strip disabled, to + # increase the chance of (reflink) extent sharing. + test_dracut_cpio "simple" "--no-compress" "--nostrip" || return 1 + # dracut-cpio should still work fine with compression and stripping enabled + test_dracut_cpio "compress" "--gzip" "--nostrip" || return 1 + test_dracut_cpio "strip" "--gzip" "--strip" || return 1 +} + +test_setup() { + CPIO_TESTDIR=$(mktemp --directory -p "$TESTDIR" cpio-test.XXXXXXXXXX) \ + || return 1 + export CPIO_TESTDIR + return 0 +} + +test_cleanup() { + [ -d "$CPIO_TESTDIR" ] && rm -rf "$CPIO_TESTDIR" + return 0 +} + +# shellcheck disable=SC1090 +. "$testdir"/test-functions