From d3b8214dcbb6f32ba4e71f51b6cc52b04578a72f Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Fri, 17 Jan 2025 11:45:24 +0100 Subject: [PATCH] openvidu-test-e2e: add signal test --- .../test/e2e/OpenViduEventManager.java | 15 +- .../test/e2e/OpenViduTestAppE2eTest.java | 146 ++++++++++++++++++ 2 files changed, 155 insertions(+), 6 deletions(-) diff --git a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java index 5af20c28..cd2faebf 100644 --- a/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java +++ b/openvidu-test-e2e/src/main/java/io/openvidu/test/e2e/OpenViduEventManager.java @@ -283,11 +283,11 @@ public class OpenViduEventManager { this.startPolling(); } - private AtomicInteger getNumEvents(String eventTypeAndCategory) { + public AtomicInteger getNumEvents(String eventTypeAndCategory) { return this.eventNumbers.computeIfAbsent(eventTypeAndCategory, k -> new AtomicInteger(0)); } - private AtomicInteger getNumEvents(int numberOfUser, String eventTypeAndCategory) { + public AtomicInteger getNumEvents(int numberOfUser, String eventTypeAndCategory) { this.eventNumbersByUser.putIfAbsent(numberOfUser, new HashMap<>()); return this.eventNumbersByUser.get(numberOfUser).computeIfAbsent(eventTypeAndCategory, k -> new AtomicInteger(0)); @@ -330,10 +330,13 @@ public class OpenViduEventManager { } } if (this.eventCallbacksByUser.containsKey(numberOfUser)) { - for (Consumer callback : this.eventCallbacksByUser.get(numberOfUser) - .get(eventTypeAndCategory)) { - final RunnableCallback runnableCallback = new RunnableCallback(callback, event); - execService.submit(runnableCallback); + Collection> callbacksForEvent = this.eventCallbacksByUser.get(numberOfUser) + .get(eventTypeAndCategory); + if (callbacksForEvent != null) { + for (Consumer callback : callbacksForEvent) { + final RunnableCallback runnableCallback = new RunnableCallback(callback, event); + execService.submit(runnableCallback); + } } } } 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 5d1d9a3a..ddb0d80d 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 @@ -17,9 +17,11 @@ package io.openvidu.test.e2e; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map.Entry; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; @@ -136,6 +138,150 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { gracefullyLeaveParticipants(user, 2); } + @Test + @DisplayName("Signal") + void signalTest() throws Exception { + OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("chrome"); + log.info("Signal"); + for (int i = 0; i < 2; i++) { + WebElement addUserBtn = user.getDriver().findElement(By.id("add-user-btn")); + addUserBtn.click(); + user.getDriver().findElement(By.cssSelector("#openvidu-instance-" + i + " .subscriber-checkbox")).click(); + user.getDriver().findElement(By.cssSelector("#openvidu-instance-" + i + " .publisher-checkbox")).click(); + } + user.getDriver().findElements(By.className("connect-btn")).forEach(el -> el.sendKeys(Keys.ENTER)); + user.getEventManager().waitUntilEventReaches("signalConnected", "RoomEvent", 2); + user.getEventManager().waitUntilEventReaches("connected", "RoomEvent", 2); + user.getEventManager().waitUntilEventReaches("connectionStateChanged", "RoomEvent", 2); + user.getEventManager().waitUntilEventReaches("participantConnected", "RoomEvent", 1); + + // Broadcast signal + Collection> assertions = new ArrayList<>(); + + // Broadcast from TestParticipant0 + final CountDownLatch signalEventLatch1 = new CountDownLatch(2); + + user.getEventManager().on(1, "dataReceived", "RoomEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant0 to all room", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch1.countDown(); + }); + user.getEventManager().on(1, "dataReceived", "ParticipantEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant0 to all room", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch1.countDown(); + }); + + user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 .message-btn")).click(); + user.getEventManager().waitUntilEventReaches(1, "dataReceived", "RoomEvent", 1); + user.getEventManager().waitUntilEventReaches(1, "dataReceived", "ParticipantEvent", 1); + // Do not trigger own signals + Assertions.assertEquals(0, user.getEventManager().getNumEvents(0, "dataReceived-RoomEvent").get()); + Assertions.assertEquals(0, user.getEventManager().getNumEvents(0, "dataReceived-ParticipantEvent").get()); + + if (!signalEventLatch1.await(3, TimeUnit.SECONDS)) { + Assertions.fail("Timeout waiting for signal event content check"); + } + assertions.forEach(assertion -> Assertions.assertEquals(assertion.getKey(), assertion.getValue())); + user.getEventManager().off(1, "dataReceived", "RoomEvent"); + user.getEventManager().off(1, "dataReceived", "ParticipantEvent"); + assertions.clear(); + user.getEventManager().clearAllCurrentEvents(); + + // Broadcast from TestParticipant1 + final CountDownLatch signalEventLatch2 = new CountDownLatch(2); + + user.getEventManager().on(0, "dataReceived", "RoomEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant1 to all room", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch2.countDown(); + }); + user.getEventManager().on(0, "dataReceived", "ParticipantEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant1 to all room", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch2.countDown(); + }); + user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 .message-btn")).click(); + user.getEventManager().waitUntilEventReaches(0, "dataReceived", "RoomEvent", 1); + user.getEventManager().waitUntilEventReaches(0, "dataReceived", "ParticipantEvent", 1); + // Do not trigger own signals + Assertions.assertEquals(1, user.getEventManager().getNumEvents(0, "dataReceived-RoomEvent").get()); + Assertions.assertEquals(1, user.getEventManager().getNumEvents(0, "dataReceived-ParticipantEvent").get()); + + if (!signalEventLatch2.await(3, TimeUnit.SECONDS)) { + Assertions.fail("Timeout waiting for signal event content check"); + } + assertions.forEach(assertion -> Assertions.assertEquals(assertion.getKey(), assertion.getValue())); + user.getEventManager().off(0, "dataReceived", "RoomEvent"); + user.getEventManager().off(0, "dataReceived", "ParticipantEvent"); + assertions.clear(); + user.getEventManager().clearAllCurrentEvents(); + + // Signal specific participant + + // Signal from TestParticipant0 to TestParticipant1 + final CountDownLatch signalEventLatch3 = new CountDownLatch(2); + + user.getEventManager().on(1, "dataReceived", "RoomEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant0 to TestParticipant1", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch3.countDown(); + }); + user.getEventManager().on(1, "dataReceived", "ParticipantEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant0 to TestParticipant1", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch3.countDown(); + }); + user.getDriver() + .findElement(By.cssSelector("#openvidu-instance-0 app-participant.remote-participant .message-btn")) + .click(); + user.getEventManager().waitUntilEventReaches(1, "dataReceived", "RoomEvent", 1); + user.getEventManager().waitUntilEventReaches(1, "dataReceived", "ParticipantEvent", 1); + + // Do not trigger own signals + Assertions.assertEquals(0, user.getEventManager().getNumEvents(0, "dataReceived-RoomEvent").get()); + Assertions.assertEquals(0, user.getEventManager().getNumEvents(0, "dataReceived-ParticipantEvent").get()); + + if (!signalEventLatch3.await(3, TimeUnit.SECONDS)) { + Assertions.fail("Timeout waiting for signal event content check"); + } + assertions.forEach(assertion -> Assertions.assertEquals(assertion.getKey(), assertion.getValue())); + user.getEventManager().off(1, "dataReceived", "RoomEvent"); + user.getEventManager().off(1, "dataReceived", "ParticipantEvent"); + assertions.clear(); + user.getEventManager().clearAllCurrentEvents(); + + // Signal from TestParticipant1 to TestParticipant0 + final CountDownLatch signalEventLatch4 = new CountDownLatch(2); + + user.getEventManager().on(0, "dataReceived", "RoomEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant1 to TestParticipant0", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch4.countDown(); + }); + user.getEventManager().on(0, "dataReceived", "ParticipantEvent", json -> { + assertions.add(new AbstractMap.SimpleEntry<>("Message from TestParticipant1 to TestParticipant0", + json.getAsJsonObject().get("eventDescription").getAsString())); + signalEventLatch4.countDown(); + }); + user.getDriver() + .findElement(By.cssSelector("#openvidu-instance-1 app-participant.remote-participant .message-btn")) + .click(); + user.getEventManager().waitUntilEventReaches(0, "dataReceived", "RoomEvent", 1); + user.getEventManager().waitUntilEventReaches(0, "dataReceived", "ParticipantEvent", 1); + + // Do not trigger own signals + Assertions.assertEquals(0, user.getEventManager().getNumEvents(1, "dataReceived-RoomEvent").get()); + Assertions.assertEquals(0, user.getEventManager().getNumEvents(1, "dataReceived-ParticipantEvent").get()); + + if (!signalEventLatch4.await(3, TimeUnit.SECONDS)) { + Assertions.fail("Timeout waiting for signal event content check"); + } + assertions.forEach(assertion -> Assertions.assertEquals(assertion.getKey(), assertion.getValue())); + + gracefullyLeaveParticipants(user, 2); + } + @Test @DisplayName("One2One only audio") void oneToOneOnlyAudioSession() throws Exception {