[systemd-commits] 4 commits - src/core test/end.service test/hello-after-sleep.target test/hello.service test/sleep.service test/TEST-01-BASIC test/TEST-02-CRYPTSETUP test/TEST-03-JOBS test/testsuite.target

Michal Schmidt michich at kemper.freedesktop.org
Fri Jan 25 13:30:29 PST 2013


 src/core/job.c                  |    1 
 test/TEST-01-BASIC/test.sh      |   14 --
 test/TEST-02-CRYPTSETUP/test.sh |   14 --
 test/TEST-03-JOBS/Makefile      |    1 
 test/TEST-03-JOBS/test-jobs.sh  |   28 ++++
 test/TEST-03-JOBS/test.sh       |  250 ++++++++++++++++++++++++++++++++++++++++
 test/end.service                |    6 
 test/hello-after-sleep.target   |    5 
 test/hello.service              |    5 
 test/sleep.service              |    6 
 test/testsuite.target           |    6 
 11 files changed, 316 insertions(+), 20 deletions(-)

New commits:
commit e45460d666512db4f908f86e8722d7932dcf0f82
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Fri Jan 25 19:54:21 2013 +0100

    job: fix merging with --ignore-dependencies
    
    This fixes a bug where a job with --ignore-dependencies would wait for
    other jobs because it merged into a previously queued job.

