diff --git a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java index 27ef7ffe..6baab2f9 100644 --- a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java +++ b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidAppUser.java @@ -13,7 +13,7 @@ public class AndroidAppUser extends BrowserUser { String REMOTE_URL = System.getProperty("REMOTE_URL_ANDROID"); if (REMOTE_URL == null) { - REMOTE_URL = "http://172.17.0.1:4723/wd/hub"; + REMOTE_URL = "http://172.17.0.1:4723/"; } UiAutomator2Options options = new UiAutomator2Options(); diff --git a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java index 32951d25..52a58a4f 100644 --- a/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java +++ b/openvidu-test-browsers/src/main/java/io/openvidu/test/browsers/AndroidChromeUser.java @@ -4,6 +4,7 @@ import java.net.MalformedURLException; import java.net.URL; import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; @@ -42,6 +43,8 @@ public class AndroidChromeUser extends BrowserUser { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID); capabilities.setCapability(ChromeOptions.CAPABILITY, options); + capabilities.setCapability(CapabilityType.BROWSER_NAME, "Chrome"); + capabilities.setCapability("appium:automationName", "UiAutomator2"); URL url = null; try { diff --git a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java index 8e9fa180..31c26ea3 100644 --- a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java +++ b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduTestE2e.java @@ -1,6 +1,7 @@ package io.openvidu.test.e2e; import static org.openqa.selenium.OutputType.BASE64; +import static org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess; import java.io.File; import java.io.IOException; @@ -8,7 +9,6 @@ import java.net.HttpURLConnection; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,6 +35,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpMethod; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.shaded.org.apache.commons.io.FileUtils; @@ -62,7 +64,19 @@ import io.openvidu.test.browsers.utils.RecordingUtils; public class OpenViduTestE2e { private final static WaitStrategy waitBrowser = Wait.forHttp("/wd/hub/status").forStatusCode(200); - private final static WaitStrategy waitAndroid = Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(600)); + + private static class AndroidContainerWaitStrategy extends AbstractWaitStrategy { + @Override + protected void waitUntilReady() { + retryUntilSuccess(600, TimeUnit.SECONDS, () -> { + if (!"READY".equals( + this.waitStrategyTarget.execInContainer("bash", "-c", "cat device_status").getStdout())) { + throw new Exception(); + } + return true; + }); + } + } // Media server variables final protected static String KURENTO_IMAGE = "kurento/kurento-media-server"; @@ -198,12 +212,15 @@ public class OpenViduTestE2e { } 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", "DATAPARTITION", - "2500m")) - .withSharedMemorySize(shmSize).withExposedPorts(6080, 5554, 5555, 4723).waitingFor(waitAndroid) - .withFileSystemBind("/opt/openvidu/android", "/opt/openvidu/android").withReuse(true); + GenericContainer android = new GenericContainer<>(DockerImageName.parse(image)).withEnv(Map.of( + "EMULATOR_DEVICE", "Samsung Galaxy S10", "APPIUM", "true", "APPIUM_HOST", "172.17.0.1", "APPIUM_PORT", + "4723", "APPIUM_ADDITIONAL_ARGS", + "--log /var/log/supervisor/appium.log --relaxed-security --allow-cors --allow-insecure=chromedriver_autodownload", + "MOBILE_WEB_TEST", "true", "RELAXED_SECURITY", "true", "WEB_VNC", "true", "WEB_LOG", "false", + "DATAPARTITION", "2500m")).withPrivilegedMode(true).withSharedMemorySize(shmSize) + .withExposedPorts(6080, 5554, 5555, 4723).withFileSystemBind("/dev/kvm", "/dev/kvm") + .withFileSystemBind("/opt/openvidu/android", "/opt/openvidu/android").withReuse(true) + .waitingFor(new AndroidContainerWaitStrategy()); android.setPortBindings(Arrays.asList("6080:6080", "5554:5554", "5555:5555", "4723:4723")); return android; } @@ -465,20 +482,7 @@ public class OpenViduTestE2e { 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 { + if (!newContainer) { container = containers.stream().filter(c -> DOCKER_ANDROID_IMAGE.equals(c.getDockerImageName())).findFirst() .get(); } diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduMobileE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduMobileE2eTest.java index f42ab1d4..852624cc 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduMobileE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduMobileE2eTest.java @@ -132,7 +132,7 @@ public class OpenViduMobileE2eTest extends AbstractOpenViduTestappE2eTest { urlInput.clear(); urlInput.sendKeys(OPENVIDU_DEPLOYMENT); appiumDriver.findElement(By.cssSelector("#ok-btn")).click(); - Thread.sleep(500); + Thread.sleep(2000); appiumDriver.findElement(By.cssSelector("#join-button")).click(); OpenViduTestappUser chromeUser = null;