mirror of https://github.com/OpenVidu/openvidu.git
openvidu-test-e2e: OpenVidu Mobile E2e Test
parent
48da31f452
commit
b9d3f16bac
|
@ -0,0 +1,198 @@
|
|||
package io.openvidu.test.e2e;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.lang3.RandomStringUtils;
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.Keys;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.openqa.selenium.support.ui.ExpectedConditions;
|
||||
import org.springframework.http.HttpMethod;
|
||||
|
||||
import io.appium.java_client.AppiumDriver;
|
||||
import io.appium.java_client.remote.SupportsContextSwitching;
|
||||
import io.openvidu.test.browsers.BrowserUser;
|
||||
import io.openvidu.test.browsers.utils.CustomHttpClient;
|
||||
import io.openvidu.test.browsers.utils.RecordingUtils;
|
||||
|
||||
public class OpenViduMobileE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||
|
||||
@BeforeAll()
|
||||
protected static void setupAll() throws Exception {
|
||||
loadEnvironmentVariables();
|
||||
cleanFoldersAndSetUpOpenViduJavaClient();
|
||||
try {
|
||||
setupDockerAndroidContainer();
|
||||
} catch (Exception e) {
|
||||
log.error("Error starting Docker Android singleton container: {}", e.getMessage());
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Chrome Android")
|
||||
void chromeAndroid() throws Exception {
|
||||
|
||||
isAndroidTest = true;
|
||||
|
||||
long initTime = System.currentTimeMillis();
|
||||
OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("androidChrome");
|
||||
log.info("Android emulator ready after {} seconds", (System.currentTimeMillis() - initTime) / 1000);
|
||||
log.info("Chrome Android");
|
||||
|
||||
String sessionName = "MobileTestSession-" + RandomStringUtils.randomAlphanumeric(6);
|
||||
WebElement urlInput = user.getDriver().findElement(By.id("openvidu-url"));
|
||||
urlInput.clear();
|
||||
urlInput.sendKeys(OPENVIDU_DEPLOYMENT);
|
||||
String[] tokens = { getToken(sessionName), getToken(sessionName) };
|
||||
|
||||
user.getDriver().findElement(By.id("one2one-btn")).click();
|
||||
|
||||
// Set tokens
|
||||
for (int i = 0; i < 2; i++) {
|
||||
user.getDriver().findElement(By.id("session-settings-btn-" + i)).click();
|
||||
Thread.sleep(1000);
|
||||
WebElement tokenInput = user.getDriver().findElement(By.cssSelector("#custom-token-div input"));
|
||||
tokenInput.clear();
|
||||
tokenInput.sendKeys(tokens[i]);
|
||||
user.getDriver().findElement(By.id("save-btn")).click();
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
|
||||
user.getDriver().findElements(By.className("join-btn")).forEach(el -> el.sendKeys(Keys.ENTER));
|
||||
user.getEventManager().waitUntilEventReaches("connectionCreated", 4);
|
||||
user.getEventManager().waitUntilEventReaches("accessAllowed", 2);
|
||||
user.getEventManager().waitUntilEventReaches("streamCreated", 4);
|
||||
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.getBrowserUser().assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true),
|
||||
"Videos were expected to have audio and video tracks");
|
||||
gracefullyLeaveParticipants(user, 2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Ionic Android")
|
||||
void ionicAndroid() throws Exception {
|
||||
|
||||
isAndroidTest = true;
|
||||
|
||||
long initTime = System.currentTimeMillis();
|
||||
BrowserUser ionicUser = setupBrowser("ionicApp");
|
||||
log.info("Android emulator ready after {} seconds", (System.currentTimeMillis() - initTime) / 1000);
|
||||
log.info("Ionic Android");
|
||||
|
||||
AppiumDriver appiumDriver = (AppiumDriver) ionicUser.getDriver();
|
||||
|
||||
Set<String> contextNames = ((SupportsContextSwitching) appiumDriver).getContextHandles();
|
||||
log.info("Appium contexts:");
|
||||
for (String contextName : contextNames) {
|
||||
log.info(contextName);
|
||||
}
|
||||
for (String context : contextNames) {
|
||||
if (context.equals("WEBVIEW_io.openvidu.ionic")) {
|
||||
log.info("Webview context name chosen is " + context);
|
||||
((SupportsContextSwitching) appiumDriver).context("WEBVIEW_io.openvidu.ionic");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
final String SESSION_NAME = "IonicTestSession";
|
||||
final String USER_NAME = "IonicUser";
|
||||
|
||||
ionicUser.getWaiter().until(ExpectedConditions.elementToBeClickable(By.cssSelector("#session-input input")));
|
||||
WebElement sessionNameInput = appiumDriver.findElement(By.cssSelector("#session-input input"));
|
||||
WebElement userNameInput = appiumDriver.findElement(By.cssSelector("#user-input input"));
|
||||
sessionNameInput.clear();
|
||||
userNameInput.clear();
|
||||
sessionNameInput.sendKeys(SESSION_NAME);
|
||||
userNameInput.sendKeys(USER_NAME);
|
||||
|
||||
appiumDriver.findElement(By.cssSelector("#settings-button")).click();
|
||||
Thread.sleep(500);
|
||||
WebElement urlInput = appiumDriver.findElement(By.cssSelector("input.alert-input"));
|
||||
urlInput.clear();
|
||||
urlInput.sendKeys(OPENVIDU_DEPLOYMENT);
|
||||
appiumDriver.findElement(By.cssSelector("#ok-btn")).click();
|
||||
Thread.sleep(500);
|
||||
appiumDriver.findElement(By.cssSelector("#join-button")).click();
|
||||
|
||||
OpenViduTestappUser chromeUser = null;
|
||||
try {
|
||||
chromeUser = setupBrowserAndConnectToOpenViduTestapp("chrome");
|
||||
urlInput = chromeUser.getDriver().findElement(By.id("openvidu-url"));
|
||||
urlInput.clear();
|
||||
urlInput.sendKeys(OPENVIDU_DEPLOYMENT);
|
||||
chromeUser.getDriver().findElement(By.id("add-user-btn")).click();
|
||||
chromeUser.getDriver().findElement(By.id("session-settings-btn-0")).click();
|
||||
Thread.sleep(1000);
|
||||
WebElement tokenInput = chromeUser.getDriver().findElement(By.cssSelector("#custom-token-div input"));
|
||||
tokenInput.clear();
|
||||
tokenInput.sendKeys(getToken(SESSION_NAME));
|
||||
chromeUser.getDriver().findElement(By.id("save-btn")).click();
|
||||
Thread.sleep(1000);
|
||||
chromeUser.getDriver().findElement(By.className("join-btn")).click();
|
||||
chromeUser.getEventManager().waitUntilEventReaches("connectionCreated", 2);
|
||||
chromeUser.getEventManager().waitUntilEventReaches("accessAllowed", 1);
|
||||
chromeUser.getEventManager().waitUntilEventReaches("streamCreated", 2);
|
||||
chromeUser.getEventManager().waitUntilEventReaches("streamPlaying", 2);
|
||||
|
||||
final int numberOfVideos = chromeUser.getDriver().findElements(By.tagName("video")).size();
|
||||
Assertions.assertEquals(2, numberOfVideos, "Wrong number of videos");
|
||||
Assertions.assertTrue(
|
||||
chromeUser.getBrowserUser()
|
||||
.assertMediaTracks(chromeUser.getDriver().findElements(By.tagName("video")), true, true),
|
||||
"Videos were expected to have audio and video tracks");
|
||||
|
||||
final int numberOfVideosIonic = ionicUser.getDriver().findElements(By.tagName("video")).size();
|
||||
Assertions.assertEquals(2, numberOfVideosIonic, "Wrong number of videos");
|
||||
Assertions.assertTrue(
|
||||
ionicUser.assertMediaTracks(ionicUser.getDriver().findElements(By.tagName("video")), true, true),
|
||||
"Videos were expected to have audio and video tracks");
|
||||
|
||||
// Check Ionic is properly receiving remote video from Chrome
|
||||
WebElement subscriberVideo = ionicUser.getDriver().findElements(By.cssSelector("video")).get(1);
|
||||
Map<String, Long> rgb = ionicUser.getAverageRgbFromVideo(subscriberVideo);
|
||||
Assertions.assertTrue(RecordingUtils.checkVideoAverageRgbGreen(rgb), "Video is not average green");
|
||||
|
||||
gracefullyLeaveParticipants(chromeUser, 1);
|
||||
|
||||
} finally {
|
||||
if (chromeUser != null) {
|
||||
chromeUser.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String getToken(String sessionId) throws Exception {
|
||||
CustomHttpClient restClient = new CustomHttpClient(OPENVIDU_DEPLOYMENT);
|
||||
restClient.restString(HttpMethod.POST, "/api/sessions", "{'customSessionId': '" + sessionId + "'}",
|
||||
HttpStatus.SC_OK);
|
||||
return restClient.restString(HttpMethod.POST, "/api/sessions/" + sessionId + "/connections", "{}",
|
||||
HttpStatus.SC_OK);
|
||||
}
|
||||
|
||||
// @Test
|
||||
// @DisplayName("React Native Android")
|
||||
// void reactNativeAndroid() throws Exception {
|
||||
// long initTime = System.currentTimeMillis();
|
||||
// BrowserUser reactNativeUser = setupBrowser("reactNativeApp");
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Test
|
||||
// @DisplayName("Native Android")
|
||||
// void nativeAndroid() throws Exception {
|
||||
// long initTime = System.currentTimeMillis();
|
||||
// BrowserUser reactNativeUser = setupBrowser("androidApp");
|
||||
//
|
||||
// }
|
||||
|
||||
}
|
Loading…
Reference in New Issue