test/test-service.py: Use constants for the bus name and object path
[dbus-python-phuang.git] / test / test-service.py
blob6c6880a5afd414ff03b9e41600b506f7f1fd42e5
1 #!/usr/bin/env python
3 # Copyright (C) 2004 Red Hat Inc. <http://www.redhat.com/>
4 # Copyright (C) 2005, 2006 Collabora Ltd. <http://www.collabora.co.uk/>
6 # Licensed under the Academic Free License version 2.1
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 import sys
23 import os
24 import logging
26 builddir = os.path.normpath(os.environ["DBUS_TOP_BUILDDIR"])
27 pydir = os.path.normpath(os.environ["DBUS_TOP_SRCDIR"])
29 import dbus
31 if not dbus.__file__.startswith(pydir):
32 raise Exception("DBus modules are not being picked up from the package")
34 import dbus.service
35 import dbus.glib
36 import gobject
37 import random
40 logging.basicConfig(filename=builddir + '/test/test-service.log', filemode='w')
41 logging.getLogger().setLevel(1)
42 logger = logging.getLogger('test-service')
45 NAME = "org.freedesktop.DBus.TestSuitePythonService"
46 IFACE = "org.freedesktop.DBus.TestSuiteInterface"
47 OBJECT = "/org/freedesktop/DBus/TestSuitePythonObject"
49 class TestInterface(dbus.service.Interface):
50 @dbus.service.method(IFACE, in_signature='', out_signature='b')
51 def CheckInheritance(self):
52 return False
54 class TestObject(dbus.service.Object, TestInterface):
55 def __init__(self, bus_name, object_path=OBJECT):
56 dbus.service.Object.__init__(self, bus_name, object_path)
58 """ Echo whatever is sent
59 """
60 @dbus.service.method(IFACE)
61 def Echo(self, arg):
62 return arg
64 @dbus.service.method(IFACE, in_signature='s', out_signature='s')
65 def AcceptUnicodeString(self, foo):
66 assert isinstance(foo, unicode), (foo, foo.__class__.__mro__)
67 return foo
69 @dbus.service.method(IFACE, in_signature='s', out_signature='s', utf8_strings=True)
70 def AcceptUTF8String(self, foo):
71 assert isinstance(foo, str), (foo, foo.__class__.__mro__)
72 return foo
74 @dbus.service.method(IFACE, in_signature='', out_signature='soss',
75 sender_keyword='sender', path_keyword='path',
76 destination_keyword='dest', message_keyword='msg')
77 def MethodExtraInfoKeywords(self, sender=None, path=None, dest=None,
78 msg=None):
79 return (sender, path, dest,
80 msg.__class__.__module__ + '.' + msg.__class__.__name__)
82 @dbus.service.method(IFACE, in_signature='ay', out_signature='ay')
83 def AcceptListOfByte(self, foo):
84 assert isinstance(foo, list), (foo, foo.__class__.__mro__)
85 return foo
87 @dbus.service.method(IFACE, in_signature='ay', out_signature='ay', byte_arrays=True)
88 def AcceptByteArray(self, foo):
89 assert isinstance(foo, str), (foo, foo.__class__.__mro__)
90 return foo
92 @dbus.service.method(IFACE)
93 def GetComplexArray(self):
94 ret = []
95 for i in range(0,100):
96 ret.append((random.randint(0,100), random.randint(0,100), str(random.randint(0,100))))
98 return dbus.Array(ret, signature="(uus)")
100 def returnValue(self, test):
101 if test == 0:
102 return ""
103 elif test == 1:
104 return "",""
105 elif test == 2:
106 return "","",""
107 elif test == 3:
108 return []
109 elif test == 4:
110 return {}
111 elif test == 5:
112 return ["",""]
113 elif test == 6:
114 return ["","",""]
116 @dbus.service.method(IFACE, in_signature='u', out_signature='s')
117 def ReturnOneString(self, test):
118 return self.returnValue(test)
120 @dbus.service.method(IFACE, in_signature='u', out_signature='ss')
121 def ReturnTwoStrings(self, test):
122 return self.returnValue(test)
124 @dbus.service.method(IFACE, in_signature='u', out_signature='(ss)')
125 def ReturnStruct(self, test):
126 logger.info('ReturnStruct(%r) -> %r', test, self.returnValue(test))
127 return self.returnValue(test)
129 @dbus.service.method(IFACE, in_signature='u', out_signature='as')
130 def ReturnArray(self, test):
131 return self.returnValue(test)
133 @dbus.service.method(IFACE, in_signature='u', out_signature='a{ss}')
134 def ReturnDict(self, test):
135 return self.returnValue(test)
137 @dbus.service.signal(IFACE, signature='s')
138 def SignalOneString(self, test):
139 logger.info('SignalOneString(%r)', test)
141 @dbus.service.signal(IFACE, signature='ss')
142 def SignalTwoStrings(self, test, test2):
143 logger.info('SignalTwoStrings(%r, %r)', test, test2)
145 @dbus.service.signal(IFACE, signature='(ss)')
146 def SignalStruct(self, test):
147 logger.info('SignalStruct(%r)', test)
149 @dbus.service.signal(IFACE, signature='as')
150 def SignalArray(self, test):
151 pass
153 @dbus.service.signal(IFACE, signature='a{ss}')
154 def SignalDict(self, test):
155 pass
157 @dbus.service.method(IFACE, in_signature='su', out_signature='')
158 def EmitSignal(self, signal, value):
159 sig = getattr(self, str(signal), None)
160 assert(sig != None)
162 val = self.returnValue(value)
163 # make two string case work by passing arguments in by tuple
164 if (signal == 'SignalTwoStrings' and (value == 1 or value == 5)):
165 val = tuple(val)
166 else:
167 val = tuple([val])
169 logger.info('Emitting %s with %r', signal, val)
170 sig(*val)
172 def CheckInheritance(self):
173 return True
175 @dbus.service.method(IFACE, in_signature='bbv', out_signature='v', async_callbacks=('return_cb', 'error_cb'))
176 def AsynchronousMethod(self, async, fail, variant, return_cb, error_cb):
177 try:
178 if async:
179 gobject.timeout_add(500, self.AsynchronousMethod, False, fail, variant, return_cb, error_cb)
180 return
181 else:
182 if fail:
183 raise RuntimeError
184 else:
185 return_cb(variant)
187 return False # do not run again
188 except Exception, e:
189 error_cb(e)
191 @dbus.service.method(IFACE, in_signature='', out_signature='s', sender_keyword='sender')
192 def WhoAmI(self, sender):
193 return sender
195 @dbus.service.method(IFACE)
196 def MultipleReturnWithoutSignature(self):
197 # https://bugs.freedesktop.org/show_bug.cgi?id=10174
198 return dbus.String('abc'), dbus.Int32(123)
200 session_bus = dbus.SessionBus()
201 name = dbus.service.BusName(NAME, bus=session_bus)
202 object = TestObject(name)
203 loop = gobject.MainLoop()
204 loop.run()