aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLudwig Nussel <ludwig.nussel@suse.de>2021-12-22 11:50:08 +0100
committerLudwig Nussel <ludwig.nussel@suse.de>2022-01-25 17:43:13 +0100
commit48f3bc5cc4dd52155a06753da5ef2cd9d48f7b07 (patch)
treec34137640141fdad67c5eda3c8ea0552087197ec
parentsystemctl: shutdown don't fallback on auth fail (diff)
downloadsystemd-48f3bc5cc4dd52155a06753da5ef2cd9d48f7b07.tar.xz
systemd-48f3bc5cc4dd52155a06753da5ef2cd9d48f7b07.zip
test: add shutdown test
Wraps nspawn to be able to use pexpect. The test logs in on the console and runs screen. In one screen window it types in shutdown commands and checks whether a wall message was sent to the other.
l---------test/TEST-69-SHUTDOWN/Makefile1
-rwxr-xr-xtest/TEST-69-SHUTDOWN/test.sh33
-rw-r--r--test/test-functions4
-rwxr-xr-xtest/test-shutdown.py114
-rw-r--r--test/units/testsuite-69.service7
5 files changed, 159 insertions, 0 deletions
diff --git a/test/TEST-69-SHUTDOWN/Makefile b/test/TEST-69-SHUTDOWN/Makefile
new file mode 120000
index 00000000000..e9f93b1104c
--- /dev/null
+++ b/test/TEST-69-SHUTDOWN/Makefile
@@ -0,0 +1 @@
+../TEST-01-BASIC/Makefile \ No newline at end of file
diff --git a/test/TEST-69-SHUTDOWN/test.sh b/test/TEST-69-SHUTDOWN/test.sh
new file mode 100755
index 00000000000..42a600ec18d
--- /dev/null
+++ b/test/TEST-69-SHUTDOWN/test.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -e
+
+TEST_DESCRIPTION="shutdown testing"
+IMAGE_NAME="shutdown"
+TEST_NO_QEMU=1
+
+# shellcheck source=test/test-functions
+. "${TEST_BASE_DIR:?}/test-functions"
+
+_ORIG_NSPAWN="$SYSTEMD_NSPAWN"
+SYSTEMD_NSPAWN="$STATEDIR/run-nspawn"
+
+setup_nspawn_root_hook() {
+ cat > "$STATEDIR"/run-nspawn <<-EOF
+ #!/bin/bash
+ exec "$TEST_BASE_DIR"/test-shutdown.py -- "$_ORIG_NSPAWN" "\$@"
+ exit 1
+ EOF
+ chmod 755 "$STATEDIR"/run-nspawn
+}
+
+test_append_files() {
+ # prevent shutdown in test suite, the expect script does that manually.
+ rm "$1"/usr/lib/systemd/tests/testdata/units/end.service
+ inst /usr/bin/screen
+ echo "PS1='screen\$WINDOW # '" > "$1"/etc/bash.bashrc
+ echo 'startup_message off' > "$1"/etc/screenrc
+ echo 'bell_msg ""' >> "$1"/etc/screenrc
+}
+
+do_test "$@"
diff --git a/test/test-functions b/test/test-functions
index ba18a0ea2d5..2258b8b1fe7 100644
--- a/test/test-functions
+++ b/test/test-functions
@@ -1884,6 +1884,8 @@ has_user_dbus_socket() {
fi
}
+setup_nspawn_root_hook() { :;}
+
setup_nspawn_root() {
if [ -z "${initdir}" ]; then
dfatal "\$initdir not defined"
@@ -1896,6 +1898,8 @@ setup_nspawn_root() {
ddebug "cp -ar $initdir $TESTDIR/unprivileged-nspawn-root"
cp -ar "$initdir" "$TESTDIR/unprivileged-nspawn-root"
fi
+
+ setup_nspawn_root_hook
}
setup_basic_dirs() {
diff --git a/test/test-shutdown.py b/test/test-shutdown.py
new file mode 100755
index 00000000000..d34e2249422
--- /dev/null
+++ b/test/test-shutdown.py
@@ -0,0 +1,114 @@
+#!/usr/bin/python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+
+import argparse
+import logging
+import pexpect
+import sys
+
+
+def run(args):
+
+ ret = 1
+ logger = logging.getLogger("test-shutdown")
+
+ logger.info("spawning test")
+ console = pexpect.spawn(args.command, args.arg, env={
+ "TERM": "linux",
+ }, encoding='utf-8', timeout=30)
+
+ if args.verbose:
+ console.logfile = sys.stdout
+
+ logger.debug("child pid %d" % console.pid)
+
+ try:
+ logger.info("waiting for login prompt")
+ console.expect('H login: ', 10)
+
+ logger.info("log in and start screen")
+ console.sendline('root')
+ console.expect('bash.*# ', 10)
+ console.sendline('screen')
+ console.expect('screen0 ', 10)
+ console.sendcontrol('a')
+ console.send('c')
+ console.expect('screen1 ', 10)
+
+# console.interact()
+
+ console.sendline('tty')
+ console.expect(r'/dev/(pts/\d+)')
+ pty = console.match.group(1)
+ logger.info("window 1 at line %s", pty)
+
+ logger.info("schedule reboot")
+ console.sendline('shutdown -r')
+ console.expect("Reboot scheduled for (?P<date>.*), use 'shutdown -c' to cancel", 2)
+ date = console.match.group('date')
+ logger.info("reboot scheduled for %s", date)
+
+ console.sendcontrol('a')
+ console.send('0')
+ logger.info("verify broadcast message")
+ console.expect('Broadcast message from root@H on %s' % pty, 2)
+ console.expect('The system is going down for reboot at %s' % date, 2)
+
+ logger.info("check show output")
+ console.sendline('shutdown --show')
+ console.expect("Reboot scheduled for %s, use 'shutdown -c' to cancel" % date, 2)
+
+ logger.info("cancel shutdown")
+ console.sendline('shutdown -c')
+ console.sendcontrol('a')
+ console.send('1')
+ console.expect('The system shutdown has been cancelled', 2)
+
+ logger.info("call for reboot")
+ console.sendline('sleep 10; shutdown -r now')
+ console.sendcontrol('a')
+ console.send('0')
+ console.expect("The system is going down for reboot NOW!", 12)
+
+ logger.info("waiting for reboot")
+
+ console.expect('H login: ', 10)
+ console.sendline('root')
+ console.expect('bash.*# ', 10)
+
+ console.sendline('> /testok')
+
+ logger.info("power off")
+ console.sendline('poweroff')
+
+ logger.info("expect termination now")
+ console.expect(pexpect.EOF)
+
+ ret = 0
+ except Exception as e:
+ logger.error(e)
+ logger.info("killing child pid %d" % console.pid)
+ console.terminate()
+
+ return ret
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='test logind shutdown feature')
+ parser.add_argument("-v", "--verbose", action="store_true", help="verbose")
+ parser.add_argument("command", help="command to run")
+ parser.add_argument("arg", nargs='*', help="args for command")
+
+ args = parser.parse_args()
+
+ if args.verbose:
+ level = logging.DEBUG
+ else:
+ level = logging.INFO
+
+ logging.basicConfig(level=level)
+
+ sys.exit(run(args))
+
+# vim: sw=4 et
diff --git a/test/units/testsuite-69.service b/test/units/testsuite-69.service
new file mode 100644
index 00000000000..3b2b81edc8d
--- /dev/null
+++ b/test/units/testsuite-69.service
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+[Unit]
+Description=TEST-69-SHUTDOWN
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh