From bdb544ac4ee8c187c45e9677fb7a347dfcd615d5 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Thu, 29 Dec 2022 21:52:54 +0100 Subject: [PATCH] openvidu-test-e2e: refactoring before mobile testing --- ci-scripts/commons.sh | 2 +- ci-scripts/openvidu-e2e-tests.sh | 2 +- .../test/browsers/AndroidAppUser.java | 8 +- .../test/browsers/AndroidChromeUser.java | 16 +- .../openvidu/test/browsers/BrowserUser.java | 162 +++++++ .../test/browsers/utils/CustomHttpClient.java | 55 ++- .../test/e2e/OpenViduEventManager.java | 409 ++++++------------ .../io/openvidu/test/e2e/OpenViduTestE2e.java | 97 +++-- .../test/e2e/OpenViduProTestAppE2eTest.java | 8 +- .../test/e2e/OpenViduTestAppE2eTest.java | 203 +++------ 10 files changed, 483 insertions(+), 479 deletions(-) diff --git a/ci-scripts/commons.sh b/ci-scripts/commons.sh index 03ffaca8..b8fb4af2 100755 --- a/ci-scripts/commons.sh +++ b/ci-scripts/commons.sh @@ -95,7 +95,7 @@ if [[ "${PREPARE}" == true || "${EXECUTE_ALL}" == true ]]; then docker pull "${KURENTO_MEDIA_SERVER_IMAGE}" fi - # Prepare directory Openvidu + # Prepare directory for OpenVidu recordings sudo mkdir -p /opt/openvidu/recordings && sudo chmod 777 /opt/openvidu/recordings diff --git a/ci-scripts/openvidu-e2e-tests.sh b/ci-scripts/openvidu-e2e-tests.sh index 8b37a567..a516ca78 100755 --- a/ci-scripts/openvidu-e2e-tests.sh +++ b/ci-scripts/openvidu-e2e-tests.sh @@ -290,7 +290,7 @@ if [[ "${LAUNCH_OV_MEDIASOUP}" == true || "${EXECUTE_ALL}" == true ]]; then fi # ------------- -# OpenVidu E2E Tests Kurento +# OpenVidu E2E Tests mediasoup # ------------- if [[ "${OV_E2E_MEDIASOUP}" == true || "${EXECUTE_ALL}" == true ]]; then openviduE2ETests "mediasoup" diff --git a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java index b40ea7af..9fe450df 100644 --- a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java +++ b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java @@ -3,7 +3,7 @@ package io.openvidu.test.browsers; import java.net.MalformedURLException; import java.net.URL; -import io.appium.java_client.AppiumDriver; +import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; public class AndroidAppUser extends BrowserUser { @@ -12,10 +12,9 @@ public class AndroidAppUser extends BrowserUser { super(userName, timeOfWaitInSeconds); UiAutomator2Options options = new UiAutomator2Options(); - options.setPlatformVersion("12.0"); - options.setDeviceName("Android device"); options.setAutoWebview(true); options.setApp(appPath); + options.setAutoGrantPermissions(true); URL url = null; try { @@ -23,7 +22,8 @@ public class AndroidAppUser extends BrowserUser { } catch (MalformedURLException e) { e.printStackTrace(); } - this.driver = new AppiumDriver(url, options); + + this.driver = new AndroidDriver(url, options); this.configureDriver(); } diff --git a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java index 5b6dd8bc..87e92533 100644 --- a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java +++ b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java @@ -10,7 +10,19 @@ import org.openqa.selenium.remote.RemoteWebDriver; import io.appium.java_client.remote.MobileCapabilityType; import io.appium.java_client.remote.MobilePlatform; +// Run Docker Android: // docker run --privileged --rm --name android-chrome -p 6080:6080 -p 5554:5554 -p 5555:5555 -p 4723:4723 -e DEVICE="Samsung Galaxy S10" -e APPIUM=true -e APPIUM_HOST=172.17.0.1 -e APPIUM_PORT=4723 -e MOBILE_WEB_TEST=true -e RELAXED_SECURITY=true budtmo/docker-android-x86-12.0 +// +// Kill default Appium Server in Docker Android: +// docker exec android-chrome bash -c "ps axf | grep 'Appium Server' | grep -v grep | awk '{print $1}' | xargs -I {} kill -9 {}" +// +// Run custom Appium Server in Docker Android: +// docker exec android-chrome bash -c "xterm -T 'Appium Server' -n 'Appium Server' -e appium --log /var/log/supervisor/appium.log --relaxed-security --allow-insecure=chromedriver_autodownload &" +// +// Manually run appium: +// docker run --privileged --network=host -p 4723:4723 -v /dev/bus/usb:/dev/bus/usb -v /opt/openvidu/android:/opt/openvidu/android -e RELAXED_SECURITY=true -e ALLOW_INSECURE=chromedriver_autodownload appium/appium +// +// Command to replace Chrome driver in Docker Android: // docker exec android-chrome bash -c "rm chromedriver && wget https://chromedriver.storage.googleapis.com/91.0.4472.101/chromedriver_linux64.zip && unzip chromedriver_linux64.zip && rm chromedriver_linux64.zip" public class AndroidChromeUser extends BrowserUser { @@ -23,11 +35,7 @@ public class AndroidChromeUser extends BrowserUser { "autoplay-policy=no-user-gesture-required"); DesiredCapabilities capabilities = new DesiredCapabilities(); - capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "12.0"); - capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android device"); capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID); - capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2"); - capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome"); capabilities.setCapability(ChromeOptions.CAPABILITY, options); URL url = null; diff --git a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/BrowserUser.java b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/BrowserUser.java index cf37c46b..ffd52fd0 100644 --- a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/BrowserUser.java +++ b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/BrowserUser.java @@ -17,11 +17,18 @@ package io.openvidu.test.browsers; +import java.awt.Point; import java.time.Duration; import java.time.temporal.ChronoUnit; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.openqa.selenium.Dimension; +import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.WebDriverWait; import org.slf4j.LoggerFactory; @@ -81,4 +88,159 @@ public class BrowserUser { this.driver.quit(); } + public boolean hasMediaStream(WebElement videoElement, String parentSelector) { + boolean hasMediaStream = (boolean) ((JavascriptExecutor) driver).executeScript( + "return (!!(document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + "#" + + videoElement.getAttribute("id") + "').srcObject))"); + return hasMediaStream; + } + + public Map getAverageRgbFromVideo(WebElement videoElement) { + String script = "var callback = arguments[arguments.length - 1];" + "var video = document.getElementById('" + + videoElement.getAttribute("id") + "');" + "var canvas = document.createElement('canvas');" + + "canvas.height = video.videoHeight;" + "canvas.width = video.videoWidth;" + + "var context = canvas.getContext('2d');" + + "context.drawImage(video, 0, 0, canvas.width, canvas.height);" + + "var imgEl = document.createElement('img');" + "imgEl.src = canvas.toDataURL();" + + "var blockSize = 5;" + "var defaultRGB = { r: 0, g: 0, b: 0 };" + + "context.drawImage(video, 0, 0, 220, 150);" + "var dataURL = canvas.toDataURL();" + + "imgEl.onload = function () {" + "let i = -4;" + "var rgb = { r: 0, g: 0, b: 0 };" + "let count = 0;" + + "if (!context) {" + " return defaultRGB;" + "}" + + "var height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;" + + "var width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;" + "let data;" + + "context.drawImage(imgEl, 0, 0);" + "try {" + "data = context.getImageData(0, 0, width, height);" + + "} catch (e) {" + "return defaultRGB;" + "}" + "length = data.data.length;" + + "while ((i += blockSize * 4) < length) {" + "++count;" + "rgb.r += data.data[i];" + + "rgb.g += data.data[i + 1];" + "rgb.b += data.data[i + 2];" + "}" + "rgb.r = ~~(rgb.r / count);" + + "rgb.g = ~~(rgb.g / count);" + "rgb.b = ~~(rgb.b / count);" + "callback(rgb);" + "};"; + Object averageRgb = ((JavascriptExecutor) driver).executeAsyncScript(script); + return (Map) averageRgb; + } + + public Map getAverageColorFromPixels(WebElement videoElement, List pixelPercentagePositions) { + String script = "var callback = arguments[arguments.length - 1];" + + "var points = arguments[arguments.length - 2];" + "points = JSON.parse(points);" + + "var video = document.getElementById('local-video-undefined');" + + "var canvas = document.createElement('canvas');" + "canvas.height = video.videoHeight;" + + "canvas.width = video.videoWidth;" + "var context = canvas.getContext('2d');" + + "context.drawImage(video, 0, 0, canvas.width, canvas.height);" + + "var imgEl = document.createElement('img');" + "imgEl.src = canvas.toDataURL();" + + "var blockSize = 5;" + "var defaultRGB = {r:0,g:0,b:0};" + "context.drawImage(video, 0, 0, 220, 150);" + + "var dataURL = canvas.toDataURL();" + "imgEl.onload = function() {" + " var rgb = {r:0,g:0,b:0};" + + " if (!context) {" + " return defaultRGB;" + " }" + + " var height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;" + + " var width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;" + + " let data;" + " context.drawImage(imgEl, 0, 0);" + " for (var p of points) {" + + " var xFromPercentage = width * (p.x / 100);" + + " var yFromPercentage = height * (p.y / 100);" + + " data = context.getImageData(xFromPercentage, yFromPercentage, 1, 1).data;" + + " rgb.r += data[0];" + " rgb.g += data[1];" + " rgb.b += data[2];" + " }" + + " rgb.r = ~~(rgb.r / points.length);" + " rgb.g = ~~(rgb.g / points.length);" + + " rgb.b = ~~(rgb.b / points.length);" + " callback(rgb);" + "};"; + String points = "["; + Iterator it = pixelPercentagePositions.iterator(); + while (it.hasNext()) { + Point p = it.next(); + points += "{\"x\":" + p.getX() + ",\"y\":" + p.getY() + "}"; + if (it.hasNext()) { + points += ","; + } + } + points += "]"; + Object averageRgb = ((JavascriptExecutor) driver).executeAsyncScript(script, points); + return (Map) averageRgb; + } + + public String getDimensionOfViewport() { + String dimension = (String) ((JavascriptExecutor) driver) + .executeScript("return (JSON.stringify({width: window.innerWidth, height: window.innerHeight - 1}))"); + return dimension; + } + + public void stopVideoTracksOfVideoElement(WebElement videoElement, String parentSelector) { + String script = "return (document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + + "#" + videoElement.getAttribute("id") + + "').srcObject.getVideoTracks().forEach(track => track.stop()))"; + ((JavascriptExecutor) driver).executeScript(script); + } + + public boolean assertMediaTracks(WebElement videoElement, boolean audioTransmission, boolean videoTransmission, + String parentSelector) { + return this.assertMediaTracks(Collections.singleton(videoElement), audioTransmission, videoTransmission, + parentSelector); + } + + public boolean assertMediaTracks(Iterable videoElements, boolean audioTransmission, + boolean videoTransmission) { + boolean success = true; + for (WebElement video : videoElements) { + if (!waitUntilSrcObjectDefined(video, "", 5000)) { + System.err.println("srcObject of HTMLVideoElement was not defined!"); + return false; + } + success = success && (audioTransmission == this.hasAudioTracks(video, "")) + && (videoTransmission == this.hasVideoTracks(video, "")); + if (!success) + break; + } + return success; + } + + public boolean assertMediaTracks(Iterable videoElements, boolean audioTransmission, + boolean videoTransmission, String parentSelector) { + boolean success = true; + for (WebElement video : videoElements) { + if (!waitUntilSrcObjectDefined(video, "", 5000)) { + System.err.println("srcObject of HTMLVideoElement was not defined!"); + return false; + } + success = success && (audioTransmission == this.hasAudioTracks(video, parentSelector)) + && (videoTransmission == this.hasVideoTracks(video, parentSelector)); + if (!success) + break; + } + return success; + } + + private boolean hasAudioTracks(WebElement videoElement, String parentSelector) { + String script = "return ((document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + + "#" + videoElement.getAttribute("id") + "').srcObject.getAudioTracks().length > 0)" + + " && (document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + "#" + + videoElement.getAttribute("id") + "').srcObject.getAudioTracks()[0].enabled))"; + boolean audioTracks = (boolean) ((JavascriptExecutor) driver).executeScript(script); + return audioTracks; + } + + private boolean hasVideoTracks(WebElement videoElement, String parentSelector) { + String script = "return ((document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + + "#" + videoElement.getAttribute("id") + "').srcObject.getVideoTracks().length > 0)" + + " && (document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + "#" + + videoElement.getAttribute("id") + "').srcObject.getVideoTracks()[0].enabled))"; + boolean videoTracks = (boolean) ((JavascriptExecutor) driver).executeScript(script); + return videoTracks; + } + + private boolean waitUntilSrcObjectDefined(WebElement videoElement, String parentSelector, int maxMsWait) { + final int sleepInterval = 50; + int maxIterations = maxMsWait / sleepInterval; + int counter = 0; + boolean defined = srcObjectDefined(videoElement, parentSelector); + while (!defined && counter < maxIterations) { + try { + Thread.sleep(sleepInterval); + } catch (InterruptedException e) { + } + defined = srcObjectDefined(videoElement, parentSelector); + counter++; + } + return defined; + } + + private boolean srcObjectDefined(WebElement videoElement, String parentSelector) { + String script = "return (!!(document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + + "#" + videoElement.getAttribute("id") + "').srcObject))"; + boolean defined = (boolean) ((JavascriptExecutor) driver).executeScript(script); + return defined; + } + } \ No newline at end of file diff --git a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/utils/CustomHttpClient.java b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/utils/CustomHttpClient.java index 6405b36d..1fe8b0b5 100644 --- a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/utils/CustomHttpClient.java +++ b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/utils/CustomHttpClient.java @@ -63,9 +63,16 @@ public class CustomHttpClient { private String headerAuth; private CloseableHttpClient client; + public CustomHttpClient(String url) throws Exception { + this(url, null, null); + } + public CustomHttpClient(String url, String user, String pass) throws Exception { this.openviduUrl = url.replaceFirst("/*$", ""); - this.headerAuth = "Basic " + Base64.getEncoder().encodeToString((user + ":" + pass).getBytes()); + + if (user != null && pass != null) { + this.headerAuth = "Basic " + Base64.getEncoder().encodeToString((user + ":" + pass).getBytes()); + } SSLContext sslContext = null; try { @@ -94,6 +101,10 @@ public class CustomHttpClient { return this.commonRest(method, path, body, status); } + public String restString(HttpMethod method, String path, String body, int status) throws Exception { + return this.commonRestString(method, path, body, status); + } + /** * "matchKeys" to true for the returned JSON to have the exact same keys as the * expected JSON (same number, position and name). If false, then any key @@ -239,8 +250,26 @@ public class CustomHttpClient { } private JsonObject commonRest(HttpMethod method, String path, String body, int status) throws Exception { - HttpResponse jsonResponse = null; + String stringResponse = this.commonRestString(method, path, body, status); JsonObject json = null; + JsonElement jsonElement = null; + try { + jsonElement = JsonParser.parseString(stringResponse); + } catch (JsonParseException e) { + System.out.println("Response is not a JSON element: " + stringResponse); + } + if (jsonElement != null) { + try { + json = jsonElement.getAsJsonObject(); + } catch (IllegalStateException e) { + System.out.println("Response is not a JSON object: " + stringResponse); + } + } + return json; + } + + private String commonRestString(HttpMethod method, String path, String body, int status) throws Exception { + HttpResponse jsonResponse = null; path = openviduUrl + (path.startsWith("/") ? path : ("/" + path)); HttpRequestBase request = null; @@ -282,27 +311,17 @@ public class CustomHttpClient { } } - request.addHeader("Authorization", this.headerAuth); + if (this.headerAuth != null) { + request.addHeader("Authorization", this.headerAuth); + } try { jsonResponse = client.execute(request); } catch (Exception e) { throw new Exception("Error sending request to " + path + ": " + e.getMessage()); } + String stringResponse = null; if (jsonResponse.getEntity() != null) { - String stringResponse = EntityUtils.toString(jsonResponse.getEntity(), "UTF-8"); - JsonElement jsonElement = null; - try { - jsonElement = JsonParser.parseString(stringResponse); - } catch (JsonParseException e) { - System.out.println("Response is not a JSON element: " + stringResponse); - } - if (jsonElement != null) { - try { - json = jsonElement.getAsJsonObject(); - } catch (IllegalStateException e) { - System.out.println("Response is not a JSON object: " + stringResponse); - } - } + stringResponse = EntityUtils.toString(jsonResponse.getEntity(), "UTF-8"); } if (jsonResponse.getStatusLine().getStatusCode() == 500) { @@ -319,7 +338,7 @@ public class CustomHttpClient { + jsonResponse.getStatusLine().getStatusCode()); } - return json; + return stringResponse; } } diff --git a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java index dde75f9d..2340e393 100644 --- a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java +++ b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java @@ -21,7 +21,6 @@ import static org.openqa.selenium.OutputType.BASE64; import java.awt.Point; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -83,15 +82,15 @@ public class OpenViduEventManager { private ExecutorService execService = Executors.newCachedThreadPool(); private WebDriver driver; private Queue eventQueue; - + private Map> eventCallbacks; private Map eventNumbers; private Map eventCountdowns; - - private Map>> eventCallbacksByUser; - private Map> eventNumbersByUser; - private Map> eventCountdownsByUser; - + + private Map>> eventCallbacksByUser; + private Map> eventNumbersByUser; + private Map> eventCountdownsByUser; + private AtomicBoolean isInterrupted = new AtomicBoolean(false); private CountDownLatch pollingLatch = new CountDownLatch(1); private int timeOfWaitInSeconds; @@ -102,9 +101,9 @@ public class OpenViduEventManager { this.eventCallbacks = new ConcurrentHashMap<>(); this.eventNumbers = new ConcurrentHashMap<>(); this.eventCountdowns = new ConcurrentHashMap<>(); - this.eventCallbacksByUser = new ConcurrentHashMap<>(); - this.eventNumbersByUser = new ConcurrentHashMap<>(); - this.eventCountdownsByUser = new ConcurrentHashMap<>(); + this.eventCallbacksByUser = new ConcurrentHashMap<>(); + this.eventNumbersByUser = new ConcurrentHashMap<>(); + this.eventCountdownsByUser = new ConcurrentHashMap<>(); this.timeOfWaitInSeconds = timeOfWaitInSeconds; } @@ -168,25 +167,25 @@ public class OpenViduEventManager { this.eventCallbacks.putIfAbsent(eventName, new HashSet<>()); this.eventCallbacks.get(eventName).add(new RunnableCallback(callback)); } - + public void on(int numberOfUser, String eventName, Consumer callback) { - this.eventCallbacksByUser.putIfAbsent(numberOfUser, new HashMap<>()); - this.eventCallbacksByUser.get(numberOfUser).putIfAbsent(eventName, new HashSet<>()); - this.eventCallbacksByUser.get(numberOfUser).get(eventName).add(new RunnableCallback(callback)); - } + this.eventCallbacksByUser.putIfAbsent(numberOfUser, new HashMap<>()); + this.eventCallbacksByUser.get(numberOfUser).putIfAbsent(eventName, new HashSet<>()); + this.eventCallbacksByUser.get(numberOfUser).get(eventName).add(new RunnableCallback(callback)); + } public void off(String eventName) { this.eventCallbacks.remove(eventName); } - - public void off(int numberOfUser, String eventName) { - if (this.eventCallbacksByUser.containsKey(numberOfUser)) { - this.eventCallbacksByUser.get(numberOfUser).remove(eventName); - if (this.eventCallbacksByUser.get(numberOfUser).isEmpty()) { - this.eventCallbacksByUser.remove(numberOfUser); - } - } - } + + public void off(int numberOfUser, String eventName) { + if (this.eventCallbacksByUser.containsKey(numberOfUser)) { + this.eventCallbacksByUser.get(numberOfUser).remove(eventName); + if (this.eventCallbacksByUser.get(numberOfUser).isEmpty()) { + this.eventCallbacksByUser.remove(numberOfUser); + } + } + } // 'eventNumber' is accumulative for event 'eventName' for one page while it is // not refreshed @@ -215,43 +214,43 @@ public class OpenViduEventManager { } } - public void waitUntilEventReaches(int numberOfUser, String eventName, int eventNumber) throws Exception { - this.waitUntilEventReaches(numberOfUser, eventName, eventNumber, this.timeOfWaitInSeconds, true); - } + public void waitUntilEventReaches(int numberOfUser, String eventName, int eventNumber) throws Exception { + this.waitUntilEventReaches(numberOfUser, eventName, eventNumber, this.timeOfWaitInSeconds, true); + } + + public void waitUntilEventReaches(int numberOfUser, String eventName, int eventNumber, int secondsOfWait, + boolean printTimeoutError) throws Exception { + CountDownLatch eventSignal = new CountDownLatch(eventNumber); + this.setCountDown(numberOfUser, eventName, eventSignal); + try { + if (!eventSignal.await(secondsOfWait * 1000, TimeUnit.MILLISECONDS)) { + if (printTimeoutError) { + String screenshot = "data:image/png;base64," + ((TakesScreenshot) driver).getScreenshotAs(BASE64); + System.out.println("TIMEOUT SCREENSHOT"); + System.out.println(screenshot); + } + throw (new TimeoutException()); + } + } catch (InterruptedException | TimeoutException e) { + if (printTimeoutError) { + e.printStackTrace(); + } + throw e; + } + } - public void waitUntilEventReaches(int numberOfUser, String eventName, int eventNumber, int secondsOfWait, boolean printTimeoutError) - throws Exception { - CountDownLatch eventSignal = new CountDownLatch(eventNumber); - this.setCountDown(numberOfUser, eventName, eventSignal); - try { - if (!eventSignal.await(secondsOfWait * 1000, TimeUnit.MILLISECONDS)) { - if (printTimeoutError) { - String screenshot = "data:image/png;base64," + ((TakesScreenshot) driver).getScreenshotAs(BASE64); - System.out.println("TIMEOUT SCREENSHOT"); - System.out.println(screenshot); - } - throw (new TimeoutException()); - } - } catch (InterruptedException | TimeoutException e) { - if (printTimeoutError) { - e.printStackTrace(); - } - throw e; - } - } - // Sets any event count to 0 public synchronized void clearCurrentEvents(String eventName) { this.eventNumbers.put(eventName, new AtomicInteger(0)); this.setCountDown(eventName, new CountDownLatch(0)); } - + public synchronized void clearCurrentEvents(int numberOfUser, String eventName) { - if (this.eventNumbersByUser.containsKey(numberOfUser)) { - this.eventNumbersByUser.get(numberOfUser).put(eventName, new AtomicInteger(0)); - this.setCountDown(numberOfUser, eventName, new CountDownLatch(0)); - } - } + if (this.eventNumbersByUser.containsKey(numberOfUser)) { + this.eventNumbersByUser.get(numberOfUser).put(eventName, new AtomicInteger(0)); + this.setCountDown(numberOfUser, eventName, new CountDownLatch(0)); + } + } public synchronized void clearAllCurrentEvents() { this.eventNumbers.keySet().forEach(eventName -> { @@ -259,13 +258,13 @@ public class OpenViduEventManager { }); } - public synchronized void clearAllCurrentEvents(int numberOfUser) { - if (this.eventNumbersByUser.containsKey(numberOfUser)) { - this.eventNumbersByUser.get(numberOfUser).keySet().forEach(eventName -> { - this.clearCurrentEvents(numberOfUser, eventName); - }); - } - } + public synchronized void clearAllCurrentEvents(int numberOfUser) { + if (this.eventNumbersByUser.containsKey(numberOfUser)) { + this.eventNumbersByUser.get(numberOfUser).keySet().forEach(eventName -> { + this.clearCurrentEvents(numberOfUser, eventName); + }); + } + } public void resetEventThread(boolean clearData) throws InterruptedException { this.stopPolling(true, clearData); @@ -286,242 +285,86 @@ public class OpenViduEventManager { this.startPolling(); } - public boolean assertMediaTracks(WebElement videoElement, boolean audioTransmission, boolean videoTransmission, - String parentSelector) { - return this.assertMediaTracks(Collections.singleton(videoElement), audioTransmission, videoTransmission, - parentSelector); - } - - public boolean assertMediaTracks(Iterable videoElements, boolean audioTransmission, - boolean videoTransmission) { - boolean success = true; - for (WebElement video : videoElements) { - if (!waitUntilSrcObjectDefined(video, "", 5000)) { - System.err.println("srcObject of HTMLVideoElement was not defined!"); - return false; - } - success = success && (audioTransmission == this.hasAudioTracks(video, "")) - && (videoTransmission == this.hasVideoTracks(video, "")); - if (!success) - break; - } - return success; - } - - public boolean assertMediaTracks(Iterable videoElements, boolean audioTransmission, - boolean videoTransmission, String parentSelector) { - boolean success = true; - for (WebElement video : videoElements) { - if (!waitUntilSrcObjectDefined(video, "", 5000)) { - System.err.println("srcObject of HTMLVideoElement was not defined!"); - return false; - } - success = success && (audioTransmission == this.hasAudioTracks(video, parentSelector)) - && (videoTransmission == this.hasVideoTracks(video, parentSelector)); - if (!success) - break; - } - return success; - } - public AtomicInteger getNumEvents(String eventName) { return this.eventNumbers.computeIfAbsent(eventName, k -> new AtomicInteger(0)); } - + public AtomicInteger getNumEvents(int numberOfUser, String eventName) { - this.eventNumbersByUser.putIfAbsent(numberOfUser, new HashMap<>()); - return this.eventNumbersByUser.get(numberOfUser).computeIfAbsent(eventName, k -> new AtomicInteger(0)); - } + this.eventNumbersByUser.putIfAbsent(numberOfUser, new HashMap<>()); + return this.eventNumbersByUser.get(numberOfUser).computeIfAbsent(eventName, k -> new AtomicInteger(0)); + } - private void setCountDown(String eventName, CountDownLatch cd) { - this.eventCountdowns.put(eventName, cd); - for (int i = 0; i < getNumEvents(eventName).get(); i++) { - cd.countDown(); - } - } + private void setCountDown(String eventName, CountDownLatch cd) { + this.eventCountdowns.put(eventName, cd); + for (int i = 0; i < getNumEvents(eventName).get(); i++) { + cd.countDown(); + } + } - private void setCountDown(int numberOfUser, String eventName, CountDownLatch cd) { - this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>()); - this.eventCountdownsByUser.get(numberOfUser).put(eventName, cd); - for (int i = 0; i < getNumEvents(numberOfUser, eventName).get(); i++) { - cd.countDown(); - } - } + private void setCountDown(int numberOfUser, String eventName, CountDownLatch cd) { + this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>()); + this.eventCountdownsByUser.get(numberOfUser).put(eventName, cd); + for (int i = 0; i < getNumEvents(numberOfUser, eventName).get(); i++) { + cd.countDown(); + } + } - private void emitEvents() { - while (!this.eventQueue.isEmpty()) { - JsonObject userAndEvent = this.eventQueue.poll(); - final JsonObject event = userAndEvent.get("event").getAsJsonObject(); - final int numberOfUser = userAndEvent.get("user").getAsInt(); - final String eventType = event.get("type").getAsString(); + private void emitEvents() { + while (!this.eventQueue.isEmpty()) { + JsonObject userAndEvent = this.eventQueue.poll(); + final JsonObject event = userAndEvent.get("event").getAsJsonObject(); + final int numberOfUser = userAndEvent.get("user").getAsInt(); + final String eventType = event.get("type").getAsString(); - log.info(eventType); + log.info(eventType); - if (this.eventCallbacks.containsKey(eventType)) { - for (RunnableCallback callback : this.eventCallbacks.get(eventType)) { - callback.setEventResult(event); - execService.submit(callback); - } - } - if (this.eventCallbacksByUser.containsKey(numberOfUser)) { - for (RunnableCallback callback : this.eventCallbacksByUser.get(numberOfUser).get(eventType)) { - callback.setEventResult(event); - execService.submit(callback); - } - } - } - } + if (this.eventCallbacks.containsKey(eventType)) { + for (RunnableCallback callback : this.eventCallbacks.get(eventType)) { + callback.setEventResult(event); + execService.submit(callback); + } + } + if (this.eventCallbacksByUser.containsKey(numberOfUser)) { + for (RunnableCallback callback : this.eventCallbacksByUser.get(numberOfUser).get(eventType)) { + callback.setEventResult(event); + execService.submit(callback); + } + } + } + } - private synchronized void getEventsFromBrowser() { - String rawEvents = this.getAndClearEventsInBrowser(); + private synchronized void getEventsFromBrowser() { + String rawEvents = this.getAndClearEventsInBrowser(); - if (rawEvents == null || rawEvents.length() == 0) { - return; - } + if (rawEvents == null || rawEvents.length() == 0) { + return; + } - String[] events = rawEvents.replaceFirst("^
", "").split("
"); - for (String e : events) { - JsonObject userAndEvent = JsonParser.parseString(e).getAsJsonObject(); - final JsonObject event = userAndEvent.get("event").getAsJsonObject(); - final int numberOfUser = userAndEvent.get("user").getAsInt(); - final String eventType = event.get("type").getAsString(); + String[] events = rawEvents.replaceFirst("^
", "").split("
"); + for (String e : events) { + JsonObject userAndEvent = JsonParser.parseString(e).getAsJsonObject(); + final JsonObject event = userAndEvent.get("event").getAsJsonObject(); + final int numberOfUser = userAndEvent.get("user").getAsInt(); + final String eventType = event.get("type").getAsString(); - this.eventQueue.add(userAndEvent); + this.eventQueue.add(userAndEvent); - getNumEvents(eventType).incrementAndGet(); - if (this.eventCountdowns.get(eventType) != null) { - this.eventCountdowns.get(eventType).countDown(); - } + getNumEvents(eventType).incrementAndGet(); + if (this.eventCountdowns.get(eventType) != null) { + this.eventCountdowns.get(eventType).countDown(); + } - getNumEvents(numberOfUser, eventType).incrementAndGet(); - this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>()); - if (this.eventCountdownsByUser.get(numberOfUser).get(eventType) != null) { - this.eventCountdownsByUser.get(numberOfUser).get(eventType).countDown(); - } - } - } - - private String getAndClearEventsInBrowser() { - String events = (String) ((JavascriptExecutor) driver) - .executeScript("var e = window.myEvents; window.myEvents = ''; return e;"); - return events; - } - - public boolean hasMediaStream(WebElement videoElement, String parentSelector) { - boolean hasMediaStream = (boolean) ((JavascriptExecutor) driver).executeScript( - "return (!!(document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + "#" - + videoElement.getAttribute("id") + "').srcObject))"); - return hasMediaStream; - } - - public Map getAverageRgbFromVideo(WebElement videoElement) { - String script = "var callback = arguments[arguments.length - 1];" + "var video = document.getElementById('" - + videoElement.getAttribute("id") + "');" + "var canvas = document.createElement('canvas');" - + "canvas.height = video.videoHeight;" + "canvas.width = video.videoWidth;" - + "var context = canvas.getContext('2d');" - + "context.drawImage(video, 0, 0, canvas.width, canvas.height);" - + "var imgEl = document.createElement('img');" + "imgEl.src = canvas.toDataURL();" - + "var blockSize = 5;" + "var defaultRGB = { r: 0, g: 0, b: 0 };" - + "context.drawImage(video, 0, 0, 220, 150);" + "var dataURL = canvas.toDataURL();" - + "imgEl.onload = function () {" + "let i = -4;" + "var rgb = { r: 0, g: 0, b: 0 };" + "let count = 0;" - + "if (!context) {" + " return defaultRGB;" + "}" - + "var height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;" - + "var width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;" + "let data;" - + "context.drawImage(imgEl, 0, 0);" + "try {" + "data = context.getImageData(0, 0, width, height);" - + "} catch (e) {" + "return defaultRGB;" + "}" + "length = data.data.length;" - + "while ((i += blockSize * 4) < length) {" + "++count;" + "rgb.r += data.data[i];" - + "rgb.g += data.data[i + 1];" + "rgb.b += data.data[i + 2];" + "}" + "rgb.r = ~~(rgb.r / count);" - + "rgb.g = ~~(rgb.g / count);" + "rgb.b = ~~(rgb.b / count);" + "callback(rgb);" + "};"; - Object averageRgb = ((JavascriptExecutor) driver).executeAsyncScript(script); - return (Map) averageRgb; - } - - public Map getAverageColorFromPixels(WebElement videoElement, List pixelPercentagePositions) { - String script = "var callback = arguments[arguments.length - 1];" - + "var points = arguments[arguments.length - 2];" + "points = JSON.parse(points);" - + "var video = document.getElementById('local-video-undefined');" - + "var canvas = document.createElement('canvas');" + "canvas.height = video.videoHeight;" - + "canvas.width = video.videoWidth;" + "var context = canvas.getContext('2d');" - + "context.drawImage(video, 0, 0, canvas.width, canvas.height);" - + "var imgEl = document.createElement('img');" + "imgEl.src = canvas.toDataURL();" - + "var blockSize = 5;" + "var defaultRGB = {r:0,g:0,b:0};" + "context.drawImage(video, 0, 0, 220, 150);" - + "var dataURL = canvas.toDataURL();" + "imgEl.onload = function() {" + " var rgb = {r:0,g:0,b:0};" - + " if (!context) {" + " return defaultRGB;" + " }" - + " var height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;" - + " var width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;" - + " let data;" + " context.drawImage(imgEl, 0, 0);" + " for (var p of points) {" - + " var xFromPercentage = width * (p.x / 100);" - + " var yFromPercentage = height * (p.y / 100);" - + " data = context.getImageData(xFromPercentage, yFromPercentage, 1, 1).data;" - + " rgb.r += data[0];" + " rgb.g += data[1];" + " rgb.b += data[2];" + " }" - + " rgb.r = ~~(rgb.r / points.length);" + " rgb.g = ~~(rgb.g / points.length);" - + " rgb.b = ~~(rgb.b / points.length);" + " callback(rgb);" + "};"; - String points = "["; - Iterator it = pixelPercentagePositions.iterator(); - while (it.hasNext()) { - Point p = it.next(); - points += "{\"x\":" + p.getX() + ",\"y\":" + p.getY() + "}"; - if (it.hasNext()) { - points += ","; - } - } - points += "]"; - Object averageRgb = ((JavascriptExecutor) driver).executeAsyncScript(script, points); - return (Map) averageRgb; - } - - public String getDimensionOfViewport() { - String dimension = (String) ((JavascriptExecutor) driver) - .executeScript("return (JSON.stringify({width: window.innerWidth, height: window.innerHeight - 1}))"); - return dimension; - } - - public void stopVideoTracksOfVideoElement(WebElement videoElement, String parentSelector) { - String script = "return (document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") - + "#" + videoElement.getAttribute("id") - + "').srcObject.getVideoTracks().forEach(track => track.stop()))"; - ((JavascriptExecutor) driver).executeScript(script); - } - - private boolean hasAudioTracks(WebElement videoElement, String parentSelector) { - String script = "return ((document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") - + "#" + videoElement.getAttribute("id") + "').srcObject.getAudioTracks().length > 0)" - + " && (document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + "#" - + videoElement.getAttribute("id") + "').srcObject.getAudioTracks()[0].enabled))"; - boolean audioTracks = (boolean) ((JavascriptExecutor) driver).executeScript(script); - return audioTracks; - } - - private boolean hasVideoTracks(WebElement videoElement, String parentSelector) { - String script = "return ((document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") - + "#" + videoElement.getAttribute("id") + "').srcObject.getVideoTracks().length > 0)" - + " && (document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") + "#" - + videoElement.getAttribute("id") + "').srcObject.getVideoTracks()[0].enabled))"; - boolean videoTracks = (boolean) ((JavascriptExecutor) driver).executeScript(script); - return videoTracks; - } - - private boolean waitUntilSrcObjectDefined(WebElement videoElement, String parentSelector, int maxMsWait) { - final int sleepInterval = 50; - int maxIterations = maxMsWait / sleepInterval; - int counter = 0; - boolean defined = srcObjectDefined(videoElement, parentSelector); - while (!defined && counter < maxIterations) { - try { - Thread.sleep(sleepInterval); - } catch (InterruptedException e) { - } - defined = srcObjectDefined(videoElement, parentSelector); - counter++; - } - return defined; - } - - private boolean srcObjectDefined(WebElement videoElement, String parentSelector) { - String script = "return (!!(document.querySelector('" + parentSelector + (parentSelector.isEmpty() ? "" : " ") - + "#" + videoElement.getAttribute("id") + "').srcObject))"; - boolean defined = (boolean) ((JavascriptExecutor) driver).executeScript(script); - return defined; - } + getNumEvents(numberOfUser, eventType).incrementAndGet(); + this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>()); + if (this.eventCountdownsByUser.get(numberOfUser).get(eventType) != null) { + this.eventCountdownsByUser.get(numberOfUser).get(eventType).countDown(); + } + } + } + private String getAndClearEventsInBrowser() { + String events = (String) ((JavascriptExecutor) driver) + .executeScript("var e = window.myEvents; window.myEvents = ''; return e;"); + return events; + } } diff --git a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java index 1961a41d..ece44f98 100644 --- a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java +++ b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java @@ -94,6 +94,9 @@ public class OpenViduTestE2e { // https://hub.docker.com/r/selenium/standalone-edge/tags protected static String EDGE_VERSION = "latest"; + protected static String OPENVIDU_DEPLOYMENT = "http://localhost:5000/"; + final private static String DOCKER_ANDROID_IMAGE = "budtmo/docker-android-x86-12.0:latest"; + protected static Exception ex = null; protected final Object lock = new Object(); @@ -102,10 +105,12 @@ public class OpenViduTestE2e { protected static final String RECORDING_IMAGE = "openvidu/openvidu-recording"; protected Collection browserUsers = new HashSet<>(); - protected Collection> containers = new HashSet<>(); + protected static Collection> containers = new HashSet<>(); protected volatile static boolean isRecordingTest; protected volatile static boolean isKurentoRestartTest; + protected volatile static boolean isAndroidTest; + protected static VideoCodec defaultForcedVideoCodec; protected static boolean defaultAllowTranscoding; @@ -185,12 +190,12 @@ public class OpenViduTestE2e { return edge; } - private GenericContainer androidContainer(String image, long shmSize) { + private static GenericContainer androidContainer(String image, long shmSize) { GenericContainer android = new GenericContainer<>(DockerImageName.parse(image)).withPrivilegedMode(true) .withEnv(Map.of("DEVICE", "Samsung Galaxy S10", "APPIUM", "true", "APPIUM_HOST", "172.17.0.1", "APPIUM_PORT", "4723", "MOBILE_WEB_TEST", "true", "RELAXED_SECURITY", "true")) .withSharedMemorySize(shmSize).withExposedPorts(6080, 5554, 5555, 4723).waitingFor(waitAndroid) - .withFileSystemBind("/opt/openvidu-cache", "/opt/openvidu-cache"); + .withFileSystemBind("/opt/openvidu/android", "/opt/openvidu/android").withReuse(true); android.setPortBindings(Arrays.asList("6080:6080", "5554:5554", "5555:5555", "4723:4723")); return android; } @@ -306,6 +311,12 @@ public class OpenViduTestE2e { if (dockerhubPrivateRegistryPassword != null) { DOCKERHUB_PRIVATE_REGISTRY_PASSWORD = dockerhubPrivateRegistryPassword; } + + String openviduDeployment = System.getProperty("OPENVIDU_DEPLOYMENT"); + if (openviduDeployment != null) { + OPENVIDU_DEPLOYMENT = openviduDeployment; + } + log.info("Using URL {} to connect to OpenVidu deployment", OPENVIDU_DEPLOYMENT); } protected BrowserUser setupBrowser(String browser) throws Exception { @@ -372,30 +383,20 @@ public class OpenViduTestE2e { browserUser = new EdgeUser("TestUser", 50); break; case "androidChrome": - container = androidContainer("budtmo/docker-android-x86-12.0:latest", 4294967296L); - setupBrowserAux(BrowserNames.ANDROID, container, false); - try { - // TODO: remove this try-catch when possible. Fixes - // https://github.com/budtmo/docker-android/issues/309 - container.execInContainer("bash", "-c", - "rm chromedriver && wget https://chromedriver.storage.googleapis.com/91.0.4472.101/chromedriver_linux64.zip && unzip chromedriver_linux64.zip && rm chromedriver_linux64.zip"); - } catch (UnsupportedOperationException | IOException | InterruptedException e) { - log.error("Error running command in Android container"); - } + container = setupDockerAndroidContainer(); browserUser = new AndroidChromeUser("TestUser", 50); break; + case "ionicApp": + container = setupDockerAndroidContainer(); + browserUser = new AndroidAppUser("TestUser", 50, "/opt/openvidu/android/openvidu-ionic.apk"); + break; + case "reactNativeApp": + container = setupDockerAndroidContainer(); + browserUser = new AndroidAppUser("TestUser", 50, "/opt/openvidu/android/openvidu-react-native.apk"); + break; case "androidApp": - container = androidContainer("budtmo/docker-android-x86-12.0:latest", 4294967296L); - setupBrowserAux(BrowserNames.ANDROID, container, false); - try { - // TODO: remove this try-catch when possible. Fixes - // https://github.com/budtmo/docker-android/issues/309 - container.execInContainer("bash", "-c", - "rm chromedriver && wget https://chromedriver.storage.googleapis.com/91.0.4472.101/chromedriver_linux64.zip && unzip chromedriver_linux64.zip && rm chromedriver_linux64.zip"); - } catch (UnsupportedOperationException | IOException | InterruptedException e) { - log.error("Error running command in Android container"); - } - browserUser = new AndroidAppUser("TestUser", 50, "/opt/openvidu-cache/app-debug.apk"); + container = setupDockerAndroidContainer(); + browserUser = new AndroidAppUser("TestUser", 50, "/opt/openvidu/android/openvidu-android.apk"); break; default: log.error("Browser {} not recognized", browser); @@ -405,7 +406,7 @@ public class OpenViduTestE2e { return browserUser; } - private void setupBrowserAux(BrowserNames browser, GenericContainer container, boolean forceRestart) { + private static boolean setupBrowserAux(BrowserNames browser, GenericContainer container, boolean forceRestart) { if (isRemote(browser)) { String dockerImage = container.getDockerImageName(); String ps = commandLine.executeCommand("docker ps | grep " + dockerImage, 30); @@ -416,8 +417,33 @@ public class OpenViduTestE2e { if (!containerAlreadyRunning) { container.start(); containers.add(container); + return true; } } + return false; + } + + protected static GenericContainer setupDockerAndroidContainer() throws Exception { + GenericContainer container = androidContainer(DOCKER_ANDROID_IMAGE, 4294967296L); + boolean newContainer = setupBrowserAux(BrowserNames.ANDROID, container, false); + if (newContainer) { + try { + // https://github.com/budtmo/docker-android/issues/309 + // Stop default Appium Server + container.execInContainer("bash", "-c", + "ps axf | grep \"Appium Server\" | grep -v grep | awk '{print $1}' | xargs -I {} kill -9 {}"); + // Run custom Appium Server + container.execInContainer("bash", "-c", + "xterm -T \"Appium Server\" -n \"Appium Server\" -e appium --log /var/log/supervisor/appium.log --relaxed-security --allow-insecure=chromedriver_autodownload &"); + } catch (UnsupportedOperationException | IOException | InterruptedException e) { + log.error("Error running command in Android container"); + throw e; + } + } else { + container = containers.stream().filter(c -> DOCKER_ANDROID_IMAGE.equals(c.getDockerImageName())).findFirst() + .get(); + } + return container; } private static boolean isRemote(BrowserNames browser) { @@ -450,19 +476,23 @@ public class OpenViduTestE2e { @AfterEach protected void dispose() { + // Close all remaining OpenVidu sessions this.closeAllSessions(OV); + // Remove all recordings if (isRecordingTest) { deleteAllRecordings(OV); isRecordingTest = false; } + // Reset Media Server if (isKurentoRestartTest) { this.stopMediaServer(false); this.startMediaServer(true); isKurentoRestartTest = false; } + // Dispose all browsers users Iterator it1 = browserUsers.iterator(); while (it1.hasNext()) { @@ -470,21 +500,30 @@ public class OpenViduTestE2e { u.dispose(); it1.remove(); } + // Stop and remove all browser containers if necessary Iterator> it2 = containers.iterator(); List waitUntilContainerIsRemovedCommands = new ArrayList<>(); containers.forEach(c -> { - waitUntilContainerIsRemovedCommands - .add("while docker inspect " + c.getContainerId() + " >/dev/null 2>&1; do sleep 1; done"); + if (isAndroidTest && DOCKER_ANDROID_IMAGE.equals(c.getDockerImageName())) { + log.info("Do not remove docker-android image"); + } else { + waitUntilContainerIsRemovedCommands + .add("while docker inspect " + c.getContainerId() + " >/dev/null 2>&1; do sleep 1; done"); + } }); while (it2.hasNext()) { GenericContainer c = it2.next(); - stopContainerIfPossible(c); - it2.remove(); + if (!(isAndroidTest && DOCKER_ANDROID_IMAGE.equals(c.getDockerImageName()))) { + stopContainerIfPossible(c); + it2.remove(); + } } waitUntilContainerIsRemovedCommands.forEach(command -> { commandLine.executeCommand(command, 30); }); + isAndroidTest = false; + // Reset REST client OV = new OpenVidu(OPENVIDU_URL, OPENVIDU_SECRET); } diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java index e1b6d494..a15c2353 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java @@ -715,7 +715,7 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestappE2eTest { // Image filter WebElement subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video")); - Map rgb = user.getEventManager().getAverageColorFromPixels(subscriberVideo, + Map rgb = user.getBrowserUser().getAverageColorFromPixels(subscriberVideo, Arrays.asList(new Point[] { new Point(93, 30), new Point(30, 50) })); // Green @@ -737,7 +737,7 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getWaiter().until( ExpectedConditions.attributeContains(By.id("operation-response-text-area"), "value", "Filter applied")); - rgb = user.getEventManager().getAverageColorFromPixels(subscriberVideo, + rgb = user.getBrowserUser().getAverageColorFromPixels(subscriberVideo, Arrays.asList(new Point[] { new Point(93, 30), new Point(30, 50) })); // Red @@ -772,7 +772,7 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getDriver().findElement(By.id("exec-filter-btn")).click(); user.getWaiter().until(ExpectedConditions.attributeContains(By.id("operation-response-text-area"), "value", "Filter method executed")); - rgb = user.getEventManager().getAverageColorFromPixels(subscriberVideo, + rgb = user.getBrowserUser().getAverageColorFromPixels(subscriberVideo, Arrays.asList(new Point[] { new Point(93, 30), new Point(30, 50) })); Assertions.assertTrue((rgb.get("r") < 10) && (rgb.get("g") < 10) && (rgb.get("b") > 240)); @@ -780,7 +780,7 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getWaiter().until( ExpectedConditions.attributeContains(By.id("operation-response-text-area"), "value", "Filter removed")); - rgb = user.getEventManager().getAverageColorFromPixels(subscriberVideo, + rgb = user.getBrowserUser().getAverageColorFromPixels(subscriberVideo, Arrays.asList(new Point[] { new Point(93, 30), new Point(30, 50) })); // Green diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java index ba85f42f..dde2e592 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java @@ -59,7 +59,6 @@ import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import io.appium.java_client.AppiumDriver; import io.openvidu.java.client.Connection; import io.openvidu.java.client.ConnectionProperties; import io.openvidu.java.client.ConnectionType; @@ -79,7 +78,6 @@ import io.openvidu.java.client.RecordingProperties; import io.openvidu.java.client.Session; import io.openvidu.java.client.SessionProperties; import io.openvidu.java.client.VideoCodec; -import io.openvidu.test.browsers.BrowserUser; import io.openvidu.test.browsers.utils.CustomHttpClient; import io.openvidu.test.browsers.utils.RecordingUtils; import io.openvidu.test.browsers.utils.layout.CustomLayoutHandler; @@ -138,52 +136,6 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { oneToOneAux(user); } - @Test - @DisplayName("One2One Chrome Android") - @Disabled - void oneToOneChromeAndroid() throws Exception { - long initTime = System.currentTimeMillis(); - OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("androidChrome"); - log.info("Android emulator ready after {} seconds", (System.currentTimeMillis() - initTime) / 1000); - log.info("One2One Android Chrome"); - onePublisherOneSubscriber(user); - } - - @Test - @DisplayName("One2One Firefox Android") - @Disabled - void oneToOneFirefoxAndroid() throws Exception { - long initTime = System.currentTimeMillis(); - OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("androidFirefox"); - log.info("Android emulator ready after {} seconds", (System.currentTimeMillis() - initTime) / 1000); - log.info("One2One Android Firefox"); - onePublisherOneSubscriber(user); - } - - @Test - @DisplayName("One2One Ionic Android") - @Disabled - void oneToOneIonicAndroid() throws Exception { - long initTime = System.currentTimeMillis(); - BrowserUser user = setupBrowser("androidApp"); - log.info("Android emulator ready after {} seconds", (System.currentTimeMillis() - initTime) / 1000); - log.info("One2One Ionic Android"); - - AppiumDriver appiumDriver = (AppiumDriver) user.getDriver(); - appiumDriver.findElement(By.cssSelector("#settings-button")).click(); - Thread.sleep(500); - WebElement urlInput = appiumDriver.findElement(By.cssSelector("#openvidu-url")); - urlInput.clear(); - urlInput.sendKeys(OPENVIDU_URL); - urlInput = appiumDriver.findElement(By.cssSelector("#openvidu-secret")); - urlInput.clear(); - urlInput.sendKeys(OPENVIDU_SECRET); - appiumDriver.findElement(By.cssSelector(".ok-btn")).click(); - Thread.sleep(500); - // Self signed cert over 172.17.0.1 problem - appiumDriver.findElement(By.cssSelector("#join-button")).click(); - } - private void oneToOneAux(OpenViduTestappUser user) throws Exception { user.getDriver().findElement(By.id("auto-join-checkbox")).click(); user.getDriver().findElement(By.id("one2one-btn")).click(); @@ -193,27 +145,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getEventManager().waitUntilEventReaches("streamPlaying", 4); final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), - "Videos were expected to have audio and video tracks"); - gracefullyLeaveParticipants(user, 2); - } - - private void onePublisherOneSubscriber(OpenViduTestappUser user) throws Exception { - user.getDriver().findElement(By.id("add-user-btn")).click(); - user.getDriver().findElement(By.id("add-user-btn")).click(); - user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 .publish-checkbox")).click(); - user.getDriver().findElements(By.className("join-btn")).forEach(el -> el.sendKeys(Keys.ENTER)); - - user.getEventManager().waitUntilEventReaches("connectionCreated", 4); - user.getEventManager().waitUntilEventReaches("accessAllowed", 1); - user.getEventManager().waitUntilEventReaches("streamCreated", 2); - user.getEventManager().waitUntilEventReaches("streamPlaying", 2); - - final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); - Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 2); } @@ -238,7 +171,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, false), "Videos were expected to only have audio tracks"); @@ -265,7 +198,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), false, true), "Videos were expected to only have video tracks"); @@ -290,8 +223,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 4); @@ -317,8 +250,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Video was expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 1); @@ -344,8 +277,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Video was expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 1); @@ -372,8 +305,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Video was expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 1); @@ -401,8 +334,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(16, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 4); @@ -470,7 +403,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { Assertions.assertEquals(3, numberOfVideos, "Wrong number of videos"); Assertions .assertTrue( - user.getEventManager().assertMediaTracks( + user.getBrowserUser().assertMediaTracks( user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); @@ -593,7 +526,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { // Stop video track WebElement video = user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 video")); - user.getEventManager().stopVideoTracksOfVideoElement(video, "#openvidu-instance-0"); + user.getBrowserUser().stopVideoTracksOfVideoElement(video, "#openvidu-instance-0"); user.getDriver().findElement(By.id("add-user-btn")).click(); user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 .publish-checkbox")).click(); @@ -631,8 +564,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); // Global unsubscribe-subscribe @@ -642,7 +575,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getWaiter() .until(ExpectedConditions.not(ExpectedConditions.attributeToBeNotEmpty(subscriberVideo, "srcObject"))); - Assertions.assertFalse(user.getEventManager().hasMediaStream(subscriberVideo, "#openvidu-instance-0"), + Assertions.assertFalse(user.getBrowserUser().hasMediaStream(subscriberVideo, "#openvidu-instance-0"), "Subscriber video should not have srcObject defined after unsubscribe"); subBtn.click(); @@ -650,8 +583,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); // Video unsubscribe @@ -659,23 +592,23 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { Iterable firstVideo = Arrays.asList(subscriberVideo); user.getDriver().findElement(By.cssSelector(("#openvidu-instance-0 .sub-video-btn"))).click(); Thread.sleep(1000); - Assertions.assertTrue(user.getEventManager().assertMediaTracks(firstVideo, true, false), + Assertions.assertTrue(user.getBrowserUser().assertMediaTracks(firstVideo, true, false), "Subscriber video was expected to only have audio track"); // Audio unsubscribe user.getDriver().findElement(By.cssSelector(("#openvidu-instance-0 .sub-audio-btn"))).click(); Thread.sleep(1000); - Assertions.assertTrue(user.getEventManager().assertMediaTracks(firstVideo, false, false), + Assertions.assertTrue(user.getBrowserUser().assertMediaTracks(firstVideo, false, false), "Subscriber video was expected to not have video or audio tracks"); // Video and audio subscribe user.getDriver().findElement(By.cssSelector(("#openvidu-instance-0 .sub-video-btn"))).click(); Thread.sleep(1000); - Assertions.assertTrue(user.getEventManager().assertMediaTracks(firstVideo, false, true), + Assertions.assertTrue(user.getBrowserUser().assertMediaTracks(firstVideo, false, true), "Subscriber video was expected to only have video track"); user.getDriver().findElement(By.cssSelector(("#openvidu-instance-0 .sub-audio-btn"))).click(); Thread.sleep(1000); - Assertions.assertTrue(user.getEventManager().assertMediaTracks(firstVideo, true, true), + Assertions.assertTrue(user.getBrowserUser().assertMediaTracks(firstVideo, true, true), "Subscriber video was expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 2); @@ -699,8 +632,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); List publishButtons = user.getDriver().findElements(By.className("pub-btn")); @@ -712,7 +645,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { for (WebElement video : user.getDriver().findElements(By.tagName("video"))) { user.getWaiter() .until(ExpectedConditions.not(ExpectedConditions.attributeToBeNotEmpty(video, "srcObject"))); - Assertions.assertFalse(user.getEventManager().hasMediaStream(video, ""), + Assertions.assertFalse(user.getBrowserUser().hasMediaStream(video, ""), "Videos were expected to lack srcObject property"); } @@ -722,8 +655,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getEventManager().waitUntilEventReaches("streamCreated", 8); user.getEventManager().waitUntilEventReaches("streamPlaying", 8); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 2); @@ -777,8 +710,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); final CountDownLatch latch2 = new CountDownLatch(2); @@ -812,7 +745,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), false, true), "Videos were expected to only have audio tracks"); @@ -846,8 +779,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); gracefullyLeaveParticipants(user, 2); @@ -887,8 +820,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(3, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); // Moderator forces unpublish @@ -898,7 +831,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { List videos = user.getDriver().findElements(By.tagName("video")); numberOfVideos = videos.size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertFalse(user.getEventManager().hasMediaStream(videos.get(0), ""), + Assertions.assertFalse(user.getBrowserUser().hasMediaStream(videos.get(0), ""), "Publisher video should not have srcObject defined after force unpublish"); // Publisher publishes again @@ -908,8 +841,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(3, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); // Moderator forces disconnect of publisher @@ -1045,7 +978,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getDriver().manage().window().setSize(new Dimension(newWidth, newHeight)); new Thread(() -> { - String widthAndHeight = user.getEventManager().getDimensionOfViewport(); + String widthAndHeight = user.getBrowserUser().getDimensionOfViewport(); JsonObject obj = JsonParser.parseString(widthAndHeight).getAsJsonObject(); expectedWidthHeight[0] = obj.get("width").getAsLong(); @@ -1161,8 +1094,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Video was expected to have audio and video tracks"); WebElement recordBtn = user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 .publisher-rec-btn")); @@ -1263,8 +1196,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Video was expected to have audio and video tracks"); user.getDriver().findElement(By.id("session-api-btn-0")).click(); @@ -1606,8 +1539,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); user.getDriver().findElement(By.id("session-api-btn-0")).click(); @@ -2148,8 +2081,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); // Fetch existing session (change) @@ -2256,14 +2189,14 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), false, true), "Videos were expected to have a video only track"); WebElement subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video")); // Analyze Chrome fake video stream without gray filter (GREEN color) - Map rgb = user.getEventManager().getAverageRgbFromVideo(subscriberVideo); + Map rgb = user.getBrowserUser().getAverageRgbFromVideo(subscriberVideo); Assertions.assertTrue(RecordingUtils.checkVideoAverageRgbGreen(rgb), "Video is not average green"); // Try to apply none allowed filter @@ -2301,7 +2234,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { // Analyze Chrome fake video stream with gray filter (GRAY color) user.getEventManager().waitUntilEventReaches("streamPropertyChanged", 2); Thread.sleep(500); - rgb = user.getEventManager().getAverageRgbFromVideo(subscriberVideo); + rgb = user.getBrowserUser().getAverageRgbFromVideo(subscriberVideo); System.out.println(rgb.toString()); Assertions.assertTrue(RecordingUtils.checkVideoAverageRgbGray(rgb), "Video is not average gray"); @@ -2319,7 +2252,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { // Analyze Chrome fake video stream without gray filter (GREEN color) user.getEventManager().waitUntilEventReaches("streamPropertyChanged", 4); Thread.sleep(500); - rgb = user.getEventManager().getAverageRgbFromVideo(subscriberVideo); + rgb = user.getBrowserUser().getAverageRgbFromVideo(subscriberVideo); System.out.println(rgb.toString()); Assertions.assertTrue(RecordingUtils.checkVideoAverageRgbGreen(rgb), "Video is not average green"); @@ -2344,7 +2277,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { // Analyze Chrome fake video stream with gray filter (GRAY color) subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video")); - rgb = user.getEventManager().getAverageRgbFromVideo(subscriberVideo); + rgb = user.getBrowserUser().getAverageRgbFromVideo(subscriberVideo); System.out.println(rgb.toString()); Assertions.assertTrue(RecordingUtils.checkVideoAverageRgbGray(rgb), "Video is not average gray"); @@ -2358,7 +2291,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { Thread.sleep(1000); // Analyze Chrome fake video stream with gray filter (GREEN color) - rgb = user.getEventManager().getAverageRgbFromVideo(subscriberVideo); + rgb = user.getBrowserUser().getAverageRgbFromVideo(subscriberVideo); System.out.println(rgb.toString()); Assertions.assertTrue(RecordingUtils.checkVideoAverageRgbGreen(rgb), "Video is not average green"); @@ -2411,7 +2344,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), false, true), "Videos were expected to have only a video track"); @@ -2609,10 +2542,10 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager().assertMediaTracks( + Assertions.assertTrue(user.getBrowserUser().assertMediaTracks( (WebElement) user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 video")), false, true, "#openvidu-instance-0"), "Moderator video was expected to have audio only track"); - Assertions.assertTrue(user.getEventManager().assertMediaTracks( + Assertions.assertTrue(user.getBrowserUser().assertMediaTracks( (WebElement) user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video")), true, true, "#openvidu-instance-1"), "Subscriber video was expected to have audio and video tracks"); @@ -2717,7 +2650,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { } pub = connectionModerator.getPublishers().get(0); - String widthAndHeight = user.getEventManager().getDimensionOfViewport(); + String widthAndHeight = user.getBrowserUser().getDimensionOfViewport(); JsonObject obj = JsonParser.parseString(widthAndHeight).getAsJsonObject(); // Using a local or dockerized browser may vary the height value in 1 unit @@ -3314,8 +3247,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); /** GET /openvidu/api/sessions/ID/connection (with active connections) **/ @@ -4312,7 +4245,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { user.getEventManager().waitUntilEventReaches("streamPlaying", 1); final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(1, numberOfVideos, "Expected 1 video but found " + numberOfVideos); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Video was expected to have audio and video tracks"); @@ -4535,9 +4468,9 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { Thread.sleep(1000); user.getDriver().findElement(By.id("session-settings-btn-0")).click(); Thread.sleep(1000); - WebElement tokeInput = user.getDriver().findElement(By.cssSelector("#custom-token-div input")); - tokeInput.clear(); - tokeInput.sendKeys(connection.getToken()); + WebElement tokenInput = user.getDriver().findElement(By.cssSelector("#custom-token-div input")); + tokenInput.clear(); + tokenInput.sendKeys(connection.getToken()); user.getDriver().findElement(By.id("save-btn")).click(); Thread.sleep(1000); user.getDriver().findElement(By.className("join-btn")).click(); @@ -5093,8 +5026,8 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() - .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), + Assertions.assertTrue( + user.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks"); // Assert Selected Codec in node-client session object @@ -5197,7 +5130,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assertions.assertEquals(4, numberOfVideos, "Wrong number of videos"); - Assertions.assertTrue(user.getEventManager() + Assertions.assertTrue(user.getBrowserUser() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true), "Videos were expected to have audio and video tracks");