summaryrefslogtreecommitdiff
path: root/test/TEST-01-BASIC/test.sh
blob: ace159f59ae268b8f9d321df5f02ffd762146896 (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
#!/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"

test_run() {
    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"
    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
}

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
	dracut_install sh df free ls shutdown poweroff \
            stty cat ps ln ip route \
	    mount dmesg dhclient mkdir cp ping dhclient \
	    umount strace less grep id tty touch

        # install ld.so.conf* and run ldconfig
	cp -a /etc/ld.so.conf* $initdir/etc
	ldconfig -r "$initdir"

    )
    umount $TESTDIR/root

}

test_cleanup() {
    umount $TESTDIR/root 2>/dev/null
    [[ $LOOPDEV ]] && losetup -d $LOOPDEV
    return 0
}

. $TEST_BASE_DIR/test-functions
do_test "$@"