annotate tests/unit/frontends/test_webrtc.py @ 4309:b56b1eae7994

component email gateway: add multicasting: XEP-0033 multicasting is now supported both for incoming and outgoing messages. XEP-0033 metadata are converted to suitable Email headers and vice versa. Email address and JID are both supported, and delivery is done by the gateway when suitable on incoming messages. rel 450
author Goffi <goffi@goffi.org>
date Thu, 26 Sep 2024 16:12:01 +0200
parents f1d0cde61af7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Libervia: an XMPP client
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 from unittest.mock import AsyncMock, MagicMock
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 import pytest
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
21
4227
dfccc90cacc6 tests: fix and update tests:
Goffi <goffi@goffi.org>
parents: 4140
diff changeset
22 try:
dfccc90cacc6 tests: fix and update tests:
Goffi <goffi@goffi.org>
parents: 4140
diff changeset
23 from gi.repository import Gst
dfccc90cacc6 tests: fix and update tests:
Goffi <goffi@goffi.org>
parents: 4140
diff changeset
24 except ImportError:
dfccc90cacc6 tests: fix and update tests:
Goffi <goffi@goffi.org>
parents: 4140
diff changeset
25 pytest.skip("Gst not available.", allow_module_level=True)
dfccc90cacc6 tests: fix and update tests:
Goffi <goffi@goffi.org>
parents: 4140
diff changeset
26
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from libervia.backend.core import exceptions
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from libervia.backend.tools.common import data_format
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from libervia.frontends.tools import webrtc as webrtc_mod
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
31
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 @pytest.fixture
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 def host(monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 host = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 host.bridge = AsyncMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 host.app.expand = lambda s: s
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 return host
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
38
4285
f1d0cde61af7 tests (unit): fix tests + black reformatting.
Goffi <goffi@goffi.org>
parents: 4232
diff changeset
39
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 @pytest.fixture(scope="function")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 def webrtc(host):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 """Fixture for WebRTC instantiation."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 profile = "test_profile"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 instance = webrtc_mod.WebRTC(host.bridge, profile)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
45
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 instance._set_media_types = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 instance.start_pipeline = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 instance.link_element_or_pad = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 instance.webrtcbin = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 instance.webrtcbin.emit = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
51
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 instance.GstSdp_SDPMessage_new_from_text = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 instance.GstWebRTC_WebRTCSessionDescription_new = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 instance.Gst_Promise_new_with_change_func = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 return instance
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
57
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
58
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 class TestWebRtc:
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 def test_get_payload_types(self, webrtc):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 """The method can identify the correct payload types for video and audio."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 fake_sdpmsg = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 fake_media = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 fake_caps = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 fake_structure = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
66
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 # This side effect will return 'fake_video_encoding' first, then
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 # 'fake_audio_encoding'.
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 fake_structure.__getitem__.side_effect = [
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 "fake_video_encoding",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 "fake_audio_encoding",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 ]
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 fake_caps.get_structure.return_value = fake_structure
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 fake_media.get_format.side_effect = ["webrtc-datachannel", "10", "20"]
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 fake_media.get_caps_from_media.return_value = fake_caps
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 fake_sdpmsg.get_media.return_value = fake_media
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 fake_sdpmsg.medias_len.return_value = 1
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 fake_media.formats_len.return_value = 3
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
79
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 result = webrtc.get_payload_types(
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 fake_sdpmsg, "fake_video_encoding", "fake_audio_encoding"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 )
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 expected_result = {"fake_video_encoding": 10, "fake_audio_encoding": 20}
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
84
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 assert result == expected_result
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
86
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 def test_on_accepted_call(self, webrtc):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 """The method correctly sets the remote SDP upon acceptance of an outgoing call."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 sdp_str = "mock_sdp_string"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 profile_str = "test_profile"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
91
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
92 webrtc.on_accepted_call(sdp_str, profile_str)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
93
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 # remote description must be set
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 assert webrtc.webrtcbin.emit.call_count == 1
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 assert webrtc.webrtcbin.emit.call_args[0][0] == "set-remote-description"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
97
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 @pytest.mark.asyncio
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 async def test_answer_call(self, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 """The method correctly answers an incoming call."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 mock_setup_call = AsyncMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
102
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 def mock_get_payload_types(sdpmsg, video_encoding, audio_encoding):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 return {"VP8": 96, "OPUS": 97}
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
105
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 monkeypatch.setattr(webrtc, "setup_call", mock_setup_call)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 monkeypatch.setattr(webrtc, "get_payload_types", mock_get_payload_types)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
108
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 sdp_str = "mock_sdp_string"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 profile_str = "mock_profile"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
111
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
112 await webrtc.answer_call(sdp_str, profile_str)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
113
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 mock_setup_call.assert_called_once_with("responder", audio_pt=97, video_pt=96)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
115
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 # remote description must be set
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 assert webrtc.webrtcbin.emit.call_count == 1
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 assert webrtc.webrtcbin.emit.call_args[0][0] == "set-remote-description"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
119
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 def test_on_remote_decodebin_stream_video(self, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 """The method correctly handles video streams from the remote decodebin."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 mock_pipeline = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 monkeypatch.setattr(webrtc, "pipeline", mock_pipeline)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
124
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 mock_pad = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 mock_caps = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 mock_structure = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
128
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 mock_pad.has_current_caps.return_value = True
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 mock_pad.get_current_caps.return_value = mock_caps
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 mock_caps.__len__.return_value = 1
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 mock_caps.__getitem__.return_value = mock_structure
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 mock_structure.get_name.return_value = "video/x-h264"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 # We use non-standard resolution as example to trigger the workaround
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 mock_structure.get_int.side_effect = lambda x: MagicMock(
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 value=990 if x == "width" else 557
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 )
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
138
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 webrtc.on_remote_decodebin_stream(None, mock_pad)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 assert webrtc._remote_video_pad == mock_pad
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 mock_pipeline.add.assert_called()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 mock_pad.link.assert_called()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
144
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 def test_on_remote_decodebin_stream_audio(self, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 """The method correctly handles audio streams from the remote decodebin."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 mock_pipeline = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 monkeypatch.setattr(webrtc, "pipeline", mock_pipeline)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
149
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 mock_pad = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 mock_caps = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 mock_structure = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
153
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 mock_pad.has_current_caps.return_value = True
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 mock_pad.get_current_caps.return_value = mock_caps
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 mock_caps.__len__.return_value = 1
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 mock_caps.__getitem__.return_value = mock_structure
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 mock_structure.get_name.return_value = "audio/x-raw"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
159
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 webrtc.on_remote_decodebin_stream(None, mock_pad)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
161
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 mock_pipeline.add.assert_called()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 mock_pad.link.assert_called()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
164
4232
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
165 @pytest.mark.skipif(Gst is None, reason="GStreamer is not available")
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 @pytest.mark.asyncio
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 async def test_setup_call_correct_role(self, host, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 """Roles are set in setup_call."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 monkeypatch.setattr(Gst, "parse_launch", MagicMock())
4232
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
170 # we use MagicMock class and not instance on purpose, to pass the "isinstance"
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
171 # test of "setup_call".
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
172 monkeypatch.setattr(Gst, "Pipeline", MagicMock)
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 monkeypatch.setattr(data_format, "deserialise", MagicMock(return_value=[]))
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
174
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 await webrtc.setup_call("initiator")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
176 assert webrtc.role == "initiator"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
177
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 await webrtc.setup_call("responder")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 assert webrtc.role == "responder"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
180
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 with pytest.raises(AssertionError):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 await webrtc.setup_call("invalid_role")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
183
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 @pytest.mark.asyncio
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 async def test_setup_call_test_mode(self, host, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 """Test mode use fake video and audio in setup_call."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 monkeypatch.setattr(data_format, "deserialise", MagicMock(return_value=[]))
4285
f1d0cde61af7 tests (unit): fix tests + black reformatting.
Goffi <goffi@goffi.org>
parents: 4232
diff changeset
188 monkeypatch.setattr(webrtc, "sources_data", webrtc_mod.SourcesTest())
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 await webrtc.setup_call("initiator")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 assert "videotestsrc" in webrtc.gst_pipe_desc
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 assert "audiotestsrc" in webrtc.gst_pipe_desc
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
192
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 @pytest.mark.asyncio
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 async def test_setup_call_normal_mode(self, host, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 """Normal mode use real video and audio in setup_call."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 monkeypatch.setattr(data_format, "deserialise", MagicMock(return_value=[]))
4285
f1d0cde61af7 tests (unit): fix tests + black reformatting.
Goffi <goffi@goffi.org>
parents: 4232
diff changeset
197 monkeypatch.setattr(webrtc, "sources_data", webrtc_mod.SourcesAuto())
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 await webrtc.setup_call("initiator")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 assert "v4l2src" in webrtc.gst_pipe_desc
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
200 assert "pulsesrc" in webrtc.gst_pipe_desc
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
201
4232
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
202 @pytest.mark.skipif(Gst is None, reason="GStreamer is not available")
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 @pytest.mark.asyncio
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
204 async def test_setup_call_with_stun_and_turn(self, host, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 """STUN and TURN server configurations are done in setup_call."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
206 mock_pipeline = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
207 mock_parse_launch = MagicMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
208 mock_parse_launch.return_value = mock_pipeline
4232
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
209 # As for "test_setup_call_correct_role" we user MagicMock class and not instance
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
210 # on purpose here.
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
211 monkeypatch.setattr(Gst, "Pipeline", MagicMock)
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 monkeypatch.setattr(Gst, "parse_launch", mock_parse_launch)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
213
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
214 mock_pipeline.get_by_name.return_value = webrtc.webrtcbin
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
215
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
216 mock_external_disco = [
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 {"type": "stun", "transport": "udp", "host": "stun.host", "port": "3478"},
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
218 {
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
219 "type": "turn",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 "transport": "udp",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 "host": "turn.host",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
222 "port": "3478",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
223 "username": "user",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
224 "password": "pass",
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
225 },
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
226 ]
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
227
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
228 monkeypatch.setattr(
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
229 data_format, "deserialise", MagicMock(return_value=mock_external_disco)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 )
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
231
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 mock_emit = AsyncMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 monkeypatch.setattr(webrtc.webrtcbin, "emit", mock_emit)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
234
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 mock_set_property = AsyncMock()
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
236 monkeypatch.setattr(webrtc.webrtcbin, "set_property", mock_set_property)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
237
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 await webrtc.setup_call("initiator")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
239
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
240 host.bridge.external_disco_get.assert_called_once_with("", webrtc.profile)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 mock_set_property.assert_any_call("stun-server", "stun://stun.host:3478")
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 mock_emit.assert_called_once_with(
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
243 "add-turn-server", "turn://user:pass@turn.host:3478"
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
244 )
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
245
4232
0fbe5c605eb6 tests (unit/webrtc,XEP-0176, XEP-0234): Fix tests and add webrtc file transfer tests:
Goffi <goffi@goffi.org>
parents: 4227
diff changeset
246 @pytest.mark.skipif(Gst is None, reason="GStreamer is not available")
4140
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
247 @pytest.mark.asyncio
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 async def test_setup_call_gstreamer_pipeline_failure(self, webrtc, monkeypatch):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 """Test setup_call method handling Gstreamer pipeline failure."""
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 monkeypatch.setattr(Gst, "parse_launch", lambda _: None)
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 with pytest.raises(exceptions.InternalError):
13dd5660c28f tests (unit/frontends): tests for webrtc implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 await webrtc.setup_call("initiator")