Skip to content

Commit

Permalink
tests/templates: Store config in dataclass
Browse files Browse the repository at this point in the history
The templates are loaded onto the MAIN_OBJ which is the same for all
portal impls. That means if a test case sets up multiple templates, they
all operate on the same object.

If we set, for example, `mock.delay` in both templates, the latter will
overwrite the former.

This commit loads the parameters into a dataclass that's available as
mock.${classname}_params.

Technically we have similar issues whenever we access self in the dbus
method implementations, but for the most part we use different variables
in different templates.
  • Loading branch information
swick committed Jan 29, 2025
1 parent 2a8b5ac commit 5df845a
Show file tree
Hide file tree
Showing 18 changed files with 430 additions and 170 deletions.
22 changes: 17 additions & 5 deletions tests/templates/access.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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(
Expand All @@ -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,
Expand All @@ -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)
28 changes: 22 additions & 6 deletions tests/templates/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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,
Expand All @@ -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)
23 changes: 18 additions & 5 deletions tests/templates/appchooser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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(
Expand All @@ -45,6 +57,7 @@ def ChooseApplication(
logger.debug(
f"ChooseApplication({handle}, {app_id}, {parent_window}, {choices}, {options})"
)
params = self.appchooser_params

request = ImplRequest(
self,
Expand All @@ -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(
Expand Down
24 changes: 19 additions & 5 deletions tests/templates/background.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,35 @@
# 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"
SYSTEM_BUS = False
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(
Expand All @@ -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(
Expand All @@ -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(
Expand Down
56 changes: 37 additions & 19 deletions tests/templates/clipboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,40 @@
# 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"
SYSTEM_BUS = False
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,
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Loading

0 comments on commit 5df845a

Please sign in to comment.