mirror of https://github.com/OpenVidu/openvidu.git
openvidu-test-e2e: allow for egress check in container's backup folder
parent
654063a33f
commit
ade870d843
|
|
@ -57,6 +57,7 @@ import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
|
|
||||||
|
import io.minio.BucketExistsArgs;
|
||||||
import io.minio.ListObjectsArgs;
|
import io.minio.ListObjectsArgs;
|
||||||
import io.minio.MinioClient;
|
import io.minio.MinioClient;
|
||||||
import io.minio.Result;
|
import io.minio.Result;
|
||||||
|
|
@ -1579,7 +1580,11 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
|
|
||||||
JsonObject egress = this.waitUntilEgressStatus(user, egressId, "EGRESS_COMPLETE", 10000);
|
JsonObject egress = this.waitUntilEgressStatus(user, egressId, "EGRESS_COMPLETE", 10000);
|
||||||
|
|
||||||
this.checkRecordingInBucket(egress);
|
if (isMinioAvailable()) {
|
||||||
|
this.checkRecordingInBucket(egress);
|
||||||
|
} else {
|
||||||
|
this.checkRecordingInEgressBackupFolder(egress);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: UNCOMMENT WHEN MEDIASOUP IS ABLE TO MANAGE ABRUPT
|
// TODO: UNCOMMENT WHEN MEDIASOUP IS ABLE TO MANAGE ABRUPT
|
||||||
// CONNECTIONSTATECHANGED DISOCONNECTED/FAILED
|
// CONNECTIONSTATECHANGED DISOCONNECTED/FAILED
|
||||||
|
|
@ -1636,6 +1641,17 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
return egressObject;
|
return egressObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isMinioAvailable() {
|
||||||
|
MinioClient minioClient = MinioClient.builder().endpoint("localhost", 9000, false)
|
||||||
|
.credentials("minioadmin", "minioadmin").build();
|
||||||
|
try {
|
||||||
|
minioClient.bucketExists(BucketExistsArgs.builder().bucket("openvidu-appdata").build());
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkRecordingInBucket(JsonObject egress) {
|
private void checkRecordingInBucket(JsonObject egress) {
|
||||||
MinioClient minioClient = MinioClient.builder().endpoint("localhost", 9000, false)
|
MinioClient minioClient = MinioClient.builder().endpoint("localhost", 9000, false)
|
||||||
.credentials("minioadmin", "minioadmin").build();
|
.credentials("minioadmin", "minioadmin").build();
|
||||||
|
|
@ -1670,6 +1686,61 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkRecordingInEgressBackupFolder(JsonObject egress) {
|
||||||
|
final boolean[] metadataFound = { false };
|
||||||
|
final boolean[] videoFound = { false };
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Execute docker command to list files in the egress container's backup_storage
|
||||||
|
// directory
|
||||||
|
Process process = Runtime.getRuntime()
|
||||||
|
.exec(new String[] { "docker", "exec", "egress", "ls", "/home/egress/backup_storage" });
|
||||||
|
|
||||||
|
// Read the output
|
||||||
|
java.io.BufferedReader reader = new java.io.BufferedReader(
|
||||||
|
new java.io.InputStreamReader(process.getInputStream()));
|
||||||
|
String line;
|
||||||
|
|
||||||
|
String expectedMetadataFileName = egress.get("egressId").getAsString() + ".json";
|
||||||
|
String expectedVideoFileName = egress.get("file").getAsJsonObject().get("filename").getAsString();
|
||||||
|
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
String fileName = line.trim();
|
||||||
|
if (expectedMetadataFileName.equals(fileName)) {
|
||||||
|
metadataFound[0] = true;
|
||||||
|
}
|
||||||
|
if (expectedVideoFileName.equals(fileName)) {
|
||||||
|
videoFound[0] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int exitCode = process.waitFor();
|
||||||
|
if (exitCode != 0) {
|
||||||
|
// Read error stream if command failed
|
||||||
|
java.io.BufferedReader errorReader = new java.io.BufferedReader(
|
||||||
|
new java.io.InputStreamReader(process.getErrorStream()));
|
||||||
|
StringBuilder errorOutput = new StringBuilder();
|
||||||
|
String errorLine;
|
||||||
|
while ((errorLine = errorReader.readLine()) != null) {
|
||||||
|
errorOutput.append(errorLine).append("\n");
|
||||||
|
}
|
||||||
|
Assertions.fail("Error accessing egress container backup folder. Exit code: " + exitCode + ", Error: "
|
||||||
|
+ errorOutput.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Assertions.fail("Error executing docker command to check egress backup folder: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!metadataFound[0]) {
|
||||||
|
Assertions.fail("Recording metadata file not found in egress backup folder");
|
||||||
|
}
|
||||||
|
if (!videoFound[0]) {
|
||||||
|
Assertions.fail("Recording media file not found in egress backup folder");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("Ingress VP8 Simulcast Chrome")
|
@DisplayName("Ingress VP8 Simulcast Chrome")
|
||||||
// TODO: remove tag when not forcing VP8 no-simulcast in ingress with mediasoup
|
// TODO: remove tag when not forcing VP8 no-simulcast in ingress with mediasoup
|
||||||
|
|
@ -2691,7 +2762,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
user.getDriver().findElement(By.cssSelector("#mat-option-" + preset.toUpperCase())).click();
|
user.getDriver().findElement(By.cssSelector("#mat-option-" + preset.toUpperCase())).click();
|
||||||
} else {
|
} else {
|
||||||
if (!simulcast) {
|
if (!simulcast) {
|
||||||
user.getDriver().findElement(By.cssSelector("#ingress-simulcast")).click();
|
this.waitForBackdropAndClick(user, "#ingress-simulcast");
|
||||||
Thread.sleep(300);
|
Thread.sleep(300);
|
||||||
}
|
}
|
||||||
this.waitForBackdropAndClick(user, "#ingress-video-codec-select");
|
this.waitForBackdropAndClick(user, "#ingress-video-codec-select");
|
||||||
|
|
@ -2732,16 +2803,17 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for any Material Design backdrop overlays to disappear and then clicks the element.
|
* Waits for any Material Design backdrop overlays to disappear and then clicks
|
||||||
* This prevents ElementClickInterceptedException caused by overlay backdrops.
|
* the element. This prevents ElementClickInterceptedException caused by overlay
|
||||||
|
* backdrops.
|
||||||
*/
|
*/
|
||||||
private void waitForBackdropAndClick(OpenViduTestappUser user, String cssSelector) {
|
private void waitForBackdropAndClick(OpenViduTestappUser user, String cssSelector) {
|
||||||
final long startTime = System.currentTimeMillis();
|
final long startTime = System.currentTimeMillis();
|
||||||
final long timeoutMillis = 10000; // 10 seconds total timeout
|
final long timeoutMillis = 10000; // 10 seconds total timeout
|
||||||
final long retryIntervalMillis = 500; // 500ms between retries
|
final long retryIntervalMillis = 500; // 500ms between retries
|
||||||
|
|
||||||
WebElement element = null;
|
WebElement element = null;
|
||||||
|
|
||||||
while (System.currentTimeMillis() - startTime < timeoutMillis) {
|
while (System.currentTimeMillis() - startTime < timeoutMillis) {
|
||||||
try {
|
try {
|
||||||
// Try to find and click the element immediately
|
// Try to find and click the element immediately
|
||||||
|
|
@ -2759,7 +2831,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// Any other exception, continue retrying
|
// Any other exception, continue retrying
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait before next retry
|
// Wait before next retry
|
||||||
try {
|
try {
|
||||||
Thread.sleep(retryIntervalMillis);
|
Thread.sleep(retryIntervalMillis);
|
||||||
|
|
@ -2768,10 +2840,10 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestappE2eTest {
|
||||||
throw new RuntimeException("Thread interrupted while waiting for backdrop to clear", e);
|
throw new RuntimeException("Thread interrupted while waiting for backdrop to clear", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we get here, we've timed out
|
// If we get here, we've timed out
|
||||||
throw new RuntimeException("Timeout waiting for element '" + cssSelector +
|
throw new RuntimeException("Timeout waiting for element '" + cssSelector
|
||||||
"' to be clickable without backdrop interference after " + timeoutMillis + "ms");
|
+ "' to be clickable without backdrop interference after " + timeoutMillis + "ms");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue