diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java index 28d3496e..1e5c92f6 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java @@ -3137,6 +3137,82 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestappE2eTest { } } + @Test + @DisplayName("Broadcast and composed recording Test") + void broadcastAndComposedRecordingTest() throws Exception { + + log.info("Broadcast and composed recording Test"); + + try { + String BROADCAST_IP = TestUtils.startRtmpServer(); + + final String sessionName = "BROADCAST_AND_RECORDED_SESSION"; + + OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("chrome"); + user.getDriver().findElement(By.id("add-user-btn")).click(); + user.getDriver().findElement(By.id("session-name-input-0")).clear(); + user.getDriver().findElement(By.id("session-name-input-0")).sendKeys(sessionName); + user.getDriver().findElement(By.className("join-btn")).sendKeys(Keys.ENTER); + user.getEventManager().waitUntilEventReaches("streamCreated", 1); + user.getEventManager().waitUntilEventReaches("streamPlaying", 1); + + user.getDriver().findElement(By.id("session-api-btn-0")).click(); + Thread.sleep(750); + WebElement broadcastUrlField = user.getDriver().findElement(By.id("broadcasturl-id-field")); + broadcastUrlField.clear(); + broadcastUrlField.sendKeys("rtmp://" + BROADCAST_IP + "/live"); + user.getDriver().findElement(By.id("broadcast-properties-btn")).click(); + Thread.sleep(500); + + // Start broadcast + user.getDriver().findElement(By.id("start-broadcast-btn")).click(); + user.getWaiter().until( + ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", "Broadcast started")); + user.getEventManager().waitUntilEventReaches("broadcastStarted", 1); + + // Start composed recording + user.getDriver().findElement(By.id("start-recording-btn")).click(); + user.getWaiter().until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", + "Recording started [" + sessionName + "]")); + user.getEventManager().waitUntilEventReaches("recordingStarted", 1); + + Thread.sleep(2000); + + // Check broadcast + checkRtmpRecordingIsFine(30, RecordingUtils::checkVideoAverageRgbGreen); + + // Stop broadcast + user.getDriver().findElement(By.id("stop-broadcast-btn")).click(); + user.getWaiter().until( + ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", "Broadcast stopped")); + user.getEventManager().waitUntilEventReaches("broadcastStopped", 1); + + // Stop recording + user.getDriver().findElement(By.id("recording-id-field")).clear(); + user.getDriver().findElement(By.id("recording-id-field")).sendKeys(sessionName); + user.getDriver().findElement(By.id("stop-recording-btn")).click(); + user.getWaiter().until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", + "Recording stopped [" + sessionName + "]")); + user.getEventManager().waitUntilEventReaches("recordingStopped", 1); + + // Check recording + String recordingsPath = "/opt/openvidu/recordings/"; + File file1 = new File(recordingsPath + sessionName + "/" + sessionName + ".mp4"); + File file2 = new File(recordingsPath + sessionName + "/" + sessionName + ".jpg"); + Assertions.assertTrue( + this.recordingUtils.recordedGreenFileFine(file1, + new OpenVidu(OPENVIDU_URL, OPENVIDU_SECRET).getRecording(sessionName)), + "Recorded file " + file1.getAbsolutePath() + " is not fine"); + Assertions.assertTrue(this.recordingUtils.thumbnailIsFine(file2, RecordingUtils::checkVideoAverageRgbGreen), + "Thumbnail " + file2.getAbsolutePath() + " is not fine"); + + gracefullyLeaveParticipants(user, 1); + + } finally { + TestUtils.stopRtmpServer(); + } + } + private void checkRtmpRecordingIsFine(long secondsTimeout, Function, Boolean> colorCheckFunction) throws InterruptedException { final String broadcastRecordingPath = "/opt/openvidu/recordings"; 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 d627a158..b6ef49c8 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 @@ -1009,52 +1009,23 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { } // Resize captured window - final CountDownLatch latchViewport = new CountDownLatch(1); final CountDownLatch latch3 = new CountDownLatch(2); int newWidth = 1000; int newHeight = 700; - final long[] expectedWidthHeight = new long[2]; - user.getEventManager().on("streamPropertyChanged", (event) -> { - try { - if (latchViewport.await(4000, TimeUnit.MILLISECONDS)) { - // Using a local or dockerized browser may vary the height value in 1 unit - String expectedDimensions1 = "{\"width\":" + expectedWidthHeight[0] + ",\"height\":" - + expectedWidthHeight[1] + "}"; - String expectedDimensions2 = "{\"width\":" + expectedWidthHeight[0] + ",\"height\":" - + (expectedWidthHeight[1] + 1) + "}"; - System.out.println("Publisher dimensions: " + event.get("newValue").getAsJsonObject().toString()); - System.out.println("Real dimensions of viewport (+0/+1 in height): " + expectedDimensions1); - if ("videoDimensions".equals(event.get("changedProperty").getAsString()) - && "screenResized".equals(event.get("reason").getAsString()) - && (expectedDimensions1.equals(event.get("newValue").getAsJsonObject().toString()) - || expectedDimensions2 - .equals(event.get("newValue").getAsJsonObject().toString()))) { - latch3.countDown(); - } - } else { - fail("Viewport resolution did not change in 4 seconds"); - } - } catch (InterruptedException e) { - log.error("Error waiting for viewport resolution"); + String expectedDimensions = "{\"width\":" + newWidth + ",\"height\":" + newHeight + "}"; + System.out.println("Publisher dimensions: " + event.get("newValue").getAsJsonObject().toString()); + System.out.println("Real dimensions of viewport: " + expectedDimensions); + if ("videoDimensions".equals(event.get("changedProperty").getAsString()) + && "screenResized".equals(event.get("reason").getAsString()) + && (expectedDimensions.equals(event.get("newValue").getAsJsonObject().toString()))) { + latch3.countDown(); } }); user.getDriver().manage().window().setSize(new Dimension(newWidth, newHeight)); - new Thread(() -> { - String widthAndHeight = user.getBrowserUser().getDimensionOfViewport(); - JsonObject obj = JsonParser.parseString(widthAndHeight).getAsJsonObject(); - - expectedWidthHeight[0] = obj.get("width").getAsLong(); - expectedWidthHeight[1] = obj.get("height").getAsLong(); - - System.out.println("New viewport dimension: " + obj.toString()); - latchViewport.countDown(); - - }).start(); - user.getEventManager().waitUntilEventReaches("streamPropertyChanged", 6); if (!latch3.await(4000, TimeUnit.MILLISECONDS)) { @@ -2669,7 +2640,9 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("chromeAlternateScreenShare"); - user.getDriver().manage().window().setSize(new Dimension(1000, 800)); + final int width = 1000; + final int height = 800; + user.getDriver().manage().window().setSize(new Dimension(width, height)); log.info("openvidu-java-client test"); @@ -2885,19 +2858,11 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest { } pub = connectionModerator.getPublishers().get(0); - 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 - long validHeight1 = obj.get("height").getAsLong(); - long validHeight2 = validHeight1 + 1; - String validDimensions1 = "{\"width\":" + obj.get("width").getAsLong() + ",\"height\":" + validHeight1 + "}"; - String validDimensions2 = "{\"width\":" + obj.get("width").getAsLong() + ",\"height\":" + validHeight2 + "}"; + String validDimensions = "{\"width\":" + width + ",\"height\":" + height + "}"; - Assertions.assertTrue( - validDimensions1.equals(pub.getVideoDimensions()) || validDimensions2.equals(pub.getVideoDimensions()), - "Wrong video dimenstions. Expected: " + validDimensions1 + "(+0/+1 in height) but actual: " - + pub.getVideoDimensions()); + Assertions.assertTrue(validDimensions.equals(pub.getVideoDimensions()), + "Wrong video dimensions. Expected: " + validDimensions + " but actual: " + pub.getVideoDimensions()); Assertions.assertEquals(Integer.valueOf(30), pub.getFrameRate()); Assertions.assertEquals("SCREEN", pub.getTypeOfVideo());