diff --git a/src/core/job.c b/src/core/job.c
index e381ea2..6a03d17 100644
--- a/src/core/job.c
+++ b/src/core/job.c
@@ -166,6 +166,7 @@ static void job_merge_into_installed(Job *j, Job *other) {
                 assert(other->type == JOB_NOP);
 
         j->override = j->override || other->override;
+        j->ignore_order = j->ignore_order || other->ignore_order;
 }
 
 Job* job_install(Job *j) {

commit b5da077ddf01546c4a85688624d6957766d6c00c
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Fri Jan 25 20:10:00 2013 +0100

    test: add test for jobs
    
    Add a test case for job merging with --ignore-dependencies.
    
    test.sh is copied from TEST-01-*, only lightly modified (this
    should be refactored better in the future).
    test-jobs.sh is the core of this test.

diff --git a/test/TEST-03-JOBS/Makefile b/test/TEST-03-JOBS/Makefile
new file mode 120000
index 0000000..e9f93b1
--- /dev/null
+++ b/test/TEST-03-JOBS/Makefile
@@ -0,0 +1 @@
+../TEST-01-BASIC/Makefile
\ No newline at end of file
diff --git a/test/TEST-03-JOBS/test-jobs.sh b/test/TEST-03-JOBS/test-jobs.sh
new file mode 100755
index 0000000..98746c5
--- /dev/null
+++ b/test/TEST-03-JOBS/test-jobs.sh
@@ -0,0 +1,28 @@
+#!/bin/bash -x
+
+# Test merging of a --ignore-dependencies job into a previously
+# installed job.
+
+systemctl start --no-block hello-after-sleep.target
+# sleep is now running, hello/start is waiting. Verify that:
+systemctl list-jobs > /root/list-jobs.txt
+grep 'sleep\.service.*running' /root/list-jobs.txt || exit 1
+grep 'hello\.service.*waiting' /root/list-jobs.txt || exit 1
+
+# This is supposed to finish quickly, not wait for sleep to finish.
+START_SEC=$(date -u '+%s')
+systemctl start --ignore-dependencies hello
+END_SEC=$(date -u '+%s')
+ELAPSED=$(($END_SEC-$START_SEC))
+
+[ "$ELAPSED" -lt 3 ] || exit 1
+
+# sleep should still be running, hello not.
+systemctl list-jobs > /root/list-jobs.txt
+grep 'sleep\.service.*running' /root/list-jobs.txt || exit 1
+grep 'hello\.service' /root/list-jobs.txt && exit 1
+
+# TODO: add more job queueing/merging tests here.
+
+touch /testok
+exit 0
diff --git a/test/TEST-03-JOBS/test.sh b/test/TEST-03-JOBS/test.sh
new file mode 100755
index 0000000..4cfb2a5
--- /dev/null
+++ b/test/TEST-03-JOBS/test.sh
@@ -0,0 +1,250 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+TEST_DESCRIPTION="Job merging"
+
+KVERSION=${KVERSION-$(uname -r)}
+KERNEL_VER=$(uname -r)
+
+# Uncomment this to debug failures
+#DEBUGFAIL="systemd.unit=multi-user.target"
+DEBUGTOOLS="df free ls stty cat ps ln ip route dmesg dhclient mkdir cp ping dhclient strace less grep id tty touch du sort"
+
+run_qemu() {
+    # TODO: qemu wrapper script: http://www.spinics.net/lists/kvm/msg72389.html
+    qemu-kvm \
+        -hda $TESTDIR/rootdisk.img \
+        -m 512M -nographic \
+        -net none -kernel /boot/vmlinuz-$KERNEL_VER \
+        -append "root=/dev/sda1 systemd.log_level=debug raid=noautodetect loglevel=2 init=/usr/lib/systemd/systemd ro console=ttyS0,115200n81 selinux=0 $DEBUGFAIL" || return 1
+
+    ret=1
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+    [[ -e $TESTDIR/root/testok ]] && ret=0
+    cp -a $TESTDIR/root/failed $TESTDIR
+    cp -a $TESTDIR/root/var/log/journal $TESTDIR
+    umount $TESTDIR/root
+    cat $TESTDIR/failed
+    ls -l $TESTDIR/journal/*/*.journal
+    test -s $TESTDIR/failed && ret=$(($ret+1))
+    return $ret
+}
+
+
+run_nspawn() {
+    systemd-nspawn -b -D $TESTDIR/nspawn-root --capability=CAP_AUDIT_CONTROL,CAP_AUDIT_WRITE /usr/lib/systemd/systemd
+    ret=1
+    [[ -e $TESTDIR/nspawn-root/testok ]] && ret=0
+    cp -a $TESTDIR/nspawn-root/failed $TESTDIR
+    cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
+    cat $TESTDIR/failed
+    ls -l $TESTDIR/journal/*/*.journal
+    test -s $TESTDIR/failed && ret=$(($ret+1))
+    return $ret
+}
+
+
+test_run() {
+    if check_qemu ; then
+        run_qemu || return 1
+    else
+        dwarn "can't run qemu-kvm, skipping"
+    fi
+    if check_nspawn; then
+        run_nspawn || return 1
+    else
+        dwarn "can't run systemd-nspawn, skipping"
+    fi
+    return 0
+}
+
+test_setup() {
+    rm -f $TESTDIR/rootdisk.img
+    # Create the blank file to use as a root filesystem
+    dd if=/dev/null of=$TESTDIR/rootdisk.img bs=1M seek=200
+    LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
+    [ -b $LOOPDEV ] || return 1
+    echo "LOOPDEV=$LOOPDEV" >> $STATEFILE
+    sfdisk -C 6400 -H 2 -S 32 -L $LOOPDEV <<EOF
+,3200
+,
+EOF
+
+    mkfs.ext3 -L systemd ${LOOPDEV}p1
+    echo -n test >$TESTDIR/keyfile
+    mkdir -p $TESTDIR/root
+    mount ${LOOPDEV}p1 $TESTDIR/root
+    mkdir -p $TESTDIR/root/run
+
+    # Create what will eventually be our root filesystem onto an overlay
+    (
+        LOG_LEVEL=5
+        initdir=$TESTDIR/root
+
+        # create the basic filesystem layout
+        setup_basic_dirs
+
+        # install compiled files
+        (cd ../..; make DESTDIR=$initdir install)
+
+        # remove unneeded documentation
+        rm -fr $initdir/usr/share/{man,doc,gtk-doc}
+
+        # install possible missing libraries
+        for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
+            inst_libs $i
+        done
+
+        # make a journal directory
+        mkdir -p $initdir/var/log/journal
+
+        # install some basic config files
+        inst /etc/sysconfig/init
+        inst /etc/passwd
+        inst /etc/shadow
+        inst /etc/group
+        inst /etc/shells
+        inst /etc/nsswitch.conf
+        inst /etc/pam.conf
+        inst /etc/securetty
+        inst /etc/os-release
+        inst /etc/localtime
+        # we want an empty environment
+        > $initdir/etc/environment
+        > $initdir/etc/machine-id
+
+        # set the hostname
+        echo  systemd-testsuite > $initdir/etc/hostname
+
+        eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)
+
+        cat >$initdir/etc/fstab <<EOF
+LABEL=systemd           /       ext3    rw 0 1
+EOF
+
+        # setup the testsuite target and the test ending service
+        cp $TEST_BASE_DIR/{testsuite.target,end.service} $initdir/etc/systemd/system/
+
+        # setup the testsuite service
+        cat >$initdir/etc/systemd/system/testsuite.service <<EOF
+[Unit]
+Description=Testsuite service
+After=multi-user.target
+
+[Service]
+ExecStart=/test-jobs.sh
+Type=oneshot
+EOF
+
+        # copy the units used by this test
+        cp $TEST_BASE_DIR/{hello.service,sleep.service,hello-after-sleep.target} $initdir/etc/systemd/system
+        cp test-jobs.sh $initdir/
+
+        mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
+        ln -fs ../testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
+        ln -fs ../end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
+
+        # make the testsuite the default target
+        ln -fs testsuite.target $initdir/etc/systemd/system/default.target
+        mkdir -p $initdir/etc/rc.d
+        cat >$initdir/etc/rc.d/rc.local <<EOF
+#!/bin/bash
+exit 0
+EOF
+        chmod 0755 $initdir/etc/rc.d/rc.local
+        # install basic tools needed
+        dracut_install sh bash setsid loadkeys setfont \
+            login sushell sulogin gzip sleep echo mount umount cryptsetup date
+        dracut_install dmsetup modprobe
+
+        # install libnss_files for login
+        inst_libdir_file "libnss_files*"
+
+        # install dbus and pam
+        find \
+            /etc/dbus-1 \
+            /etc/pam.d \
+            /etc/security \
+            /lib64/security \
+            /lib/security -xtype f \
+            | while read file; do
+            inst $file
+        done
+
+        # install dbus socket and service file
+        inst /usr/lib/systemd/system/dbus.socket
+        inst /usr/lib/systemd/system/dbus.service
+
+        # install basic keyboard maps and fonts
+        for i in \
+            /usr/lib/kbd/consolefonts/latarcyrheb-sun16* \
+            /usr/lib/kbd/keymaps/include/* \
+            /usr/lib/kbd/keymaps/i386/include/* \
+            /usr/lib/kbd/keymaps/i386/qwerty/us.*; do
+                [[ -f $i ]] || continue
+                inst $i
+        done
+
+        # some basic terminfo files
+        for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do
+            [ -f ${_terminfodir}/l/linux ] && break
+        done
+        dracut_install -o ${_terminfodir}/l/linux
+
+        # softlink mtab
+        ln -fs /proc/self/mounts $initdir/etc/mtab
+
+        # install any Exec's from the service files
+        egrep -ho '^Exec[^ ]*=[^ ]+' $initdir/lib/systemd/system/*.service \
+            | while read i; do
+            i=${i##Exec*=}; i=${i##-}
+            inst $i
+        done
+
+        # install plymouth, if found... else remove plymouth service files
+        # if [ -x /usr/libexec/plymouth/plymouth-populate-initrd ]; then
+        #     PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$TEST_BASE_DIR/test-functions" \
+        #         /usr/libexec/plymouth/plymouth-populate-initrd -t $initdir
+        #         dracut_install plymouth plymouthd
+        # else
+        rm -f $initdir/{usr/lib,etc}/systemd/system/plymouth* $initdir/{usr/lib,etc}/systemd/system/*/plymouth*
+        # fi
+
+        # some helper tools for debugging
+        [[ $DEBUGTOOLS ]] && dracut_install $DEBUGTOOLS
+
+        # install ld.so.conf* and run ldconfig
+        cp -a /etc/ld.so.conf* $initdir/etc
+        ldconfig -r "$initdir"
+        ddebug "Strip binaeries"
+        find "$initdir" -perm +111 -type f | xargs strip --strip-unneeded | ddebug
+
+        # copy depmod files
+        inst /lib/modules/$KERNEL_VER/modules.order
+        inst /lib/modules/$KERNEL_VER/modules.builtin
+        # generate module dependencies
+        if [[ -d $initdir/lib/modules/$KERNEL_VER ]] && \
+            ! depmod -a -b "$initdir" $KERNEL_VER; then
+                dfatal "\"depmod -a $KERNEL_VER\" failed."
+                exit 1
+        fi
+    )
+    rm -fr $TESTDIR/nspawn-root
+    ddebug "cp -ar $TESTDIR/root $TESTDIR/nspawn-root"
+    cp -ar $TESTDIR/root $TESTDIR/nspawn-root
+    # we don't mount in the nspawn root
+    rm -fr $TESTDIR/nspawn-root/etc/fstab
+
+    ddebug "umount $TESTDIR/root"
+    umount $TESTDIR/root
+}
+
+test_cleanup() {
+    umount $TESTDIR/root 2>/dev/null
+    [[ $LOOPDEV ]] && losetup -d $LOOPDEV
+    return 0
+}
+
+. $TEST_BASE_DIR/test-functions
+do_test "$@"
diff --git a/test/hello-after-sleep.target b/test/hello-after-sleep.target
new file mode 100644
index 0000000..526fbd2
--- /dev/null
+++ b/test/hello-after-sleep.target
@@ -0,0 +1,5 @@
+[Unit]
+Description=Sleep for a minute, then say hello.
+Wants=sleep.service hello.service
+After=sleep.service
+Before=hello.service
diff --git a/test/hello.service b/test/hello.service
new file mode 100644
index 0000000..82907b6
--- /dev/null
+++ b/test/hello.service
@@ -0,0 +1,5 @@
+[Unit]
+Description=Hello World
+
+[Service]
+ExecStart=/bin/echo "Hello World"
diff --git a/test/sleep.service b/test/sleep.service
new file mode 100644
index 0000000..946c44b
--- /dev/null
+++ b/test/sleep.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Sleep for 1 minute
+
+[Service]
+Type=oneshot
+ExecStart=/bin/sleep 60

