view tests/unit/cli/test_calls.py @ 4231:e11b13418ba6

plugin XEP-0353, XEP-0234, jingle: WebRTC data channel signaling implementation: Implement XEP-0343: Signaling WebRTC Data Channels in Jingle. The current version of the XEP (0.3.1) has no implementation and contains some flaws. After discussing this on xsf@, Daniel (from Conversations) mentioned that they had a sprint with Larma (from Dino) to work on another version and provided me with this link: https://gist.github.com/iNPUTmice/6c56f3e948cca517c5fb129016d99e74 . I have used it for my implementation. This implementation reuses work done on Jingle A/V call (notably XEP-0176 and XEP-0167 plugins), with adaptations. When used, XEP-0234 will not handle the file itself as it normally does. This is because WebRTC has several implementations (browser for web interface, GStreamer for others), and file/data must be handled directly by the frontend. This is particularly important for web frontends, as the file is not sent from the backend but from the end-user's browser device. Among the changes, there are: - XEP-0343 implementation. - `file_send` bridge method now use serialised dict as output. - New `BaseTransportHandler.is_usable` method which get content data and returns a boolean (default to `True`) to tell if this transport can actually be used in this context (when we are initiator). Used in webRTC case to see if call data are available. - Support of `application` media type, and everything necessary to handle data channels. - Better confirmation message, with file name, size and description when available. - When file is accepted in preflight, it is specified in following `action_new` signal for actual file transfer. This way, frontend can avoid the display or 2 confirmation messages. - XEP-0166: when not specified, default `content` name is now its index number instead of a UUID. This follows the behaviour of browsers. - XEP-0353: better handling of events such as call taken by another device. - various other updates. rel 441
author Goffi <goffi@goffi.org>
date Sat, 06 Apr 2024 12:57:23 +0200
parents dfccc90cacc6
children
line wrap: on
line source

#!/usr/bin/env python3

# Libervia: an XMPP client
# Copyright (C) 2009-2024 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 unittest.mock import MagicMock, patch

import pytest

try:
    from libervia.cli.call_gui import AVCallUI
    from libervia.frontends.tools import display_servers
    from PyQt6.QtWidgets import QApplication
except ModuleNotFoundError:
    pytest.skip("PyQt6 is not available.", allow_module_level=True)


@pytest.fixture(scope="session")
def qapplication():
    # QApplication is needed to instantiate any QWidget
    return QApplication([])


@pytest.fixture
def av_call_gui(qapplication):
    host = MagicMock()
    icons_path = MagicMock()
    gui = AVCallUI(host, icons_path)
    gui.webrtc_call = MagicMock()
    return gui


def test_toggle_fullscreen(av_call_gui):
    """``toggle_fullscreen`` changes window state."""
    initial_state = av_call_gui.isFullScreen()
    av_call_gui.toggle_fullscreen()
    assert av_call_gui.isFullScreen() != initial_state


def test_toggle_video(av_call_gui):
    """``toggle_video`` actually toggles video state."""
    av_call_gui.webrtc_call.webrtc = MagicMock(video_muted=False)
    av_call_gui.toggle_video()
    assert av_call_gui.webrtc_call.webrtc.video_muted is True


def test_toggle_audio(av_call_gui):
    """``toggle_audio`` actually toggles audio state."""
    av_call_gui.webrtc_call.webrtc = MagicMock(audio_muted=False)
    av_call_gui.toggle_audio()
    assert av_call_gui.webrtc_call.webrtc.audio_muted is True


def test_share_desktop(av_call_gui):
    """``share_desktop`` changes WebRTC ``desktop_sharing`` state."""
    av_call_gui.webrtc_call.webrtc = MagicMock(desktop_sharing=False)
    # We test WAYLAND as it is a direct change of ``desktop_sharing`` state.
    with patch(
        "libervia.cli.call_gui.display_servers.detect",
        return_value=display_servers.WAYLAND,
    ):
        av_call_gui.share_desktop()
        assert av_call_gui.webrtc_call.webrtc.desktop_sharing is True


def test_hang_up(av_call_gui):
    """Hang-up button triggers window close."""
    with patch.object(av_call_gui, "close") as mock_close:
        av_call_gui.hang_up()
    mock_close.assert_called_once()