diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduEventManager.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduEventManager.java index 0cd65bed..4d40dd7d 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduEventManager.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduEventManager.java @@ -17,6 +17,8 @@ package io.openvidu.test.e2e; +import java.util.Collection; +import java.util.HashSet; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; @@ -69,7 +71,7 @@ public class OpenViduEventManager { private ExecutorService execService = Executors.newCachedThreadPool(); private WebDriver driver; private Queue eventQueue; - private Map eventCallbacks; + private Map> eventCallbacks; private Map eventNumbers; private Map eventCountdowns; private AtomicBoolean isInterrupted = new AtomicBoolean(false); @@ -113,7 +115,8 @@ public class OpenViduEventManager { } public void on(String eventName, Consumer callback) { - this.eventCallbacks.put(eventName, new RunnableCallback(callback)); + this.eventCallbacks.putIfAbsent(eventName, new HashSet<>()); + this.eventCallbacks.get(eventName).add(new RunnableCallback(callback)); } public void off(String eventName) { @@ -164,10 +167,11 @@ public class OpenViduEventManager { System.out.println(event.get("event") + ": " + event); - RunnableCallback callback = this.eventCallbacks.get(event.get("event")); - if (callback != null) { - callback.setEventResult(event); - execService.submit(callback); + if (this.eventCallbacks.containsKey(event.get("event"))) { + for (RunnableCallback callback : this.eventCallbacks.get(event.get("event"))) { + callback.setEventResult(event); + execService.submit(callback); + } } } } @@ -203,7 +207,7 @@ public class OpenViduEventManager { .executeScript("var e = window.myEvents; window.myEvents = ''; return e;"); return events; } - + public boolean hasMediaStream(WebElement videoElement) { boolean hasMediaStream = (boolean) ((JavascriptExecutor) driver).executeScript( "return (!!(document.getElementById('" + videoElement.getAttribute("id") + "').srcObject))"); diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java index 276f6cf5..47d41e20 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduTestAppE2eTest.java @@ -28,6 +28,7 @@ import java.util.Iterator; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.CountDownLatch; import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; @@ -661,9 +662,14 @@ public class OpenViduTestAppE2eTest { user.getDriver().findElement(By.id("auto-join-checkbox")).click(); + final CountDownLatch latch1 = new CountDownLatch(2); + // First publication (audio + video [CAMERA]) user.getEventManager().on("streamPlaying", (event) -> { - threadAssertions.add(((String) event.get("eventContent")).contains("CAMERA")); + if (event.get("eventContent") != null) { + threadAssertions.add(((String) event.get("eventContent")).contains("CAMERA")); + } + latch1.countDown(); }); user.getDriver().findElement(By.id("one2many-btn")).click(); @@ -673,6 +679,9 @@ public class OpenViduTestAppE2eTest { user.getEventManager().waitUntilEventReaches("accessAllowed", 1); user.getEventManager().waitUntilEventReaches("streamCreated", 2); user.getEventManager().waitUntilEventReaches("streamPlaying", 2); + + latch1.await(); + user.getEventManager().off("streamPlaying"); for (Iterator iter = threadAssertions.iterator(); iter.hasNext();) { Assert.assertTrue(iter.next()); @@ -685,15 +694,23 @@ public class OpenViduTestAppE2eTest { Thread.sleep(2000); + final CountDownLatch latch2 = new CountDownLatch(2); + // Second publication (only video (SCREEN)) user.getEventManager().on("streamPlaying", (event) -> { - threadAssertions.add(((String) event.get("eventContent")).contains("SCREEN")); + if (event.get("eventContent") != null) { + threadAssertions.add(((String) event.get("eventContent")).contains("SCREEN")); + } + latch2.countDown(); }); user.getDriver().findElements(By.className("change-publisher-btn")).get(0).click(); user.getEventManager().waitUntilEventReaches("streamDestroyed", 2); user.getEventManager().waitUntilEventReaches("accessAllowed", 2); user.getEventManager().waitUntilEventReaches("streamCreated", 4); user.getEventManager().waitUntilEventReaches("streamPlaying", 4); + + latch2.await(); + user.getEventManager().off("streamPlaying"); for (Iterator iter = threadAssertions.iterator(); iter.hasNext();) { Assert.assertTrue(iter.next()); @@ -705,15 +722,23 @@ public class OpenViduTestAppE2eTest { Thread.sleep(2000); + final CountDownLatch latch3 = new CountDownLatch(2); + // Third publication (audio + video [CAMERA]) user.getEventManager().on("streamPlaying", (event) -> { - threadAssertions.add(((String) event.get("eventContent")).contains("CAMERA")); + if (event.get("eventContent") != null) { + threadAssertions.add(((String) event.get("eventContent")).contains("CAMERA")); + } + latch3.countDown(); }); user.getDriver().findElements(By.className("change-publisher-btn")).get(0).click(); user.getEventManager().waitUntilEventReaches("streamDestroyed", 4); user.getEventManager().waitUntilEventReaches("accessAllowed", 3); user.getEventManager().waitUntilEventReaches("streamCreated", 6); user.getEventManager().waitUntilEventReaches("streamPlaying", 6); + + latch3.await(); + user.getEventManager().off("streamPlaying"); for (Iterator iter = threadAssertions.iterator(); iter.hasNext();) { Assert.assertTrue(iter.next()); @@ -755,11 +780,16 @@ public class OpenViduTestAppE2eTest { user.getEventManager().waitUntilEventReaches("streamPlaying", 2); // Unpublish video + final CountDownLatch latch1 = new CountDownLatch(2); user.getEventManager().on("streamPropertyChanged", (event) -> { threadAssertions.add(((String) event.get("eventContent")).contains("videoActive [false]")); + latch1.countDown(); }); user.getDriver().findElements(By.className("pub-video-btn")).get(0).click(); user.getEventManager().waitUntilEventReaches("streamPropertyChanged", 2); + + latch1.await(); + user.getEventManager().off("streamPropertyChanged"); for (Iterator iter = threadAssertions.iterator(); iter.hasNext();) { Assert.assertTrue(iter.next()); @@ -767,11 +797,16 @@ public class OpenViduTestAppE2eTest { } // Unpublish audio + final CountDownLatch latch2 = new CountDownLatch(2); user.getEventManager().on("streamPropertyChanged", (event) -> { threadAssertions.add(((String) event.get("eventContent")).contains("audioActive [false]")); + latch2.countDown(); }); user.getDriver().findElements(By.className("pub-audio-btn")).get(0).click(); user.getEventManager().waitUntilEventReaches("streamPropertyChanged", 4); + + latch2.await(); + user.getEventManager().off("streamPropertyChanged"); for (Iterator iter = threadAssertions.iterator(); iter.hasNext();) { Assert.assertTrue(iter.next()); @@ -779,14 +814,19 @@ public class OpenViduTestAppE2eTest { } // Resize captured window - int newWidth = 1280; - int newHeight = 720; + final CountDownLatch latch3 = new CountDownLatch(2); + int newWidth = 1500; + int newHeight = 500; user.getEventManager().on("streamPropertyChanged", (event) -> { threadAssertions.add(((String) event.get("eventContent")) - .contains("videoDimensions videoDimensions [{\\\"width\\\":" + newWidth + ",\\\"height\\\":" + newHeight + "}]")); + .contains("videoDimensions [{\"width\":" + (newWidth - 10) + ",\"height\":" + (newHeight - 132) + "}]")); + latch3.countDown(); }); user.getDriver().manage().window().setSize(new Dimension(newWidth, newHeight)); user.getEventManager().waitUntilEventReaches("streamPropertyChanged", 6); + + latch3.await(); + user.getEventManager().off("streamPropertyChanged"); for (Iterator iter = threadAssertions.iterator(); iter.hasNext();) { Assert.assertTrue(iter.next()); @@ -979,7 +1019,7 @@ public class OpenViduTestAppE2eTest { Assert.assertFalse(file3.exists()); user.getDriver().findElement(By.id("close-dialog-btn")).click(); - + gracefullyLeaveParticipants(1); } diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/BrowserUser.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/BrowserUser.java index 50c1abb0..180f102e 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/BrowserUser.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/BrowserUser.java @@ -20,6 +20,7 @@ package io.openvidu.test.e2e.browser; import static java.lang.invoke.MethodHandles.lookup; import static org.slf4j.LoggerFactory.getLogger; +import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.slf4j.Logger; @@ -27,7 +28,7 @@ import org.slf4j.Logger; import io.openvidu.test.e2e.OpenViduEventManager; public class BrowserUser { - + final static Logger log = getLogger(lookup().lookupClass()); protected WebDriver driver; @@ -56,7 +57,7 @@ public class BrowserUser { public String getClientData() { return this.clientData; } - + public int getTimeOfWait() { return this.timeOfWaitInSeconds; } @@ -68,8 +69,9 @@ public class BrowserUser { protected void configureDriver() { this.waiter = new WebDriverWait(this.driver, this.timeOfWaitInSeconds); this.eventManager = new OpenViduEventManager(this.driver, this.timeOfWaitInSeconds); + this.driver.manage().window().setSize(new Dimension(1920,1080)); } - + public void dispose() { this.eventManager.stopPolling(); this.driver.quit(); diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/ChromeUser.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/ChromeUser.java index 40a7fa95..664c2a60 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/ChromeUser.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/ChromeUser.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.TimeUnit; + import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; @@ -31,7 +32,7 @@ public class ChromeUser extends BrowserUser { public ChromeUser(String userName, int timeOfWaitInSeconds) { super(userName, timeOfWaitInSeconds); - + DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setAcceptInsecureCerts(true); @@ -41,17 +42,17 @@ public class ChromeUser extends BrowserUser { // This flag fakes user media with synthetic video options.addArguments("--use-fake-device-for-media-stream"); // This flag selects the entire screen as video source when screen sharing - options.addArguments("--auto-select-desktop-capture-source=OpenVidu TestApp - Google Chrome"); - + options.addArguments("--auto-select-desktop-capture-source=OpenVidu TestApp"); + try { // Add Screen Sharing extension options.addExtensions(new ClassPathResource("ScreenCapturing.crx").getFile()); } catch (IOException e) { e.printStackTrace(); } - + capabilities.setCapability(ChromeOptions.CAPABILITY, options); - + String REMOTE_URL = System.getProperty("REMOTE_URL_CHROME"); if (REMOTE_URL != null) { log.info("Using URL {} to connect to remote web driver", REMOTE_URL); @@ -64,7 +65,7 @@ public class ChromeUser extends BrowserUser { log.info("Using local web driver"); this.driver = new ChromeDriver(capabilities); } - + this.driver.manage().timeouts().setScriptTimeout(this.timeOfWaitInSeconds, TimeUnit.SECONDS); this.configureDriver(); } diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/FirefoxUser.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/FirefoxUser.java index f1c8b5e5..3c8fffe9 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/FirefoxUser.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/browser/FirefoxUser.java @@ -29,7 +29,7 @@ public class FirefoxUser extends BrowserUser { public FirefoxUser(String userName, int timeOfWaitInSeconds) { super(userName, timeOfWaitInSeconds); - + DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setAcceptInsecureCerts(true); FirefoxProfile profile = new FirefoxProfile(); @@ -40,7 +40,7 @@ public class FirefoxUser extends BrowserUser { profile.setPreference("media.navigator.streams.fake", true); capabilities.setCapability(FirefoxDriver.PROFILE, profile); - + String REMOTE_URL = System.getProperty("REMOTE_URL_FIREFOX"); if (REMOTE_URL != null) { log.info("Using URL {} to connect to remote web driver", REMOTE_URL); @@ -53,7 +53,7 @@ public class FirefoxUser extends BrowserUser { log.info("Using local web driver"); this.driver = new FirefoxDriver(capabilities); } - + this.configureDriver(); }