summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn (J5) Palmieri <johnp@redhat.com>2005-10-14 21:44:00 +0000
committerJohn (J5) Palmieri <johnp@redhat.com>2005-10-14 21:44:00 +0000
commit0ae9f138ad4dfacbbd28abd39ce3dee66333539a (patch)
treec2796ea79ca9e0eab9e5b4fa3be416a4b0394007
parent7667a2ae4ae4912f8130895e828d1dfb87050870 (diff)
* python/dbus_bindings.pyx (MessageIter::append_strict): check for
STRUCT_BEGIN not TYPE_STRUCT in indicate we are marshalling a struct * python/service.py (Object::_message_cb): handle exceptions correctly by sending them over the wire to the calling app. This makes sure the client returns immediately instead of waiting the 15 seconds to timeout. * test/python/test-client.py (TestDBusBindings::testBenchmarkIntrospect): Add a test to benchmark how long it takes to introspect a service and call a method which returns a large element (pretty fast) * test/python/test-service.py (TestObject::GetComplexArray): new test method which pushes a lot of data
-rw-r--r--ChangeLog20
-rw-r--r--python/dbus_bindings.pyx3
-rw-r--r--python/service.py18
-rwxr-xr-xtest/python/run-test.sh4
-rwxr-xr-xtest/python/test-client.py14
-rwxr-xr-xtest/python/test-service.py9
6 files changed, 57 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index e62e1e83..3d6cce4c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,24 @@
+2005-10-14 John (J5) Palmieri <johnp@redhat.com>
+
+ * python/dbus_bindings.pyx (MessageIter::append_strict): check for
+ STRUCT_BEGIN not TYPE_STRUCT in indicate we are marshalling a struct
+
+ * python/service.py (Object::_message_cb): handle exceptions correctly
+ by sending them over the wire to the calling app. This makes sure
+ the client returns immediately instead of waiting the 15 seconds to
+ timeout.
+
+ * test/python/test-client.py (TestDBusBindings::testBenchmarkIntrospect):
+ Add a test to benchmark how long it takes to introspect a service and
+ call a method which returns a large element (pretty fast)
+
+ * test/python/test-service.py (TestObject::GetComplexArray): new test
+ method which pushes a lot of data
+
2005-10-13 John (J5) Palmieri <johnp@redhat.com>
- * python/service.py(ObjectType::_reflect_on_signal, _reflect_on_method): reclaim memory outside of the loop and use del istead of just setting
+ * python/service.py(ObjectType::_reflect_on_signal, _reflect_on_method):
+ reclaim memory outside of the loop and use del istead of just setting
the key to None
2005-10-13 John (J5) Palmieri <johnp@redhat.com>
diff --git a/python/dbus_bindings.pyx b/python/dbus_bindings.pyx
index 00603734..35ad492b 100644
--- a/python/dbus_bindings.pyx
+++ b/python/dbus_bindings.pyx
@@ -978,7 +978,6 @@ cdef class MessageIter:
return (sig, remainder)
def append_strict(self, value, sig):
-
if sig == TYPE_INVALID or sig == None:
raise TypeError, 'Invalid arg type sent to append_strict'
@@ -1023,7 +1022,7 @@ cdef class MessageIter:
retval = self.append_array(Array(value, signature=tmp_sig))
elif sig_type == TYPE_OBJECT_PATH:
retval = self.append_object_path(value)
- elif sig_type == TYPE_STRUCT:
+ elif sig_type == STRUCT_BEGIN:
tmp_sig = sig[1:-1]
retval = self.append_struct(value, signature = tmp_sig)
elif sig_type == TYPE_VARIANT:
diff --git a/python/service.py b/python/service.py
index a4391837..0cc2ed9f 100644
--- a/python/service.py
+++ b/python/service.py
@@ -168,13 +168,19 @@ class Object:
print ("Unregister")
def _message_cb(self, connection, message):
- target_method_name = message.get_member()
- target_methods = self._dbus_method_vtable[target_method_name]
- args = message.get_args_list()
+ try:
+ target_method_name = message.get_member()
+ target_methods = self._dbus_method_vtable[target_method_name]
+ args = message.get_args_list()
- reply = _dispatch_dbus_method_call(target_methods, self, args, message)
-
- self._connection.send(reply)
+ reply = _dispatch_dbus_method_call(target_methods, self, args, message)
+
+ self._connection.send(reply)
+ except Exception, e:
+ error_reply = dbus_bindings.Error(message,
+ "org.freedesktop.DBus.Python.%s" % e.__class__.__name__,
+ str(e))
+ self._connection.send(error_reply)
@method('org.freedesktop.DBus.Introspectable')
def Introspect(self):
diff --git a/test/python/run-test.sh b/test/python/run-test.sh
index 600eb6d7..aa6bd366 100755
--- a/test/python/run-test.sh
+++ b/test/python/run-test.sh
@@ -29,6 +29,10 @@ fi
ln -s $DBUS_TOP_BUILDDIR/python $DBUS_TOP_BUILDDIR/python/dbus
echo "running test-client.py"
+#uncomment this if you need to see the output from the service for debugging
+#otherwise keep it commented so we can test activation
+#libtool --mode=execute $DEBUG $DBUS_TOP_BUILDDIR/test/python/test-service.py &
+
libtool --mode=execute $DEBUG $DBUS_TOP_BUILDDIR/test/python/test-client.py || die "test-client.py failed"
rm $DBUS_TOP_BUILDDIR/python/dbus
diff --git a/test/python/test-client.py b/test/python/test-client.py
index 08c547fd..f90ce13c 100755
--- a/test/python/test-client.py
+++ b/test/python/test-client.py
@@ -2,6 +2,7 @@
import sys
import os
import unittest
+import time
builddir = os.environ["DBUS_TOP_BUILDDIR"]
pydir = builddir + "/python"
@@ -29,7 +30,6 @@ test_types_vals = [1, 12323231, 3.14159265, 99999999.99,
([1,2,3],"c", 1.2, ["a","b","c"], {"a": (1,"v"), "b": (2,"d")})
]
-
class TestDBusBindings(unittest.TestCase):
def setUp(self):
self.bus = dbus.SessionBus()
@@ -57,7 +57,17 @@ class TestDBusBindings(unittest.TestCase):
print "Testing %s"% str(send_val)
recv_val = self.iface.Echo(send_val)
self.assertEquals(send_val, recv_val)
-
+
+ def testBenchmarkIntrospect(self):
+ print "\n********* Benchmark Introspect ************"
+ a = time.time()
+ print a
+ print self.iface.GetComplexArray()
+ b = time.time()
+ print b
+ print "Delta: %f" % (b - a)
+ self.assert_(True)
+
def testAsyncCalls(self):
#test sending python types and getting them back async
print "\n********* Testing Async Calls ***********"
diff --git a/test/python/test-service.py b/test/python/test-service.py
index 8f3cb7af..36c2df7c 100755
--- a/test/python/test-service.py
+++ b/test/python/test-service.py
@@ -16,6 +16,7 @@ if not dbus.__file__.startswith(pydir):
import dbus.service
import dbus.glib
import gobject
+import random
class TestObject(dbus.service.Object):
def __init__(self, bus_name, object_path="/org/freedesktop/DBus/TestSuitePythonObject"):
@@ -27,6 +28,14 @@ class TestObject(dbus.service.Object):
def Echo(self, arg):
return arg
+ @dbus.service.method("org.freedesktop.DBus.TestSuiteInterface")
+ def GetComplexArray(self):
+ ret = []
+ for i in range(0,100):
+ ret.append((random.randint(0,100), random.randint(0,100), str(random.randint(0,100))))
+
+ return dbus.Array(ret, signature="(uus)")
+
session_bus = dbus.SessionBus()
name = dbus.service.BusName("org.freedesktop.DBus.TestSuitePythonService", bus=session_bus)
object = TestObject(name)