From c9a50ebd8f2142808fca45dc2acff8ddc391cf7e Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 3 Mar 2025 11:44:42 +0100 Subject: [PATCH 1/4] test: Check stdin for interactivity, not stderr --- test/integration-test-wrapper.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/integration-test-wrapper.py b/test/integration-test-wrapper.py index a87b49bd8b..901695b970 100755 --- a/test/integration-test-wrapper.py +++ b/test/integration-test-wrapper.py @@ -395,7 +395,7 @@ def main() -> None: shell = bool(int(os.getenv('TEST_SHELL', '0'))) summary = Summary.get(args) - if shell and not sys.stderr.isatty(): + if shell and not sys.stdin.isatty(): print( '--interactive must be passed to meson test to use TEST_SHELL=1', file=sys.stderr, @@ -443,7 +443,7 @@ def main() -> None: journal_file.unlink(missing_ok=True) - if not sys.stderr.isatty(): + if not sys.stdin.isatty(): dropin += textwrap.dedent( """ [Unit] @@ -458,7 +458,7 @@ def main() -> None: """ ) - if sys.stderr.isatty(): + if sys.stdin.isatty(): dropin += textwrap.dedent( """ [Service] @@ -489,7 +489,7 @@ def main() -> None: '--credential', f'systemd.extra-unit.emergency-exit.service={shlex.quote(EMERGENCY_EXIT_SERVICE)}', # noqa: E501 '--credential', f'systemd.unit-dropin.emergency.target={shlex.quote(EMERGENCY_EXIT_DROPIN)}', ] - if not sys.stderr.isatty() + if not sys.stdin.isatty() else [] ), '--credential', f'systemd.unit-dropin.{args.unit}={shlex.quote(dropin)}', @@ -514,13 +514,13 @@ def main() -> None: 'systemd.crash_action=poweroff', 'loglevel=6', ] - if not sys.stderr.isatty() + if not sys.stdin.isatty() else [] ), ] ), - '--credential', f"journal.storage={'persistent' if sys.stderr.isatty() else args.storage}", - *(['--runtime-build-sources=no', '--register=no'] if not sys.stderr.isatty() else []), + '--credential', f"journal.storage={'persistent' if sys.stdin.isatty() else args.storage}", + *(['--runtime-build-sources=no', '--register=no'] if not sys.stdin.isatty() else []), 'vm' if args.vm or os.getuid() != 0 or os.getenv('TEST_PREFER_QEMU', '0') == '1' else 'boot', ] # fmt: skip From 854a8c21d00e070bffd0c754812b29c5a4acd324 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 3 Mar 2025 11:51:13 +0100 Subject: [PATCH 2/4] test: Move getty-pre.target logic into integration-test-wrapper.py Also pull in getty-pre.target via Wants= so it actually gets pulled into the transaction. --- test/TEST-07-PID1/TEST-07-PID1.service | 1 - test/TEST-16-EXTEND-TIMEOUT/TEST-16-EXTEND-TIMEOUT.service | 1 - test/TEST-44-LOG-NAMESPACE/TEST-44-LOG-NAMESPACE.service | 1 - test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service | 1 - test/TEST-82-SOFTREBOOT/TEST-82-SOFTREBOOT.service | 1 - test/integration-test-wrapper.py | 3 ++- test/test.service.in | 1 - 7 files changed, 2 insertions(+), 7 deletions(-) diff --git a/test/TEST-07-PID1/TEST-07-PID1.service b/test/TEST-07-PID1/TEST-07-PID1.service index 53dd54cc45..f2c8697e5b 100644 --- a/test/TEST-07-PID1/TEST-07-PID1.service +++ b/test/TEST-07-PID1/TEST-07-PID1.service @@ -3,7 +3,6 @@ Description=TEST-07-PID1 Wants=basic.target multi-user.target After=basic.target -Before=getty-pre.target [Service] Type=oneshot diff --git a/test/TEST-16-EXTEND-TIMEOUT/TEST-16-EXTEND-TIMEOUT.service b/test/TEST-16-EXTEND-TIMEOUT/TEST-16-EXTEND-TIMEOUT.service index 3be8ef5059..3189a2484a 100644 --- a/test/TEST-16-EXTEND-TIMEOUT/TEST-16-EXTEND-TIMEOUT.service +++ b/test/TEST-16-EXTEND-TIMEOUT/TEST-16-EXTEND-TIMEOUT.service @@ -5,7 +5,6 @@ Description=TEST-16-EXTEND-TIMEOUT Wants=basic.target multi-user.target After=basic.target -Before=getty-pre.target Wants=success-all.service Wants=success-start.service diff --git a/test/TEST-44-LOG-NAMESPACE/TEST-44-LOG-NAMESPACE.service b/test/TEST-44-LOG-NAMESPACE/TEST-44-LOG-NAMESPACE.service index 1b1dd98418..bed66fa003 100644 --- a/test/TEST-44-LOG-NAMESPACE/TEST-44-LOG-NAMESPACE.service +++ b/test/TEST-44-LOG-NAMESPACE/TEST-44-LOG-NAMESPACE.service @@ -3,7 +3,6 @@ Description=TEST-44-LOG-NAMESPACE Wants=basic.target multi-user.target systemd-journald@foobar.socket systemd-journald-varlink@foobar.socket After=basic.target systemd-journald@foobar.socket systemd-journald-varlink@foobar.socket -Before=getty-pre.target [Service] ExecStartPre=rm -f /failed /testok diff --git a/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service b/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service index 1467f7152a..7b47b61893 100644 --- a/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service +++ b/test/TEST-69-SHUTDOWN/TEST-69-SHUTDOWN.service @@ -3,7 +3,6 @@ Description=TEST-69-SHUTDOWN Wants=basic.target multi-user.target After=basic.target -Before=getty-pre.target ConditionPathExists=/usr/bin/python3 diff --git a/test/TEST-82-SOFTREBOOT/TEST-82-SOFTREBOOT.service b/test/TEST-82-SOFTREBOOT/TEST-82-SOFTREBOOT.service index f3892a7777..d9c4529412 100644 --- a/test/TEST-82-SOFTREBOOT/TEST-82-SOFTREBOOT.service +++ b/test/TEST-82-SOFTREBOOT/TEST-82-SOFTREBOOT.service @@ -4,7 +4,6 @@ Description=TEST-82-SOFTREBOOT DefaultDependencies=no Wants=basic.target multi-user.target After=basic.target -Before=getty-pre.target [Service] Type=oneshot diff --git a/test/integration-test-wrapper.py b/test/integration-test-wrapper.py index 901695b970..e9c5a295bc 100755 --- a/test/integration-test-wrapper.py +++ b/test/integration-test-wrapper.py @@ -454,7 +454,8 @@ def main() -> None: dropin += textwrap.dedent( """ [Unit] - Wants=multi-user.target + Wants=multi-user.target getty-pre.target + Before=getty-pre.target """ ) diff --git a/test/test.service.in b/test/test.service.in index 790c513da4..77ddb8541b 100644 --- a/test/test.service.in +++ b/test/test.service.in @@ -3,7 +3,6 @@ Description=%N Wants=basic.target network.target @wants@ After=basic.target network.target @after@ -Before=getty-pre.target [Service] ExecStartPre=rm -f /failed /testok From 070de658a9f2bf48d26035ddbe861f79dfff2be4 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 3 Mar 2025 12:33:56 +0100 Subject: [PATCH 3/4] test: Disable status messages when we start running a test As soon as we start running a test, we want pid 1 to stop showing status messages so let's tell pid 1 to stop showing status messages. --- test/integration-test-setup.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/integration-test-setup.sh b/test/integration-test-setup.sh index c67f938acf..e09e0dddef 100755 --- a/test/integration-test-setup.sh +++ b/test/integration-test-setup.sh @@ -5,6 +5,8 @@ set -o pipefail case "$1" in setup) + busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager SetShowStatus s no + if [[ -f "$STATE_DIRECTORY/inprogress" ]]; then exit 0 fi @@ -46,6 +48,8 @@ case "$1" in touch "$STATE_DIRECTORY/inprogress" ;; finalize) + busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager SetShowStatus s auto + # If we're rebooting, the test does a reboot as part of its execution and we shouldn't remove /inprogress. if ! [[ "$(systemctl list-jobs)" =~ reboot.target|kexec.target|soft-reboot.target ]]; then rm -f "$STATE_DIRECTORY/inprogress" From fe7413d1955bbf0f8fe869543c423025a22a4671 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 3 Mar 2025 12:35:11 +0100 Subject: [PATCH 4/4] test: Connect test unit to console when running interactively When running interactively, let's connect the test unit directly to the console. This enables adding "bash" anywhere within an integration test to get a shell within the test environment. --- test/integration-test-wrapper.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/integration-test-wrapper.py b/test/integration-test-wrapper.py index e9c5a295bc..55eca9f75a 100755 --- a/test/integration-test-wrapper.py +++ b/test/integration-test-wrapper.py @@ -456,6 +456,16 @@ def main() -> None: [Unit] Wants=multi-user.target getty-pre.target Before=getty-pre.target + + [Service] + StandardInput=tty + StandardOutput=inherit + StandardError=inherit + TTYReset=yes + TTYVHangup=yes + IgnoreSIGPIPE=no + # bash ignores SIGTERM + KillSignal=SIGHUP """ )