From ef05d294e85978cf96a86535321cf914b605fa48 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Thu, 15 Dec 2011 19:37:23 -0500 Subject: Fix the match rule semantics so that a match rule of "arg0='/'" does not match object paths in Python3, as per Simon's review comments. --- dbus/connection.py | 18 +++++++++--------- test/test-standalone.py | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/dbus/connection.py b/dbus/connection.py index f4124bd..e2361ec 100644 --- a/dbus/connection.py +++ b/dbus/connection.py @@ -28,17 +28,18 @@ import threading import weakref from _dbus_bindings import ( - Connection as _Connection, LOCAL_IFACE, LOCAL_PATH, - validate_bus_name, validate_error_name, validate_interface_name, - validate_member_name, validate_object_path) + Connection as _Connection, LOCAL_IFACE, LOCAL_PATH, validate_bus_name, + validate_interface_name, validate_member_name, validate_object_path) from dbus.exceptions import DBusException from dbus.lowlevel import ( ErrorMessage, HANDLER_RESULT_NOT_YET_HANDLED, MethodCallMessage, MethodReturnMessage, SignalMessage) from dbus.proxies import ProxyObject -from dbus._compat import is_py2 +from dbus._compat import is_py2, is_py3 -if is_py2: +if is_py3: + from _dbus_bindings import String +else: from _dbus_bindings import UTF8String @@ -185,14 +186,13 @@ class SignalMatch(object): if self._int_args_match is not None: # extracting args with utf8_strings and byte_arrays is less work kwargs = dict(byte_arrays=True) + arg_type = (String if is_py3 else UTF8String) if is_py2: kwargs['utf8_strings'] = True args = message.get_args_list(**kwargs) for index, value in self._int_args_match.items(): if (index >= len(args) - or (not isinstance(args[index], UTF8String) - if is_py2 - else False) + or not isinstance(args[index], arg_type) or args[index] != value): return False @@ -540,7 +540,7 @@ class Connection(_Connection): for cb in self.__call_on_disconnection: try: cb(self) - except Exception as e: + except Exception: # basicConfig is a no-op if logging is already configured logging.basicConfig() _logger.error('Exception in handler for Disconnected ' diff --git a/test/test-standalone.py b/test/test-standalone.py index 48cbe09..22e8444 100755 --- a/test/test-standalone.py +++ b/test/test-standalone.py @@ -344,6 +344,25 @@ class TestMessageMarshalling(unittest.TestCase): 'should fail') +class TestMatching(unittest.TestCase): + def setUp(self): + from _dbus_bindings import SignalMessage + from dbus.connection import SignalMatch + self._message = SignalMessage('/', 'a.b', 'c') + class FakeConn(object): pass + def ignore_cb(*args, **kws): pass + self._match = SignalMatch(FakeConn(), None, '/', None, None, + ignore_cb, arg0='/') + + def test_string_match(self): + self._message.append('/', signature='s') + self.assertTrue(self._match.maybe_handle_message(self._message)) + + def test_object_path_no_match(self): + self._message.append('/', signature='o') + self.assertFalse(self._match.maybe_handle_message(self._message)) + + if __name__ == '__main__': # Python 2.6 doesn't accept a `verbosity` keyword. kwargs = {} -- cgit v1.2.1