summaryrefslogtreecommitdiff
path: root/test/TEST-01-BASIC/test.sh
blob: efdf449a82384b6924186facaa22e57355696910 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/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="Basic systemd setup"

KVERSION=${KVERSION-$(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() {
    qemu-kvm \
        -hda $TESTDIR/rootdisk.img \
        -m 256M -nographic \
        -net none -kernel /boot/vmlinuz-$KVERSION \
        -append "root=/dev/sda1 systemd.log_level=debug raid=noautodetect loglevel=2 init=/usr/lib/systemd/systemd rw 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/var/log/journal $TESTDIR
    cp -a $TESTDIR/root/failed $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 /usr/lib/systemd/systemd
    ret=1
    [[ -e $TESTDIR/nspawn-root/testok ]] && ret=0
    cp -a $TESTDIR/nspawn-root/var/log/journal $TESTDIR
    cp -a $TESTDIR/nspawn-root/failed $TESTDIR
    cat $TESTDIR/failed
    ls -l $TESTDIR/journal/*/*.journal
    test -s $TESTDIR/failed && ret=$(($ret+1))
    return $ret
}


test_run() {
    run_qemu || return 1
    if [[ -d /sys/fs/cgroup/systemd ]]; then
        run_nspawn || return 1
    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=100
    LOOPDEV=$(losetup --show -P -f $TESTDIR/rootdisk.img)
    [ -b $LOOPDEV ] || return 1
    echo "LOOPDEV=$LOOPDEV" >> $STATEFILE
    sfdisk -C 3200 -H 2 -S 32 -L $LOOPDEV <<EOF
,
EOF

    mkfs.ext3 -L systemd ${LOOPDEV}p1
    mkdir -p $TESTDIR/root
    mount ${LOOPDEV}p1 $TESTDIR/root
    mkdir -p $TESTDIR/root/run

    kernel=$KVERSION
    # 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)

        # install possible missing libraries
        for i in $initdir/{sbin,bin}/* $initdir/lib/systemd/*; do
            inst_libs $i
        done

        # activate kmsg import
        echo 'ImportKernel=yes' >> $initdir/etc/systemd/journald.conf

        # 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

        # set the hostname
        echo  systemd-testsuite > $initdir/etc/hostname

        # 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 service
        cat >$initdir/etc/systemd/system/testsuite.service <<EOF
[Unit]
Description=Testsuite service
After=multi-user.target

[Service]
ExecStart=/bin/sh -c 'systemctl --failed --no-legend --no-pager > /failed ; echo OK > /testok'
ExecStartPost=/usr/sbin/poweroff
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

        # 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

        # 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/systemd/system/plymouth* $initdir/usr/lib/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"

    )
    rm -fr $TESTDIR/nspawn-root
    cp -avr $TESTDIR/root $TESTDIR/nspawn-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 "$@"