openvidu-test-e2e: fix testcontainer usage

dependabot/npm_and_yarn/openvidu-components-angular/multi-f2b383cc78
pabloFuente 2025-01-02 18:10:45 +01:00
parent b829142caf
commit fa0392a0a3
2 changed files with 81 additions and 22 deletions

View File

@ -12,7 +12,6 @@ import java.nio.file.Paths;
import java.security.KeyManagementException; import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -49,7 +48,7 @@ import retrofit2.Response;
public class OpenViduTestE2e { public class OpenViduTestE2e {
private final static WaitStrategy waitBrowser = Wait.forHttp("/wd/hub/status").forStatusCode(200); private final static WaitStrategy waitBrowser = Wait.forLogMessage("^.*Started Selenium Standalone.*$", 1);
protected static String MEDIA_SERVER_IMAGE = "livekit-server:latest"; protected static String MEDIA_SERVER_IMAGE = "livekit-server:latest";
@ -96,6 +95,7 @@ public class OpenViduTestE2e {
private GenericContainer<?> chromeContainer(String image, long shmSize, int maxBrowserSessions, boolean headless) { private GenericContainer<?> chromeContainer(String image, long shmSize, int maxBrowserSessions, boolean headless) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("SE_OPTS", "--port 4444");
if (headless) { if (headless) {
map.put("START_XVFB", "false"); map.put("START_XVFB", "false");
} }
@ -104,14 +104,14 @@ public class OpenViduTestE2e {
map.put("SE_NODE_MAX_SESSIONS", String.valueOf(maxBrowserSessions)); map.put("SE_NODE_MAX_SESSIONS", String.valueOf(maxBrowserSessions));
} }
GenericContainer<?> chrome = new GenericContainer<>(DockerImageName.parse(image)).withSharedMemorySize(shmSize) GenericContainer<?> chrome = new GenericContainer<>(DockerImageName.parse(image)).withSharedMemorySize(shmSize)
.withFileSystemBind("/opt/openvidu", "/opt/openvidu").withEnv(map).withExposedPorts(4444) .withFileSystemBind("/opt/openvidu", "/opt/openvidu").withEnv(map).withNetworkMode("host")
.waitingFor(waitBrowser); .waitingFor(waitBrowser);
chrome.setPortBindings(Arrays.asList("6666:4444", "7900:7900"));
return chrome; return chrome;
} }
private GenericContainer<?> firefoxContainer(String image, long shmSize, int maxBrowserSessions, boolean headless) { private GenericContainer<?> firefoxContainer(String image, long shmSize, int maxBrowserSessions, boolean headless) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("SE_OPTS", "--port 4445");
if (headless) { if (headless) {
map.put("START_XVFB", "false"); map.put("START_XVFB", "false");
} }
@ -120,14 +120,14 @@ public class OpenViduTestE2e {
map.put("SE_NODE_MAX_SESSIONS", String.valueOf(maxBrowserSessions)); map.put("SE_NODE_MAX_SESSIONS", String.valueOf(maxBrowserSessions));
} }
GenericContainer<?> firefox = new GenericContainer<>(DockerImageName.parse(image)).withSharedMemorySize(shmSize) GenericContainer<?> firefox = new GenericContainer<>(DockerImageName.parse(image)).withSharedMemorySize(shmSize)
.withFileSystemBind("/opt/openvidu", "/opt/openvidu").withEnv(map).withExposedPorts(4444) .withFileSystemBind("/opt/openvidu", "/opt/openvidu").withEnv(map).withNetworkMode("host")
.waitingFor(waitBrowser); .waitingFor(waitBrowser);
firefox.setPortBindings(Arrays.asList("6667:4444", "7901:7900"));
return firefox; return firefox;
} }
private GenericContainer<?> edgeContainer(String image, long shmSize, int maxBrowserSessions, boolean headless) { private GenericContainer<?> edgeContainer(String image, long shmSize, int maxBrowserSessions, boolean headless) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("SE_OPTS", "--port 4446");
if (headless) { if (headless) {
map.put("START_XVFB", "false"); map.put("START_XVFB", "false");
} }
@ -136,9 +136,8 @@ public class OpenViduTestE2e {
map.put("SE_NODE_MAX_SESSIONS", String.valueOf(maxBrowserSessions)); map.put("SE_NODE_MAX_SESSIONS", String.valueOf(maxBrowserSessions));
} }
GenericContainer<?> edge = new GenericContainer<>(DockerImageName.parse(image)).withSharedMemorySize(shmSize) GenericContainer<?> edge = new GenericContainer<>(DockerImageName.parse(image)).withSharedMemorySize(shmSize)
.withFileSystemBind("/opt/openvidu", "/opt/openvidu").withEnv(map).withExposedPorts(4444) .withFileSystemBind("/opt/openvidu", "/opt/openvidu").withEnv(map).withNetworkMode("host")
.waitingFor(waitBrowser); .waitingFor(waitBrowser);
edge.setPortBindings(Arrays.asList("6668:4444", "7902:7900"));
return edge; return edge;
} }
@ -192,9 +191,9 @@ public class OpenViduTestE2e {
} }
log.info("Using URL {} to connect to openvidu-testapp", APP_URL); log.info("Using URL {} to connect to openvidu-testapp", APP_URL);
String openviduUrl = System.getProperty("LIVEKIT_URL"); String livekitUrl = System.getProperty("LIVEKIT_URL");
if (openviduUrl != null) { if (livekitUrl != null) {
LIVEKIT_URL = openviduUrl; LIVEKIT_URL = livekitUrl;
} }
log.info("Using URL {} to connect to livekit-server", LIVEKIT_URL); log.info("Using URL {} to connect to livekit-server", LIVEKIT_URL);
@ -269,23 +268,23 @@ public class OpenViduTestE2e {
browserUser = new ChromeUser("TestUser", 50, "OpenVidu TestApp"); browserUser = new ChromeUser("TestUser", 50, "OpenVidu TestApp");
break; break;
case "chromeAlternateFakeVideo": case "chromeAlternateFakeVideo":
container = chromeContainer("selenium/standalone-chrome:" + CHROME_VERSION, 2147483648L, 1, true); container = chromeContainer("selenium/standalone-chrome:" + CHROME_VERSION, 2147483648L, 1, false);
setupBrowserAux(BrowserNames.CHROME, container, false); setupBrowserAux(BrowserNames.CHROME, container, false);
path = Paths.get("/opt/openvidu/barcode.y4m"); path = Paths.get("/opt/openvidu/barcode.y4m");
checkMediafilePath(path); checkMediafilePath(path);
browserUser = new ChromeUser("TestUser", 50, path); browserUser = new ChromeUser("TestUser", 50, path);
break; break;
case "chromeFakeAudio": case "chromeFakeAudio":
container = chromeContainer("selenium/standalone-chrome:" + CHROME_VERSION, 2147483648L, 1, true); container = chromeContainer("selenium/standalone-chrome:" + CHROME_VERSION, 2147483648L, 1, false);
setupBrowserAux(BrowserNames.CHROME, container, false); setupBrowserAux(BrowserNames.CHROME, container, false);
path = new File(System.getProperty("java.io.tmpdir"), "test.wav").toPath(); path = new File("/opt/openvidu/test.wav").toPath();
try { try {
checkMediafilePath(path); checkMediafilePath(path);
} catch (Exception e) { } catch (Exception e) {
try { try {
FileUtils.copyURLToFile( FileUtils.copyURLToFile(
new URL("https://openvidu-loadtest-mediafiles.s3.amazonaws.com/interview.wav"), new URL("https://openvidu-loadtest-mediafiles.s3.amazonaws.com/interview.wav"),
new File(System.getProperty("java.io.tmpdir"), "test.wav"), 60000, 60000); new File("/opt/openvidu/test.wav"), 60000, 60000);
} catch (FileNotFoundException e2) { } catch (FileNotFoundException e2) {
e2.printStackTrace(); e2.printStackTrace();
System.err.println("exception on: downLoadFile() function: " + e.getMessage()); System.err.println("exception on: downLoadFile() function: " + e.getMessage());

View File

@ -445,7 +445,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
@Test @Test
@DisplayName("Firefox force H264") @DisplayName("Firefox force H264")
@Disabled // Firefox forces H264 in linux/android when publishing even with Pion @Disabled // Firefox forces VP8 in linux/android when publishing even with Pion
void firefoxForceH264Test() throws Exception { void firefoxForceH264Test() throws Exception {
OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("firefox"); OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("firefox");
log.info("Firefox force H264"); log.info("Firefox force H264");
@ -462,7 +462,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
@Test @Test
@DisplayName("Firefox force VP9") @DisplayName("Firefox force VP9")
@Disabled // Firefox forces H264 in linux/android when publishing even with Pion @Disabled // Firefox forces VP8 in linux/android when publishing even with Pion
void firefoxForceVP9Test() throws Exception { void firefoxForceVP9Test() throws Exception {
OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("firefox"); OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("firefox");
log.info("Firefox force VP9"); log.info("Firefox force VP9");
@ -497,6 +497,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
String expectedCodec = "video/" + codec.toUpperCase(); String expectedCodec = "video/" + codec.toUpperCase();
// Check publisher's codec // Check publisher's codec
WebElement publisherVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 video.local")); WebElement publisherVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 video.local"));
this.waitUntilVideoLayersNotEmpty(user, publisherVideo);
Assertions.assertEquals(expectedCodec, Assertions.assertEquals(expectedCodec,
getPublisherVideoLayerAttribute(user, publisherVideo, null, "codec").getAsString()); getPublisherVideoLayerAttribute(user, publisherVideo, null, "codec").getAsString());
@ -514,24 +515,45 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
@DisplayName("Firefox subscribe to VP8") @DisplayName("Firefox subscribe to VP8")
void firefoxSubscribeToVP8Test() throws Exception { void firefoxSubscribeToVP8Test() throws Exception {
log.info("Firefox subscribe to VP8"); log.info("Firefox subscribe to VP8");
firefoxSubscribeToCodecTest("vp8"); firefoxSubscribeToCodecTest("vp8", false);
} }
@Test @Test
@DisplayName("Firefox subscribe to H264") @DisplayName("Firefox subscribe to H264")
void firefoxSubscribeToH264Test() throws Exception { void firefoxSubscribeToH264Test() throws Exception {
log.info("Firefox subscribe to H264"); log.info("Firefox subscribe to H264");
firefoxSubscribeToCodecTest("h264"); firefoxSubscribeToCodecTest("h264", false);
} }
@Test @Test
@DisplayName("Firefox subscribe to VP9") @DisplayName("Firefox subscribe to VP9")
void firefoxSubscribeToVP9Test() throws Exception { void firefoxSubscribeToVP9Test() throws Exception {
log.info("Firefox subscribe to VP9"); log.info("Firefox subscribe to VP9");
firefoxSubscribeToCodecTest("vp9"); firefoxSubscribeToCodecTest("vp9", false);
} }
private void firefoxSubscribeToCodecTest(String codec) throws Exception { @Test
@DisplayName("Firefox subscribe to VP8 simulcast")
void firefoxSubscribeToVP8SimulcastTest() throws Exception {
log.info("Firefox subscribe to VP8 simulcast");
firefoxSubscribeToCodecTest("vp8", true);
}
@Test
@DisplayName("Firefox subscribe to H264 simulcast")
void firefoxSubscribeToH264SimulcastTest() throws Exception {
log.info("Firefox subscribe to H264 simulcast");
firefoxSubscribeToCodecTest("h264", true);
}
@Test
@DisplayName("Firefox subscribe to VP9 simulcast")
void firefoxSubscribeToVP9SimulcastTest() throws Exception {
log.info("Firefox subscribe to VP9 simulcast");
firefoxSubscribeToCodecTest("vp9", true);
}
private void firefoxSubscribeToCodecTest(String codec, boolean simulcast) throws Exception {
final String expectedCodec = "video/" + codec.toUpperCase(); final String expectedCodec = "video/" + codec.toUpperCase();
final CountDownLatch latch = new CountDownLatch(2); final CountDownLatch latch = new CountDownLatch(2);
ExecutorService executor = Executors.newFixedThreadPool(2); ExecutorService executor = Executors.newFixedThreadPool(2);
@ -539,7 +561,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
Future<?> task1 = executor.submit(() -> { Future<?> task1 = executor.submit(() -> {
try { try {
OpenViduTestappUser chromeUser = setupBrowserAndConnectToOpenViduTestapp("chrome"); OpenViduTestappUser chromeUser = setupBrowserAndConnectToOpenViduTestapp("chrome");
this.addOnlyPublisherVideo(chromeUser, false, false, false); this.addOnlyPublisherVideo(chromeUser, simulcast, false, false);
WebElement participantNameInput = chromeUser.getDriver().findElement(By.id("participant-name-input-0")); WebElement participantNameInput = chromeUser.getDriver().findElement(By.id("participant-name-input-0"));
participantNameInput.clear(); participantNameInput.clear();
participantNameInput.sendKeys("CHROME_USER"); participantNameInput.sendKeys("CHROME_USER");
@ -620,6 +642,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
"HTMLVideoElements were expected to have only one video track"); "HTMLVideoElements were expected to have only one video track");
WebElement subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video.remote")); WebElement subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-1 video.remote"));
this.waitUntilVideoLayersNotEmpty(user, subscriberVideo);
long bytesReceived = this.getSubscriberVideoBytesReceived(user, subscriberVideo); long bytesReceived = this.getSubscriberVideoBytesReceived(user, subscriberVideo);
this.waitUntilSubscriberBytesReceivedIncrease(user, subscriberVideo, bytesReceived); this.waitUntilSubscriberBytesReceivedIncrease(user, subscriberVideo, bytesReceived);
@ -1449,6 +1472,43 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
testNoSimulcast(user, subscriberVideo); testNoSimulcast(user, subscriberVideo);
} }
@Test
@DisplayName("Custom ingress")
@Disabled // ONLY FOR CUSTOM ingress IMAGE
void customIngressTest() throws Exception {
OpenViduTestappUser user = setupBrowserAndConnectToOpenViduTestapp("firefox");
// With custom ingress it should force VP8 no simulcast 1920x0180
log.info("Custom ingress");
this.addSubscriber(user, true);
user.getDriver().findElement(By.className("connect-btn")).sendKeys(Keys.ENTER);
user.getEventManager().waitUntilEventReaches("connected", "RoomEvent", 1);
// Try publishing H264 with 2 layer simulcast
createIngress(user, "H264_540P_25FPS_2_LAYERS", null, true);
user.getEventManager().waitUntilEventReaches("trackSubscribed", "ParticipantEvent", 1);
user.getWaiter().until(ExpectedConditions.numberOfElementsToBe(By.tagName("video"), 1));
int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size();
Assertions.assertEquals(1, numberOfVideos, "Wrong number of videos");
Assertions.assertTrue(user.getBrowserUser().assertAllElementsHaveTracks("video", false, true),
"HTMLVideoElements were expected to have only one video track");
// Should receive VP8 1920
WebElement subscriberVideo = user.getDriver().findElement(By.cssSelector("#openvidu-instance-0 video.remote"));
JsonArray json = this.getLayersAsJsonArray(user, subscriberVideo);
String subscriberCodec = json.get(0).getAsJsonObject().get("codec").getAsString();
String expectedCodec = "video/VP8";
Assertions.assertEquals(expectedCodec, subscriberCodec);
this.waitUntilSubscriberFrameWidthIs(user, subscriberVideo, 1920);
waitUntilVideoLayersNotEmpty(user, subscriberVideo);
long bytesReceived = this.getSubscriberVideoBytesReceived(user, subscriberVideo);
this.waitUntilSubscriberBytesReceivedIncrease(user, subscriberVideo, bytesReceived);
this.waitUntilSubscriberFramesPerSecondNotZero(user, subscriberVideo);
}
private void ingressSimulcastTest(OpenViduTestappUser user, boolean simulcast, String codec, String preset) private void ingressSimulcastTest(OpenViduTestappUser user, boolean simulcast, String codec, String preset)
throws Exception { throws Exception {