[Telepathy-commits] [telepathy-gabble/master] Implement EnsureChannel for 1-1 tubes; add test
Will Thompson
will.thompson at collabora.co.uk
Thu Sep 25 09:58:43 PDT 2008
---
src/private-tubes-factory.c | 13 +++
tests/twisted/Makefile.am | 1 +
tests/twisted/tubes/ensure-si-tube.py | 167 +++++++++++++++++++++++++++++++++
3 files changed, 181 insertions(+), 0 deletions(-)
create mode 100644 tests/twisted/tubes/ensure-si-tube.py
diff --git a/src/private-tubes-factory.c b/src/private-tubes-factory.c
index 4704f1a..1f952b1 100644
--- a/src/private-tubes-factory.c
+++ b/src/private-tubes-factory.c
@@ -684,6 +684,18 @@ gabble_private_tubes_factory_request_channel (TpChannelManager *manager,
}
+static gboolean
+gabble_private_tubes_factory_ensure_channel (TpChannelManager *manager,
+ gpointer request_token,
+ GHashTable *request_properties)
+{
+ GabblePrivateTubesFactory *self = GABBLE_PRIVATE_TUBES_FACTORY (manager);
+
+ return gabble_private_tubes_factory_requestotron (self, request_token,
+ request_properties, FALSE);
+}
+
+
static void
channel_manager_iface_init (gpointer g_iface,
gpointer iface_data)
@@ -695,4 +707,5 @@ channel_manager_iface_init (gpointer g_iface,
gabble_private_tubes_factory_foreach_channel_class;
iface->create_channel = gabble_private_tubes_factory_create_channel;
iface->request_channel = gabble_private_tubes_factory_request_channel;
+ iface->ensure_channel = gabble_private_tubes_factory_ensure_channel;
}
diff --git a/tests/twisted/Makefile.am b/tests/twisted/Makefile.am
index f4a4d55..e8e3988 100644
--- a/tests/twisted/Makefile.am
+++ b/tests/twisted/Makefile.am
@@ -31,6 +31,7 @@ TWISTED_TESTS = \
tubes/test-muc-offer-dbus-tube.py \
tubes/test-muc-offer-stream-tube-ibb.py \
tubes/test-si-tubes.py \
+ tubes/ensure-si-tube.py \
vcard/test-alias-empty-vcard.py \
vcard/test-alias-pep.py \
vcard/test-alias.py \
diff --git a/tests/twisted/tubes/ensure-si-tube.py b/tests/twisted/tubes/ensure-si-tube.py
new file mode 100644
index 0000000..ea99332
--- /dev/null
+++ b/tests/twisted/tubes/ensure-si-tube.py
@@ -0,0 +1,167 @@
+"""
+Test support for creating and retrieving 1-1 tubes with EnsureChannel
+"""
+
+import base64
+import errno
+import os
+
+import dbus
+from dbus.connection import Connection
+from dbus.lowlevel import SignalMessage
+
+from servicetest import call_async, EventPattern, tp_name_prefix, watch_tube_signals
+from gabbletest import exec_test, acknowledge_iq
+
+from twisted.words.xish import domish, xpath
+from twisted.internet.protocol import Factory, Protocol
+from twisted.internet import reactor
+from twisted.words.protocols.jabber.client import IQ
+
+from gabbleconfig import HAVE_DBUS_TUBES
+
+NS_TUBES = 'http://telepathy.freedesktop.org/xmpp/tubes'
+NS_SI = 'http://jabber.org/protocol/si'
+NS_FEATURE_NEG = 'http://jabber.org/protocol/feature-neg'
+NS_IBB = 'http://jabber.org/protocol/ibb'
+NS_X_DATA = 'jabber:x:data'
+
+sample_parameters = dbus.Dictionary({
+ 's': 'hello',
+ 'ay': dbus.ByteArray('hello'),
+ 'u': dbus.UInt32(123),
+ 'i': dbus.Int32(-123),
+ }, signature='sv')
+
+
+class Echo(Protocol):
+ def dataReceived(self, data):
+ self.transport.write(data)
+
+def set_up_echo():
+ factory = Factory()
+ factory.protocol = Echo
+ try:
+ os.remove(os.getcwd() + '/stream')
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ reactor.listenUNIX(os.getcwd() + '/stream', factory)
+
+
+def test(q, bus, conn, stream):
+ set_up_echo()
+ conn.Connect()
+
+ properties = conn.GetAll(
+ 'org.freedesktop.Telepathy.Connection.Interface.Requests',
+ dbus_interface='org.freedesktop.DBus.Properties')
+ assert properties.get('Channels') == [], properties['Channels']
+ assert ({'org.freedesktop.Telepathy.Channel.ChannelType':
+ 'org.freedesktop.Telepathy.Channel.Type.Tubes',
+ 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1,
+ },
+ ['org.freedesktop.Telepathy.Channel.TargetHandle'],
+ ) in properties.get('RequestableChannelClasses'),\
+ properties['RequestableChannelClasses']
+
+ _, vcard_event, roster_event = q.expect_many(
+ EventPattern('dbus-signal', signal='StatusChanged', args=[0, 1]),
+ EventPattern('stream-iq', to=None, query_ns='vcard-temp',
+ query_name='vCard'),
+ EventPattern('stream-iq', query_ns='jabber:iq:roster'))
+
+ acknowledge_iq(stream, vcard_event.stanza)
+
+ roster = roster_event.stanza
+ roster['type'] = 'result'
+ item = roster_event.query.addElement('item')
+ item['jid'] = 'bob at localhost'
+ item['subscription'] = 'both'
+ stream.send(roster)
+
+ presence = domish.Element(('jabber:client', 'presence'))
+ presence['from'] = 'bob at localhost/Bob'
+ presence['to'] = 'test at localhost/Resource'
+ c = presence.addElement('c')
+ c['xmlns'] = 'http://jabber.org/protocol/caps'
+ c['node'] = 'http://example.com/ICantBelieveItsNotTelepathy'
+ c['ver'] = '1.2.3'
+ stream.send(presence)
+
+ event = q.expect('stream-iq', iq_type='get',
+ query_ns='http://jabber.org/protocol/disco#info',
+ to='bob at localhost/Bob')
+ result = event.stanza
+ result['type'] = 'result'
+ assert event.query['node'] == \
+ 'http://example.com/ICantBelieveItsNotTelepathy#1.2.3'
+ feature = event.query.addElement('feature')
+ feature['var'] = NS_TUBES
+ stream.send(result)
+
+ bob_handle = conn.RequestHandles(1, ['bob at localhost'])[0]
+
+ call_async(q, conn, 'RequestChannel',
+ tp_name_prefix + '.Channel.Type.Tubes', 1, bob_handle, True);
+
+ ret, old_sig, new_sig = q.expect_many(
+ EventPattern('dbus-return', method='RequestChannel'),
+ EventPattern('dbus-signal', signal='NewChannel'),
+ EventPattern('dbus-signal', signal='NewChannels'),
+ )
+
+
+ assert len(ret.value) == 1
+ chan_path = ret.value[0]
+
+
+ # Ensure a tube to the same person; check it's the same one.
+ requestotron = dbus.Interface(conn,
+ 'org.freedesktop.Telepathy.Connection.Interface.Requests')
+ call_async(q, requestotron, 'EnsureChannel',
+ { 'org.freedesktop.Telepathy.Channel.ChannelType':
+ 'org.freedesktop.Telepathy.Channel.Type.Tubes',
+ 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1,
+ 'org.freedesktop.Telepathy.Channel.TargetHandle': bob_handle
+ })
+
+ ret = q.expect('dbus-return', method='EnsureChannel')
+ yours, ensured_path, _ = ret.value
+
+ assert ensured_path == chan_path, (ensured_path, chan_path)
+ assert not yours
+
+ chan = bus.get_object(conn.bus_name, chan_path)
+ chan.Close()
+
+
+ # Now let's try ensuring a new tube.
+ call_async(q, requestotron, 'EnsureChannel',
+ { 'org.freedesktop.Telepathy.Channel.ChannelType':
+ 'org.freedesktop.Telepathy.Channel.Type.Tubes',
+ 'org.freedesktop.Telepathy.Channel.TargetHandleType': 1,
+ 'org.freedesktop.Telepathy.Channel.TargetHandle': bob_handle
+ })
+
+ ret, old_sig, new_sig = q.expect_many(
+ EventPattern('dbus-return', method='EnsureChannel'),
+ EventPattern('dbus-signal', signal='NewChannel'),
+ EventPattern('dbus-signal', signal='NewChannels'),
+ )
+
+ yours, path, props = ret.value
+ assert yours
+
+ emitted_props = new_sig.args[0][0][1]
+ assert props == emitted_props, (props, emitted_props)
+
+ chan = bus.get_object(conn.bus_name, path)
+ chan.Close()
+
+ # OK, we're done
+ conn.Disconnect()
+ q.expect('dbus-signal', signal='StatusChanged', args=[2, 1])
+
+if __name__ == '__main__':
+ exec_test(test)
--
1.5.6.5
More information about the Telepathy-commits
mailing list