[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