[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