[telepathy-mission-control/master] Add a simple regression test for avatars
Simon McVittie
simon.mcvittie at collabora.co.uk
Tue Jun 2 11:05:13 PDT 2009
---
test/twisted/Makefile.am | 1 +
test/twisted/account-manager/avatar.py | 85 ++++++++++++++++++++++++++++++++
test/twisted/mctest.py | 43 +++++++++++++++-
3 files changed, 126 insertions(+), 3 deletions(-)
create mode 100644 test/twisted/account-manager/avatar.py
diff --git a/test/twisted/Makefile.am b/test/twisted/Makefile.am
index 6090631..8af1d01 100644
--- a/test/twisted/Makefile.am
+++ b/test/twisted/Makefile.am
@@ -3,6 +3,7 @@ TWISTED_TESTS =
TWISTED_BASIC_TESTS = \
account-bad-cm.py \
account-manager/auto-away.py \
+ account-manager/avatar.py \
account-manager/create-with-properties.py \
account-manager/nickname.py \
account-manager/old-create-with-properties.py \
diff --git a/test/twisted/account-manager/avatar.py b/test/twisted/account-manager/avatar.py
new file mode 100644
index 0000000..4dc9bc6
--- /dev/null
+++ b/test/twisted/account-manager/avatar.py
@@ -0,0 +1,85 @@
+import dbus
+import dbus.service
+
+from servicetest import EventPattern, tp_name_prefix, tp_path_prefix, \
+ call_async
+from mctest import exec_test, create_fakecm_account, enable_fakecm_account
+import constants as cs
+
+def test(q, bus, mc):
+ account_manager = bus.get_object(cs.AM, cs.AM_PATH)
+ account_manager_iface = dbus.Interface(account_manager, cs.AM)
+
+ params = dbus.Dictionary({"account": "me at example.com",
+ "password": "secrecy"}, signature='sv')
+ (cm_name_ref, account) = create_fakecm_account(q, bus, mc, params)
+
+ account_iface = dbus.Interface(account, cs.ACCOUNT)
+ account_props = dbus.Interface(account, cs.PROPERTIES_IFACE)
+
+ call_async(q, account_props, 'Set', cs.ACCOUNT_IFACE_AVATAR, 'Avatar',
+ dbus.Struct((dbus.ByteArray('AAAA'), 'image/jpeg')))
+ q.expect_many(
+ EventPattern('dbus-signal',
+ path=account.object_path,
+ signal='AvatarChanged',
+ interface=cs.ACCOUNT_IFACE_AVATAR,
+ args=[]),
+ EventPattern('dbus-return', method='Set'),
+ )
+ assert account_props.Get(cs.ACCOUNT_IFACE_AVATAR, 'Avatar',
+ byte_arrays=True) == ('AAAA', 'image/jpeg')
+
+ # OK, let's go online. The avatar is set regardless of the CM
+ conn, e = enable_fakecm_account(q, bus, mc, account, params,
+ has_avatars=True, avatars_persist=True,
+ expect_after_connect=[
+ EventPattern('dbus-method-call',
+ interface=cs.CONN_IFACE_AVATARS, method='SetAvatar',
+ handled=True, args=['AAAA', 'image/jpeg']),
+ ])
+
+ # Change avatar after going online
+ call_async(q, account_props, 'Set', cs.ACCOUNT_IFACE_AVATAR, 'Avatar',
+ (dbus.ByteArray('BBBB'), 'image/png'))
+
+ q.expect_many(
+ EventPattern('dbus-method-call',
+ interface=cs.CONN_IFACE_AVATARS, method='SetAvatar',
+ args=['BBBB', 'image/png'],
+ handled=True),
+ EventPattern('dbus-signal', path=account.object_path,
+ interface=cs.ACCOUNT_IFACE_AVATAR, signal='AvatarChanged'),
+ EventPattern('dbus-return', method='Set')
+ )
+
+ assert account_props.Get(cs.ACCOUNT_IFACE_AVATAR, 'Avatar',
+ byte_arrays=True) == ('BBBB', 'image/png')
+
+ someone_else = conn.ensure_handle(cs.HT_CONTACT, 'alberto at example.com')
+
+ # Another contact changes their avatar: ignored
+ q.dbus_emit(conn.object_path, cs.CONN_IFACE_AVATARS, 'AvatarUpdated',
+ someone_else, "mardy's avatar token", signature='us')
+
+ # Another client changes our avatar remotely
+ q.dbus_emit(conn.object_path, cs.CONN_IFACE_AVATARS, 'AvatarUpdated',
+ conn.self_handle, 'CCCC', signature='us')
+
+ e = q.expect('dbus-method-call',
+ interface=cs.CONN_IFACE_AVATARS, method='RequestAvatars',
+ args=[[conn.self_handle]],
+ handled=False)
+
+ q.dbus_return(e.message, signature='')
+ q.dbus_emit(conn.object_path, cs.CONN_IFACE_AVATARS,
+ 'AvatarRetrieved', conn.self_handle, 'CCCC',
+ dbus.ByteArray('CCCC'), 'image/svg', signature='usays')
+ q.expect('dbus-signal', path=account.object_path,
+ interface=cs.ACCOUNT_IFACE_AVATAR, signal='AvatarChanged'),
+
+ assert account_props.Get(cs.ACCOUNT_IFACE_AVATAR, 'Avatar',
+ byte_arrays=True) == ('CCCC', 'image/svg')
+
+if __name__ == '__main__':
+ exec_test(test, {})
diff --git a/test/twisted/mctest.py b/test/twisted/mctest.py
index 5c88df0..f54e158 100644
--- a/test/twisted/mctest.py
+++ b/test/twisted/mctest.py
@@ -141,7 +141,8 @@ class SimulatedConnection(object):
def __init__(self, q, bus, cmname, protocol, account_part, self_ident,
implement_get_interfaces=True, has_requests=True,
- has_presence=False, has_aliasing=False, has_avatars=False):
+ has_presence=False, has_aliasing=False, has_avatars=False,
+ avatars_persist=True):
self.q = q
self.bus = bus
@@ -162,6 +163,13 @@ class SimulatedConnection(object):
self.has_presence = has_presence
self.has_aliasing = has_aliasing
self.has_avatars = has_avatars
+ self.avatars_persist = avatars_persist
+
+ if self.avatars_persist:
+ self.avatar = dbus.Struct((dbus.ByteArray('my old avatar'),
+ 'text/plain'), signature='ays')
+ else:
+ self.avatar = None
q.add_dbus_method_impl(self.Connect,
path=self.object_path, interface=cs.CONN, method='Connect')
@@ -220,6 +228,12 @@ class SimulatedConnection(object):
q.add_dbus_method_impl(self.GetAll_Avatars,
path=self.object_path, interface=cs.PROPERTIES_IFACE,
method='GetAll', args=[cs.CONN_IFACE_AVATARS])
+ q.add_dbus_method_impl(self.GetKnownAvatarTokens,
+ path=self.object_path, interface=cs.CONN_IFACE_AVATARS,
+ method='GetKnownAvatarTokens')
+ q.add_dbus_method_impl(self.SetAvatar,
+ path=self.object_path, interface=cs.CONN_IFACE_AVATARS,
+ method='SetAvatar')
self.statuses = dbus.Dictionary({
'available': (cs.PRESENCE_TYPE_AVAILABLE, True, True),
@@ -254,6 +268,28 @@ class SimulatedConnection(object):
'MaximumAvatarBytes': 8192,
}, signature='a{sv}')
+ def GetKnownAvatarTokens(self, e):
+ ret = dbus.Dictionary(signature='us')
+
+ # the user has an avatar already; nobody else does
+ if self.self_handle in e.args[0]:
+ if self.avatar is None:
+ ret[self.self_handle] = ''
+ else:
+ # we just stringify the avatar as the token
+ ret[self.self_handle] = str(self.avatar[0])
+
+ self.q.dbus_return(e.message, ret, signature='a{us}')
+
+ def SetAvatar(self, e):
+ self.avatar = dbus.Struct(e.args, signature='ays')
+
+ # we just stringify the avatar as the token
+ self.q.dbus_return(e.message, str(self.avatar[0]), signature='s')
+ self.q.dbus_emit(self.object_path, cs.CONN_IFACE_AVATARS,
+ 'AvatarRetrieved', self.self_handle, str(self.avatar[0]),
+ self.avatar[0], self.avatar[1], signature='usays')
+
def GetPresences(self, e):
ret = dbus.Dictionary(signature='u(uss)')
contacts = e.args[0]
@@ -644,7 +680,7 @@ def create_fakecm_account(q, bus, mc, params):
def enable_fakecm_account(q, bus, mc, account, expected_params,
has_requests=True, has_presence=False, has_aliasing=False,
- has_avatars=False,
+ has_avatars=False, avatars_persist=True,
requested_presence=(2, 'available', ''),
expect_after_connect=[]):
# Enable the account
@@ -669,7 +705,8 @@ def enable_fakecm_account(q, bus, mc, account, expected_params,
conn = SimulatedConnection(q, bus, 'fakecm', 'fakeprotocol', '_',
'myself', has_requests=has_requests, has_presence=has_presence,
- has_aliasing=has_aliasing, has_avatars=has_avatars)
+ has_aliasing=has_aliasing, has_avatars=has_avatars,
+ avatars_persist=avatars_persist)
q.dbus_return(e.message, conn.bus_name, conn.object_path, signature='so')
--
1.5.6.5
More information about the telepathy-commits
mailing list