commit c90feab4ff8bc23d88d4f9c67d9652ba189cb51b
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Fri Jan 25 22:19:19 2013 +0100

    test: factor out testsuite.target, end.service
    
    Tests can use the same testsuite.target.
    Add end.service to call poweroff instead of doing it from ExecStopPost
    where it may be skipped on failure of ExecStart.

diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh
index 9ab0a6f..7d2e3d4 100755
--- a/test/TEST-01-BASIC/test.sh
+++ b/test/TEST-01-BASIC/test.sh
@@ -123,15 +123,8 @@ EOF
 LABEL=systemd           /       ext3    rw 0 1
 EOF
 
-        # setup the testsuite target
-        cat >$initdir/etc/systemd/system/testsuite.target <<EOF
-[Unit]
-Description=Testsuite target
-Requires=multi-user.target
-After=multi-user.target
-Conflicts=rescue.target
-AllowIsolate=yes
-EOF
+        # setup the testsuite target and the test ending service
+        cp $TEST_BASE_DIR/{testsuite.target,end.service} $initdir/etc/systemd/system/
 
         # setup the testsuite service
         cat >$initdir/etc/systemd/system/testsuite.service <<EOF
@@ -141,11 +134,12 @@ After=multi-user.target
 
 [Service]
 ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;'
