changeset 4063:e12936318177

tests (units): tests for plugin XEP-0294: fix 438
author Goffi <goffi@goffi.org>
date Tue, 30 May 2023 17:58:44 +0200
parents 18719058a914
children 08ee0e623e7e
files tests/unit/test_plugin_xep_0294.py
diffstat 1 files changed, 219 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/unit/test_plugin_xep_0294.py	Tue May 30 17:58:44 2023 +0200
@@ -0,0 +1,219 @@
+#!/usr/bin/env python3
+
+# Libervia: an XMPP client
+# Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+from twisted.words.xish import domish
+
+from sat.plugins.plugin_xep_0294 import NS_JINGLE_RTP_HDREXT, XEP_0294
+from sat.tools.xml_tools import parse
+
+
+class TestXEP0294:
+    def test_extmap_attribute(self, host):
+        """Session level 'extmap' SDP attribute are set to application_data"""
+        xep_0294 = XEP_0294(host)
+
+        call_data = {}
+        # "a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level"
+        parts = ["1", "urn:ietf:params:rtp-hdrext:ssrc-audio-level"]
+
+        # Call the method with application_data as None to make is a session level
+        # attribute
+        xep_0294._parse_sdp_a_trigger("extmap", parts, call_data, {}, "audio", None, {})
+
+        # Call the method again with application_data set
+        application_data = {}
+        xep_0294._parse_sdp_a_trigger(
+            "", [], call_data, {}, "audio", application_data, {}
+        )
+
+        # Assert data has been correctly transferred
+        assert application_data == {
+            "rtp-hdrext": {
+                "1": {
+                    "id": "1",
+                    "uri": "urn:ietf:params:rtp-hdrext:ssrc-audio-level",
+                    "senders": "both",
+                }
+            }
+        }
+
+    def test_extmap_allow_mixed_attribute(self, host):
+        """Session level 'extmap-allow-mixed' SDP attribute are set to application_data"""
+        xep_0294 = XEP_0294(host)
+
+        call_data = {}
+
+        # Call the method with application_data as None to make is a session level
+        # attribute
+        xep_0294._parse_sdp_a_trigger(
+            "extmap-allow-mixed", [], call_data, {}, "audio", None, {}
+        )
+
+        # Call the method again with application_data set
+        application_data = {}
+        xep_0294._parse_sdp_a_trigger(
+            "", [], call_data, {}, "audio", application_data, {}
+        )
+
+        # Assert value has been correctly transferred
+        assert application_data == {"extmap-allow-mixed": True}
+
+    def test_generate_sdp_content(self, host):
+        """SDP for 'extmap' and 'extmap-allow-mixed' attributes is correctly generated"""
+        xep_0294 = XEP_0294(host)
+
+        session = {}
+        local = False
+        idx = 0
+        content_data = {}
+        sdp_lines = []
+        application_data = {}
+        app_data_key = "rtp-hdrext"
+        media_data = {
+            "rtp-hdrext": {
+                "1": {
+                    "id": "1",
+                    "uri": "urn:ietf:params:rtp-hdrext:ssrc-audio-level",
+                    "senders": "both",
+                    "parameters": {"param1": "value1", "param2": "value2"},
+                },
+                "2": {
+                    "id": "2",
+                    "uri": "urn:ietf:params:rtp-hdrext:time-offset",
+                    "senders": "initiator",
+                },
+                "3": {
+                    "id": "3",
+                    "uri": "urn:ietf:params:rtp-hdrext:toffset",
+                    "senders": "none",
+                },
+            },
+            "extmap-allow-mixed": True,
+        }
+        media = "audio"
+
+        xep_0294._generate_sdp_content_trigger(
+            session,
+            local,
+            idx,
+            content_data,
+            sdp_lines,
+            application_data,
+            app_data_key,
+            media_data,
+            media,
+        )
+
+        assert sdp_lines == [
+            "a=extmap:1/sendrecv urn:ietf:params:rtp-hdrext:ssrc-audio-level param1=value1 param2=value2",
+            "a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:time-offset",
+            "a=extmap:3/inactive urn:ietf:params:rtp-hdrext:toffset",
+            "a=extmap-allow-mixed",
+        ]
+
+    def test_parse_description(self, host):
+        """'rtp-hdrext' and 'extmap-allow-mixed' elements are correctly parsed"""
+        xep_0294 = XEP_0294(host)
+        media_data = {}
+
+        desc_elt_str = """
+        <description>
+            <rtp-hdrext xmlns='urn:xmpp:jingle:apps:rtp:rtp-hdrext:0'
+                        id='1'
+                        uri='urn:ietf:params:rtp-hdrext:ssrc-audio-level'
+                        senders='both'>
+                <parameter xmlns='urn:xmpp:jingle:apps:rtp:rtp-hdrext:0'
+                           name='vad'
+                           value='on'/>
+            </rtp-hdrext>
+            <rtp-hdrext xmlns='urn:xmpp:jingle:apps:rtp:rtp-hdrext:0'
+                        id='2'
+                        uri='urn:ietf:params:rtp-hdrext:toffset'
+                        senders='initiator'/>
+            <extmap-allow-mixed xmlns='urn:xmpp:jingle:apps:rtp:rtp-hdrext:0'/>
+        </description>
+        """
+        desc_elt = parse(desc_elt_str)
+
+        xep_0294._parse_description_trigger(desc_elt, media_data)
+
+        assert media_data == {
+            "rtp-hdrext": {
+                "1": {
+                    "id": "1",
+                    "uri": "urn:ietf:params:rtp-hdrext:ssrc-audio-level",
+                    "senders": "both",
+                    "parameters": {"vad": "on"},
+                },
+                "2": {
+                    "id": "2",
+                    "uri": "urn:ietf:params:rtp-hdrext:toffset",
+                    "senders": "initiator",
+                },
+            },
+            "extmap-allow-mixed": True,
+        }
+
+    def test_build_description(self, host):
+        """'rtp-hdrext' and 'extmap-allow-mixed' elements are correctly built"""
+        xep_0294 = XEP_0294(host)
+
+        desc_elt = domish.Element((None, "description"))
+        media_data = {
+            "rtp-hdrext": {
+                "1": {
+                    "id": "1",
+                    "uri": "urn:ietf:params:rtp-hdrext:ssrc-audio-level",
+                    "senders": "both",
+                    "parameters": {"vad": "on"},
+                },
+                "2": {
+                    "id": "2",
+                    "uri": "urn:ietf:params:rtp-hdrext:toffset",
+                    "senders": "initiator",
+                },
+            },
+            "extmap-allow-mixed": True,
+        }
+
+        xep_0294._build_description_trigger(desc_elt, media_data, {})
+
+        rtp_hdrext_elts = list(desc_elt.elements(NS_JINGLE_RTP_HDREXT, "rtp-hdrext"))
+        assert len(rtp_hdrext_elts) == 2
+
+        rtp_hdrext_elt1, rtp_hdrext_elt2 = rtp_hdrext_elts
+
+        assert rtp_hdrext_elt1["id"] == "1"
+        assert rtp_hdrext_elt1["uri"] == "urn:ietf:params:rtp-hdrext:ssrc-audio-level"
+
+        # both is default and should not be set
+        assert "senders" not in rtp_hdrext_elt1.attributes
+
+        param_elt1 = list(rtp_hdrext_elt1.elements(NS_JINGLE_RTP_HDREXT, "parameter"))[0]
+        assert param_elt1["name"] == "vad"
+        assert param_elt1["value"] == "on"
+
+        assert rtp_hdrext_elt2["id"] == "2"
+        assert rtp_hdrext_elt2["uri"] == "urn:ietf:params:rtp-hdrext:toffset"
+        assert rtp_hdrext_elt2["senders"] == "initiator"
+
+        extmap_allow_mixed_elts = list(
+            desc_elt.elements(NS_JINGLE_RTP_HDREXT, "extmap-allow-mixed")
+        )
+        assert len(extmap_allow_mixed_elts) == 1