test-functions revision 739d81ddd005fae2bb82edce5b8a6173c7c48b34
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# ex: ts=8 sw=4 sts=4 et filetype=sh
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncBASICTOOLS="sh bash setsid loadkeys setfont login sushell sulogin gzip sleep echo mount umount cryptsetup date dmsetup modprobe"
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncDEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort"
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a kvm qemu-kvm 2>/dev/null | grep '^/' -m1)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # QEMU's own build system calls it qemu-system-x86_64
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-x86_64 2>/dev/null | grep '^/' -m1)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-i386 2>/dev/null | grep '^/' -m1)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu 2>/dev/null | grep '^/' -m1)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ "$KERNEL_BIN" ] || KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ "$INITRD" ] || INITRD=/boot/initramfs-${KERNEL_VER}.img
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncraid=noautodetect \
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncloglevel=2 \
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncconsole=ttyS0 \
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync-nographic \
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync $QEMU_BIN $QEMU_OPTIONS -append "$KERNEL_APPEND" $TESTDIR/rootdisk.img || return 1
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync ../../systemd-nspawn --boot --directory=$TESTDIR/nspawn-root /usr/lib/systemd/systemd
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync type -P dmeventd >/dev/null && dracut_install dmeventd
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync (cd $TEST_BASE_DIR/..; make DESTDIR=$initdir install)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # we strip binaries since debug symbols increase binaries size a lot
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # Create the blank file to use as a root filesystem
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync dd if=/dev/null of="$TESTDIR/rootdisk.img" bs=1M seek=200
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [[ -f $TESTDIR/nspawn-root/failed ]] && cp -a $TESTDIR/nspawn-root/failed $TESTDIR
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync find "$initdir" -executable -not -path '*/lib/modules/*.ko' -type f | xargs strip --strip-unneeded | ddebug
7d0cc752907fa7423e9d6558ecea067a10f0dd77vboxsync egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/lib/systemd/system/*.service \
7d0cc752907fa7423e9d6558ecea067a10f0dd77vboxsync | while read i; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # install plymouth, if found... else remove plymouth service files
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync # /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth*
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsyncLABEL=systemd / ext3 rw 0 1
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync | while read file; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync | while read file; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [[ -f $i ]] || continue
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [[ -f $i ]] || continue
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ -f ${_terminfodir}/l/linux ] && break
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync cp $TEST_BASE_DIR/{testsuite.target,end.service} $initdir/etc/systemd/system/
d1966fe9681e9a100f8c895f08e450fc32dafd48vboxsync mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync ln -fs $TEST_BASE_DIR/testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync ln -fs $TEST_BASE_DIR/end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync ln -fs testsuite.target $initdir/etc/systemd/system/default.target
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 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
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync LC_ALL=C ldd "$_bin" 2>/dev/null | while read _line; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if [[ $_line =~ $_so_regex ]]; then
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [[ -e ${initdir}/$_file ]] && continue
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if [[ $_line =~ not\ found ]]; then
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync dfatal "Missing a shared library required by $_bin."
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if [[ -z "$TESTDIR" ]] || [[ ! -d "$TESTDIR" ]]; then
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync TESTDIR=$(mktemp --tmpdir=/var/tmp -d -t systemd-test.XXXXXX)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync## @brief Converts numeric logging level to the first letter of level name.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @param lvl Numeric logging level in range from 1 to 6.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @retval 1 if @a lvl is out of range.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @retval 0 if @a lvl is correct.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @result Echoes first letter of level name.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 1) echo F;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 2) echo E;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 3) echo W;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 4) echo I;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 5) echo D;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync 6) echo T;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync *) return 1;;
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync## @brief Internal helper function for _do_dlog()
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @param lvl Numeric logging level.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @param msg Message.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @retval 0 It's always returned, even if logging failed.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @note This function is not supposed to be called manually. Please use
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# dtrace(), ddebug(), or others instead which wrap this one.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# This function calls _do_dlog() either with parameter msg, or if
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# none is given, it will read standard input and will use every line as
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# a message.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# This enables:
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# dwarn "This is a warning"
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# echo "This is a warning" | dwarn
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync [ $1 -le $LOG_LEVEL ] || return 0
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync if [ $# -ge 1 ]; then
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync while read line; do
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync## @brief Logs message at TRACE level (6)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @param msg Message.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @retval 0 It's always returned, even if logging failed.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync## @brief Logs message at DEBUG level (5)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @param msg Message.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @retval 0 It's always returned, even if logging failed.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# [ -n "$debug" ] && set -x || :
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync## @brief Logs message at INFO level (4)
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @param msg Message.
b1d7d513c459787311cd09c440524044fa7ff8a9vboxsync# @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;;