Compare commits

..

10 Commits

Author SHA1 Message Date
openeuler-ci-bot
ecbdb8dc30
!26 [sync] PR-21: add build require dbus-daemon for test
From: @openeuler-sync-bot 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2023-12-01 03:33:47 +00:00
sherlock2010
5809bfef9b add build require dbus-daemon for test
(cherry picked from commit 888a6225b23d3e5edaba9c97e34c5af25fa73db8)
2023-11-30 14:33:44 +08:00
openeuler-ci-bot
dd1ac498b6
!16 [sync] PR-14: enable test
From: @openeuler-sync-bot 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2023-11-28 03:44:47 +00:00
sherlock2010
1962a742e8 enable test
(cherry picked from commit 975ae39e6429613eaee9d50726d9ae5a5e92b097)
2023-11-28 11:29:26 +08:00
openeuler-ci-bot
c0a6690f49
!7 Raise TimeoutError if a DBus call times out
From: @sherlock2010 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2022-10-21 09:15:13 +00:00
sherlock2010
1ddf1b628c Raise TimeoutError if a DBus call times out 2022-10-21 07:46:30 +00:00
openeuler-ci-bot
285e058700 !5 update python-dasbus to 1.6
Merge pull request !5 from haochen/openEuler-22.03-LTS-Next
2021-12-27 03:14:59 +00:00
haochenstar
ce4a465284 update python-dasbus to 1.6 2021-12-04 09:32:48 +08:00
openeuler-ci-bot
f24b9269ff !2 fix source0 url
From: @lunankun
Reviewed-by: @t_feng
Signed-off-by: @t_feng
2020-09-30 17:32:45 +08:00
lunankun
c04ab74793 fix source0 url 2020-09-30 16:06:38 +08:00
4 changed files with 215 additions and 4 deletions

View File

