mirror of https://github.com/OpenVidu/openvidu.git
openvidu-test-e2e: refactoring before mobile testing
parent
0664da5e5b
commit
bdb544ac4e
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in New Issue