* 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
This commit is contained in:
John (J5) Palmieri 2005-10-14 21:44:00 +00:00
parent 7667a2ae4a
commit 0ae9f138ad
6 changed files with 56 additions and 10 deletions

View file

@ -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>

View file

@ -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:

View file

@ -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)
reply = _dispatch_dbus_method_call(target_methods, self, args, message)
self._connection.send(reply)
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):

View file

@ -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

View file

@ -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 ***********"

View file

@ -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)