test-functions revision a2fbff31c9c319da51528f85ae97d019f1e61a86
174f3dff60f96d89b320f9a322307118676db1dbvboxsync# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
174f3dff60f96d89b320f9a322307118676db1dbvboxsync# ex: ts=8 sw=4 sts=4 et filetype=sh
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncLOOKS_LIKE_DEBIAN=$(source /etc/os-release && [[ "$ID" = "debian" || "$ID_LIKE" = "debian" ]] && echo yes)
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncif ! ROOTLIBDIR=$(pkg-config --variable=systemdutildir systemd); then
174f3dff60f96d89b320f9a322307118676db1dbvboxsync echo "WARNING! Cannot determine rootlibdir from pkg-config, assuming /usr/lib/systemd" >&2
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncBASICTOOLS="sh bash setsid loadkeys setfont login sulogin gzip sleep echo mount umount cryptsetup date dmsetup modprobe sed cmp tee"
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncDEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort hostname"
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a kvm qemu-kvm 2>/dev/null | grep '^/' -m1)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # QEMU's own build system calls it qemu-system-x86_64
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-x86_64 2>/dev/null | grep '^/' -m1)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-i386 2>/dev/null | grep '^/' -m1)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu 2>/dev/null | grep '^/' -m1)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync if [ -f /etc/machine-id ]; then
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ -z "$INITRD" ] && [ -e "/boot/$MACHINE_ID/$KERNEL_VER/initrd" ] \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ -z "$KERNEL_BIN" ] && [ -e "/boot/$MACHINE_ID/$KERNEL_VER/linux" ] \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync && KERNEL_BIN="/boot/$MACHINE_ID/$KERNEL_VER/linux"
174f3dff60f96d89b320f9a322307118676db1dbvboxsync default_fedora_initrd=/boot/initramfs-${KERNEL_VER}.img
174f3dff60f96d89b320f9a322307118676db1dbvboxsync default_debian_initrd=/boot/initrd.img-${KERNEL_VER}
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$KERNEL_BIN" ] || KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$INITRD" ] || { [ -e "$default_fedora_initrd" ] && INITRD=$default_fedora_initrd; }
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ "$INITRD" ] || { [ "$LOOKS_LIKE_DEBIAN" ] && [ -e "$default_debian_initrd" ] && INITRD=$default_debian_initrd; }
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncraid=noautodetect \
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncloglevel=2 \
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsyncinit=$ROOTLIBDIR/systemd \
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncconsole=ttyS0 \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync-nographic \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync if [ -c /dev/kvm ]; then
174f3dff60f96d89b320f9a322307118676db1dbvboxsync QEMU_OPTIONS="$QEMU_OPTIONS -machine accel=kvm -enable-kvm -cpu host"
174f3dff60f96d89b320f9a322307118676db1dbvboxsync $QEMU_BIN $QEMU_OPTIONS -append "$KERNEL_APPEND" $TESTDIR/rootdisk.img ) || return 1
174f3dff60f96d89b320f9a322307118676db1dbvboxsync ../../systemd-nspawn --register=no --boot --directory=$TESTDIR/nspawn-root $ROOTLIBDIR/systemd $KERNEL_APPEND
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync if ! type -p valgrind; then
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync local _valgrind_bins=$(strace -e execve valgrind /bin/true 2>&1 >/dev/null | perl -lne 'print $1 if /^execve\("([^"]+)"/')
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync local _valgrind_libs=$(LD_DEBUG=files valgrind /bin/true 2>&1 >/dev/null | perl -lne 'print $1 if m{calling init: (/.*vgpreload_.*)}')
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync strace -e open valgrind /bin/true 2>&1 >/dev/null |
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync perl -lne 'if (my ($fname) = /^open\("([^"]+).*= (?!-)\d+/) { print $fname if $fname =~ /debug|\.supp$/ }'
174f3dff60f96d89b320f9a322307118676db1dbvboxsync type -P dmeventd >/dev/null && dracut_install dmeventd
174f3dff60f96d89b320f9a322307118676db1dbvboxsync inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync (cd $TEST_BASE_DIR/..; set -x; make DESTDIR=$initdir install)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # we strip binaries since debug symbols increase binaries size a lot
174f3dff60f96d89b320f9a322307118676db1dbvboxsync for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # Create the blank file to use as a root filesystem
174f3dff60f96d89b320f9a322307118676db1dbvboxsync dd if=/dev/null of="$TESTDIR/rootdisk.img" bs=1M seek=400
174f3dff60f96d89b320f9a322307118676db1dbvboxsync LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [[ -f $TESTDIR/nspawn-root/failed ]] && cp -a $TESTDIR/nspawn-root/failed $TESTDIR
174f3dff60f96d89b320f9a322307118676db1dbvboxsync cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
174f3dff60f96d89b320f9a322307118676db1dbvboxsync find "$initdir" -executable -not -path '*/lib/modules/*.ko' -type f | xargs strip --strip-unneeded | ddebug
174f3dff60f96d89b320f9a322307118676db1dbvboxsync systemdsystemunitdir=$(pkg-config --variable=systemdsystemunitdir systemd)
174f3dff60f96d89b320f9a322307118676db1dbvboxsync systemduserunitdir=$(pkg-config --variable=systemduserunitdir systemd)
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/{$systemdsystemunitdir,$systemduserunitdir}/*.service \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync | while read i; do
174f3dff60f96d89b320f9a322307118676db1dbvboxsync if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # install plymouth, if found... else remove plymouth service files
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
174f3dff60f96d89b320f9a322307118676db1dbvboxsync # /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
174f3dff60f96d89b320f9a322307118676db1dbvboxsync rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth*
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncLABEL=systemd / ext3 rw 0 1
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync # in Debian ldconfig is just a shell script wrapper around ldconfig.real
174f3dff60f96d89b320f9a322307118676db1dbvboxsync NSS_LIBS=$(LD_DEBUG=files getent passwd 2>&1 >/dev/null |sed -n '/calling init: .*libnss_/ {s!^.* /!/!; p}')
174f3dff60f96d89b320f9a322307118676db1dbvboxsync | while read file; do
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [[ "$LOOKS_LIKE_DEBIAN" ]] && type -p dpkg-architecture &>/dev/null && find "/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/security" -xtype f
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [[ -f $i ]] || continue
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [[ -f $i ]] || continue
174f3dff60f96d89b320f9a322307118676db1dbvboxsync for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [ -f ${_terminfodir}/l/linux ] && break
174f3dff60f96d89b320f9a322307118676db1dbvboxsync cp $TEST_BASE_DIR/testsuite.target $initdir/etc/systemd/system/
174f3dff60f96d89b320f9a322307118676db1dbvboxsync cp $TEST_BASE_DIR/end.service $initdir/etc/systemd/system/
174f3dff60f96d89b320f9a322307118676db1dbvboxsync mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
a3b592bbebcadf0cc7c1b9e295f4f8a032128ef0vboxsync ln -fs $TEST_BASE_DIR/testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync ln -fs $TEST_BASE_DIR/end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync ln -fs testsuite.target $initdir/etc/systemd/system/default.target
174f3dff60f96d89b320f9a322307118676db1dbvboxsync for d in usr/bin usr/sbin bin etc lib "$libdir" sbin tmp usr var var/log dev proc sys sysroot root run run/lock run/initramfs; do
174f3dff60f96d89b320f9a322307118676db1dbvboxsync LC_ALL=C ldd "$_bin" 2>/dev/null | while read _line; do
174f3dff60f96d89b320f9a322307118676db1dbvboxsync if [[ $_line =~ $_so_regex ]]; then
174f3dff60f96d89b320f9a322307118676db1dbvboxsync [[ -e ${initdir}/$_file ]] && continue
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync if [[ $_line =~ not\ found ]]; then
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync dfatal "Missing a shared library required by $_bin."
174f3dff60f96d89b320f9a322307118676db1dbvboxsync if [[ -z "$TESTDIR" ]] || [[ ! -d "$TESTDIR" ]]; then
174f3dff60f96d89b320f9a322307118676db1dbvboxsync TESTDIR=$(mktemp --tmpdir=/var/tmp -d -t systemd-test.XXXXXX)
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync## @brief Converts numeric logging level to the first letter of level name.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @param lvl Numeric logging level in range from 1 to 6.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @retval 1 if @a lvl is out of range.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @retval 0 if @a lvl is correct.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @result Echoes first letter of level name.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync 1) echo F;;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync 2) echo E;;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync 3) echo W;;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync 4) echo I;;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync 5) echo D;;
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync 6) echo T;;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync *) return 1;;
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync## @brief Internal helper function for _do_dlog()
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @param lvl Numeric logging level.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @param msg Message.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @retval 0 It's always returned, even if logging failed.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @note This function is not supposed to be called manually. Please use
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# dtrace(), ddebug(), or others instead which wrap this one.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# This function calls _do_dlog() either with parameter msg, or if
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# none is given, it will read standard input and will use every line as
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# a message.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# This enables:
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# dwarn "This is a warning"
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# echo "This is a warning" | dwarn
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync [ $1 -le $LOG_LEVEL ] || return 0
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync if [ $# -ge 1 ]; then
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync while read line; do
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync## @brief Logs message at TRACE level (6)
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @param msg Message.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @retval 0 It's always returned, even if logging failed.
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync## @brief Logs message at DEBUG level (5)
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync# @param msg Message.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @retval 0 It's always returned, even if logging failed.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# [ -n "$debug" ] && set -x || :
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync## @brief Logs message at INFO level (4)
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @param msg Message.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @retval 0 It's always returned, even if logging failed.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync## @brief Logs message at WARN level (3)
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @param msg Message.
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsync# @retval 0 It's always returned, even if logging failed.
while [[ ${__absolute[__level]} == ${__current[__level]} ]]
if [[ -n $__newpath ]]
if [[ -L $_file ]]; then
# rev_lib_symlinks libfoo.so.8.1
if [[ -L $_src ]]; then
[[ -L $_bin ]] && inst_symlink $_bin $_target && return 0
if [[ $_line =~ $_so_regex ]]; then
_file=${BASH_REMATCH[1]}
local _bin
local _line _shebang_regex
[[ $_line =~ $_shebang_regex ]] || return 1
if [[ -d $_realsrc ]]; then
if [[ -f $r/$_rule ]]; then
if [[ -f ${r}$_rule ]]; then
local _x
case $# in
[[ $initdir = $2 ]] && set $1;;
for _x in inst_symlink inst_script inst_binary inst_simple; do
local to f
if [[ $_optional = yes ]]; then
if [[ $omit_drivers ]]; then
_found=1
local _modname _filtercmd
if ! [[ $hostonly ]]; then
if ! [[ $hostonly ]]; then
[[ $no_kernel = yes ]] && return
local _fderr=9
| instmods
| instmods
local _moddirname=${KERNEL_MODS%%/lib/modules/*}
--set-version $KERNEL_VER ${_moddirname} $_mpargs
return $_ret
while read _mod; do
set -o pipefail
| while read line; do [[ "$line" =~ $_filter_not_found ]] && echo $line || echo $line >&2 ;done | derror
_ret=$?
set +o pipefail
return $_ret
local _pattern=$1
case $1 in
--run)
ret=$?
exit $ret;;
--setup)
--clean)
--all)
ret=$?
exit $ret
ret=$?
exit $ret;;