diff --git a/openvidu-test-e2e/pom.xml b/openvidu-test-e2e/pom.xml index b2023b7a..75fa6ec6 100644 --- a/openvidu-test-e2e/pom.xml +++ b/openvidu-test-e2e/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 @@ -136,15 +137,26 @@ test - com.googlecode.json-simple - json-simple - ${version.json-simple} + com.googlecode.json-simple + json-simple + ${version.json-simple} xml-apis xml-apis 1.4.01 + + org.jcodec + jcodec + 0.2.3 + + + org.jcodec + jcodec-javase + 0.2.3 + + io.openvidu 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 051dd86e..04b004fc 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 @@ -38,6 +38,8 @@ import org.json.simple.parser.ParseException; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Manager event class for BrowserUser. Collects, cleans and stores events from @@ -47,6 +49,8 @@ import org.openqa.selenium.WebElement; * @since 1.1.1 */ public class OpenViduEventManager { + + private static final Logger log = LoggerFactory.getLogger(OpenViduEventManager.class); private static class RunnableCallback implements Runnable { @@ -172,7 +176,7 @@ public class OpenViduEventManager { while (!this.eventQueue.isEmpty()) { JSONObject event = this.eventQueue.poll(); - System.out.println(event.get("event") + ": " + event); + log.info(event.get("event") + ": " + event); if (this.eventCallbacks.containsKey(event.get("event"))) { for (RunnableCallback callback : this.eventCallbacks.get(event.get("event"))) { 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 1bb6238c..487a3164 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,15 +17,17 @@ package io.openvidu.test.e2e; -import static java.lang.invoke.MethodHandles.lookup; import static org.junit.Assert.fail; import static org.openqa.selenium.OutputType.BASE64; -import static org.slf4j.LoggerFactory.getLogger; +import java.awt.Color; +import java.awt.image.BufferedImage; import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -34,6 +36,10 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import org.jcodec.api.FrameGrab; +import org.jcodec.api.JCodecException; +import org.jcodec.common.model.Picture; +import org.jcodec.scale.AWTUtil; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -56,9 +62,12 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import io.github.bonigarcia.SeleniumExtension; import io.github.bonigarcia.wdm.WebDriverManager; +import io.openvidu.java.client.OpenVidu; +import io.openvidu.java.client.Recording; import io.openvidu.test.e2e.browser.BrowserUser; import io.openvidu.test.e2e.browser.ChromeAndroidUser; import io.openvidu.test.e2e.browser.ChromeUser; @@ -83,7 +92,7 @@ public class OpenViduTestAppE2eTest { static Exception ex = null; private final Object lock = new Object(); - final static Logger log = getLogger(lookup().lookupClass()); + private static final Logger log = LoggerFactory.getLogger(OpenViduTestAppE2eTest.class); BrowserUser user; @@ -940,8 +949,8 @@ public class OpenViduTestAppE2eTest { final long[] expectedWidthHeight = new long[2]; user.getEventManager().on("streamPropertyChanged", (event) -> { - threadAssertions.add(((String) event.get("eventContent")).contains( - "videoDimensions [{\"width\":" + expectedWidthHeight[0] + ",\"height\":" + expectedWidthHeight[1] + "}]")); + threadAssertions.add(((String) event.get("eventContent")).contains("videoDimensions [{\"width\":" + + expectedWidthHeight[0] + ",\"height\":" + expectedWidthHeight[1] + "}]")); latch3.countDown(); }); @@ -1084,19 +1093,13 @@ public class OpenViduTestAppE2eTest { Thread.sleep(1000); user.getDriver().findElement(By.id("start-recording-btn")).click(); - Thread.sleep(4000); - - try { - System.out.println(getBase64Screenshot(user)); - } catch (Exception e) { - e.printStackTrace(); - } - user.getWaiter().until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", "Recording started [" + sessionName + "]")); user.getEventManager().waitUntilEventReaches("recordingStarted", 1); + Thread.sleep(8000); + user.getDriver().findElement(By.id("recording-id-field")).clear(); user.getDriver().findElement(By.id("recording-id-field")).sendKeys(sessionName); @@ -1105,12 +1108,12 @@ public class OpenViduTestAppE2eTest { user.getWaiter() .until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", "Error [409]")); - // Try to get a existing recording + // Try to get an existing recording user.getDriver().findElement(By.id("get-recording-btn")).click(); user.getWaiter().until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", "Recording got [" + sessionName + "]")); - // Try to delete a ongoing recording + // Try to delete an ongoing recording user.getDriver().findElement(By.id("delete-recording-btn")).click(); user.getWaiter() .until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", "Error [409]")); @@ -1136,6 +1139,9 @@ public class OpenViduTestAppE2eTest { Assert.assertTrue(file2.exists() || file2.length() > 0); Assert.assertTrue(file3.exists() || file3.length() > 0); + Assert.assertTrue( + this.recordedFileFine(file1, new OpenVidu(OPENVIDU_URL, OPENVIDU_SECRET).getRecording(sessionName))); + // Try to get the stopped recording user.getDriver().findElement(By.id("get-recording-btn")).click(); user.getWaiter().until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value", @@ -1613,4 +1619,44 @@ public class OpenViduTestAppE2eTest { return "data:image/png;base64," + screenshotBase64; } + private boolean recordedFileFine(File file, Recording recording) { + boolean isFine = false; + Picture frame; + try { + // Get a frame at 75% duration + frame = FrameGrab.getFrameAtSec(file, (double) (recording.getDuration() * 0.75)); + Map colorMap = this.averageColor(AWTUtil.toBufferedImage(frame)); + log.info("Recording map color: {}", colorMap.toString()); + isFine = this.checkVideoAverageRgbGreen(colorMap); + } catch (IOException | JCodecException e) { + log.warn("Error getting frame from video recording: {}", e.getMessage()); + isFine = false; + } + return isFine; + } + + private Map averageColor(BufferedImage bi) { + int x0 = 0; + int y0 = 0; + int w = bi.getWidth(); + int h = bi.getHeight(); + int x1 = x0 + w; + int y1 = y0 + h; + long sumr = 0, sumg = 0, sumb = 0; + for (int x = x0; x < x1; x++) { + for (int y = y0; y < y1; y++) { + Color pixel = new Color(bi.getRGB(x, y)); + sumr += pixel.getRed(); + sumg += pixel.getGreen(); + sumb += pixel.getBlue(); + } + } + int num = w * h; + Map colorMap = new HashMap<>(); + colorMap.put("r", (long) (sumr / num)); + colorMap.put("g", (long) (sumg / num)); + colorMap.put("b", (long) (sumb / num)); + return colorMap; + } + } diff --git a/openvidu-test-e2e/src/test/resources/logback.xml b/openvidu-test-e2e/src/test/resources/logback.xml index 3ba00edb..08a8eb48 100644 --- a/openvidu-test-e2e/src/test/resources/logback.xml +++ b/openvidu-test-e2e/src/test/resources/logback.xml @@ -1,5 +1,14 @@ - - + + + + [%p] %d [%.12t] %c \(%M\) - %msg%n + + + + + + \ No newline at end of file