[telepathy-gabble/telepathy-gabble-0.8] Tests: extract stream name(s) from session-initiate

Will Thompson will.thompson at collabora.co.uk
Wed Sep 2 09:26:03 PDT 2009


This also adds some simple tests about the session-initiate that Gabble
sends on old-school and current Jingle (but not on GTalk4).
---
 tests/twisted/jingle/jingletest2.py |   83 ++++++++++++++++++++++++++++++----
 1 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/tests/twisted/jingle/jingletest2.py b/tests/twisted/jingle/jingletest2.py
index ee0d1d0..829c84b 100644
--- a/tests/twisted/jingle/jingletest2.py
+++ b/tests/twisted/jingle/jingletest2.py
@@ -119,11 +119,11 @@ class JingleProtocol:
     def match_jingle_action(self, q, action):
         return q is not None and q.name == 'jingle' and q['action'] == action
 
-    def extract_session_id(self, query):
+    def _extract_session_id(self, query):
         return query['sid']
 
     def validate_session_initiate(self, query):
-        return True
+        raise NotImplementedError()
 
     def can_do_video(self):
         return True
@@ -207,14 +207,15 @@ class GtalkProtocol03(JingleProtocol):
     def TransportGoogleP2P(self):
         return None
 
-    def extract_session_id(self, query):
+    def _extract_session_id(self, query):
         return query['id']
 
     def can_do_video_only(self):
         return False
 
     def validate_session_initiate(self, query):
-        assert query['id'] != None
+        sid = self._extract_session_id(query)
+
         # No transport in GTalk03
         assert xpath.queryForNodes('/session/transport', query) == None
 
@@ -232,8 +233,9 @@ class GtalkProtocol03(JingleProtocol):
             assert xpath.queryForNodes(
                 '/session/description/payload-type[@xmlns="%s"]' %
                     ns.GOOGLE_SESSION_PHONE, query)
-
-        return True
+            return (sid, ['fake-audio'], ['fake-video'])
+        else:
+            return (sid, ['fake-audio'], [])
 
     def seperate_contents(self):
         return False
@@ -279,9 +281,13 @@ class GtalkProtocol04(JingleProtocol):
         action = self._action_map(action)
         return q is not None and q.name == 'session' and q['type'] == action
 
-    def extract_session_id(self, query):
+    def _extract_session_id(self, query):
         return query['id']
 
+    def validate_session_initiate(self, query):
+        # FIXME: validate it!
+        return (self._extract_session_id(query), ['fake-audio'], [])
+
     def can_do_video(self):
         return False
 
@@ -312,6 +318,36 @@ class JingleProtocol015(JingleProtocol):
             namespace = 'unexistent-namespace'
         return ('description', namespace, { 'type': type }, children)
 
+    def validate_session_initiate(self, query):
+        contents = xpath.queryForNodes(
+            '/jingle[@xmlns="%s"]/content' % ns.JINGLE_015,
+            query)
+
+        audio, video = [], []
+
+        for c in contents:
+            a_desc = xpath.queryForNodes(
+                '/content/description[@xmlns="%s"]' % ns.JINGLE_015_AUDIO,
+                c)
+            v_desc = xpath.queryForNodes(
+                '/content/description[@xmlns="%s"]' % ns.JINGLE_015_VIDEO,
+                c)
+
+            if a_desc is not None:
+                assert len(a_desc) == 1, c.toXml()
+                assert v_desc is None
+                audio.append(c['name'])
+            elif v_desc is not None:
+                assert len(v_desc) == 1, c.toXml()
+                assert a_desc is None
+                video.append(c['name'])
+            else:
+                assert False, c.toXml()
+
+        assert len(audio) + len(video) > 0, query.toXml()
+
+        return (self._extract_session_id(query), audio, video)
+
 class JingleProtocol031(JingleProtocol):
     features = [ ns.JINGLE, ns.JINGLE_RTP, ns.JINGLE_RTP_AUDIO,
         ns.JINGLE_RTP_VIDEO, ns.GOOGLE_P2P ]
@@ -346,6 +382,33 @@ class JingleProtocol031(JingleProtocol):
 
         return EventPattern('stream-iq', predicate=p)
 
+    def validate_session_initiate(self, query):
+        contents = xpath.queryForNodes(
+            '/jingle[@xmlns="%s"]/content' % ns.JINGLE,
+            query)
+
+        audio, video = [], []
+
+        for c in contents:
+            descs = xpath.queryForNodes(
+                '/content/description[@xmlns="%s"]' % ns.JINGLE_RTP,
+                c)
+
+            assert len(descs) == 1, c.toXml()
+
+            d = descs[0]
+
+            if d['media'] == 'audio':
+                audio.append(c['name'])
+            elif d['media'] == 'video':
+                video.append(c['name'])
+            else:
+                assert False, c.toXml()
+
+        assert len(audio) + len(video) > 0, query.toXml()
+
+        return (self._extract_session_id(query), audio, video)
+
 class JingleTest2:
     # Default caps for the remote end
     remote_caps = { 'ext': '', 'ver': '0.0.0',
@@ -476,9 +539,9 @@ class JingleTest2:
         self.stream.send(jp.xml(node))
 
     def parse_session_initiate (self, query):
-        # Validate the session initiate and get some useful ifo from it
-        self.jp.validate_session_initiate (query)
-        self.sid = self.jp.extract_session_id(query)
+        # Validate the session initiate and get some useful info from it
+        self.sid, self.audio_names, self.video_names = \
+            self.jp.validate_session_initiate(query)
 
     def accept(self, with_video=False):
         jp = self.jp
-- 
1.5.6.5




More information about the telepathy-commits mailing list