summaryrefslogtreecommitdiffstats
path: root/debian/tests/test-common
diff options
context:
space:
mode:
Diffstat (limited to 'debian/tests/test-common')
-rw-r--r--debian/tests/test-common204
1 files changed, 204 insertions, 0 deletions
diff --git a/debian/tests/test-common b/debian/tests/test-common
new file mode 100644
index 0000000..981aafe
--- /dev/null
+++ b/debian/tests/test-common
@@ -0,0 +1,204 @@
+# -*- mode: sh -*-
+
+# Find kernel flavour and release
+KVER=
+for flavour in $SUPPORTED_FLAVOURS; do
+ KVER="$(dpkg-query -Wf '${Depends}' "linux-image-${flavour}" 2>/dev/null | tr ',' '\n' | sed -n 's/^ *linux-image-\([-a-z0-9+.]*\).*/\1/p')"
+ if [ "$KVER" ]; then
+ break
+ fi
+done
+if [ -z "$KVER" ]; then
+ echo >&2 "E: Test must set SUPPORTED_FLAVOURS and depend on those flavours"
+ exit 2
+fi
+
+case "$(dpkg --print-architecture)" in
+arm64)
+ # The Ubuntu arm64 autopkgtest runs rarely into the 1200 seconds timeout.
+ QEMU_TIMEOUT=1800
+ ;;
+armhf)
+ # qemu-busybox on Ubuntu armhf runs into the 300 seconds timeout.
+ QEMU_TIMEOUT=600
+ ;;
+ppc64el)
+ # Slowest execution seen in Ubuntu ppc64el autopkgtest: 230 seconds
+ QEMU_TIMEOUT=600
+ ;;
+*)
+ QEMU_TIMEOUT=120
+esac
+
+if [ -n "${AUTOPKGTEST_TMP-}" ]; then
+ export TMPDIR="${AUTOPKGTEST_TMP}"
+fi
+
+BASEDIR="$(mktemp -d -t initramfs-test.XXXXXXXXXX)"
+
+# Skeleton configuration directory
+CONFDIR="${BASEDIR}/config"
+mkdir -p "${CONFDIR}"
+cp conf/initramfs.conf "${CONFDIR}/initramfs.conf"
+echo "RESUME=none" >>"${CONFDIR}/initramfs.conf"
+mkdir "${CONFDIR}/hooks"
+touch "${CONFDIR}/modules"
+mkdir "${CONFDIR}/scripts"
+
+# initramfs image file
+INITRAMFS="${BASEDIR}/initrd.img"
+
+# root disk image file
+ROOTDISK="${BASEDIR}/rootdisk.raw"
+
+# root disk interface type (for qemu) and device name (for Linux)
+test -n "${ROOTDISK_QEMU_IF}" || ROOTDISK_QEMU_IF=virtio
+test -n "${ROOTDISK_LINUX_NAME}" || ROOTDISK_LINUX_NAME=vda
+
+# Create a root fs with a trivial userspace
+ROOTDIR="${BASEDIR}/rootdir"
+INIT_MESSAGE='root fs init system started successfully'
+for subdir in "" dev proc run sys usr usr/bin usr/lib usr/lib64 usr/sbin; do
+ mkdir "${ROOTDIR}/${subdir}"
+done
+for subdir in bin lib lib64 sbin; do
+ ln -s "usr/$subdir" "${ROOTDIR}/${subdir}"
+done
+cat >"${ROOTDIR}/sbin/init" <<EOF
+#!/bin/sh -e
+test -b /dev/${ROOTDISK_LINUX_NAME}
+test -d /proc/1
+test -d /run/initramfs
+test -d /sys/class
+test -d /usr/bin
+echo '${INIT_MESSAGE}'
+poweroff
+EOF
+chmod a+x "${ROOTDIR}/sbin/init"
+cp /usr/lib/klibc/bin/sh "${ROOTDIR}/bin/sh"
+cp /usr/lib/klibc/bin/poweroff "${ROOTDIR}/bin/poweroff"
+cp "$(dpkg -L libklibc | grep '/klibc-.*\.so$')" "${ROOTDIR}/lib/"
+
+# VM output file
+OUTPUT="${BASEDIR}/output.log"
+
+prepare_network_dumping_rootfs() {
+ local root_dir="${1-$ROOTDIR}"
+ cat >"${root_dir}/usr/sbin/init" <<EOF
+#!/bin/sh
+echo "I: Executing /usr/sbin/init from root fs"
+# Stop the kernel from spamming the output
+current_printk=\$(sysctl kernel.printk)
+sysctl -w kernel.printk="4 4 1 7"
+# Run twice, once for the human, once for the test harness
+echo "I: ip addr"
+ip addr
+echo "I: ip route"
+ip route
+echo "I: ip -6 route"
+ip -6 route
+for file in /run/net*.conf; do
+ [ -f \$file ] || continue;
+ echo "########## \$file ##########"
+ cat \$file
+ echo "########################################"
+done
+echo "########## hostname ##########"
+cat /proc/sys/kernel/hostname
+echo "########################################"
+echo "########## ip -json addr ##########"
+ip -json addr
+echo "########################################"
+echo "########## ip -json route ##########"
+ip -json route
+echo "########################################"
+echo "########## ip -json -6 route ##########"
+ip -json -6 route
+echo "########################################"
+echo "########## ps -ww aux ##########"
+ps -ww aux
+echo "########################################"
+sysctl -w "\${current_printk}"
+echo '${INIT_MESSAGE}'
+poweroff
+EOF
+
+ . /usr/share/initramfs-tools/hook-functions
+ verbose=y
+ DESTDIR="$root_dir"
+ for binary in /usr/bin/cat /usr/bin/ip /usr/bin/ps /usr/sbin/sysctl; do
+ copy_exec "$binary"
+ done
+}
+
+build_initramfs() {
+ echo "build_initramfs: /usr/sbin/mkinitramfs -d ${CONFDIR} -o ${INITRAMFS} ${KVER}"
+ /usr/sbin/mkinitramfs -d "${CONFDIR}" -o "${INITRAMFS}" "${KVER}"
+}
+
+build_fs_ext2() {
+ local dir="${1}"
+ local disk="${2}"
+
+ # Get directory size
+ local blocks="$(du --summarize "${dir}" | cut -f 1)"
+ local inodes="$(du --summarize --inodes "${dir}" | cut -f 1)"
+
+ # Add fudge factor
+ blocks="$((blocks + 28 + blocks / 4))"
+ inodes="$((inodes + 10))"
+
+ # genext2fs writes status messages to stderr; hide that from
+ # autopkgtest
+ genext2fs 2>&1 -b "${blocks}" -N "${inodes}" -U -d "${dir}" "${disk}"
+}
+
+build_rootfs_ext2() {
+ build_fs_ext2 "${ROOTDIR}" "${ROOTDISK}"
+}
+
+_run_qemu() {
+ local extra_params="$*"
+
+ echo "I: Running qemu (with a timeout of $QEMU_TIMEOUT seconds)..."
+ timeout --foreground "$QEMU_TIMEOUT" \
+ debian/tests/run-qemu /boot/vmlinu*-"${KVER}" "${INITRAMFS}" \
+ "root=/dev/${ROOTDISK_LINUX_NAME} ${extra_params}" -nographic \
+ -drive "file=${ROOTDISK},if=${ROOTDISK_QEMU_IF},media=disk,format=raw" \
+ ${USRDISK:+-drive "file=${USRDISK},if=${USRDISK_QEMU_IF},media=disk,format=raw"} \
+ -device "virtio-net-pci,netdev=lan0,mac=52:54:00:65:43:21" \
+ -netdev "user,id=lan0,net=10.0.3.0/24,ipv6-net=fec7::/48,hostname=pizza,dnssearch=test,domainname=example.com,bootfile=/path/to/bootfile2" \
+ -device "virtio-net-pci,netdev=lan1,mac=52:54:00:12:34:56" \
+ -netdev "user,id=lan1,hostname=goulash,dnssearch=example,dnssearch=example.net,domainname=test,bootfile=/path/to/bootfile" \
+ -chardev stdio,id=char0 -serial chardev:char0 | tee "${OUTPUT}"
+}
+
+run_qemu_nocheck() {
+ # hide error messages from autopkgtest
+ _run_qemu 2>&1 "$@"
+}
+
+run_qemu() {
+ _run_qemu "panic=-1 $*"
+ grep -qF "${INIT_MESSAGE}" "${OUTPUT}"
+}
+
+check_no_output() {
+ local msg="$1"
+ if grep -qF "${msg}" "${OUTPUT}"; then
+ echo >&2 "E: Message '${msg}' found in log output '${OUTPUT}."
+ exit 1
+ fi
+}
+
+check_output() {
+ local msg="$1"
+ if ! grep -qF "${msg}" "${OUTPUT}"; then
+ echo >&2 "E: Message '${msg}' not found in log output '${OUTPUT}."
+ exit 1
+ fi
+}
+
+check_no_network_configuration() {
+ check_no_output "Waiting up to 180 secs for"
+}