-ExecStopPost=/usr/bin/systemctl poweroff --no-block
 Type=oneshot
 EOF
+
         mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
         ln -fs ../testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
+        ln -fs ../end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
 
         # make the testsuite the default target
         ln -fs testsuite.target $initdir/etc/systemd/system/default.target
diff --git a/test/TEST-02-CRYPTSETUP/test.sh b/test/TEST-02-CRYPTSETUP/test.sh
index a0e4d65..e094531 100755
--- a/test/TEST-02-CRYPTSETUP/test.sh
+++ b/test/TEST-02-CRYPTSETUP/test.sh
@@ -122,15 +122,8 @@ LABEL=systemd           /       ext3    rw 0 1
 /dev/mapper/varcrypt    /var    ext3    defaults 0 1
 EOF
 
-        # setup the testsuite target
-        cat >$initdir/etc/systemd/system/testsuite.target <<EOF
-[Unit]
-Description=Testsuite target
-Requires=multi-user.target
-After=multi-user.target
-Conflicts=rescue.target
-AllowIsolate=yes
-EOF
+        # setup the testsuite target and the test ending service
+        cp $TEST_BASE_DIR/{testsuite.target,end.service} $initdir/etc/systemd/system/
 
         # setup the testsuite service
         cat >$initdir/etc/systemd/system/testsuite.service <<EOF
