[Telepathy-commits] [telepathy-gabble/master] Add regression test for fd.o bug #18918
Will Thompson
will.thompson at collabora.co.uk
Thu Dec 11 04:53:58 PST 2008
---
tests/twisted/Makefile.am | 1 +
tests/twisted/jingle/jingletest.py | 11 ++-
tests/twisted/jingle/payload-types.py | 149 +++++++++++++++++++++++++++++++++
3 files changed, 160 insertions(+), 1 deletions(-)
create mode 100644 tests/twisted/jingle/payload-types.py
diff --git a/tests/twisted/Makefile.am b/tests/twisted/Makefile.am
index 653b0fb..4a5f32c 100644
--- a/tests/twisted/Makefile.am
+++ b/tests/twisted/Makefile.am
@@ -58,6 +58,7 @@ TWISTED_TESTS = \
vcard/test-vcard-set-and-get.py \
jingle/hold-audio.py \
jingle/hold-av.py \
+ jingle/payload-types.py \
jingle/test-content-adding-removal.py \
jingle/test-incoming-call.py \
jingle/test-incoming-call-reject.py \
diff --git a/tests/twisted/jingle/jingletest.py b/tests/twisted/jingle/jingletest.py
index 1102451..3d224dd 100644
--- a/tests/twisted/jingle/jingletest.py
+++ b/tests/twisted/jingle/jingletest.py
@@ -139,7 +139,7 @@ class JingleTest:
self.stream.send(reply.toXml())
- def incoming_call(self):
+ def incoming_call(self, codec_parameters=None):
self.direction = 'incoming'
if self.google_mode:
@@ -159,10 +159,19 @@ class JingleTest:
p = domish.Element((None, 'payload-type'))
p['name'] = codec
p['id'] = str(id)
+
if self.google_mode:
p['clockrate'] = p['bitrate'] = str(rate)
else:
p['rate'] = str(rate)
+
+ if codec_parameters is not None:
+ for name, value in codec_parameters.iteritems():
+ param = domish.Element((None, 'parameter'))
+ param['name'] = name
+ param['value'] = value
+ p.addChild(param)
+
desc.addChild(p)
xport = domish.Element(("http://www.google.com/transport/p2p", 'transport'))
diff --git a/tests/twisted/jingle/payload-types.py b/tests/twisted/jingle/payload-types.py
new file mode 100644
index 0000000..f536202
--- /dev/null
+++ b/tests/twisted/jingle/payload-types.py
@@ -0,0 +1,149 @@
+"""
+Regression test for https://bugs.freedesktop.org/show_bug.cgi?id=18918
+"""
+
+from gabbletest import exec_test, make_result_iq, sync_stream, \
+ send_error_reply
+from servicetest import make_channel_proxy, unwrap, tp_path_prefix, \
+ call_async, EventPattern
+from twisted.words.xish import domish
+import jingletest
+import gabbletest
+import dbus
+import time
+
+
+def test(q, bus, conn, stream):
+ jt = jingletest.JingleTest(stream, 'test at localhost', 'foo at bar.com/Foo')
+
+ # Connecting
+ conn.Connect()
+
+ q.expect('dbus-signal', signal='StatusChanged', args=[1, 1])
+
+ q.expect('stream-authenticated')
+ q.expect('dbus-signal', signal='PresenceUpdate',
+ args=[{1L: (0L, {u'available': {}})}])
+ q.expect('dbus-signal', signal='StatusChanged', args=[0, 1])
+
+ self_handle = conn.GetSelfHandle()
+
+ # We need remote end's presence for capabilities
+ jt.send_remote_presence()
+
+ # Gabble doesn't trust it, so makes a disco
+ event = q.expect('stream-iq', query_ns='http://jabber.org/protocol/disco#info',
+ to='foo at bar.com/Foo')
+
+ jt.send_remote_disco_reply(event.stanza)
+
+ # Force Gabble to process the caps before calling RequestChannel
+ sync_stream(q, stream)
+
+ handle = conn.RequestHandles(1, [jt.remote_jid])[0]
+
+ path = conn.RequestChannel(
+ 'org.freedesktop.Telepathy.Channel.Type.StreamedMedia',
+ 1, handle, True)
+
+ channel = bus.get_object(conn.bus_name, path)
+ signalling_iface = make_channel_proxy(conn, path, 'Channel.Interface.MediaSignalling')
+ media_iface = make_channel_proxy(conn, path, 'Channel.Type.StreamedMedia')
+ group_iface = make_channel_proxy(conn, path, 'Channel.Interface.Group')
+
+ # FIXME: Hack to make sure the disco info has been processed - we need to
+ # send Gabble some XML that will cause an event when processed, and
+ # wait for that event (until
+ # https://bugs.freedesktop.org/show_bug.cgi?id=15769 is fixed)
+ el = domish.Element(('jabber.client', 'presence'))
+ el['from'] = 'bob at example.com/Bar'
+ stream.send(el.toXml())
+ q.expect('dbus-signal', signal='PresenceUpdate')
+ # OK, now we can continue. End of hack
+
+
+ # Test that codec parameters are correctly sent in <parameter> children of
+ # <payload-type> rather than as attributes of the latter.
+
+ media_iface.RequestStreams(handle, [0]) # 0 == MEDIA_STREAM_TYPE_AUDIO
+
+ # S-E gets notified about new session handler, and calls Ready on it
+ e = q.expect('dbus-signal', signal='NewSessionHandler')
+ assert e.args[1] == 'rtp'
+
+ session_handler = make_channel_proxy(conn, e.args[0], 'Media.SessionHandler')
+ session_handler.Ready()
+
+ e = q.expect('dbus-signal', signal='NewStreamHandler')
+ stream_id = e.args[1]
+
+ stream_handler = make_channel_proxy(conn, e.args[0], 'Media.StreamHandler')
+ stream_handler.NewNativeCandidate("fake", jt.get_remote_transports_dbus())
+
+ codecs = dbus.Array( [ (96, 'speex', 0, 16000, 0, {'vbr': 'on'}) ],
+ signature='(usuuua{ss})')
+ stream_handler.Ready(codecs)
+ stream_handler.StreamState(2)
+
+ e = q.expect('stream-iq')
+ content = list(e.query.elements())[0]
+ assert content.name == 'content'
+ for child in content.elements():
+ if child.name == 'description':
+ description = child
+ break
+ assert description is not None
+
+ # there should be one <payload-type> tag for speex:
+ assert len(list(description.elements())) == 1
+ payload_type = list(description.elements())[0]
+ assert payload_type.name == 'payload-type'
+ assert payload_type['name'] == 'speex'
+
+ # the vbr parameter should not be an attribute on the <payload-type>, but
+ # a child <parameter/> tag
+ assert 'vbr' not in payload_type.attributes
+ assert len(list(payload_type.elements())) == 1
+ parameter = list(payload_type.elements())[0]
+ assert parameter.name == 'parameter'
+ assert parameter['name'] == 'vbr'
+ assert parameter['value'] == 'on'
+
+ channel.Close()
+
+
+ # Test that codec parameters are correctly extracted from <parameter>
+ # children of <payload-type> rather than from attributes of the latter.
+
+ jt.incoming_call({'misc': 'other'})
+
+ e = q.expect('dbus-signal', signal='NewSessionHandler')
+ assert e.args[1] == 'rtp'
+
+ session_handler = make_channel_proxy(conn, e.args[0], 'Media.SessionHandler')
+ session_handler.Ready()
+
+ e = q.expect('dbus-signal', signal='NewStreamHandler')
+ stream_id = e.args[1]
+
+ stream_handler = make_channel_proxy(conn, e.args[0], 'Media.StreamHandler')
+ stream_handler.Ready( dbus.Array( [], signature='(usuuua{ss})'))
+
+ e = q.expect('dbus-signal', signal='SetRemoteCodecs')
+ for codec in e.args[0]:
+ id, name, type, rate, channels, parameters = codec
+ assert len(parameters) == 1, parameters
+ assert parameters['misc'] == 'other', parameters
+
+ print e.args[0]
+ # Test completed, close the connection
+
+ conn.Disconnect()
+ q.expect('dbus-signal', signal='StatusChanged', args=[2, 1])
+
+ return True
+
+
+if __name__ == '__main__':
+ exec_test(test)
+
--
1.5.6.5
More information about the Telepathy-commits
mailing list