https://github.com/polkit-org/polkit/commit/690e6972ffe30473dacbfaa81158f5507cef99f6 https://github.com/polkit-org/polkit/commit/247952425829e41a47e83b2e433b9703713739f5 From 690e6972ffe30473dacbfaa81158f5507cef99f6 Mon Sep 17 00:00:00 2001 From: Jan Rybar Date: Wed, 1 Oct 2025 13:23:45 +0200 Subject: [PATCH] DBusMock: CI broken after stop_dbus() removal Because stop_dbus() was removed from DBusMock implementation, nothing actually stops the system bus in testing environment in the wrapper.py child process, hence the test times out into failure. Adding simple kill() in atexit() is sufficient, but the original implementation in DBusMock seemed more graceful, so it was pulled back in. --- test/wrapper.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/test/wrapper.py b/test/wrapper.py index 14f4abdb..dc62f702 100755 --- a/test/wrapper.py +++ b/test/wrapper.py @@ -5,6 +5,8 @@ import os import subprocess import sys +import signal +import time import dbus import dbus.mainloop.glib @@ -36,6 +38,36 @@ def setup_test_namespace(data_dir): print("Python 3.12 is required for os.unshare(), skipping") sys.exit(77) + +def stop_dbus(pid: int) -> None: + """Stop a D-Bus daemon + + If DBus daemon is not explicitly killed in the testing environment + the test times out and reports as failed. + This is a backport of a function dropped from DBusMock source (99c4800e9eed). + """ + signal.signal(signal.SIGTERM, signal.SIG_IGN) + for _ in range(50): + try: + os.kill(pid, signal.SIGTERM) + os.waitpid(pid, os.WNOHANG) + except ChildProcessError: + break + except OSError as e: + if e.errno == errno.ESRCH: + break + raise + time.sleep(0.1) + else: + sys.stderr.write("ERROR: timed out waiting for bus process to terminate\n") + os.kill(pid, signal.SIGKILL) + try: + os.waitpid(pid, 0) + except ChildProcessError: + pass + signal.signal(signal.SIGTERM, signal.SIG_DFL) + + if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("test_executable", @@ -51,7 +83,7 @@ def setup_test_namespace(data_dir): if args.mock_dbus: dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) dbusmock.DBusTestCase.start_system_bus() - atexit.register(dbusmock.DBusTestCase.stop_dbus, dbusmock.DBusTestCase.system_bus_pid) + atexit.register(stop_dbus, dbusmock.DBusTestCase.system_bus_pid) print(f"Executing '{args.test_executable}'") sys.stdout.flush() From 247952425829e41a47e83b2e433b9703713739f5 Mon Sep 17 00:00:00 2001 From: Jan Rybar Date: Sun, 5 Oct 2025 16:40:30 +0200 Subject: [PATCH] Missed 'errno' import in wrapper --- test/wrapper.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/wrapper.py b/test/wrapper.py index dc62f70..9547720 100755 --- a/test/wrapper.py +++ b/test/wrapper.py @@ -7,6 +7,7 @@ import sys import signal import time +import errno import dbus import dbus.mainloop.glib