diff --git a/openvidu-server/docker/openvidu-deployment-tester/.gitignore b/openvidu-server/docker/openvidu-deployment-tester/.gitignore new file mode 100644 index 00000000..beb420f4 --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/.gitignore @@ -0,0 +1,3 @@ +python_modules/ +src/geckodriver.* +*/__pycache__/ \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/Dockerfile b/openvidu-server/docker/openvidu-deployment-tester/Dockerfile new file mode 100644 index 00000000..104800b9 --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/Dockerfile @@ -0,0 +1,47 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND noninteractive \ + DISPLAY :99.0 + +# Install Software +RUN apt-get update && \ + apt-get install -qqy --no-install-recommends \ + lbzip2 \ + gnupg2 \ + xvfb \ + x11-utils \ + wget \ + python3 \ + python3-pip + +# Install latest chrome +RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ + apt install -y ./google-chrome-stable_current_amd64.deb && \ + rm google-chrome-stable_current_amd64.deb + +# Install non snap version of firefox +ENV FF_INSTALLER_NAME=firefox-latest.tar.bz2 +RUN cd /tmp && \ + apt-get update && apt-get install libdbus-glib-1-2 -y && \ + rm -rf /var/lib/apt/lists/* && \ + wget --progress=dot:mega -O ${FF_INSTALLER_NAME} \ + 'https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=en-US' && \ + tar -x -C /usr/local/bin -f ${FF_INSTALLER_NAME} && \ + rm -f ${FF_INSTALLER_NAME} && \ + ln -s /usr/local/bin/firefox/firefox /usr/bin/firefox + +# Copy source code and install dependencies +COPY ./src/ /workdir/src/ +COPY ./requirements.txt /workdir/ +RUN cd /workdir && pip3 install -r requirements.txt + +WORKDIR /workdir/src + +# Cache web driver +RUN python3 main.py install-drivers + +# Copy entrypoint +COPY ./entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/entrypoint.sh + +ENTRYPOINT [ "/usr/local/bin/entrypoint.sh" ] \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/README.md b/openvidu-server/docker/openvidu-deployment-tester/README.md new file mode 100644 index 00000000..41e1166c --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/README.md @@ -0,0 +1,82 @@ +# OpenVidu Deployment Tester + +This is a simple python automation script to test the deployment of any kind of OpenVidu Server deployment. Its purpose is to test most general deployment scenarios and to provide a simple and portable way to test the deployment of OpenVidu Server. + +The script uses selenium to control a browser and execute the tests. As this automation tool is packaged in a docker container, it is not necessary to install any other dependency in the machine where the script is going to be executed. + +## Requirements +- A working OpenVidu Server deployment (CE/PRO/Enterprise) +- Docker installed in the machine where the script is going to be executed. +- OpenVidu Call. It is not strictly necessary, but it is recommended to execute some tests. + +## Test cases + +### 1. Basic Test + +This test case will simply check from the dashboard (CE) or Inspector (PRO/Enterprise) that OpenVidu WebRTC minimal capabilities are working (Video and TURN) + +**1. OpenVidu CE without forcing TURN candidates to be used (Chrome)** + +```bash +docker run openvidu/openvidu-deployment-tester basic-test \ + --openvidu-url \ + --openvidu-secret \ + --openvidu-edition ce \ + --browser chrome +``` + +**2. OpenVidu CE without forcing TURN candidates to be used (Firefox)** + +```bash +docker run openvidu/openvidu-deployment-tester basic-test \ + --openvidu-url \ + --openvidu-secret \ + --openvidu-edition ce \ + --browser firefox +``` + +**3. OpenVidu CE forcing TURN candidates to be used (Firefox)** + +```bash +docker run openvidu/openvidu-deployment-tester basic-test \ + --openvidu-url \ + --openvidu-secret \ + --openvidu-edition ce \ + --browser firefox \ + --turn +``` + +**4. OpenVidu PRO without forcing TURN candidates to be used (Chrome)** + +```bash +docker run openvidu/openvidu-deployment-tester basic-test \ + --openvidu-url \ + --openvidu-secret \ + --openvidu-edition pro \ + --browser chrome +``` + +**5. OpenVidu PRO without forcing TURN candidates to be used (Firefox)** + +```bash +docker run openvidu/openvidu-deployment-tester basic-test \ + --openvidu-url \ + --openvidu-secret \ + --openvidu-edition pro \ + --browser firefox +``` + +**6. OpenVidu PRO forcing TURN candidates to be used (Firefox)** + +```bash +docker run openvidu/openvidu-deployment-tester basic-test \ + --openvidu-url \ + --openvidu-secret \ + --openvidu-edition ce \ + --browser firefox \ + --turn +``` + +### 2. Recording tests + +Working on... \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-health-checker/create_image.sh b/openvidu-server/docker/openvidu-deployment-tester/create_image.sh similarity index 85% rename from openvidu-server/docker/openvidu-health-checker/create_image.sh rename to openvidu-server/docker/openvidu-deployment-tester/create_image.sh index aa886c0f..15ef91eb 100755 --- a/openvidu-server/docker/openvidu-health-checker/create_image.sh +++ b/openvidu-server/docker/openvidu-deployment-tester/create_image.sh @@ -1,7 +1,7 @@ #!/bin/bash -x VERSION=$1 if [[ ! -z $VERSION ]]; then - docker build --pull --no-cache --rm=true -t openvidu/openvidu-health-checker:$VERSION . + docker build --pull --no-cache --rm=true -t openvidu/openvidu-deployment-tester:latest . else echo "Error: You need to specify a version as first argument" -fi +fi \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/entrypoint.sh b/openvidu-server/docker/openvidu-deployment-tester/entrypoint.sh new file mode 100644 index 00000000..aa467724 --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/entrypoint.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -eu -o pipefail + +# Iniciar XVFB +export DISPLAY_NUM=99 +export DISPLAY=":${DISPLAY_NUM}" + +# Esperar hasta que XVFB esté listo +while ! xdpyinfo -display "${DISPLAY}" >/dev/null 2>&1; do + DISPLAY_NUM=$((DISPLAY_NUM+1)) + DISPLAY=":${DISPLAY_NUM}" + echo "Trying to launch XVFB on display ${DISPLAY}..." + /usr/bin/Xvfb "${DISPLAY}" -screen 0 1280x720x16 & + sleep 2s +done + +echo "Running tests... Please wait..." + +python3 main.py "$@" \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/requirements.txt b/openvidu-server/docker/openvidu-deployment-tester/requirements.txt new file mode 100644 index 00000000..dd593bcf --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/requirements.txt @@ -0,0 +1,4 @@ +selenium==4.8.2 +webdriver-manager==3.8.5 +prettytable==3.6.0 +beautifulsoup4==4.12.0 \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/src/cli_utils.py b/openvidu-server/docker/openvidu-deployment-tester/src/cli_utils.py new file mode 100644 index 00000000..ab1159fd --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/src/cli_utils.py @@ -0,0 +1,34 @@ +import argparse + +def install_drivers_parser(subparsers): + install_drivers_parser = subparsers.add_parser("install-drivers") + install_drivers_parser.add_argument("--chrome-version", required=False, help="Chrome version to install (e.g. 87.0.4280.88") + install_drivers_parser.add_argument("--gecko-version", required=False, help="Gecko version to install (e.g. 0.29.1") + +def test_parser(subparsers, command): + test_parser = subparsers.add_parser(command) + test_parser.add_argument("--openvidu-url", required=True, help="OpenVidu URL to test") + test_parser.add_argument("--openvidu-secret", required=True, help="OpenVidu secret used for OpenVidu API") + if command == "basic-test": + test_parser.add_argument("--openvidu-edition", required=True, choices=["ce", "pro", "enterprise"], help="OpenVidu edition to test") + test_parser.add_argument("--browser", required=True, choices=["chrome", "firefox"], help="Browser to test") + test_parser.add_argument("--turn", required=False, default=False, action='store_true', help="Force TURN usage. Only available for Firefox") + elif command == "recording-test": + test_parser.add_argument("--openvidu-call-url", required=True, help="OpenVidu Call URL to test") + +def initialize_parser(): + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest="command") + + install_drivers_parser(subparsers) + test_parser(subparsers, "basic-test") + + return parser + +def print_args(args): + print("Executing command: " + args.command) + for arg, value in vars(args).items(): + if arg != 'command': + if arg == 'openvidu-secret': + value = '********' + print(f"\t{arg}: {value}") \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/src/main.py b/openvidu-server/docker/openvidu-deployment-tester/src/main.py new file mode 100644 index 00000000..253e6a8f --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/src/main.py @@ -0,0 +1,25 @@ +import cli_utils +import utils + +import tests + +# Define your commands here +def install_drivers(args): + cli_utils.print_args(args) + utils.install_drivers(args.chrome_version, args.gecko_version) + +# Define the command-line arguments +parser = cli_utils.initialize_parser() + +# Parse the command-line arguments and call the appropriate command with its arguments +args = parser.parse_args() +if hasattr(args, "openvidu_url") and args.openvidu_url.endswith("/"): + args.openvidu_url = args.openvidu_url[:-1] +if hasattr(args, "openvidu_secret"): + args.openvidu_url = utils.authenticated_url(args.openvidu_url, args.openvidu_secret) +if args.command == "install-drivers": + install_drivers(args) +elif args.command == "basic-test": + tests.basic_test(args) +else: + print("Error: No command specified") \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/src/tests.py b/openvidu-server/docker/openvidu-deployment-tester/src/tests.py new file mode 100644 index 00000000..60e0afb9 --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/src/tests.py @@ -0,0 +1,52 @@ +import utils +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.by import By + +def basic_test(args): + print("Running basic test with args:", args) + driver = utils.runBrowser(args.browser, args.turn) + if args.openvidu_edition == "ce": + url_test = args.openvidu_url + '/dashboard' + driver.get(url_test) + + elem = driver.find_element(By.ID,'test-btn') + elem.send_keys(Keys.RETURN) + + elem = driver.find_element(By.NAME, 'secret') + elem.send_keys(args.openvidu_secret) + + elem = driver.find_element(By.ID, 'join-btn') + elem.send_keys(Keys.RETURN) + elif args.openvidu_edition == "pro": + url_test = args.openvidu_url + '/inspector' + driver.get(url_test) + + elem = driver.find_element(By.ID, 'secret-input') + elem.send_keys(args.openvidu_secret) + + elem = driver.find_element(By.ID, 'login-btn') + elem.send_keys(Keys.RETURN) + + # print('data:image/png;base64,' + self.driver.get_screenshot_as_base64()) + elem = driver.find_element(By.ID,'menu-test-btn') + elem.send_keys(Keys.RETURN) + + elem = driver.find_element(By.ID,'test-btn') + elem.send_keys(Keys.RETURN) + else: + print("Error: Invalid OpenVidu edition specified") + exit(1) + + video_error = False + try: + driver.find_element(By.XPATH, "//*[contains(text(), 'Stream playing')]") + print('Video detected.\n') + except: + video_error = True + finally: + # print('data:image/png;base64,' + driver.get_screenshot_as_base64()) + if args.browser == "firefox": + utils.print_candidates(driver) + + if video_error == True: + raise Exception('Error. No video detected') \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-deployment-tester/src/utils.py b/openvidu-server/docker/openvidu-deployment-tester/src/utils.py new file mode 100644 index 00000000..f99ddb7a --- /dev/null +++ b/openvidu-server/docker/openvidu-deployment-tester/src/utils.py @@ -0,0 +1,126 @@ +import time +import os + +from webdriver_manager.chrome import ChromeDriverManager +from webdriver_manager.firefox import GeckoDriverManager +from selenium.webdriver.chrome.service import Service as ChromeService +from selenium.webdriver.firefox.service import Service as FirefoxService +from selenium.webdriver.common.by import By +from selenium import webdriver +from bs4 import BeautifulSoup +from prettytable import from_html_one + +def install_drivers(chrome_version, gecko_version): + print("Downloading drivers...") + # Download Chrome driver + chrome_driver_manager = ChromeDriverManager(version=chrome_version) + chrome_driver_manager.install() + + # Download Firefox driver + firefox_driver_manager = GeckoDriverManager(version=gecko_version) + firefox_driver_manager.install() + + with open("chrome_version", "w") as f: + f.write(chrome_driver_manager.driver.get_version()) + with open("firefox_version", "w") as f: + f.write(firefox_driver_manager.driver.get_version()) + +def authenticated_url(openvidu_url, openvidu_secret): + separator = "://" + basic_auth_url_str = "OPENVIDUAPP:" + openvidu_secret + "@" + split_url = openvidu_url.split(separator) + return split_url[0] + separator + basic_auth_url_str + split_url[1] + +def runBrowser(browser, turn=False): + driver=None + if browser == "chrome": + driver = runChrome() + else: + driver = runFirefox(turn) + driver.maximize_window() + driver.implicitly_wait(10) + return driver + +def runChrome(): + # Get Chrome driver version from environment variable + chrome_version = os.environ.get("CHROME_VERSION") + + # Get Chrome driver version from file if not found in environment variable + # Read it only if file exist (it may not exist if running in a container) + if chrome_version is None and os.path.isfile("chrome_version"): + with open("chrome_version", "r") as f: + chrome_version = f.read() + print("Chrome version: ", chrome_version) + print("Running chrome...") + options = webdriver.ChromeOptions() + options.add_argument("--use-fake-ui-for-media-stream") + options.add_argument("--disable-infobars") + options.add_argument("--ignore-certificate-errors") + options.add_argument("--start-maximized") + options.add_argument("--use-fake-device-for-media-stream") + options.add_argument("--no-sandbox") + + return webdriver.Chrome( + service=ChromeService(ChromeDriverManager(version=chrome_version).install()), + options = options) + +def runFirefox(turn=False): + # Get Gecko driver version from environment variable + gecko_version = os.environ.get("GECKO_VERSION") + + # Get Gecko driver version from file if not found in environment variable + # Read it only if file exist (it may not exist if running in a container) + if gecko_version is None and os.path.isfile("firefox_version"): + with open("firefox_version", "r") as f: + gecko_version = f.read() + + print("Gecko version: ", gecko_version) + print("Running firefox with Turn: ", turn) + options = webdriver.FirefoxOptions() + options.set_preference('media.navigator.permission.disabled', True) + options.set_preference('media.navigator.streams.fake', True) + options.set_preference('media.peerconnection.enabled', True) + options.set_preference('media.peerconnection.ice.obfuscate_host_addresses', False) + options.set_preference('media.peerconnection.identity.enabled', True) + options.set_preference('media.peerconnection.mtransport_process', True) + options.set_preference('media.peerconnection.ice.no_host', False) + options.set_preference('network.process.enabled', True) + options.set_preference('media.peerconnection.ice.relay_only', turn) + options.set_preference('media.peerconnection.turn.disable', not turn) + + return webdriver.Firefox( + service=FirefoxService(GeckoDriverManager(version=gecko_version).install()), + options = options) + +def print_candidates(driver): + try: + # New tab + driver.execute_script("window.open('');") + # Switch to the new window + driver.switch_to.window(driver.window_handles[1]) + # Open about:webrtc + driver.get('about:webrtc') + peer_conn_elems = 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) + # about:webrtc page refreshes each second, so we need to + # safe the entire HTML in a variable to have a Snapshot of the situation + about_webrtc_html = '' + driver.find_element(By.TAG_NAME, 'html').get_attribute('innerHTML') + '' + # Search the tables using a parser and print all candidates + soup = BeautifulSoup(about_webrtc_html, 'html.parser') + for caption in soup.findAll('caption', {'data-l10n-id' : 'about-webrtc-trickle-caption-msg'}): + print(from_html_one(str(caption.parent))) + # Close about:webrtc + driver.close() + driver.switch_to.window(driver.window_handles[0]) + driver.close() + except: + print('[Warn] Some candidates may not appear in test result') + driver.switch_to.window(driver.window_handles[0]) + driver.close() \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-health-checker/Dockerfile b/openvidu-server/docker/openvidu-health-checker/Dockerfile deleted file mode 100644 index 5e3d585a..00000000 --- a/openvidu-server/docker/openvidu-health-checker/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -FROM ubuntu:20.04 - -ENV DEBIAN_FRONTEND noninteractive -ENV DISPLAY :99.0 - -# Install Software -RUN apt-get update && \ - apt-get install -qqy --no-install-recommends \ - gnupg2 \ - xvfb \ - x11-utils \ - wget \ - python3 \ - python3-pip - -# Install Chrome and firefox -RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ - && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \ - && apt-get update -qqy \ - && apt-get -qqy install \ - google-chrome-stable firefox \ - && rm /etc/apt/sources.list.d/google-chrome.list - -RUN pip3 install selenium webdriver_manager prettytable beautifulsoup4 - -WORKDIR /workdir - -COPY ./run.sh ./entrypoint.sh /usr/local/bin/ -COPY ./openvidu_health_check.py ./download_webdrivers.py ./ -RUN chmod +x /usr/local/bin/entrypoint.sh /usr/local/bin/run.sh - -# Cache web driver -RUN python3 download_webdrivers.py - -ENTRYPOINT [ "/usr/local/bin/entrypoint.sh" ] - -CMD [ "openvidu_health_check.py" ] - diff --git a/openvidu-server/docker/openvidu-health-checker/README.md b/openvidu-server/docker/openvidu-health-checker/README.md deleted file mode 100644 index 21a8f977..00000000 --- a/openvidu-server/docker/openvidu-health-checker/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Openvidu health checker - -The main purpose of this image is to have a self-contained and independent docker image to test and check possible errors in OpenVidu deployments. - -This image is also usefull to automation tests of infrastructure. - -# Current health checks - -## 1. Video working and Turn correctly setup - -``` -docker run --shm-size 2g \ - -e OV_URL= \ - -e OV_SECRET= \ - openvidu/openvidu-health-checker -``` - -Just put your OpenVidu url at `OV_URL` and your `OV_SECRET` and the stack will be tested. - -This health check includes: - -- 1. Inspector Test Video in **Chrome** -- 2. Inspector Test Video in **Firefox** -- 3. Inspector Test Video in **Firefox** with **TURN forced**. - -If allways works: - -- STUN/TURN is correctly configured -- Video Publishing/Subscribing works - -If works sometimes: - -- Bad ports opened. -- Bad internet connection. -- No possible connection via STUN/TURN - -If don't work: - -- Bad port configuration. -- No possible connection via STUN/TURN -- Simply a deployment which is not deployed correctly diff --git a/openvidu-server/docker/openvidu-health-checker/download_webdrivers.py b/openvidu-server/docker/openvidu-health-checker/download_webdrivers.py deleted file mode 100644 index 15672d6c..00000000 --- a/openvidu-server/docker/openvidu-health-checker/download_webdrivers.py +++ /dev/null @@ -1,12 +0,0 @@ -from openvidu_health_check import InfraSmokeTests - -if __name__ == '__main__': - try: - init_obj = InfraSmokeTests() - init_obj.runChrome() - except: - print("Chrome web driver downloaded") - try: - init_obj.runFirefox() - except: - print("Firefox web driver downloaded") diff --git a/openvidu-server/docker/openvidu-health-checker/entrypoint.sh b/openvidu-server/docker/openvidu-health-checker/entrypoint.sh deleted file mode 100644 index 63f36791..00000000 --- a/openvidu-server/docker/openvidu-health-checker/entrypoint.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -asyncRun() { - "$@" & - pid="$!" - trap "echo 'Stopping PID $pid'; kill -SIGTERM $pid" SIGINT SIGTERM - - # A signal emitted while waiting will make the wait command return code > 128 - # Let's wrap it in a loop that doesn't end before the process is indeed stopped - while kill -0 $pid > /dev/null 2>&1; do - wait - done -} - -asyncRun /usr/local/bin/run.sh "$@" diff --git a/openvidu-server/docker/openvidu-health-checker/openvidu_health_check.py b/openvidu-server/docker/openvidu-health-checker/openvidu_health_check.py deleted file mode 100644 index 8b8a5707..00000000 --- a/openvidu-server/docker/openvidu-health-checker/openvidu_health_check.py +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/python3 -import unittest -import requests -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 -from selenium.webdriver.chrome import options -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 bs4 import BeautifulSoup -from prettytable import from_html_one -import time -import os - -class InfraSmokeTests(unittest.TestCase): - - def setUp(self): - print('Executing test... Please wait...') - self.openvidu_url = os.getenv('OV_URL') - self.openvidu_password = os.getenv('OV_SECRET') - self.is_openvidu_ce = self.check_is_openvidu_ce() - if self.is_openvidu_ce: - self.inject_basic_auth_in_url() - self.driver = None - - def test_chrome_no_relay(self): - self.inspector_check(browser="chrome") - - def test_firefox_no_relay(self): - self.inspector_check(browser="firefox") - - def test_firefox_force_relay(self): - self.inspector_check(browser="firefox", turn=True) - - def inspector_check(self, browser="chrome", turn=False): - print('\n\n======================================================================') - print('|') - print('|') - print('| Testing OpenVidu ' + ('CE ' if self.is_openvidu_ce else 'PRO/ENTERPRISE ') + '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) - - if self.is_openvidu_ce: - url_test = self.openvidu_url + '/dashboard' - self.driver.get(url_test) - - elem = self.driver.find_element(By.ID,'test-btn') - elem.send_keys(Keys.RETURN) - - elem = self.driver.find_element(By.NAME, 'secret') - elem.send_keys(self.openvidu_password) - - elem = self.driver.find_element(By.ID, 'join-btn') - elem.send_keys(Keys.RETURN) - - else: - url_test = self.openvidu_url + '/inspector' - self.driver.get(url_test) - - elem = self.driver.find_element(By.ID, 'secret-input') - elem.send_keys(self.openvidu_password) - - elem = self.driver.find_element(By.ID, 'login-btn') - elem.send_keys(Keys.RETURN) - - # 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) - - video_error = False - try: - self.driver.find_element(By.XPATH, "//*[contains(text(), 'Stream playing')]") - print('Video detected.\n') - except: - video_error = True - finally: - # print('data:image/png;base64,' + self.driver.get_screenshot_as_base64()) - if browser == "firefox": - self.print_candidates() - - if video_error == True: - raise Exception('Error. No video detected') - - self.driver.switch_to.window(self.driver.window_handles[0]) - elem = self.driver.find_element(By.ID,'test-btn') - elem.send_keys(Keys.RETURN) - - self.closeBrowser() - print('Sucess with ' + browser + ' and Force Turn: ' + str(turn) + '\n') - print('----------------------------------------------------------------------\n') - - def runChrome(self): - self.options = webdriver.ChromeOptions() - self.options.add_argument("--use-fake-ui-for-media-stream") - self.options.add_argument("--disable-infobars") - self.options.add_argument("--ignore-certificate-errors") - self.options.add_argument("--start-maximized") - self.options.add_argument("--use-fake-device-for-media-stream") - self.options.add_argument("--no-sandbox") - - self.driver = webdriver.Chrome( - service=ChromeService(ChromeDriverManager().install()), - options = self.options) - self.driver.implicitly_wait(15) - - def runFirefox(self, turn=False): - print("Running firefox with Turn: ", turn) - self.options = webdriver.FirefoxOptions() - self.options.set_preference('media.navigator.permission.disabled', False) - self.options.set_preference('media.navigator.streams.fake', 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.maximize_window() - - def check_is_openvidu_ce(self): - response = requests.get(self.openvidu_url + "/dashboard") - if response.status_code == 401: - return True - else: - return False - - def inject_basic_auth_in_url(self): - separator = "://" - basic_auth_url_str = "OPENVIDUAPP:" + self.openvidu_password + "@" - split_url = self.openvidu_url.split(separator) - self.openvidu_url = split_url[0] + separator + basic_auth_url_str + split_url[1] - - - 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) - # about:webrtc page refreshes each second, so we need to - # safe the entire HTML in a variable to have a Snapshot of the situation - about_webrtc_html = '' + self.driver.find_element(By.TAG_NAME, 'html').get_attribute('innerHTML') + '' - # Search the tables using a parser and print all candidates - soup = BeautifulSoup(about_webrtc_html, 'html.parser') - for caption in soup.findAll('caption', {'data-l10n-id' : 'about-webrtc-trickle-caption-msg'}): - print(from_html_one(str(caption.parent))) - # Close about:webrtc - self.driver.close() - except: - print('[Warn] Some candidates may not appear in test result') - - def closeBrowser(self): - # close the browser window - self.driver.close() - self.driver.quit() - -if __name__ == '__main__': - unittest.main() diff --git a/openvidu-server/docker/openvidu-health-checker/run.sh b/openvidu-server/docker/openvidu-health-checker/run.sh deleted file mode 100644 index 22940cc6..00000000 --- a/openvidu-server/docker/openvidu-health-checker/run.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -eu -o pipefail - -# Launch XVFB -/usr/bin/Xvfb :99 -screen 0 1280x720x16 & - -# Wait for XVFB -while ! xdpyinfo >/dev/null 2>&1 -do - sleep 0.50s - echo "Waiting xvfb..." -done - -echo "Running tests... Please wait..." - -exec python3 "$@" diff --git a/openvidu-server/docker/openvidu-recording/Dockerfile b/openvidu-server/docker/openvidu-recording/Dockerfile index 19f28c2e..5c140978 100644 --- a/openvidu-server/docker/openvidu-recording/Dockerfile +++ b/openvidu-server/docker/openvidu-recording/Dockerfile @@ -18,12 +18,12 @@ RUN apt update && apt -y upgrade && apt install -y \ ttf-ancient-fonts fonts-beng fonts-wqy-zenhei fonts-indic \ && rm -rf /var/lib/apt/lists/* -# Install chrome -RUN apt update && apt -y upgrade && apt install -y wget sudo -RUN wget http://dl.google.com/linux/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && apt install -y ./google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && rm google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && google-chrome --version +# Install latest stable Chrome browser +RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4CCA1EAF950CEE4AB83976DCA040830F7FAC5991 \ + && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \ + && apt update \ + && apt install -y google-chrome-stable \ + && rm -rf /var/lib/apt/lists/* # Add root user to pulseaudio group RUN adduser root pulse-access