openvidu-test-e2e: refactoring before mobile testing

pull/781/head
pabloFuente 2022-12-29 21:52:54 +01:00
parent 0664da5e5b
commit bdb544ac4e
10 changed files with 483 additions and 479 deletions

View File

@ -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

View File

@ -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"

View File

@ -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();
}

View File

@ -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;

View File

@ -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<String, Long> 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<String, Long>) averageRgb;
}
public Map<String, Long> getAverageColorFromPixels(WebElement videoElement, List<Point> 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<Point> 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<String, Long>) 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<WebElement> 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<WebElement> 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;
}
}

View File

@ -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;
}
}

View File

@ -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<JsonObject> eventQueue;
private Map<String, Collection<RunnableCallback>> eventCallbacks;
private Map<String, AtomicInteger> eventNumbers;
private Map<String, CountDownLatch> eventCountdowns;
private Map<Integer, Map<String, Collection<RunnableCallback>>> eventCallbacksByUser;
private Map<Integer, Map<String, AtomicInteger>> eventNumbersByUser;
private Map<Integer, Map<String, CountDownLatch>> eventCountdownsByUser;
private Map<Integer, Map<String, Collection<RunnableCallback>>> eventCallbacksByUser;
private Map<Integer, Map<String, AtomicInteger>> eventNumbersByUser;
private Map<Integer, Map<String, CountDownLatch>> 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<JsonObject> 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<WebElement> 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<WebElement> 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("^<br>", "").split("<br>");
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("^<br>", "").split("<br>");
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<String, Long> 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<String, Long>) averageRgb;
}
public Map<String, Long> getAverageColorFromPixels(WebElement videoElement, List<Point> 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<Point> 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<String, Long>) 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;
}
}

View File

@ -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<BrowserUser> browserUsers = new HashSet<>();
protected Collection<GenericContainer<?>> containers = new HashSet<>();
protected static Collection<GenericContainer<?>> 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<BrowserUser> 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<GenericContainer<?>> it2 = containers.iterator();
List<String> 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);
}

View File

@ -715,7 +715,7 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
// Image filter
WebElement subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video"));
Map<String, Long> rgb = user.getEventManager().getAverageColorFromPixels(subscriberVideo,
Map<String, Long> 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

View File

@ -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<WebElement> 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<WebElement> 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<WebElement> 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<String, Long> rgb = user.getEventManager().getAverageRgbFromVideo(subscriberVideo);
Map<String, Long> 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");