Submitted By:            Xi Ruoyao <xry111 at xry111.site>
Date:                    2024-01-21
Initial Package Version: 0.7.1
Upstream Status:         Applied
Origin:                  Upstream (PR 137)
Description:             Fixes test failures with dbusmock >= 0.30.0.

From 7ce883525754befd366034c8f0433351dd01f503 Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@debian.org>
Date: Tue, 26 Dec 2023 14:35:46 +0000
Subject: [PATCH] pyportaltest: Only create one session bus per DBusTestCase
 subclass

DBusTestCase.start_session_bus() is a class method, and can only be
called once per class, because DBusTestCase.tearDownClass() will only
clean up one session bus. In older versions of dbusmock, calling it more
than once will result in dbus-daemon processes being leaked; since
0.30.0, calling it more than once will result in an assertion failure.

Resolves: https://github.com/flatpak/libportal/issues/136
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1058245
Signed-off-by: Simon McVittie <smcv@debian.org>
---
 tests/pyportaltest/__init__.py | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/tests/pyportaltest/__init__.py b/tests/pyportaltest/__init__.py
index af053c2a..80f04a91 100644
--- a/tests/pyportaltest/__init__.py
+++ b/tests/pyportaltest/__init__.py
@@ -83,6 +83,14 @@ def setUpClass(cls):
         except AttributeError:
             pytest.skip("Updated version of dbusmock required")
 
+        cls.__have_session_bus = False
+
+    @classmethod
+    def ensure_session_bus(cls):
+        if not cls.__have_session_bus:
+            cls.__have_session_bus = True
+            cls.start_session_bus()
+
     def setUp(self):
         self.p_mock = None
         self._mainloop = None
@@ -96,7 +104,7 @@ def setup_daemon(self, params=None, extra_templates: List[Tuple[str, Dict]] = []
         portal name as first value and the param dict to be passed to that
         template as second value, e.g. ("ScreenCast", {...}).
         """
-        self.start_session_bus()
+        self.ensure_session_bus()
         self.p_mock, self.obj_portal = self.spawn_server_template(
             template=f"pyportaltest/templates/{self.PORTAL_NAME.lower()}.py",
             parameters=params,
