forked from IQ.Lvbs/IQ.Pilot
76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
import json
|
|
from types import SimpleNamespace
|
|
|
|
from parameterized import parameterized_class
|
|
import pytest
|
|
|
|
from iqpilot.system.webrtc.webrtcd import add_ice, get_stream
|
|
|
|
|
|
class FakeSession:
|
|
instances = []
|
|
|
|
def __init__(self, identifier="session"):
|
|
self.identifier = identifier
|
|
self.started = False
|
|
self.stopped = False
|
|
self.candidates = []
|
|
self.instances.append(self)
|
|
|
|
async def get_answer(self):
|
|
return SimpleNamespace(sdp="answer", type="answer")
|
|
|
|
def start(self):
|
|
self.started = True
|
|
|
|
async def stop_async(self):
|
|
self.stopped = True
|
|
|
|
async def add_ice_candidate(self, candidate):
|
|
self.candidates.append(candidate)
|
|
|
|
|
|
@parameterized_class(("in_services", "out_services"), [
|
|
(["testJoystick"], ["carState"]),
|
|
([], ["carState"]),
|
|
(["testJoystick"], []),
|
|
([], []),
|
|
])
|
|
@pytest.mark.asyncio
|
|
class TestWebrtcdProc:
|
|
async def test_webrtcd(self, mocker):
|
|
session = FakeSession()
|
|
mocker.patch("iqpilot.system.webrtc.webrtcd._new_stream_session", return_value=session)
|
|
request = mocker.MagicMock()
|
|
request.app = {"streams": {}, "debug": False}
|
|
request.json = mocker.AsyncMock(return_value={
|
|
"sdp": "offer",
|
|
"cameras": ["road"],
|
|
"bridge_services_in": self.in_services,
|
|
"bridge_services_out": self.out_services,
|
|
})
|
|
|
|
response = await get_stream(request)
|
|
|
|
assert response.status == 200
|
|
assert json.loads(response.text) == {"sdp": "answer", "type": "answer"}
|
|
assert request.app["streams"] == {session.identifier: session}
|
|
assert session.started
|
|
|
|
async def test_replaces_session_and_routes_ice(self, mocker):
|
|
previous = FakeSession("previous")
|
|
session = FakeSession("current")
|
|
mocker.patch("iqpilot.system.webrtc.webrtcd._new_stream_session", return_value=session)
|
|
request = mocker.MagicMock()
|
|
request.app = {"streams": {previous.identifier: previous}, "debug": False}
|
|
request.json = mocker.AsyncMock(return_value={"sdp": "offer", "cameras": ["road"]})
|
|
|
|
response = await get_stream(request)
|
|
|
|
assert response.status == 200
|
|
assert previous.stopped
|
|
request.json = mocker.AsyncMock(return_value={"candidate": {"candidate": "candidate:1"}})
|
|
ice_response = await add_ice(request)
|
|
assert ice_response.status == 200
|
|
assert session.candidates == [{"candidate": "candidate:1"}]
|