You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					61 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					61 lines
				
				2.2 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								#!/usr/bin/env python
							 | 
						||
| 
								 | 
							
								import asyncio
							 | 
						||
| 
								 | 
							
								import json
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								from unittest.mock import MagicMock, AsyncMock
							 | 
						||
| 
								 | 
							
								# for aiortc and its dependencies
							 | 
						||
| 
								 | 
							
								import warnings
							 | 
						||
| 
								 | 
							
								warnings.filterwarnings("ignore", category=DeprecationWarning)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from openpilot.system.webrtc.webrtcd import get_stream
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import aiortc
							 | 
						||
| 
								 | 
							
								from teleoprtc import WebRTCOfferBuilder
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase):
							 | 
						||
| 
								 | 
							
								  async def assertCompletesWithTimeout(self, awaitable, timeout=1):
							 | 
						||
| 
								 | 
							
								    try:
							 | 
						||
| 
								 | 
							
								      async with asyncio.timeout(timeout):
							 | 
						||
| 
								 | 
							
								        await awaitable
							 | 
						||
| 
								 | 
							
								    except asyncio.TimeoutError:
							 | 
						||
| 
								 | 
							
								      self.fail("Timeout while waiting for awaitable to complete")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  async def test_webrtcd(self):
							 | 
						||
| 
								 | 
							
								    mock_request = MagicMock()
							 | 
						||
| 
								 | 
							
								    async def connect(offer):
							 | 
						||
| 
								 | 
							
								      body = {'sdp': offer.sdp, 'cameras': offer.video, 'bridge_services_in': [], 'bridge_services_out': []}
							 | 
						||
| 
								 | 
							
								      mock_request.json.side_effect = AsyncMock(return_value=body)
							 | 
						||
| 
								 | 
							
								      response = await get_stream(mock_request)
							 | 
						||
| 
								 | 
							
								      response_json = json.loads(response.text)
							 | 
						||
| 
								 | 
							
								      return aiortc.RTCSessionDescription(**response_json)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    builder = WebRTCOfferBuilder(connect)
							 | 
						||
| 
								 | 
							
								    builder.offer_to_receive_video_stream("road")
							 | 
						||
| 
								 | 
							
								    builder.offer_to_receive_audio_stream()
							 | 
						||
| 
								 | 
							
								    builder.add_messaging()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    stream = builder.stream()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    await self.assertCompletesWithTimeout(stream.start())
							 | 
						||
| 
								 | 
							
								    await self.assertCompletesWithTimeout(stream.wait_for_connection())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.assertTrue(stream.has_incoming_video_track("road"))
							 | 
						||
| 
								 | 
							
								    self.assertTrue(stream.has_incoming_audio_track())
							 | 
						||
| 
								 | 
							
								    self.assertTrue(stream.has_messaging_channel())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    video_track, audio_track = stream.get_incoming_video_track("road"), stream.get_incoming_audio_track()
							 | 
						||
| 
								 | 
							
								    await self.assertCompletesWithTimeout(video_track.recv())
							 | 
						||
| 
								 | 
							
								    await self.assertCompletesWithTimeout(audio_track.recv())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    await self.assertCompletesWithTimeout(stream.stop())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # cleanup, very implementation specific, test may break if it changes
							 | 
						||
| 
								 | 
							
								    self.assertTrue(mock_request.app["streams"].__setitem__.called, "Implementation changed, please update this test")
							 | 
						||
| 
								 | 
							
								    _, session = mock_request.app["streams"].__setitem__.call_args.args
							 | 
						||
| 
								 | 
							
								    await self.assertCompletesWithTimeout(session.post_run_cleanup())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  unittest.main()
							 |