| #!/usr/bin/env python3 | |
| import os | |
| import unittest | |
| from selenium import webdriver | |
| from selenium.webdriver.support.wait import WebDriverWait | |
| from selenium.webdriver.firefox.firefox_profile import FirefoxProfile | |
| from selenium.webdriver.chrome.options import Options as COptions | |
| import webrtc_sendrecv as webrtc | |
| import simple_server as sserver | |
| import asyncio | |
| import threading | |
| import signal | |
| import gi | |
| gi.require_version('Gst', '1.0') | |
| from gi.repository import Gst | |
| thread = None | |
| stop = None | |
| server = None | |
| class AsyncIOThread(threading.Thread): | |
| def __init__ (self, loop): | |
| threading.Thread.__init__(self) | |
| self.loop = loop | |
| def run(self): | |
| asyncio.set_event_loop(self.loop) | |
| self.loop.run_forever() | |
| self.loop.close() | |
| print ("closed loop") | |
| def stop_thread(self): | |
| self.loop.call_soon_threadsafe(self.loop.stop) | |
| async def run_until(server, stop_token): | |
| async with server: | |
| await stop_token | |
| print ("run_until done") | |
| def setUpModule(): | |
| global thread, server | |
| Gst.init(None) | |
| cacerts_path = os.environ.get('TEST_CA_CERT_PATH') | |
| loop = asyncio.new_event_loop() | |
| thread = AsyncIOThread(loop) | |
| thread.start() | |
| server = sserver.WebRTCSimpleServer('127.0.0.1', 8443, 20, False, cacerts_path) | |
| def f(): | |
| global stop | |
| stop = asyncio.ensure_future(server.run()) | |
| loop.call_soon_threadsafe(f) | |
| def tearDownModule(): | |
| global thread, stop | |
| stop.cancel() | |
| thread.stop_thread() | |
| thread.join() | |
| print("thread joined") | |
| def valid_int(n): | |
| if isinstance(n, int): | |
| return True | |
| if isinstance(n, str): | |
| try: | |
| num = int(n) | |
| return True | |
| except: | |
| return False | |
| return False | |
| def create_firefox_driver(): | |
| capabilities = webdriver.DesiredCapabilities().FIREFOX.copy() | |
| capabilities['acceptSslCerts'] = True | |
| capabilities['acceptInsecureCerts'] = True | |
| profile = FirefoxProfile() | |
| profile.set_preference ('media.navigator.streams.fake', True) | |
| profile.set_preference ('media.navigator.permission.disabled', True) | |
| return webdriver.Firefox(firefox_profile=profile, capabilities=capabilities) | |
| def create_chrome_driver(): | |
| capabilities = webdriver.DesiredCapabilities().CHROME.copy() | |
| capabilities['acceptSslCerts'] = True | |
| capabilities['acceptInsecureCerts'] = True | |
| copts = COptions() | |
| copts.add_argument('--allow-file-access-from-files') | |
| copts.add_argument('--use-fake-ui-for-media-stream') | |
| copts.add_argument('--use-fake-device-for-media-stream') | |
| copts.add_argument('--enable-blink-features=RTCUnifiedPlanByDefault') | |
| return webdriver.Chrome(options=copts, desired_capabilities=capabilities) | |
| class ServerConnectionTestCase(unittest.TestCase): | |
| def setUp(self): | |
| self.browser = create_firefox_driver() | |
| # self.browser = create_chrome_driver() | |
| self.addCleanup(self.browser.quit) | |
| self.html_source = os.environ.get('TEST_HTML_SOURCE') | |
| self.assertIsNot(self.html_source, None) | |
| self.assertNotEqual(self.html_source, '') | |
| self.html_source = 'file://' + self.html_source + '/index.html' | |
| def get_peer_id(self): | |
| self.browser.get(self.html_source) | |
| peer_id = WebDriverWait(self.browser, 5).until( | |
| lambda x: x.find_element_by_id('peer-id'), | |
| message='Peer-id element was never seen' | |
| ) | |
| WebDriverWait (self.browser, 5).until( | |
| lambda x: valid_int(peer_id.text), | |
| message='Peer-id never became a number' | |
| ) | |
| return int(peer_id.text) | |
| def testPeerID(self): | |
| self.get_peer_id() | |
| def testPerformCall(self): | |
| loop = asyncio.new_event_loop() | |
| thread = AsyncIOThread(loop) | |
| thread.start() | |
| peer_id = self.get_peer_id() | |
| client = webrtc.WebRTCClient(peer_id + 1, peer_id, 'wss://127.0.0.1:8443') | |
| async def do_things(): | |
| await client.connect() | |
| async def stop_after(client, delay): | |
| await asyncio.sleep(delay) | |
| await client.stop() | |
| future = asyncio.ensure_future (stop_after (client, 5)) | |
| res = await client.loop() | |
| thread.stop_thread() | |
| return res | |
| res = asyncio.run_coroutine_threadsafe(do_things(), loop).result() | |
| thread.join() | |
| print ("client thread joined") | |
| self.assertEqual(res, 0) | |
| if __name__ == '__main__': | |
| unittest.main(verbosity=2) |