@@ -140,11 +133,12 @@ After=multi-user.target
 
 [Service]
 ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do systemd-cat echo "testsuite service waiting for /var/log/journal" ; echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;'
-ExecStopPost=/usr/bin/systemctl poweroff --no-block
 Type=oneshot
 EOF
+
         mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
         ln -fs ../testsuite.service $initdir/etc/systemd/system/testsuite.target.wants/testsuite.service
+        ln -fs ../end.service $initdir/etc/systemd/system/testsuite.target.wants/end.service
 
         # make the testsuite the default target
         ln -fs testsuite.target $initdir/etc/systemd/system/default.target
diff --git a/test/end.service b/test/end.service
new file mode 100644
index 0000000..0f04dfe
--- /dev/null
+++ b/test/end.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=End the test
+After=testsuite.service
+
+[Service]
+ExecStart=/usr/bin/systemctl poweroff --no-block
diff --git a/test/testsuite.target b/test/testsuite.target
new file mode 100644
index 0000000..1a7e5b3
--- /dev/null
+++ b/test/testsuite.target
@@ -0,0 +1,6 @@
+[Unit]
+Description=Testsuite target
+Requires=multi-user.target
+After=multi-user.target
+Conflicts=rescue.target
+AllowIsolate=yes

commit e8a66f4af296dc1dd4879a1401eb42bf7b7aeb01
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Fri Jan 25 19:49:19 2013 +0100

    test: use non-blocking systemctl calls in testsuite.service
    
    "systemctl poweroff" called from testsuite.service will cause this unit
    itself to stop. To avoid deadlock, the call must not be synchronous.

diff --git a/test/TEST-01-BASIC/test.sh b/test/TEST-01-BASIC/test.sh
index eb6a80a..9ab0a6f 100755
--- a/test/TEST-01-BASIC/test.sh
+++ b/test/TEST-01-BASIC/test.sh
@@ -141,7 +141,7 @@ After=multi-user.target
 
 [Service]
 ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;'
-ExecStopPost=/usr/bin/systemctl poweroff
+ExecStopPost=/usr/bin/systemctl poweroff --no-block
 Type=oneshot
 EOF
         mkdir -p $initdir/etc/systemd/system/testsuite.target.wants
diff --git a/test/TEST-02-CRYPTSETUP/test.sh b/test/TEST-02-CRYPTSETUP/test.sh
index 790dc30..a0e4d65 100755
--- a/test/TEST-02-CRYPTSETUP/test.sh
+++ b/test/TEST-02-CRYPTSETUP/test.sh
@@ -140,7 +140,7 @@ After=multi-user.target
 
 [Service]
 ExecStart=/bin/bash -c 'set -x; systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok; while : ;do systemd-cat echo "testsuite service waiting for /var/log/journal" ; echo "testsuite service waiting for journal to move to /var/log/journal" > /dev/console ; for i in /var/log/journal/*;do [ -d "\$i" ] && echo "\$i" && break 2; done; sleep 1; done; sleep 1; exit 0;'
-ExecStopPost=/usr/bin/systemctl poweroff
+ExecStopPost=/usr/bin/systemctl poweroff --no-block
 Type=oneshot
 EOF
         mkdir -p $initdir/etc/systemd/system/testsuite.target.wants



More information about the systemd-commits mailing list