From e182c7b4db02ec98957ee3f60fd2a2807e172aac Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Thu, 16 May 2024 12:28:51 +0200 Subject: [PATCH] test: Enable TEST-69-SHUTDOWN for mkosi In mkosi, we run the test inside the VM instead of outside. To simplify the implementation we drop the reboot part and only verify that we can schedule and cancel shutdowns and that the wall messages are sent as expected. --- .../system/mkosi.conf.d/10-arch/mkosi.conf | 1 + .../mkosi.conf.d/10-centos-fedora/mkosi.conf | 1 + .../mkosi.conf.d/10-debian-ubuntu/mkosi.conf | 1 + .../mkosi.conf.d/10-opensuse/mkosi.conf | 1 + .../TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service | 4 +- test/TEST-69-SHUTDOWN/meson.build | 1 - test/units/TEST-69-SHUTDOWN.py | 58 +++++++++++++++++++ 7 files changed, 65 insertions(+), 2 deletions(-) create mode 100755 test/units/TEST-69-SHUTDOWN.py diff --git a/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.conf index b8a1bc08b4d..942db4cb967 100644 --- a/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.conf +++ b/mkosi.images/system/mkosi.conf.d/10-arch/mkosi.conf @@ -41,6 +41,7 @@ Packages= polkit procps-ng psmisc + python-pexpect python-psutil quota-tools sbsigntools diff --git a/mkosi.images/system/mkosi.conf.d/10-centos-fedora/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-centos-fedora/mkosi.conf index be47b1e6350..26b45e8e9c7 100644 --- a/mkosi.images/system/mkosi.conf.d/10-centos-fedora/mkosi.conf +++ b/mkosi.images/system/mkosi.conf.d/10-centos-fedora/mkosi.conf @@ -53,6 +53,7 @@ Packages= policycoreutils polkit procps-ng + python3-pexpect quota rpm rpm-build diff --git a/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf index a9cdd9e883c..7e870ace870 100644 --- a/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf +++ b/mkosi.images/system/mkosi.conf.d/10-debian-ubuntu/mkosi.conf @@ -64,6 +64,7 @@ Packages= policykit-1 procps psmisc + python3-pexpect python3-psutil quota sbsigntool diff --git a/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf b/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf index 78208db9c6b..5491c28339a 100644 --- a/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf +++ b/mkosi.images/system/mkosi.conf.d/10-opensuse/mkosi.conf @@ -60,6 +60,7 @@ Packages= procps4 psmisc python3-pefile + python3-pexpect python3-psutil quota rpm-build diff --git a/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service b/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service index 5ff28426981..1467f7152aa 100644 --- a/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service +++ b/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service @@ -5,6 +5,8 @@ Wants=basic.target multi-user.target After=basic.target Before=getty-pre.target +ConditionPathExists=/usr/bin/python3 + [Service] Type=oneshot -ExecStart=true +ExecStart=/usr/lib/systemd/tests/testdata/units/TEST-69-SHUTDOWN.py diff --git a/test/TEST-69-SHUTDOWN/meson.build b/test/TEST-69-SHUTDOWN/meson.build index ab4a38b13e1..75c0446872b 100644 --- a/test/TEST-69-SHUTDOWN/meson.build +++ b/test/TEST-69-SHUTDOWN/meson.build @@ -3,7 +3,6 @@ integration_tests += [ integration_test_template + { 'name' : fs.name(meson.current_source_dir()), - 'enabled' : false, 'unit' : files('TEST-69-SHUTDOWN.service'), }, ] diff --git a/test/units/TEST-69-SHUTDOWN.py b/test/units/TEST-69-SHUTDOWN.py new file mode 100755 index 00000000000..eb790f45da7 --- /dev/null +++ b/test/units/TEST-69-SHUTDOWN.py @@ -0,0 +1,58 @@ +#!/usr/bin/python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +# pylint: disable=broad-except + +import logging +import sys + +import pexpect + + +def main(): + logger = logging.getLogger("test-shutdown") + + consoles = [] + for _ in range(2): + # Use script to allocate a separate pseudo tty to run the login shell in. + console = pexpect.spawn( + "script", ["--quiet", "--return", "--flush", "--command", "login -f root", "/dev/null"], + logfile=sys.stdout, + env={"TERM": "dumb"}, + encoding="utf-8", + timeout=60, + ) + + logger.info("waiting for login prompt") + console.expect(".*# ", 10) + + consoles += [console] + + consoles[1].sendline("tty") + consoles[1].expect(r"/dev/(pts/\d+)") + pty = console.match.group(1) + logger.info("window 1 at tty %s", pty) + + logger.info("schedule reboot") + consoles[1].sendline("shutdown -r") + consoles[1].expect("Reboot scheduled for (?P.*), use 'shutdown -c' to cancel", 2) + date = consoles[1].match.group("date") + logger.info("reboot scheduled for %s", date) + + logger.info("verify broadcast message") + consoles[0].expect(f"Broadcast message from root@H on {pty}", 2) + consoles[0].expect(f"The system will reboot at {date}!", 2) + + logger.info("check show output") + consoles[1].sendline("shutdown --show") + consoles[1].expect(f"Reboot scheduled for {date}, use 'shutdown -c' to cancel", 2) + + logger.info("cancel shutdown") + consoles[1].sendline("shutdown -c") + consoles[0].expect("System shutdown has been cancelled", 2) + + consoles[0].sendline("> /testok") + +if __name__ == "__main__": + main() + +# vim: sw=4 et -- 2.47.3