[Telepathy-commits] [telepathy-gabble/master] Add a test for Ensuring MUC channels.

Will Thompson will.thompson at collabora.co.uk
Thu Sep 25 06:21:24 PDT 2008


This test also checks that, if there are several pending requests when
the new channel appears, at most one call to EnsureChannel receives
Yours=True
---
 tests/twisted/Makefile.am        |    1 +
 tests/twisted/muc/test-ensure.py |  199 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 200 insertions(+), 0 deletions(-)
 create mode 100644 tests/twisted/muc/test-ensure.py

diff --git a/tests/twisted/Makefile.am b/tests/twisted/Makefile.am
index 851a72c..301bfbc 100644
--- a/tests/twisted/Makefile.am
+++ b/tests/twisted/Makefile.am
@@ -5,6 +5,7 @@ TWISTED_TESTS = \
 	muc/test-muc-ownership.py \
 	muc/test-muc-properties.py \
 	muc/test-muc.py \
+	muc/test-ensure.py \
 	olpc/olpc-muc-invitation.py \
 	olpc/olpc-muc-prop-change.py \
 	olpc/test-olpc-bundle.py \
diff --git a/tests/twisted/muc/test-ensure.py b/tests/twisted/muc/test-ensure.py
new file mode 100644
index 0000000..e04b362
--- /dev/null
+++ b/tests/twisted/muc/test-ensure.py
@@ -0,0 +1,199 @@
+"""
+Test that EnsureChannel works for MUCs, particularly in the case when there
+are several pending requests for the same MUC.
+"""
+
+import dbus
+
+from twisted.words.xish import domish
+
+from gabbletest import go, make_result_iq, exec_test
+from servicetest import call_async, lazy, match, EventPattern
+
+def test(q, bus, conn, stream):
+    conn.Connect()
+
+    q.expect('dbus-signal', signal='StatusChanged', args=[0, 1])
+
+    # Need to call this asynchronously as it involves Gabble sending us a
+    # query.
+    jids = ['chat at conf.localhost', 'chien at conf.localhost']
+    call_async(q, conn, 'RequestHandles', 2, jids)
+
+    # Gabble is stupid and discos the alleged conf server twice.
+    for i in [0,1]:
+        event = q.expect('stream-iq', to='conf.localhost',
+            query_ns='http://jabber.org/protocol/disco#info')
+        result = make_result_iq(stream, event.stanza)
+        feature = result.firstChildElement().addElement('feature')
+        feature['var'] = 'http://jabber.org/protocol/muc'
+        stream.send(result)
+
+    event = q.expect('dbus-return', method='RequestHandles')
+    room_handles = event.value[0]
+
+    test_create_ensure(q, conn, bus, stream, jids[0], room_handles[0])
+    test_ensure_ensure(q, conn, bus, stream, jids[1], room_handles[1])
+
+    conn.Disconnect()
+
+    q.expect('dbus-signal', signal='StatusChanged', args=[2, 1])
+
+    return True
+
+def test_create_ensure(q, conn, bus, stream, room_jid, room_handle):
+    requestotron = dbus.Interface(conn,
+            'org.freedesktop.Telepathy.Connection.Interface.Requests')
+
+    # Call both Create and Ensure for the same channel.
+    call_async(q, requestotron, 'CreateChannel',
+           { 'org.freedesktop.Telepathy.Channel.ChannelType':
+                'org.freedesktop.Telepathy.Channel.Type.Text',
+             'org.freedesktop.Telepathy.Channel.TargetHandleType': 2,
+             'org.freedesktop.Telepathy.Channel.TargetHandle': room_handle,
+           })
+    call_async(q, requestotron, 'EnsureChannel',
+           { 'org.freedesktop.Telepathy.Channel.ChannelType':
+                'org.freedesktop.Telepathy.Channel.Type.Text',
+             'org.freedesktop.Telepathy.Channel.TargetHandleType': 2,
+             'org.freedesktop.Telepathy.Channel.TargetHandle': room_handle,
+           })
+
+    mc, _ = q.expect_many(
+        EventPattern('dbus-signal', signal='MembersChanged'),
+        EventPattern('stream-presence', to=('%s/test' % room_jid)))
+    msg, added, removed, local_pending, remote_pending, actor, reason = mc.args
+
+    assert added == [], mc.args
+    assert removed == [], mc.args
+    assert local_pending == [], mc.args
+    assert len(remote_pending) == 1, mc.args
+
+    # Send presence for other member of room.
+    presence = domish.Element((None, 'presence'))
+    presence['from'] = '%s/bob' % room_jid
+    x = presence.addElement(('http://jabber.org/protocol/muc#user', 'x'))
+    item = x.addElement('item')
+    item['affiliation'] = 'owner'
+    item['role'] = 'moderator'
+    stream.send(presence)
+
+    # Send presence for own membership of room.
+    presence = domish.Element((None, 'presence'))
+    presence['from'] = '%s/test' % room_jid
+    x = presence.addElement(('http://jabber.org/protocol/muc#user', 'x'))
+    item = x.addElement('item')
+    item['affiliation'] = 'none'
+    item['role'] = 'participant'
+    stream.send(presence)
+
+    mc = q.expect('dbus-signal', signal='MembersChanged')
+    msg, added, removed, local_pending, remote_pending, actor, reason = mc.args
+
+    assert len(added) == 2, mc.args
+    assert removed == [], mc.args
+    assert local_pending == [], mc.args
+    assert remote_pending == [], mc.args
+
+    members = conn.InspectHandles(1, added)
+    members.sort()
+    assert members == ['%s/bob' % room_jid, '%s/test' % room_jid], members
+
+    create_event, ensure_event = q.expect_many(
+        EventPattern('dbus-return', method='CreateChannel'),
+        EventPattern('dbus-return', method='EnsureChannel'))
+
+    assert len(create_event.value) == 2
+    c_path, c_props = create_event.value
+
+    assert len(ensure_event.value) == 3
+    yours, e_path, e_props = ensure_event.value
+
+    assert c_path == e_path, (c_path, e_path)
+    assert c_props == e_props, (c_props, e_props)
+
+    assert not yours
+
+
+def test_ensure_ensure(q, conn, bus, stream, room_jid, room_handle):
+    requestotron = dbus.Interface(conn,
+            'org.freedesktop.Telepathy.Connection.Interface.Requests')
+
+    # Call Ensure twice for the same channel.
+    call_async(q, requestotron, 'EnsureChannel',
+           { 'org.freedesktop.Telepathy.Channel.ChannelType':
+                'org.freedesktop.Telepathy.Channel.Type.Text',
+             'org.freedesktop.Telepathy.Channel.TargetHandleType': 2,
+             'org.freedesktop.Telepathy.Channel.TargetHandle': room_handle,
+           })
+    call_async(q, requestotron, 'EnsureChannel',
+           { 'org.freedesktop.Telepathy.Channel.ChannelType':
+                'org.freedesktop.Telepathy.Channel.Type.Text',
+             'org.freedesktop.Telepathy.Channel.TargetHandleType': 2,
+             'org.freedesktop.Telepathy.Channel.TargetHandle': room_handle,
+           })
+
+    mc, _ = q.expect_many(
+        EventPattern('dbus-signal', signal='MembersChanged'),
+        EventPattern('stream-presence', to=('%s/test' % room_jid)))
+    msg, added, removed, local_pending, remote_pending, actor, reason = mc.args
+
+    assert added == [], mc.args
+    assert removed == [], mc.args
+    assert local_pending == [], mc.args
+    assert len(remote_pending) == 1, mc.args
+
+    # Send presence for other member of room.
+    presence = domish.Element((None, 'presence'))
+    presence['from'] = '%s/bob' % room_jid
+    x = presence.addElement(('http://jabber.org/protocol/muc#user', 'x'))
+    item = x.addElement('item')
+    item['affiliation'] = 'owner'
+    item['role'] = 'moderator'
+    stream.send(presence)
+
+    # Send presence for own membership of room.
+    presence = domish.Element((None, 'presence'))
+    presence['from'] = '%s/test' % room_jid
+    x = presence.addElement(('http://jabber.org/protocol/muc#user', 'x'))
+    item = x.addElement('item')
+    item['affiliation'] = 'none'
+    item['role'] = 'participant'
+    stream.send(presence)
+
+    mc = q.expect('dbus-signal', signal='MembersChanged')
+    msg, added, removed, local_pending, remote_pending, actor, reason = mc.args
+
+    assert len(added) == 2, mc.args
+    assert removed == [], mc.args
+    assert local_pending == [], mc.args
+    assert remote_pending == [], mc.args
+
+    members = conn.InspectHandles(1, added)
+    members.sort()
+    assert members == ['%s/bob' % room_jid, '%s/test' % room_jid], members
+
+    # We should get two EnsureChannel returns
+    es = []
+    while len(es) < 2:
+        e = q.expect('dbus-return', method='EnsureChannel')
+        es.append(e)
+
+    e1, e2 = es
+
+    assert len(e1.value) == 3
+    yours1, path1, props1 = e1.value
+
+    assert len(e2.value) == 3
+    yours2, path2, props2 = e2.value
+
+    # Exactly one Ensure should get Yours=True.
+    assert (yours1 == (not yours2))
+
+    assert path1 == path2, (path1, path2)
+    assert props1 == props2, (props1, props2)
+
+
+if __name__ == '__main__':
+    exec_test(test)
+
-- 
1.5.6.5




More information about the Telepathy-commits mailing list