@ -0,0 +1,176 @@
From a76cac78402df7ad01841c93fb64b02af4700b07 Mon Sep 17 00:00:00 2001
From: Vendula Poncova <vponcova@redhat.com>
Date: Thu, 9 Jun 2022 15:41:08 +0200
Subject: [PATCH] Raise TimeoutError if a DBus call times out
* Raise the TimeoutError exception instead of the original GLib.Error.
* Improve the documentation of the timeout and add an example.
---
dasbus/client/handler.py | 49 ++++++++++++++++++++++++++++------------
docs/examples.rst | 11 +++++++++
tests/test_client.py | 18 ++++++++++++++-
tests/test_dbus.py | 21 +++++++++++++++++
4 files changed, 84 insertions(+), 15 deletions(-)
diff --git a/dasbus/client/handler.py b/dasbus/client/handler.py
index 839f5a6..43b22f6 100644
--- a/dasbus/client/handler.py
+++ b/dasbus/client/handler.py
@@ -137,6 +137,12 @@ class GLibClient(object):
"""Unsubscribe from a signal."""
connection.signal_unsubscribe(subscription_id)
+ @classmethod
+ def is_timeout_error(cls, error):
+ """Is it a timeout error?"""
+ return isinstance(error, GLib.Error) \
+ and error.matches(Gio.io_error_quark(), Gio.IOErrorEnum.TIMED_OUT)
+
@classmethod
def is_remote_error(cls, error):
"""Is it a remote DBus error?"""
@@ -479,22 +485,37 @@ class ClientObjectHandler(AbstractClientObjectHandler):
def _handle_method_error(self, error):
"""Handle an error of a DBus call.
+ If the call returned a DBus error, it will be mapped
+ to a Python exception based on the rules defined in
+ the available error mapper. It should be a subclass
+ of DBusError.
+
:param error: an exception raised during the call
+ :raise Exception: if the call unexpectedly failed
+ :raise TimeoutError: if the DBus call timed out
+ :raise DBusError: if the call returned a DBus error
"""
- # Re-raise if it is not a remote DBus error.
- if not self._client.is_remote_error(error):
- raise error
-
- name = self._client.get_remote_error_name(error)
- cls = self._error_mapper.get_exception_type(name)
- message = self._client.get_remote_error_message(error)
-
- # Create a new exception.
- exception = cls(message)
- exception.dbus_name = name
-
- # Raise a new instance of the exception class.
- raise exception from None
+ if self._client.is_remote_error(error):
+ # Handle a remote DBus error.
+ name = self._client.get_remote_error_name(error)
+ cls = self._error_mapper.get_exception_type(name)
+ message = self._client.get_remote_error_message(error)
+
+ # Create a new exception.
+ exception = cls(message)
+ exception.dbus_name = name
+
+ # Raise a new instance of the exception class.
+ raise exception from None
+
+ if self._client.is_timeout_error(error):
+ # Handle a timeout error.
+ raise TimeoutError(
+ "The DBus call timeout was reached."
+ ) from None
+
+ # Or re-raise the original error.
+ raise error
def _handle_method_result(self, result):
"""Handle a result of a DBus call.
diff --git a/docs/examples.rst b/docs/examples.rst
index 8d272a8..176c0b4 100644
--- a/docs/examples.rst
+++ b/docs/examples.rst
@@ -129,6 +129,17 @@ mapper to transform Python exceptions to DBus errors and back.
class InvalidArgs(DBusError):
pass
+Call DBus methods with a timeout (specified in milliseconds).
+
+.. code-block:: python
+
+ proxy = NETWORK_MANAGER.get_proxy()
+
+ try:
+ proxy.CheckConnectivity(timeout=3)
+ except TimeoutError:
+ print("The call timed out!")
+
Call DBus methods asynchronously.
.. code-block:: python
diff --git a/tests/test_client.py b/tests/test_client.py
index 03890ea..dcbdbb9 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -30,7 +30,8 @@ from dasbus.typing import get_variant, get_variant_type, VariantType
import gi
gi.require_version("Gio", "2.0")
-from gi.repository import Gio
+gi.require_version("GLib", "2.0")
+from gi.repository import Gio, GLib
class FakeException(Exception):
@@ -230,6 +231,21 @@ class DBusClientTestCase(unittest.TestCase):
self.assertEqual(str(cm.exception), "My message.")
+ # Handle timeout exception.
+ self._set_reply(GLib.Error.new_literal(
+ Gio.io_error_quark(),
+ "Timeout was reached",
+ Gio.IOErrorEnum.TIMED_OUT
+ ))
+
+ with self.assertRaises(TimeoutError) as cm:
+ self.proxy.Method1()
+
+ self.assertEqual(
+ str(cm.exception),
+ "The DBus call timeout was reached."
+ )
+
# Handle local exception.
self._set_reply(Exception("My message."))
diff --git a/tests/test_dbus.py b/tests/test_dbus.py
index d62e25c..4e372dc 100644
--- a/tests/test_dbus.py
+++ b/tests/test_dbus.py
@@ -283,6 +283,27 @@ class DBusTestCase(unittest.TestCase):
self.assertEqual(sorted(self.service._names), ["Bar", "Foo"])
+ def test_timeout(self):
+ """Call a DBus method with a timeout."""
+ self._set_service(ExampleInterface())
+ self.assertEqual(self.service._names, [])
+
+ def test1():
+ proxy = self._get_proxy()
+ proxy.Hello("Foo", timeout=1000)
+
+ def test2():
+ proxy = self._get_proxy()
+
+ with self.assertRaises(TimeoutError):
+ proxy.Hello("Bar", timeout=0)
+
+ self._add_client(test1)
+ self._add_client(test2)
+ self._run_test()
+
+ self.assertEqual(sorted(self.service._names), ["Bar", "Foo"])
+
def test_name(self):
"""Use a DBus read-only property."""
self._set_service(ExampleInterface())
--
2.33.0

Binary file not shown.

BIN
dasbus-1.6.tar.gz Normal file

Binary file not shown.

View File

@ -1,13 +1,15 @@
%global srcname dasbus
Name: python-%{srcname}
Version: 1.3
Release: 1
Version: 1.6
Release: 4
Summary: DBus library in Python 3
License: LGPLv2+
URL: https://pypi.python.org/pypi/dasbus
Source0: https://github.com/rhinstaller/%{srcname}/archive/%{srcname}-%{version}.tar.gz
Source0: https://codeload.github.com/rhinstaller/%{srcname}/tar.gz/v%{version}#/%{srcname}-%{version}.tar.gz
Patch0001: backport-Raise-TimeoutError-if-a-DBus-call-times-out.patch
BuildArch: noarch
@ -20,7 +22,7 @@ to use and extend.}
%package -n python3-%{srcname}
Summary: %{summary}
BuildRequires: python3-devel python3-setuptools
BuildRequires: python3-devel python3-setuptools python3-gobject-base python3-pytest dbus-daemon
Requires: python3-gobject-base
%{?python_provide:%python_provide python3-%{srcname}}
@ -35,6 +37,9 @@ Requires: python3-gobject-base
%install
%py3_install
%check
%{__python3} -m pytest -v
%files -n python3-%{srcname}
%license LICENSE
%doc README.md
@ -42,5 +47,35 @@ Requires: python3-gobject-base
%{python3_sitelib}/%{srcname}/
%changelog
* Tue Nov 28 2023 zhouyihang <zhouyihang3@h-partners.com> - 1.6-4
- Type: requirements
- ID: NA
- SUG: NA
- DESC: add buildrequire dbus-daemon for test
* Mon Nov 27 2023 zhouyihang <zhouyihang3@h-partners.com> - 1.6-3
- Type: requirements
- ID: NA
- SUG: NA
- DESC: enable test
* Fri Oct 21 2022 zhouyihang <zhouyihang3@h-partners.com> - 1.6-2
- Type: bugfix
- ID: NA
- SUG: NA
- DESC: Raise TimeoutError if a DBus call times out
* Sat Dec 04 2021 xihaochen <xihaochen@huawei.com> - 1.6-1
- Type: requirements
- ID: NA
- SUG: NA
- DESC: update python-dasbus to 1.6
* Wed Sep 30 2020 lunankun <lunankun@huawei.com> - 1.3-2
- Type: bugfix
- ID: NA
- SUG: NA
- DESC: fix Source0 url
* Tue Jun 23 2020 fengtao <fengtao40@huawei.com> - 1.3-1
- package init