|
|
|
|
@ -17,7 +17,7 @@ from websockets import connect
|
|
|
|
|
eventloop = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_ws(cls, proto):
|
|
|
|
|
async def make_ws(cls, proto):
|
|
|
|
|
from platform import python_version
|
|
|
|
|
from websockets import __version__
|
|
|
|
|
|
|
|
|
|
@ -27,48 +27,67 @@ async def get_ws(cls, proto):
|
|
|
|
|
raise unittest.SkipTest(msg)
|
|
|
|
|
for _ in range(1, 300):
|
|
|
|
|
try:
|
|
|
|
|
cls._ws = await connect("ws://127.0.0.1:9191/", subprotocols=[proto])
|
|
|
|
|
break
|
|
|
|
|
conn = await connect("ws://127.0.0.1:9191/", subprotocols=[proto])
|
|
|
|
|
return conn
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
await asyncio.sleep(0.1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIO(self, msg):
|
|
|
|
|
await self._ws.send(msg)
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws.recv(), timeout=10)
|
|
|
|
|
async def get_ws(cls, proto, num=1):
|
|
|
|
|
cls._ws = []
|
|
|
|
|
for _ in range(num):
|
|
|
|
|
conn = await make_ws(cls, proto)
|
|
|
|
|
cls._ws.append(conn)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIOJson(self, msg):
|
|
|
|
|
await self._ws.send(json.dumps(msg))
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws.recv(), timeout=10)
|
|
|
|
|
async def get_more_ws(cls, proto, num=1):
|
|
|
|
|
for _ in range(num):
|
|
|
|
|
conn = await make_ws(cls, proto)
|
|
|
|
|
cls._ws.append(conn)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def close_ws(cls):
|
|
|
|
|
for conn in cls._ws:
|
|
|
|
|
await conn.close()
|
|
|
|
|
cls._ws.clear()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIO(self, msg, conn_num=0):
|
|
|
|
|
await self._ws[conn_num].send(msg)
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws[conn_num].recv(), timeout=10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIOJson(self, msg, conn_num=0):
|
|
|
|
|
await self._ws[conn_num].send(json.dumps(msg))
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws[conn_num].recv(), timeout=10)
|
|
|
|
|
self._res = json.loads(self._res)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIJson(self):
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws.recv(), timeout=10)
|
|
|
|
|
async def testIJson(self, conn_num=0):
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws[conn_num].recv(), timeout=10)
|
|
|
|
|
self._res = json.loads(self._res)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIJanus(self):
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws.recv(), timeout=10)
|
|
|
|
|
async def testIJanus(self, conn_num=0):
|
|
|
|
|
self._res = await asyncio.wait_for(self._ws[conn_num].recv(), timeout=10)
|
|
|
|
|
self._res = json.loads(self._res)
|
|
|
|
|
self.assertEqual(self._res["transaction"], self._trans)
|
|
|
|
|
del self._res["transaction"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testIOJanus(self, msg):
|
|
|
|
|
async def testIOJanus(self, msg, conn_num=0):
|
|
|
|
|
trans = str(uuid.uuid4())
|
|
|
|
|
msg["transaction"] = trans
|
|
|
|
|
self._trans = trans
|
|
|
|
|
await self._ws.send(json.dumps(msg))
|
|
|
|
|
await testIJanus(self)
|
|
|
|
|
await self._ws[conn_num].send(json.dumps(msg))
|
|
|
|
|
await testIJanus(self, conn_num)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def testOJanus(self, msg):
|
|
|
|
|
async def testOJanus(self, msg, conn_num=0):
|
|
|
|
|
trans = str(uuid.uuid4())
|
|
|
|
|
msg["transaction"] = trans
|
|
|
|
|
self._trans = trans
|
|
|
|
|
await self._ws.send(json.dumps(msg))
|
|
|
|
|
await self._ws[conn_num].send(json.dumps(msg))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestWSEcho(unittest.TestCase):
|
|
|
|
|
@ -78,7 +97,7 @@ class TestWSEcho(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def tearDownClass(cls):
|
|
|
|
|
eventloop.run_until_complete(cls._ws.close())
|
|
|
|
|
eventloop.run_until_complete(close_ws(cls))
|
|
|
|
|
|
|
|
|
|
def testEcho(self):
|
|
|
|
|
eventloop.run_until_complete(testIO(self, b"foobar"))
|
|
|
|
|
@ -96,7 +115,7 @@ class TestWSCli(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def tearDownClass(cls):
|
|
|
|
|
eventloop.run_until_complete(cls._ws.close())
|
|
|
|
|
eventloop.run_until_complete(close_ws(cls))
|
|
|
|
|
|
|
|
|
|
def testListNumsessions(self):
|
|
|
|
|
# race condition here if this runs at the same as the janus test (creates call)
|
|
|
|
|
@ -120,7 +139,7 @@ class TestWSJanus(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def tearDownClass(cls):
|
|
|
|
|
eventloop.run_until_complete(cls._ws.close())
|
|
|
|
|
eventloop.run_until_complete(close_ws(cls))
|
|
|
|
|
|
|
|
|
|
def testPing(self):
|
|
|
|
|
eventloop.run_until_complete(
|
|
|
|
|
@ -164,14 +183,19 @@ class TestWSJanus(unittest.TestCase):
|
|
|
|
|
class TestVideoroom(unittest.TestCase):
|
|
|
|
|
@classmethod
|
|
|
|
|
def setUpClass(cls):
|
|
|
|
|
eventloop.run_until_complete(get_ws(cls, "janus-protocol"))
|
|
|
|
|
cls.maxDiff = None
|
|
|
|
|
cls._ws = []
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def tearDownClass(cls):
|
|
|
|
|
eventloop.run_until_complete(cls._ws.close())
|
|
|
|
|
eventloop.run_until_complete(close_ws(cls))
|
|
|
|
|
|
|
|
|
|
def startSession(self):
|
|
|
|
|
self.maxDiff = None
|
|
|
|
|
def startSession(self, conn_num=0):
|
|
|
|
|
# make sure we have a matching connection
|
|
|
|
|
if conn_num >= len(self._ws):
|
|
|
|
|
eventloop.run_until_complete(
|
|
|
|
|
get_more_ws(self, "janus-protocol", conn_num - len(self._ws) + 1)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
token = str(uuid.uuid4())
|
|
|
|
|
|
|
|
|
|
@ -183,6 +207,7 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
"token": token,
|
|
|
|
|
"admin_secret": "dfgdfgdvgLyATjHPvckg",
|
|
|
|
|
},
|
|
|
|
|
conn_num,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
@ -199,6 +224,7 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
"token": token,
|
|
|
|
|
"admin_secret": "dfgdfgdvgLyATjHPvckg",
|
|
|
|
|
},
|
|
|
|
|
conn_num,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
session = self._res["data"]["id"]
|
|
|
|
|
@ -208,6 +234,9 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
return (token, session)
|
|
|
|
|
|
|
|
|
|
def startVideoroom(self):
|
|
|
|
|
# start fresh
|
|
|
|
|
self.closeConns()
|
|
|
|
|
|
|
|
|
|
(token, session) = self.startSession()
|
|
|
|
|
|
|
|
|
|
handle = self.createHandle(token, session)
|
|
|
|
|
@ -280,7 +309,10 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def createHandle(self, token, session):
|
|
|
|
|
def closeConns(self):
|
|
|
|
|
eventloop.run_until_complete(close_ws(self))
|
|
|
|
|
|
|
|
|
|
def createHandle(self, token, session, conn_num=0):
|
|
|
|
|
eventloop.run_until_complete(
|
|
|
|
|
testIOJanus(
|
|
|
|
|
self,
|
|
|
|
|
@ -291,6 +323,7 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
"token": token,
|
|
|
|
|
"opaque_id": None,
|
|
|
|
|
},
|
|
|
|
|
conn_num,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
handle = self._res["data"]["id"]
|
|
|
|
|
@ -303,7 +336,7 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
return handle
|
|
|
|
|
|
|
|
|
|
def createPublisher(self, token, session, room, handle, pubs=[]):
|
|
|
|
|
def createPublisher(self, token, session, room, handle, pubs=[], conn_num=0):
|
|
|
|
|
eventloop.run_until_complete(
|
|
|
|
|
testIOJanus(
|
|
|
|
|
self,
|
|
|
|
|
@ -314,12 +347,13 @@ class TestVideoroom(unittest.TestCase):
|
|
|
|
|
"session_id": session,
|
|
|
|
|
"token": token,
|
|
|
|
|
},
|
|
|
|
|
conn_num,
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
# ack is received first
|
|
|
|
|
self.assertEqual(self._res, {"janus": "ack", "session_id": session})
|
|
|
|
|
# followed by the joined event
|
|
|
|
|
eventloop.run_until_complete(testIJanus(self))
|
|
|
|
|
eventloop.run_until_complete(testIJanus(self, conn_num))
|
|
|
|
|
feed = self._res["plugindata"]["data"]["id"]
|
|
|
|
|
self.assertIsInstance(feed, int)
|
|
|
|
|
self.assertNotEqual(feed, session)
|
|
|
|
|
|