test-functions revision a2fbff31c9c319da51528f85ae97d019f1e61a86
11e9368a226272085c337e9e74b79808c16fbdbaTinderbox User# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# ex: ts=8 sw=4 sts=4 et filetype=sh
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsLOOKS_LIKE_DEBIAN=$(source /etc/os-release && [[ "$ID" = "debian" || "$ID_LIKE" = "debian" ]] && echo yes)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif ! ROOTLIBDIR=$(pkg-config --variable=systemdutildir systemd); then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews echo "WARNING! Cannot determine rootlibdir from pkg-config, assuming /usr/lib/systemd" >&2
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsBASICTOOLS="sh bash setsid loadkeys setfont login sulogin gzip sleep echo mount umount cryptsetup date dmsetup modprobe sed cmp tee"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsDEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort hostname"
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a kvm qemu-kvm 2>/dev/null | grep '^/' -m1)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews # QEMU's own build system calls it qemu-system-x86_64
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-x86_64 2>/dev/null | grep '^/' -m1)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu-system-i386 2>/dev/null | grep '^/' -m1)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [ "$QEMU_BIN" ] || QEMU_BIN=$(which -a qemu 2>/dev/null | grep '^/' -m1)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews echo "Could not find a suitable QEMU binary" >&2
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if [ -f /etc/machine-id ]; then
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [ -z "$INITRD" ] && [ -e "/boot/$MACHINE_ID/$KERNEL_VER/initrd" ] \
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [ -z "$KERNEL_BIN" ] && [ -e "/boot/$MACHINE_ID/$KERNEL_VER/linux" ] \
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews && KERNEL_BIN="/boot/$MACHINE_ID/$KERNEL_VER/linux"
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt default_fedora_initrd=/boot/initramfs-${KERNEL_VER}.img
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt default_debian_initrd=/boot/initrd.img-${KERNEL_VER}
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [ "$KERNEL_BIN" ] || KERNEL_BIN=/boot/vmlinuz-$KERNEL_VER
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews [ "$INITRD" ] || { [ -e "$default_fedora_initrd" ] && INITRD=$default_fedora_initrd; }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [ "$INITRD" ] || { [ "$LOOKS_LIKE_DEBIAN" ] && [ -e "$default_debian_initrd" ] && INITRD=$default_debian_initrd; }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntraid=noautodetect \
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntinit=$ROOTLIBDIR/systemd \
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntconsole=ttyS0 \
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if [ -c /dev/kvm ]; then
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt QEMU_OPTIONS="$QEMU_OPTIONS -machine accel=kvm -enable-kvm -cpu host"
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt $QEMU_BIN $QEMU_OPTIONS -append "$KERNEL_APPEND" $TESTDIR/rootdisk.img ) || return 1
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt ../../systemd-nspawn --register=no --boot --directory=$TESTDIR/nspawn-root $ROOTLIBDIR/systemd $KERNEL_APPEND
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if ! type -p valgrind; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews local _valgrind_bins=$(strace -e execve valgrind /bin/true 2>&1 >/dev/null | perl -lne 'print $1 if /^execve\("([^"]+)"/')
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt local _valgrind_libs=$(LD_DEBUG=files valgrind /bin/true 2>&1 >/dev/null | perl -lne 'print $1 if m{calling init: (/.*vgpreload_.*)}')
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews strace -e open valgrind /bin/true 2>&1 >/dev/null |
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt perl -lne 'if (my ($fname) = /^open\("([^"]+).*= (?!-)\d+/) { print $fname if $fname =~ /debug|\.supp$/ }'
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt type -P dmeventd >/dev/null && dracut_install dmeventd
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt (cd $TEST_BASE_DIR/..; set -x; make DESTDIR=$initdir install)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt # we strip binaries since debug symbols increase binaries size a lot
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt # Create the blank file to use as a root filesystem
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt dd if=/dev/null of="$TESTDIR/rootdisk.img" bs=1M seek=400
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [[ -f $TESTDIR/nspawn-root/failed ]] && cp -a $TESTDIR/nspawn-root/failed $TESTDIR
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
d8620c7234281056fdfd2ee40cf16636b8281092Tinderbox User [[ -f $TESTDIR/failed ]] && cat $TESTDIR/failed
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt find "$initdir" -executable -not -path '*/lib/modules/*.ko' -type f | xargs strip --strip-unneeded | ddebug
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews ddebug "install any Execs from the service files"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews export PKG_CONFIG_PATH=$TEST_BASE_DIR/../src/core/
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews systemdsystemunitdir=$(pkg-config --variable=systemdsystemunitdir systemd)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt systemduserunitdir=$(pkg-config --variable=systemduserunitdir systemd)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/{$systemdsystemunitdir,$systemduserunitdir}/*.service \
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews | while read i; do
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews # install plymouth, if found... else remove plymouth service files
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews # PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt # /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth*
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsLABEL=systemd / ext3 rw 0 1
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt # in Debian ldconfig is just a shell script wrapper around ldconfig.real
0e1dece22e128f9dfa723316a35c4b3f06912381Tinderbox User [[ $DEBUGTOOLS ]] && dracut_install $DEBUGTOOLS
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt NSS_LIBS=$(LD_DEBUG=files getent passwd 2>&1 >/dev/null |sed -n '/calling init: .*libnss_/ {s!^.* /!/!; p}')
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews | while read file; do
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [[ "$LOOKS_LIKE_DEBIAN" ]] && type -p dpkg-architecture &>/dev/null && find "/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/security" -xtype f
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [[ -f $i ]] || continue
f7b41fd9291b8f4dba27e2b57e1d93f0913a4f1dMark Andrews /usr/lib/kbd/consolefonts/latarcyrheb-sun16*; do
f7b41fd9291b8f4dba27e2b57e1d93f0913a4f1dMark Andrews [[ -f $i ]] || continue
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
e2e4d321999340802f77adaacd19c797d04b4b95Automatic Updater [ -f ${_terminfodir}/l/linux ] && break
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt cp $TEST_BASE_DIR/testsuite.target $initdir/etc/systemd/system/
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews cp $TEST_BASE_DIR/end.service $initdir/etc/systemd/system/
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews ln -fs $TEST_BASE_DIR/testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt ln -fs $TEST_BASE_DIR/end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews ln -fs testsuite.target $initdir/etc/systemd/system/default.target
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt 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
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt LC_ALL=C ldd "$_bin" 2>/dev/null | while read _line; do
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [[ $_line = 'not a dynamic executable' ]] && break
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if [[ $_line =~ $_so_regex ]]; then
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt [[ -e ${initdir}/$_file ]] && continue
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if [[ $_line =~ not\ found ]]; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews dfatal "Missing a shared library required by $_bin."
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt dfatal "Run \"ldd $_bin\" to find out what it is."
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt if [[ -z "$TESTDIR" ]] || [[ ! -d "$TESTDIR" ]]; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews TESTDIR=$(mktemp --tmpdir=/var/tmp -d -t systemd-test.XXXXXX)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews## @brief Converts numeric logging level to the first letter of level name.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @param lvl Numeric logging level in range from 1 to 6.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# @retval 1 if @a lvl is out of range.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @retval 0 if @a lvl is correct.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @result Echoes first letter of level name.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt *) return 1;;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews## @brief Internal helper function for _do_dlog()
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @param lvl Numeric logging level.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @param msg Message.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @retval 0 It's always returned, even if logging failed.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# @note This function is not supposed to be called manually. Please use
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# dtrace(), ddebug(), or others instead which wrap this one.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# This function calls _do_dlog() either with parameter msg, or if
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# none is given, it will read standard input and will use every line as
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# This enables:
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# dwarn "This is a warning"
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# echo "This is a warning" | dwarn
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews [ $1 -le $LOG_LEVEL ] || return 0
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if [ $# -ge 1 ]; then
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews while read line; do
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt## @brief Logs message at TRACE level (6)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# @param msg Message.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews# @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;;