diff --git a/tests/templates/access.py b/tests/templates/access.py index 7e6cd952e..fba270edf 100644 --- a/tests/templates/access.py +++ b/tests/templates/access.py @@ -5,6 +5,7 @@ from tests.templates import Response, init_logger, ImplRequest import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -16,12 +17,22 @@ logger = init_logger(__name__) +@dataclass +class AccessParameters: + delay: int + response: int + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "access_params") + mock.access_params = AccessParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + ) @dbus.service.method( @@ -45,6 +56,7 @@ def AccessDialog( logger.debug( f"AccessDialog({handle}, {app_id}, {parent_window}, {title}, {subtitle}, {body}, {options})" ) + params = self.access_params request = ImplRequest( self, @@ -55,7 +67,7 @@ def AccessDialog( cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, {}), delay=self.delay) + request.respond(Response(params.response, {}), delay=params.delay) diff --git a/tests/templates/account.py b/tests/templates/account.py index d4f87e899..b2642af3e 100644 --- a/tests/templates/account.py +++ b/tests/templates/account.py @@ -3,24 +3,39 @@ # This file is formatted with Python Black from tests.templates import Response, init_logger, ImplRequest + import dbus.service import dbus +from dataclasses import dataclass + BUS_NAME = "org.freedesktop.impl.portal.Test" MAIN_OBJ = "/org/freedesktop/portal/desktop" SYSTEM_BUS = False MAIN_IFACE = "org.freedesktop.impl.portal.Account" + logger = init_logger(__name__) +@dataclass +class AccountParameters: + delay: int + response: int + results: dict + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.results: bool = parameters.get("results", {}) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "account_params") + mock.account_params = AccountParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + results=parameters.get("results", {}), + expect_close=parameters.get("expect-close", False), + ) @dbus.service.method( @@ -31,6 +46,7 @@ def load(mock, parameters={}): ) def GetUserInformation(self, handle, app_id, window, options, cb_success, cb_error): logger.debug(f"GetUserInformation({handle}, {app_id}, {window}, {options})") + params = self.account_params request = ImplRequest( self, @@ -41,7 +57,7 @@ def GetUserInformation(self, handle, app_id, window, options, cb_success, cb_err cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.results), delay=self.delay) + request.respond(Response(params.response, params.results), delay=params.delay) diff --git a/tests/templates/appchooser.py b/tests/templates/appchooser.py index 3ea88b1a8..4be4f6943 100644 --- a/tests/templates/appchooser.py +++ b/tests/templates/appchooser.py @@ -5,6 +5,7 @@ from tests.templates import Response, init_logger, ImplRequest import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -17,12 +18,23 @@ logger = init_logger(__name__) +@dataclass +class AppchooserParameters: + delay: int + response: int + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "appchooser_params") + mock.appchooser_params = AppchooserParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -45,6 +57,7 @@ def ChooseApplication( logger.debug( f"ChooseApplication({handle}, {app_id}, {parent_window}, {choices}, {options})" ) + params = self.appchooser_params request = ImplRequest( self, @@ -55,10 +68,10 @@ def ChooseApplication( cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, {}), delay=self.delay) + request.respond(Response(params.response, {}), delay=params.delay) @dbus.service.method( diff --git a/tests/templates/background.py b/tests/templates/background.py index 78fffd26b..11e44351a 100644 --- a/tests/templates/background.py +++ b/tests/templates/background.py @@ -3,9 +3,12 @@ # This file is formatted with Python Black from tests.templates import init_logger + import dbus.service import dbus from gi.repository import GLib +from dataclasses import dataclass + BUS_NAME = "org.freedesktop.impl.portal.Test" MAIN_OBJ = "/org/freedesktop/portal/desktop" @@ -13,13 +16,22 @@ MAIN_IFACE = "org.freedesktop.impl.portal.Background" VERSION = 1 + logger = init_logger(__name__) +@dataclass +class BackgroundParameters: + delay: int + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) + assert not hasattr(mock, "background_params") + mock.background_params = BackgroundParameters( + delay=parameters.get("delay", 200), + ) @dbus.service.method( @@ -30,13 +42,14 @@ def load(mock, parameters={}): ) def GetAppState(self, cb_success, cb_error): logger.debug("GetAppState()") + params = self.background_params # FIXME: implement? def reply(): cb_success({}) - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, reply) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, reply) @dbus.service.method( @@ -47,9 +60,10 @@ def reply(): ) def NotifyBackground(self, handle, app_id, name, cb_success, cb_error): logger.debug(f"NotifyBackground({handle}, {app_id}, {name})") + params = self.background_params - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, cb_success) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, cb_success) @dbus.service.method( diff --git a/tests/templates/clipboard.py b/tests/templates/clipboard.py index 3e164f00d..5a57267c2 100644 --- a/tests/templates/clipboard.py +++ b/tests/templates/clipboard.py @@ -3,11 +3,13 @@ # This file is formatted with Python Black from tests.templates import init_logger + import dbus.service import dbus import tempfile - from gi.repository import GLib +from dataclasses import dataclass + BUS_NAME = "org.freedesktop.impl.portal.Test" MAIN_OBJ = "/org/freedesktop/portal/desktop" @@ -15,15 +17,26 @@ MAIN_IFACE = "org.freedesktop.impl.portal.Clipboard" VERSION = 1 + logger = init_logger(__name__) +@dataclass +class ClipboardParameters: + delay: int + response: int + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "clipboard_params") + mock.clipboard_params = ClipboardParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + ) mock.AddProperties( MAIN_IFACE, @@ -44,12 +57,13 @@ def load(mock, parameters={}): def RequestClipboard(self, session_handle, options, cb_success, cb_error): try: logger.debug(f"RequestClipboard({session_handle}, {options})") + params = self.clipboard_params - if self.expect_close: + if params.expect_close: cb_success() else: - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, cb_success) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, cb_success) except Exception as e: logger.critical(e) cb_error(e) @@ -64,12 +78,13 @@ def RequestClipboard(self, session_handle, options, cb_success, cb_error): def SetSelection(self, session_handle, options, cb_success, cb_error): try: logger.debug(f"SetSelection({session_handle}, {options})") + params = self.clipboard_params - if self.expect_close: + if params.expect_close: cb_success() else: - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, cb_success) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, cb_success) except Exception as e: logger.critical(e) cb_error(e) @@ -84,19 +99,20 @@ def SetSelection(self, session_handle, options, cb_success, cb_error): def SelectionWrite(self, session_handle, serial, cb_success, cb_error): try: logger.debug(f"SelectionWrite({session_handle}, {serial})") + params = self.clipboard_params temp_file = tempfile.TemporaryFile() fd = dbus.types.UnixFd(temp_file.fileno()) - if self.expect_close: + if params.expect_close: cb_success(fd) else: def reply(): cb_success(fd) - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, reply) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, reply) except Exception as e: logger.critical(e) cb_error(e) @@ -111,12 +127,13 @@ def reply(): def SelectionWriteDone(self, session_handle, serial, success, cb_success, cb_error): try: logger.debug(f"SelectionWriteDone({session_handle}, {serial}, {success})") + params = self.clipboard_params - if self.expect_close: + if params.expect_close: cb_success() else: - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, cb_success) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, cb_success) except Exception as e: logger.critical(e) cb_error(e) @@ -131,19 +148,20 @@ def SelectionWriteDone(self, session_handle, serial, success, cb_success, cb_err def SelectionRead(self, session_handle, mime_type, cb_success, cb_error): try: logger.debug(f"SelectionRead({session_handle}, {mime_type})") + params = self.clipboard_params temp_file = tempfile.TemporaryFile() fd = dbus.types.UnixFd(temp_file.fileno()) - if self.expect_close: + if params.expect_close: cb_success(fd) else: def reply(): cb_success(fd) - logger.debug(f"scheduling delay of {self.delay}") - GLib.timeout_add(self.delay, reply) + logger.debug(f"scheduling delay of {params.delay}") + GLib.timeout_add(params.delay, reply) except Exception as e: logger.critical(e) cb_error(e) diff --git a/tests/templates/dynamiclauncher.py b/tests/templates/dynamiclauncher.py index e60c0f227..e8cd08620 100644 --- a/tests/templates/dynamiclauncher.py +++ b/tests/templates/dynamiclauncher.py @@ -3,7 +3,9 @@ # This file is formatted with Python Black from tests.templates import Response, init_logger, ImplRequest + import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -16,12 +18,25 @@ logger = init_logger(__name__) +@dataclass +class DynamiclauncherParameters: + delay: int + response: int + expect_close: bool + launcher_name: str + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "dynamiclauncher_params") + mock.dynamiclauncher_params = DynamiclauncherParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + launcher_name=parameters.get("launcher-name", None), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -30,7 +45,6 @@ def load(mock, parameters={}): } ), ) - mock.launcher_name: str = parameters.get("launcher-name", None) @dbus.service.method( @@ -45,6 +59,7 @@ def PrepareInstall( logger.debug( f"PrepareInstall({handle}, {app_id}, {parent_window}, {name}, {icon_v}, {options})" ) + params = self.dynamiclauncher_params request = ImplRequest( self, @@ -56,14 +71,14 @@ def PrepareInstall( ) response = Response( - self.response, + params.response, { - "name": self.launcher_name if self.launcher_name else name, + "name": params.launcher_name if params.launcher_name else name, "icon": dbus.Struct(list(icon_v), signature="sv", variant_level=2), }, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(response, delay=self.delay) + request.respond(response, delay=params.delay) diff --git a/tests/templates/email.py b/tests/templates/email.py index 9c600c55d..7f786a25a 100644 --- a/tests/templates/email.py +++ b/tests/templates/email.py @@ -3,7 +3,9 @@ # This file is formatted with Python Black from tests.templates import Response, init_logger, ImplRequest + import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -16,12 +18,23 @@ logger = init_logger(__name__) +@dataclass +class EmailParameters: + delay: int + response: int + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "email_params") + mock.email_params = EmailParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -40,6 +53,7 @@ def load(mock, parameters={}): ) def ComposeEmail(self, handle, app_id, parent_window, options, cb_success, cb_error): logger.debug(f"ComposeEmail({handle}, {app_id}, {parent_window}, {options})") + params = self.email_params request = ImplRequest( self, @@ -50,7 +64,7 @@ def ComposeEmail(self, handle, app_id, parent_window, options, cb_success, cb_er cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, {}), delay=self.delay) + request.respond(Response(params.response, {}), delay=params.delay) diff --git a/tests/templates/filechooser.py b/tests/templates/filechooser.py index c1d4135f2..49439d119 100644 --- a/tests/templates/filechooser.py +++ b/tests/templates/filechooser.py @@ -5,6 +5,7 @@ from tests.templates import Response, init_logger, ImplRequest import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -17,13 +18,25 @@ logger = init_logger(__name__) +@dataclass +class FilechooserParameters: + delay: int + response: int + results: dict + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.results = parameters.get("results", {}) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "filechooser_params") + mock.filechooser_params = FilechooserParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + results=parameters.get("results", {}), + expect_close=parameters.get("expect-close", False), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -42,6 +55,7 @@ def load(mock, parameters={}): ) def OpenFile(self, handle, app_id, parent_window, title, options, cb_success, cb_error): logger.debug(f"OpenFile({handle}, {app_id}, {parent_window}, {title}, {options})") + params = self.filechooser_params request = ImplRequest( self, @@ -52,10 +66,10 @@ def OpenFile(self, handle, app_id, parent_window, title, options, cb_success, cb cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.results), delay=self.delay) + request.respond(Response(params.response, params.results), delay=params.delay) @dbus.service.method( @@ -66,6 +80,7 @@ def OpenFile(self, handle, app_id, parent_window, title, options, cb_success, cb ) def SaveFile(self, handle, app_id, parent_window, title, options, cb_success, cb_error): logger.debug(f"SaveFile({handle}, {app_id}, {parent_window}, {title}, {options})") + params = self.filechooser_params request = ImplRequest( self, @@ -76,7 +91,7 @@ def SaveFile(self, handle, app_id, parent_window, title, options, cb_success, cb cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.results), delay=self.delay) + request.respond(Response(params.response, params.results), delay=params.delay) diff --git a/tests/templates/geoclue2.py b/tests/templates/geoclue2.py index f32757fe1..40d7ebb14 100644 --- a/tests/templates/geoclue2.py +++ b/tests/templates/geoclue2.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later from tests.templates import init_logger + import dbus.service import dbus diff --git a/tests/templates/globalshortcuts.py b/tests/templates/globalshortcuts.py index 1be4e40b1..f047fc452 100644 --- a/tests/templates/globalshortcuts.py +++ b/tests/templates/globalshortcuts.py @@ -3,12 +3,13 @@ # This file is formatted with Python Black from tests.templates import Response, init_logger, ImplRequest, ImplSession + import dbus import dbus.service import time from dbusmock import MOCK_IFACE - from gi.repository import GLib +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -21,13 +22,25 @@ logger = init_logger(__name__) +@dataclass +class GlobalshortcutsParameters: + delay: int + response: int + expect_close: bool + force_close: int + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) - mock.force_close: int = parameters.get("force-close", 0) + assert not hasattr(mock, "globalshortcuts_params") + mock.globalshortcuts_params = GlobalshortcutsParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + force_close=parameters.get("force-close", 0), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -47,6 +60,7 @@ def load(mock, parameters={}): ) def CreateSession(self, handle, session_handle, app_id, options, cb_success, cb_error): logger.debug(f"CreateSession({handle}, {session_handle}, {app_id}, {options})") + params = self.globalshortcuts_params session = ImplSession(self, BUS_NAME, session_handle, app_id).export() self.sessions[session_handle] = session @@ -60,15 +74,15 @@ def CreateSession(self, handle, session_handle, app_id, options, cb_success, cb_ cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: request.respond( - Response(self.response, {"session_handle": session.handle}), - delay=self.delay, + Response(params.response, {"session_handle": session.handle}), + delay=params.delay, ) - if self.force_close > 0: - GLib.timeout_add(self.force_close, session.close) + if params.force_close > 0: + GLib.timeout_add(params.force_close, session.close) @dbus.service.method( @@ -88,6 +102,7 @@ def BindShortcuts( cb_error, ): logger.debug(f"BindShortcuts({handle}, {session_handle}, {shortcuts}, {options})") + params = self.globalshortcuts_params assert session_handle in self.sessions @@ -100,16 +115,16 @@ def BindShortcuts( cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: def reply(): logger.debug(f"BindShortcuts with shortcuts {shortcuts}") self.sessions[session_handle].shortcuts = shortcuts - return Response(self.response, {}) + return Response(params.response, {}) - request.respond(reply, delay=self.delay) + request.respond(reply, delay=params.delay) @dbus.service.method( diff --git a/tests/templates/inhibit.py b/tests/templates/inhibit.py index 192298529..ce107cdcd 100644 --- a/tests/templates/inhibit.py +++ b/tests/templates/inhibit.py @@ -8,6 +8,7 @@ from gi.repository import GLib from enum import Enum from dbusmock import MOCK_IFACE +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -17,21 +18,32 @@ VERSION = 3 +logger = init_logger(__name__) + + class SessionState(Enum): RUNNING = 1 QUERY_END = 2 ENDING = 3 -logger = init_logger(__name__) +@dataclass +class InhibitParameters: + delay: int + response: int + expect_close: bool def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "inhibit_params") + mock.inhibit_params = InhibitParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -52,6 +64,7 @@ def load(mock, parameters={}): ) def Inhibit(self, handle, app_id, window, flags, options, cb_success, cb_error): logger.debug(f"Inhibit({handle}, {app_id}, {window}, {flags}, {options})") + params = self.inhibit_params request = ImplRequest( self, @@ -62,10 +75,10 @@ def Inhibit(self, handle, app_id, window, flags, options, cb_success, cb_error): cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, {}), delay=self.delay) + request.respond(Response(params.response, {}), delay=params.delay) @dbus.service.method( @@ -105,6 +118,7 @@ def close_session(): ) def CreateMonitor(self, handle, session_handle, app_id, window, cb_success, cb_error): logger.debug(f"CreateMonitor({handle}, {session_handle}, {app_id}, {window})") + params = self.inhibit_params session = ImplSession(self, BUS_NAME, session_handle, app_id).export() self.sessions[session_handle] = session @@ -122,7 +136,7 @@ def internal_cb_success(response, results): cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: @@ -130,7 +144,7 @@ def arm_timer(): self.ArmTimer(session_handle) request.respond( - Response(self.response, {}), delay=self.delay, done_cb=arm_timer + Response(params.response, {}), delay=params.delay, done_cb=arm_timer ) diff --git a/tests/templates/inputcapture.py b/tests/templates/inputcapture.py index f3efadd99..f41439308 100644 --- a/tests/templates/inputcapture.py +++ b/tests/templates/inputcapture.py @@ -2,53 +2,69 @@ # # This file is formatted with Python Black +from tests.templates import Response, init_logger + from collections import namedtuple from itertools import count from gi.repository import GLib - +from dataclasses import dataclass import dbus import dbus.service -import logging import socket + BUS_NAME = "org.freedesktop.impl.portal.Test" MAIN_OBJ = "/org/freedesktop/portal/desktop" SYSTEM_BUS = False MAIN_IFACE = "org.freedesktop.impl.portal.InputCapture" VERSION = 1 -logger = logging.getLogger(f"templates.{__name__}") -logger.setLevel(logging.DEBUG) + +logger = init_logger(__name__) + serials = count() -Response = namedtuple("Response", ["response", "results"]) + Barrier = namedtuple("Barrier", ["id", "position"]) +@dataclass +class InputcaptureParameters: + delay: int + supported_capabilities: int + capabilities: int + default_zone: list + disable_delay: int + activated_delay: int + deactivated_delay: int + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - # Delay before Request.response - mock.delay: int = parameters.get("delay", 0) - mock.supported_capabilities = parameters.get("supported_capabilities", 0xF) - # The actual ones we reply with in the CreateSession request - mock.capabilities = parameters.get("capabilities", None) + assert not hasattr(mock, "inputcapture_params") + mock.inputcapture_params = InputcaptureParameters( + delay=parameters.get("delay", 0), + supported_capabilities=parameters.get("supported_capabilities", 0xF), + capabilities=parameters.get("capabilities", None), + default_zone=parameters.get("default-zone", [(1920, 1080, 0, 0)]), + disable_delay=parameters.get("disable-delay", 0), + activated_delay=parameters.get("activated-delay", 0), + deactivated_delay=parameters.get("deactivated-delay", 0), + ) - mock.default_zone = parameters.get("default-zone", [(1920, 1080, 0, 0)]) - mock.current_zones = mock.default_zone + mock.current_zones = mock.inputcapture_params.default_zone mock.current_zone_set = next(serials) - mock.disable_delay = parameters.get("disable-delay", 0) - mock.activated_delay = parameters.get("activated-delay", 0) - mock.deactivated_delay = parameters.get("deactivated-delay", 0) - mock.AddProperties( MAIN_IFACE, dbus.Dictionary( { "version": dbus.UInt32(parameters.get("version", VERSION)), - "SupportedCapabilities": dbus.UInt32(mock.supported_capabilities), + "SupportedCapabilities": dbus.UInt32( + mock.inputcapture_params.supported_capabilities + ), } ), ) @@ -64,16 +80,17 @@ def load(mock, parameters={}): def CreateSession(self, handle, session_handle, app_id, parent_window, options): try: logger.debug(f"CreateSession({parent_window}, {options})") + params = self.inputcapture_params assert "capabilities" in options # Filter to the subset of supported capabilities - if self.capabilities is None: + if params.capabilities is None: capabilities = options["capabilities"] else: - capabilities = self.capabilities + capabilities = params.capabilities - capabilities &= self.supported_capabilities + capabilities &= params.supported_capabilities response = Response(0, {}) response.results["capabilities"] = dbus.UInt32(capabilities) @@ -95,11 +112,12 @@ def CreateSession(self, handle, session_handle, app_id, parent_window, options): def GetZones(self, handle, session_handle, app_id, options): try: logger.debug(f"GetZones({session_handle}, {options})") + params = self.inputcapture_params assert session_handle in self.active_session_handles response = Response(0, {}) - response.results["zones"] = self.default_zone + response.results["zones"] = params.default_zone response.results["zone_set"] = dbus.UInt32( self.current_zone_set, variant_level=1 ) @@ -191,6 +209,7 @@ def SetPointerBarriers( def Enable(self, session_handle, app_id, options): try: logger.debug(f"Enable({session_handle}, {options})") + params = self.inputcapture_params assert session_handle in self.active_session_handles @@ -199,15 +218,15 @@ def Enable(self, session_handle, app_id, options): barrier = self.current_barriers[0] pos = (barrier.position[0] + 10, barrier.position[1] + 20) - if self.disable_delay > 0: + if params.disable_delay > 0: def disable(): logger.debug("emitting Disabled") self.EmitSignal(MAIN_IFACE, "Disabled", "oa{sv}", [session_handle, {}]) - GLib.timeout_add(self.disable_delay, disable) + GLib.timeout_add(params.disable_delay, disable) - if self.activated_delay > 0: + if params.activated_delay > 0: def activated(): logger.debug("emitting Activated") @@ -222,9 +241,9 @@ def activated(): MAIN_IFACE, "Activated", "oa{sv}", [session_handle, options] ) - GLib.timeout_add(self.activated_delay, activated) + GLib.timeout_add(params.activated_delay, activated) - if self.deactivated_delay > 0: + if params.deactivated_delay > 0: def deactivated(): logger.debug("emitting Deactivated") @@ -238,7 +257,7 @@ def deactivated(): MAIN_IFACE, "Deactivated", "oa{sv}", [session_handle, options] ) - GLib.timeout_add(self.deactivated_delay, deactivated) + GLib.timeout_add(params.deactivated_delay, deactivated) except Exception as e: logger.critical(e) diff --git a/tests/templates/print.py b/tests/templates/print.py index 00235af7c..c10a7d5bd 100644 --- a/tests/templates/print.py +++ b/tests/templates/print.py @@ -5,6 +5,7 @@ from tests.templates import Response, init_logger, ImplRequest import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -17,14 +18,27 @@ logger = init_logger(__name__) +@dataclass +class PrintParameters: + delay: int + response: int + results: dict + expect_close: bool + prepare_results: dict + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.prepare_results: bool = parameters.get("prepare-results", {}) - mock.results: bool = parameters.get("results", {}) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "print_params") + mock.print_params = PrintParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + results=parameters.get("results", {}), + expect_close=parameters.get("expect-close", False), + prepare_results=parameters.get("prepare-results", {}), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -56,6 +70,7 @@ def PreparePrint( logger.debug( f"PreparePrint({handle}, {app_id}, {parent_window}, {title}, {settings}, {page_setup}, {options})" ) + params = self.print_params request = ImplRequest( self, @@ -66,10 +81,12 @@ def PreparePrint( cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.prepare_results), delay=self.delay) + request.respond( + Response(params.response, params.prepare_results), delay=params.delay + ) @dbus.service.method( @@ -84,6 +101,7 @@ def Print( logger.debug( f"Print({handle}, {app_id}, {parent_window}, {title}, {fd}, {options})" ) + params = self.print_params request = ImplRequest( self, @@ -94,7 +112,7 @@ def Print( cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.results), delay=self.delay) + request.respond(Response(params.response, params.results), delay=params.delay) diff --git a/tests/templates/remotedesktop.py b/tests/templates/remotedesktop.py index 6a60449ba..972f6c55d 100644 --- a/tests/templates/remotedesktop.py +++ b/tests/templates/remotedesktop.py @@ -3,12 +3,13 @@ # This file is formatted with Python Black from tests.templates import Response, init_logger, ImplRequest, ImplSession + from dbusmock import MOCK_IFACE import dbus import dbus.service import socket - from gi.repository import GLib +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -21,17 +22,29 @@ logger = init_logger(__name__) +@dataclass +class RemotedesktopParameters: + delay: int + response: int + expect_close: bool + force_close: int + force_clipoboard_enabled: bool + fail_connect_to_eis: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) - mock.force_close: int = parameters.get("force-close", 0) - mock.force_clipoboard_enabled: bool = parameters.get( - "force-clipboard-enabled", False + assert not hasattr(mock, "remotedesktop_params") + mock.remotedesktop_params = RemotedesktopParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + force_close=parameters.get("force-close", 0), + force_clipoboard_enabled=parameters.get("force-clipboard-enabled", False), + fail_connect_to_eis=parameters.get("fail-connect-to-eis", False), ) - mock.fail_connect_to_eis: bool = parameters.get("fail-connect-to-eis", False) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -51,6 +64,7 @@ def load(mock, parameters={}): ) def CreateSession(self, handle, session_handle, app_id, options, cb_success, cb_error): logger.debug(f"CreateSession({handle}, {session_handle}, {app_id}, {options})") + params = self.remotedesktop_params session = ImplSession(self, BUS_NAME, session_handle, app_id).export() self.sessions[session_handle] = session @@ -64,15 +78,15 @@ def CreateSession(self, handle, session_handle, app_id, options, cb_success, cb_ cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: request.respond( - Response(self.response, {"session_handle": session.handle}), - delay=self.delay, + Response(params.response, {"session_handle": session.handle}), + delay=params.delay, ) - if self.force_close > 0: - GLib.timeout_add(self.force_close, session.close) + if params.force_close > 0: + GLib.timeout_add(params.force_close, session.close) @dbus.service.method( @@ -83,6 +97,7 @@ def CreateSession(self, handle, session_handle, app_id, options, cb_success, cb_ ) def SelectDevices(self, handle, session_handle, app_id, options, cb_success, cb_error): logger.debug(f"SelectDevices({handle}, {session_handle}, {app_id}, {options})") + params = self.remotedesktop_params assert session_handle in self.sessions @@ -95,10 +110,10 @@ def SelectDevices(self, handle, session_handle, app_id, options, cb_success, cb_ cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, {}), delay=self.delay) + request.respond(Response(params.response, {}), delay=params.delay) @dbus.service.method( @@ -113,6 +128,7 @@ def Start( logger.debug( f"Start({handle}, {session_handle}, {parent_window}, {app_id}, {options})" ) + params = self.remotedesktop_params assert session_handle in self.sessions @@ -125,14 +141,14 @@ def Start( cb_error, ) - response = Response(self.response, {}) - if self.force_clipoboard_enabled: + response = Response(params.response, {}) + if params.force_clipoboard_enabled: response.results["clipboard_enabled"] = True - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(response, delay=self.delay) + request.respond(response, delay=params.delay) @dbus.service.method( @@ -143,10 +159,11 @@ def Start( def ConnectToEIS(self, session_handle, app_id, options): try: logger.debug(f"ConnectToEIS({session_handle}, {app_id}, {options})") + params = self.remotedesktop_params assert session_handle in self.sessions - if self.fail_connect_to_eis: + if params.fail_connect_to_eis: raise dbus.exceptions.DBusException("Purposely failing ConnectToEIS") sockets = socket.socketpair() diff --git a/tests/templates/screenshot.py b/tests/templates/screenshot.py index 2921a3564..7e0212667 100644 --- a/tests/templates/screenshot.py +++ b/tests/templates/screenshot.py @@ -5,6 +5,7 @@ from tests.templates import Response, init_logger, ImplRequest import dbus.service +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -17,13 +18,25 @@ logger = init_logger(__name__) +@dataclass +class ScreenshotParameters: + delay: int + response: int + results: dict + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.results = parameters.get("results", {}) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "screenshot_params") + mock.screenshot_params = ScreenshotParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + results=parameters.get("results", {}), + expect_close=parameters.get("expect-close", False), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -42,6 +55,7 @@ def load(mock, parameters={}): ) def Screenshot(self, handle, app_id, parent_window, options, cb_success, cb_error): logger.debug(f"Screenshot({handle}, {app_id}, {parent_window}, {options})") + params = self.screenshot_params request = ImplRequest( self, @@ -52,10 +66,10 @@ def Screenshot(self, handle, app_id, parent_window, options, cb_success, cb_erro cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.results), delay=self.delay) + request.respond(Response(params.response, params.results), delay=params.delay) @dbus.service.method( @@ -66,6 +80,7 @@ def Screenshot(self, handle, app_id, parent_window, options, cb_success, cb_erro ) def PickColor(self, handle, app_id, parent_window, options, cb_success, cb_error): logger.debug(f"PickColor({handle}, {app_id}, {parent_window}, {options})") + params = self.screenshot_params request = ImplRequest( self, @@ -76,7 +91,7 @@ def PickColor(self, handle, app_id, parent_window, options, cb_success, cb_error cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, self.results), delay=self.delay) + request.respond(Response(params.response, params.results), delay=params.delay) diff --git a/tests/templates/settings.py b/tests/templates/settings.py index 25412cb17..339aeaabc 100644 --- a/tests/templates/settings.py +++ b/tests/templates/settings.py @@ -6,6 +6,7 @@ import dbus.service from dbusmock import MOCK_IFACE +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -18,10 +19,19 @@ logger = init_logger(__name__) +@dataclass +class SettingsParameters: + settings: dict + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.settings = parameters.get("settings", {}) + assert not hasattr(mock, "settings_params") + mock.settings_params = SettingsParameters( + settings=parameters.get("settings", {}), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -39,21 +49,22 @@ def load(mock, parameters={}): ) def ReadAll(self, namespaces): logger.debug(f"ReadAll({namespaces})") + settings = self.settings_params.settings if len(namespaces) == 0 or (len(namespaces) == 1 and namespaces[0] == ""): - return self.settings + return settings def find_matching(namespace): if len(namespace) >= 3 and namespace[-2:] == ".*": ns_prefix = namespace[:-2] matches = {} - for ns in self.settings: + for ns in settings: if ns.startswith(ns_prefix): - matches[ns] = self.settings[ns] + matches[ns] = settings[ns] return matches - if namespace in self.settings: - return {namespace: self.settings[namespace]} + if namespace in settings: + return {namespace: settings[namespace]} return {} @@ -71,8 +82,9 @@ def find_matching(namespace): ) def Read(self, namespace, key): logger.debug(f"Read({namespace}, {key})") + settings = self.settings_params.settings - return self.settings[namespace][key] + return settings[namespace][key] @dbus.service.method( @@ -81,7 +93,10 @@ def Read(self, namespace, key): out_signature="", ) def SetSetting(self, namespace, key, value): - self.settings.setdefault(namespace, {})[key] = value + logger.debug(f"SetSetting({namespace}, {key}, {value})") + settings = self.settings_params.settings + + settings.setdefault(namespace, {})[key] = value self.EmitSignal( MAIN_IFACE, diff --git a/tests/templates/usb.py b/tests/templates/usb.py index d3868dc93..84aed8243 100644 --- a/tests/templates/usb.py +++ b/tests/templates/usb.py @@ -3,9 +3,11 @@ # This file is formatted with Python Black from tests.templates import Response, init_logger, ImplRequest + import dbus import dbus.service from dbusmock import MOCK_IFACE +from dataclasses import dataclass BUS_NAME = "org.freedesktop.impl.portal.Test" @@ -18,13 +20,25 @@ logger = init_logger(__name__) +@dataclass +class UsbParameters: + delay: int + response: int + expect_close: bool + filters: dict + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) - mock.filters = parameters.get("filters", {}) + assert not hasattr(mock, "usb_params") + mock.usb_params = UsbParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + filters=parameters.get("filters", {}), + ) + mock.AddProperties( MAIN_IFACE, dbus.Dictionary( @@ -54,6 +68,7 @@ def AcquireDevices( logger.debug( f"AcquireDevices({handle}, {parent_window}, {app_id}, {devices}, {options})" ) + params = self.usb_params request = ImplRequest( self, @@ -73,13 +88,13 @@ def reply(): (id, info, access_options) = device props = info["properties"] - allows_writable = self.filters.get("writable", True) + allows_writable = params.filters.get("writable", True) needs_writable = access_options.get("writable", False) if needs_writable and not allows_writable: logger.debug(f"Skipping device {id} because it requires writable") continue - needs_vendor = self.filters.get("vendor", None) + needs_vendor = params.filters.get("vendor", None) needs_vendor = int(needs_vendor, 16) if needs_vendor else None vendor = props.get("ID_VENDOR_ID", None) @@ -91,7 +106,7 @@ def reply(): ) continue - needs_model = self.filters.get("model", None) + needs_model = params.filters.get("model", None) needs_model = int(needs_model, 16) if needs_model else None model = props.get("ID_MODEL_ID", None) @@ -108,14 +123,14 @@ def reply(): ) return Response( - self.response, + params.response, {"devices": dbus.Array(devices_out, signature="(sa{sv})", variant_level=1)}, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(reply, delay=self.delay) + request.respond(reply, delay=params.delay) @dbus.service.method( @@ -125,5 +140,6 @@ def reply(): ) def SetSelectionFilters(self, filters): logger.debug(f"SetSelectionFilters({filters})") + params = self.usb_params - self.filters = filters + params.filters = filters diff --git a/tests/templates/wallpaper.py b/tests/templates/wallpaper.py index 0c614b4da..a73e4f287 100644 --- a/tests/templates/wallpaper.py +++ b/tests/templates/wallpaper.py @@ -6,6 +6,8 @@ import dbus import dbus.service +from dataclasses import dataclass + BUS_NAME = "org.freedesktop.impl.portal.Test" MAIN_OBJ = "/org/freedesktop/portal/desktop" @@ -16,12 +18,22 @@ logger = init_logger(__name__) +@dataclass +class WallpaperParameters: + delay: int + response: int + expect_close: bool + + def load(mock, parameters={}): logger.debug(f"Loading parameters: {parameters}") - mock.delay: int = parameters.get("delay", 200) - mock.response: int = parameters.get("response", 0) - mock.expect_close: bool = parameters.get("expect-close", False) + assert not hasattr(mock, "wallpaper_params") + mock.wallpaper_params = WallpaperParameters( + delay=parameters.get("delay", 200), + response=parameters.get("response", 0), + expect_close=parameters.get("expect-close", False), + ) @dbus.service.method( @@ -36,6 +48,7 @@ def SetWallpaperURI( logger.debug( f"SetWallpaperURI({handle}, {app_id}, {parent_window}, {uri}, {options})" ) + params = self.wallpaper_params # This is irregular: the backend doesn't return the results vardict def internal_cb_success(response, results): @@ -50,7 +63,7 @@ def internal_cb_success(response, results): cb_error, ) - if self.expect_close: + if params.expect_close: request.wait_for_close() else: - request.respond(Response(self.response, {}), delay=self.delay) + request.respond(Response(params.response, {}), delay=params.delay)