diff --git a/openvidu-server/docker/openvidu-health-checker/Dockerfile b/openvidu-server/docker/openvidu-health-checker/Dockerfile index 2ab316fd..fe1ae1ee 100644 --- a/openvidu-server/docker/openvidu-health-checker/Dockerfile +++ b/openvidu-server/docker/openvidu-health-checker/Dockerfile @@ -21,7 +21,7 @@ RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key google-chrome-stable firefox \ && rm /etc/apt/sources.list.d/google-chrome.list -RUN pip3 install selenium webdriver_manager +RUN pip3 install selenium webdriver_manager prettytable COPY ./run.sh /usr/local/bin/run.sh COPY ./openvidu_helth_check.py /usr/local/bin/openvidu_helth_check diff --git a/openvidu-server/docker/openvidu-health-checker/create_image.sh b/openvidu-server/docker/openvidu-health-checker/create_image.sh old mode 100644 new mode 100755 diff --git a/openvidu-server/docker/openvidu-health-checker/openvidu_helth_check.py b/openvidu-server/docker/openvidu-health-checker/openvidu_helth_check.py index cf1d29cc..a217dc70 100644 --- a/openvidu-server/docker/openvidu-health-checker/openvidu_helth_check.py +++ b/openvidu-server/docker/openvidu-health-checker/openvidu_helth_check.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import unittest from selenium import webdriver +from selenium.webdriver import firefox from selenium.webdriver.firefox import service from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.firefox import GeckoDriverManager @@ -9,6 +10,7 @@ from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.firefox.service import Service as FirefoxService from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By +from prettytable import from_html_one import time import os @@ -25,11 +27,19 @@ class InfraSmokeTests(unittest.TestCase): self.inspector_check(browser="firefox", turn=True) def inspector_check(self, browser="chrome", turn=False): + print('\n\n======================================================================') + print('|') + print('|') + print('| Testing OpenVidu with ' + browser + ' and force relay: ' + str(turn)) + print('|') + print('|') + print('======================================================================') + if self.openvidu_url == None or self.openvidu_password == None: + raise(Exception("You must specify OV_URL and OV_SECRET environment variables")) if browser == "chrome": self.runChrome() else: self.runFirefox(turn) - print ('Testing OpenVidu Inspector test') url_test = self.openvidu_url + '/inspector' self.driver.get(url_test) @@ -40,23 +50,33 @@ class InfraSmokeTests(unittest.TestCase): elem = self.driver.find_element(By.ID, 'login-btn') elem.send_keys(Keys.RETURN) - time.sleep(10) - print('data:image/png;base64,' + self.driver.get_screenshot_as_base64()) + # print('data:image/png;base64,' + self.driver.get_screenshot_as_base64()) elem = self.driver.find_element(By.ID,'menu-test-btn') elem.send_keys(Keys.RETURN) elem = self.driver.find_element(By.ID,'test-btn') elem.send_keys(Keys.RETURN) - self.driver.find_elements(By.XPATH, "//*[contains(text(), 'Stream playing')]") - print('data:image/png;base64,' + self.driver.get_screenshot_as_base64()) + video_error = False + try: + self.driver.find_elements(By.XPATH, "//*[contains(text(), 'Stream playing')]") + except: + video_error = True + finally: + # print('data:image/png;base64,' + self.driver.get_screenshot_as_base64()) + if browser == "firefox": + self.print_candidates() - print('Video detected.') + if video_error == True: + raise Exception('Error. No video detected') + + print('Video detected.\n') elem = self.driver.find_element(By.ID,'test-btn') elem.send_keys(Keys.RETURN) - print('Test success') self.closeBrowser() + print('Sucess with ' + browser + ' and Force Turn: ' + str(turn) + '\n') + print('----------------------------------------------------------------------\n') def runChrome(self): self.options = webdriver.ChromeOptions() @@ -75,17 +95,51 @@ class InfraSmokeTests(unittest.TestCase): def runFirefox(self, turn=False): print("Running firefox with Turn: ", turn) self.options = webdriver.FirefoxOptions() - self.options.set_preference('media.navigator.permission.disabled', True) + self.options.set_preference('media.navigator.permission.disabled', False) self.options.set_preference('media.navigator.streams.fake', True) - if turn: - self.options.set_preference('media.peerconnection.ice.relay_only', True) + self.options.set_preference('media.peerconnection.enabled', True) + self.options.set_preference('media.peerconnection.ice.obfuscate_host_addresses', False) + self.options.set_preference('media.peerconnection.identity.enabled', True) + self.options.set_preference('media.peerconnection.mtransport_process', True) + self.options.set_preference('media.peerconnection.ice.no_host', False) + self.options.set_preference('network.process.enabled', True) + self.options.set_preference('media.peerconnection.ice.relay_only', turn) + self.options.set_preference('media.peerconnection.turn.disable', not turn) self.driver = webdriver.Firefox( service=FirefoxService(GeckoDriverManager().install()), options = self.options) - self.driver.implicitly_wait(15) + self.driver.implicitly_wait(5) self.driver.maximize_window() + def print_candidates(self): + try: + # New tab + self.driver.execute_script("window.open('');") + # Switch to the new window + self.driver.switch_to.window(self.driver.window_handles[1]) + # Open about:webrtc + self.driver.get('about:webrtc') + peer_conn_elems = self.driver.find_elements(By.CLASS_NAME, "peer-connection") + for peer_conn in peer_conn_elems: + show_details_elems = peer_conn.find_elements(By.XPATH, "//*[contains(text(), 'show details')]") + for show_details in show_details_elems: + show_details.click() + + print("Waiting for candidates to be checked...") + # Get ice stats + time.sleep(15) + ice_stats_div_elems = self.driver.find_elements(By.XPATH, "//div[contains(@id, 'ice-stats')]") + for ice_stats_div in ice_stats_div_elems: + table_elems = ice_stats_div.find_elements(By.TAG_NAME, 'table') + ice_candidates_table = table_elems[0] + html_ice_table = '' + ice_candidates_table.get_attribute('innerHTML') + '
' + print(from_html_one(html_ice_table)) + # Go to main window + self.driver.switch_to.window(self.driver.window_handles[0]) + except: + print('Error getting candidates') + def closeBrowser(self): # close the browser window self.driver.close()