From 4f969b20b03095c62082c73609216a705b60df89 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Sat, 23 Nov 2024 12:59:32 +0100 Subject: test: Format integration-test-wrapper.py --- test/integration-test-wrapper.py | 140 +++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 63 deletions(-) diff --git a/test/integration-test-wrapper.py b/test/integration-test-wrapper.py index d9c035e99f..30b9d8b172 100755 --- a/test/integration-test-wrapper.py +++ b/test/integration-test-wrapper.py @@ -1,8 +1,7 @@ #!/usr/bin/python3 # SPDX-License-Identifier: LGPL-2.1-or-later -'''Test wrapper command for driving integration tests. -''' +"""Test wrapper command for driving integration tests.""" import argparse import json @@ -13,7 +12,6 @@ import sys import textwrap from pathlib import Path - EMERGENCY_EXIT_DROPIN = """\ [Unit] Wants=emergency-exit.service @@ -46,34 +44,43 @@ def main(): parser.add_argument('--slow', action=argparse.BooleanOptionalAction) parser.add_argument('--vm', action=argparse.BooleanOptionalAction) parser.add_argument('--exit-code', required=True, type=int) - parser.add_argument('mkosi_args', nargs="*") + parser.add_argument('mkosi_args', nargs='*') args = parser.parse_args() - if not bool(int(os.getenv("SYSTEMD_INTEGRATION_TESTS", "0"))): - print(f"SYSTEMD_INTEGRATION_TESTS=1 not found in environment, skipping {args.name}", file=sys.stderr) + if not bool(int(os.getenv('SYSTEMD_INTEGRATION_TESTS', '0'))): + print( + f'SYSTEMD_INTEGRATION_TESTS=1 not found in environment, skipping {args.name}', + file=sys.stderr, + ) exit(77) - if args.slow and not bool(int(os.getenv("SYSTEMD_SLOW_TESTS", "0"))): - print(f"SYSTEMD_SLOW_TESTS=1 not found in environment, skipping {args.name}", file=sys.stderr) + if args.slow and not bool(int(os.getenv('SYSTEMD_SLOW_TESTS', '0'))): + print( + f'SYSTEMD_SLOW_TESTS=1 not found in environment, skipping {args.name}', + file=sys.stderr, + ) exit(77) - if args.vm and bool(int(os.getenv("TEST_NO_QEMU", "0"))): - print(f"TEST_NO_QEMU=1, skipping {args.name}", file=sys.stderr) + if args.vm and bool(int(os.getenv('TEST_NO_QEMU', '0'))): + print(f'TEST_NO_QEMU=1, skipping {args.name}', file=sys.stderr) exit(77) - for s in os.getenv("TEST_SKIP", "").split(): + for s in os.getenv('TEST_SKIP', '').split(): if s in args.name: - print(f"Skipping {args.name} due to TEST_SKIP", file=sys.stderr) + print(f'Skipping {args.name} due to TEST_SKIP', file=sys.stderr) exit(77) - keep_journal = os.getenv("TEST_SAVE_JOURNAL", "fail") - shell = bool(int(os.getenv("TEST_SHELL", "0"))) + keep_journal = os.getenv('TEST_SAVE_JOURNAL', 'fail') + shell = bool(int(os.getenv('TEST_SHELL', '0'))) if shell and not sys.stderr.isatty(): - print("--interactive must be passed to meson test to use TEST_SHELL=1", file=sys.stderr) + print( + '--interactive must be passed to meson test to use TEST_SHELL=1', + file=sys.stderr, + ) exit(1) - name = args.name + (f"-{i}" if (i := os.getenv("MESON_TEST_ITERATION")) else "") + name = args.name + (f'-{i}' if (i := os.getenv('MESON_TEST_ITERATION')) else '') dropin = textwrap.dedent( """\ @@ -91,7 +98,7 @@ def main(): """ ) - if os.getenv("TEST_MATCH_SUBTEST"): + if os.getenv('TEST_MATCH_SUBTEST'): dropin += textwrap.dedent( f""" [Service] @@ -99,7 +106,7 @@ def main(): """ ) - if os.getenv("TEST_MATCH_TESTCASE"): + if os.getenv('TEST_MATCH_TESTCASE'): dropin += textwrap.dedent( f""" [Service] @@ -116,7 +123,7 @@ def main(): """ ) - journal_file = (args.meson_build_dir / (f"test/journal/{name}.journal")).absolute() + journal_file = (args.meson_build_dir / (f'test/journal/{name}.journal')).absolute() journal_file.unlink(missing_ok=True) elif not shell: dropin += textwrap.dedent( @@ -136,42 +143,42 @@ def main(): *(['--forward-journal', journal_file] if journal_file else []), *( [ - '--credential', - f"systemd.extra-unit.emergency-exit.service={shlex.quote(EMERGENCY_EXIT_SERVICE)}", - '--credential', - f"systemd.unit-dropin.emergency.target={shlex.quote(EMERGENCY_EXIT_DROPIN)}", + '--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() else [] ), - '--credential', - f"systemd.unit-dropin.{args.unit}={shlex.quote(dropin)}", + '--credential', f'systemd.unit-dropin.{args.unit}={shlex.quote(dropin)}', '--runtime-network=none', '--runtime-scratch=no', *args.mkosi_args, - '--qemu-firmware', args.firmware, - *(['--qemu-kvm', 'no'] if int(os.getenv("TEST_NO_KVM", "0")) else []), + '--qemu-firmware', + args.firmware, + *(['--qemu-kvm', 'no'] if int(os.getenv('TEST_NO_KVM', '0')) else []), '--kernel-command-line-extra', - ' '.join([ - 'systemd.hostname=H', - f"SYSTEMD_UNIT_PATH=/usr/lib/systemd/tests/testdata/{args.name}.units:/usr/lib/systemd/tests/testdata/units:", - *([f"systemd.unit={args.unit}"] if not shell else []), - 'systemd.mask=systemd-networkd-wait-online.service', - *( - [ - "systemd.mask=serial-getty@.service", - "systemd.show_status=error", - "systemd.crash_shell=0", - "systemd.crash_action=poweroff", - ] - if not sys.stderr.isatty() - else [] - ), - ]), + ' '.join( + [ + 'systemd.hostname=H', + f'SYSTEMD_UNIT_PATH=/usr/lib/systemd/tests/testdata/{args.name}.units:/usr/lib/systemd/tests/testdata/units:', + *([f'systemd.unit={args.unit}'] if not shell else []), + 'systemd.mask=systemd-networkd-wait-online.service', + *( + [ + 'systemd.mask=serial-getty@.service', + 'systemd.show_status=error', + 'systemd.crash_shell=0', + 'systemd.crash_action=poweroff', + ] + if not sys.stderr.isatty() + else [] + ), + ] + ), '--credential', f"journal.storage={'persistent' if sys.stderr.isatty() else args.storage}", *(['--runtime-build-sources=no'] if not sys.stderr.isatty() else []), 'qemu' if args.vm or os.getuid() != 0 else 'boot', - ] + ] # fmt: skip result = subprocess.run(cmd) @@ -180,10 +187,15 @@ def main(): journal_file.unlink(missing_ok=True) result = subprocess.run(cmd) if args.vm and result.returncode == 247 and args.exit_code != 247: - print(f"Test {args.name} failed due to QEMU crash (error 247), ignoring", file=sys.stderr) + print( + f'Test {args.name} failed due to QEMU crash (error 247), ignoring', + file=sys.stderr, + ) exit(77) - if journal_file and (keep_journal == "0" or (result.returncode in (args.exit_code, 77) and keep_journal == "fail")): + if journal_file and ( + keep_journal == '0' or (result.returncode in (args.exit_code, 77) and keep_journal == 'fail') + ): journal_file.unlink(missing_ok=True) if shell or result.returncode in (args.exit_code, 77): @@ -192,31 +204,33 @@ def main(): if journal_file: ops = [] - if os.getenv("GITHUB_ACTIONS"): - id = os.environ["GITHUB_RUN_ID"] - iteration = os.environ["GITHUB_RUN_ATTEMPT"] + if os.getenv('GITHUB_ACTIONS'): + id = os.environ['GITHUB_RUN_ID'] + iteration = os.environ['GITHUB_RUN_ATTEMPT'] j = json.loads( subprocess.run( [ args.mkosi, - "--directory", os.fspath(args.meson_source_dir), - "--json", - "summary", + '--directory', os.fspath(args.meson_source_dir), + '--json', + 'summary', ], stdout=subprocess.PIPE, text=True, ).stdout - ) - distribution = j["Images"][-1]["Distribution"] - release = j["Images"][-1]["Release"] - artifact = f"ci-mkosi-{id}-{iteration}-{distribution}-{release}-failed-test-journals" - ops += [f"gh run download {id} --name {artifact} -D ci/{artifact}"] - journal_file = Path(f"ci/{artifact}/test/journal/{name}.journal") - - ops += [f"journalctl --file {journal_file} --no-hostname -o short-monotonic -u {args.unit} -p info"] - - print("Test failed, relevant logs can be viewed with: \n\n" - f"{(' && '.join(ops))}\n", file=sys.stderr) + ) # fmt: skip + distribution = j['Images'][-1]['Distribution'] + release = j['Images'][-1]['Release'] + artifact = f'ci-mkosi-{id}-{iteration}-{distribution}-{release}-failed-test-journals' + ops += [f'gh run download {id} --name {artifact} -D ci/{artifact}'] + journal_file = Path(f'ci/{artifact}/test/journal/{name}.journal') + + ops += [f'journalctl --file {journal_file} --no-hostname -o short-monotonic -u {args.unit} -p info'] + + print( + "Test failed, relevant logs can be viewed with: \n\n" f"{(' && '.join(ops))}\n", + file=sys.stderr, + ) # 0 also means we failed so translate that to a non-zero exit code to mark the test as failed. exit(result.returncode or 1) -- cgit v1.2.3