From c2b0f95c2a9a081381b5f21c852f5abb2df1d317 Mon Sep 17 00:00:00 2001 From: cruizba Date: Thu, 19 Nov 2020 23:58:26 +0100 Subject: [PATCH] openvidu-server-e2e: Add tests for transcoding parameters for java-client, node-client and API Rest --- .../e2e/AbstractOpenViduTestAppE2eTest.java | 15 ++ .../test/e2e/OpenViduTestAppE2eTest.java | 128 +++++++++++++++--- openvidu-testapp/src/app/app.module.ts | 5 +- .../session-info-dialog.component.ts | 38 ++++++ .../show-codec-dialog.component.ts | 1 - .../openvidu-instance.component.html | 5 +- .../openvidu-instance.component.ts | 11 ++ 7 files changed, 178 insertions(+), 25 deletions(-) create mode 100644 openvidu-testapp/src/app/components/dialogs/session-info-dialog/session-info-dialog.component.ts diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/AbstractOpenViduTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/AbstractOpenViduTestAppE2eTest.java index 00998dae..bfe0f488 100644 --- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/AbstractOpenViduTestAppE2eTest.java +++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/AbstractOpenViduTestAppE2eTest.java @@ -25,7 +25,10 @@ import java.util.stream.Stream; import javax.imageio.ImageIO; +import com.mashape.unirest.http.HttpMethod; +import io.openvidu.test.browsers.utils.CustomHttpClient; import org.apache.commons.io.FileUtils; +import org.apache.http.HttpStatus; import org.jcodec.api.FrameGrab; import org.jcodec.api.JCodecException; import org.jcodec.common.model.Picture; @@ -53,6 +56,7 @@ import io.openvidu.java.client.OpenVidu; import io.openvidu.java.client.OpenViduHttpException; import io.openvidu.java.client.OpenViduJavaClientException; import io.openvidu.java.client.Recording; +import io.openvidu.java.client.VideoCodec; import io.openvidu.test.browsers.BrowserUser; import io.openvidu.test.browsers.ChromeAndroidUser; import io.openvidu.test.browsers.ChromeUser; @@ -86,6 +90,10 @@ public class AbstractOpenViduTestAppE2eTest { protected Collection otherUsers = new ArrayList<>(); protected volatile static boolean isRecordingTest; protected volatile static boolean isKurentoRestartTest; + + protected static VideoCodec defaultForcedVideoCodec; + protected static boolean defaultAllowTranscoding; + protected static OpenVidu OV; protected static void checkFfmpegInstallation() { @@ -224,6 +232,13 @@ public class AbstractOpenViduTestAppE2eTest { user.getEventManager().startPolling(); } + protected static void getDefaultTranscodingValues() throws Exception { + CustomHttpClient restClient = new CustomHttpClient(OPENVIDU_URL, "OPENVIDUAPP", OPENVIDU_SECRET); + JsonObject ovConfig = restClient.rest(HttpMethod.GET, "/openvidu/api/config", HttpStatus.SC_OK); + defaultForcedVideoCodec = VideoCodec.valueOf(ovConfig.get("OPENVIDU_FORCED_CODEC").getAsString()); + defaultAllowTranscoding = ovConfig.get("OPENVIDU_ALLOW_TRANSCODING").getAsBoolean(); + } + @AfterEach protected void dispose() { if (user != null) { 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 3b0a7757..8c22f89b 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 @@ -88,11 +88,12 @@ import io.openvidu.test.browsers.utils.webhook.CustomWebhook; public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { @BeforeAll() - protected static void setupAll() { + protected static void setupAll() throws Exception { checkFfmpegInstallation(); loadEnvironmentVariables(); setupBrowserDrivers(); cleanFoldersAndSetUpOpenViduJavaClient(); + getDefaultTranscodingValues(); } @Test @@ -2610,6 +2611,45 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { Assert.assertEquals("Wrong property networkCache", Integer.valueOf(50), ipcamera.getNetworkCache()); gracefullyLeaveParticipants(2); + session.close(); + + /** Test transcoding defined properties */ + SessionProperties.Builder basePropertiesBuilder = new SessionProperties.Builder() + .mediaMode(MediaMode.ROUTED).recordingMode(RecordingMode.ALWAYS) + .defaultOutputMode(OutputMode.INDIVIDUAL); + + SessionProperties propertiesDefaultCodec = basePropertiesBuilder.build(); + SessionProperties propertiesH264AllowTranscoding = basePropertiesBuilder + .forcedVideoCodec(VideoCodec.H264) + .allowTranscoding(true) + .build(); + SessionProperties propertiesVP9AllowTranscoding = basePropertiesBuilder + .forcedVideoCodec(VideoCodec.VP9) + .allowTranscoding(true) + .build(); + + Session sessionDefaultCodec = OV.createSession(propertiesDefaultCodec); + Session sessionH264AllowTranscoding = OV.createSession(propertiesH264AllowTranscoding); + Session sessionVP9AllowTranscoding = OV.createSession(propertiesVP9AllowTranscoding); + assertTranscodingSessionProperties(sessionDefaultCodec, sessionH264AllowTranscoding, sessionVP9AllowTranscoding); + + // Fetch sessions + Assert.assertFalse(sessionDefaultCodec.fetch()); + Assert.assertFalse(sessionH264AllowTranscoding.fetch()); + Assert.assertFalse(sessionVP9AllowTranscoding.fetch()); + + // Check session with default transcoding params + assertTranscodingSessionProperties(sessionDefaultCodec, sessionH264AllowTranscoding, sessionVP9AllowTranscoding); + + // Fetch all sessions + Assert.assertFalse(OV.fetch()); + + // Check session with default transcoding params + assertTranscodingSessionProperties(sessionDefaultCodec, sessionH264AllowTranscoding, sessionVP9AllowTranscoding); + + sessionDefaultCodec.close(); + sessionH264AllowTranscoding.close(); + sessionVP9AllowTranscoding.close(); } @Test @@ -3048,6 +3088,39 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { + "'OPENVIDU_FORCED_CODEC':'STR','OPENVIDU_ALLOW_TRANSCODING':false,'OPENVIDU_RECORDING':false,'OPENVIDU_RECORDING_VERSION':'STR','OPENVIDU_RECORDING_PATH':'STR','OPENVIDU_RECORDING_PUBLIC_ACCESS':false,'OPENVIDU_RECORDING_NOTIFICATION':'STR'," + "'OPENVIDU_RECORDING_CUSTOM_LAYOUT':'STR','OPENVIDU_RECORDING_AUTOSTOP_TIMEOUT':0,'OPENVIDU_WEBHOOK':false,'OPENVIDU_WEBHOOK_ENDPOINT':'STR','OPENVIDU_WEBHOOK_HEADERS':[]," + "'OPENVIDU_WEBHOOK_EVENTS':[]}"); + + /** POST /openvidu/api/sessions (default transcoding parameters) **/ + + body = "{'mediaMode': 'ROUTED', 'recordingMode': 'MANUAL', 'customSessionId': 'CUSTOM_SESSION_ID', 'defaultOutputMode': 'COMPOSED', 'defaultRecordingLayout': 'BEST_FIT'}"; + res = restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", body, HttpStatus.SC_OK); + + // Check session info + Assert.assertEquals(VideoCodec.valueOf(res.get("forcedVideoCodec").getAsString()), defaultForcedVideoCodec); + Assert.assertEquals(res.get("allowTranscoding").getAsBoolean(), defaultAllowTranscoding); + + // Check all sessions data + res = restClient.rest(HttpMethod.GET, "/openvidu/api/sessions", HttpStatus.SC_OK); + Assert.assertEquals(res.get("numberOfElements").getAsInt(), 1); + Assert.assertEquals(VideoCodec.valueOf(res.get("content").getAsJsonArray().get(0).getAsJsonObject().get("forcedVideoCodec").getAsString()), defaultForcedVideoCodec); + Assert.assertEquals(res.get("content").getAsJsonArray().get(0).getAsJsonObject().get("allowTranscoding").getAsBoolean(), defaultAllowTranscoding); + + // Remove session + restClient.rest(HttpMethod.DELETE, "/openvidu/api/sessions/CUSTOM_SESSION_ID", HttpStatus.SC_NO_CONTENT); + + /** POST /openvidu/api/sessions (define forceCodec and allowTranscoding) **/ + body = "{'mediaMode': 'ROUTED', 'recordingMode': 'MANUAL', 'customSessionId': 'CUSTOM_SESSION_ID', 'defaultOutputMode': 'COMPOSED', 'defaultRecordingLayout': 'BEST_FIT', 'forcedVideoCodec': 'H264', 'allowTranscoding': true}"; + res = restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", body, HttpStatus.SC_OK); + + Assert.assertEquals(VideoCodec.valueOf(res.get("forcedVideoCodec").getAsString()), VideoCodec.H264); + Assert.assertEquals(res.get("allowTranscoding").getAsBoolean(), true); + + // Check all sessions data + res = restClient.rest(HttpMethod.GET, "/openvidu/api/sessions", HttpStatus.SC_OK); + Assert.assertEquals(res.get("numberOfElements").getAsInt(), 1); + Assert.assertEquals(VideoCodec.valueOf(res.get("content").getAsJsonArray().get(0).getAsJsonObject().get("forcedVideoCodec").getAsString()), VideoCodec.H264); + Assert.assertEquals(res.get("content").getAsJsonArray().get(0).getAsJsonObject().get("allowTranscoding").getAsBoolean(), true); + + restClient.rest(HttpMethod.DELETE, "/openvidu/api/sessions/CUSTOM_SESSION_ID", HttpStatus.SC_NO_CONTENT); } @Test @@ -3897,7 +3970,6 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { @Test @DisplayName("Force valid codec - Not Allow Transcoding") void forceValidCodecNotAllowTranscodingTest() throws Exception { - log.info("Force codec Chrome - Force VP8 - Not Allow Transcoding"); setupBrowser("chrome"); this.forceCodecGenericE2eTest(VideoCodec.VP8, false); @@ -3929,7 +4001,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { // Start firefox with OpenH264 disabled to check not supported codecs log.info("Force codec Firefox - Force H264 - Allow Transcoding - Disabled H264 in Firefox"); setupBrowser("firefoxDisabledOpenH264"); - this.forceCodecNotSupportedCodec(VideoCodec.H264, false); + this.forceNotSupportedCodec(VideoCodec.H264, false); } @Test @@ -3938,7 +4010,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { // Start firefox with OpenH264 disabled to check not supported codecs setupBrowser("firefoxDisabledOpenH264"); log.info("Force codec Firefox - Force H264 - Allow Transcoding - Disabled H264 in Firefox"); - this.forceCodecNotSupportedCodec(VideoCodec.H264, true); + this.forceNotSupportedCodec(VideoCodec.H264, true); } private void checkNodeFetchChanged(boolean global, boolean hasChanged) { @@ -3975,10 +4047,6 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { */ private void forceCodecGenericE2eTest(VideoCodec codec, Boolean allowTranscoding) throws Exception { CustomHttpClient restClient = new CustomHttpClient(OPENVIDU_URL, "OPENVIDUAPP", OPENVIDU_SECRET); - JsonObject ovConfig = restClient.rest(HttpMethod.GET, "/openvidu/api/config", HttpStatus.SC_OK); - VideoCodec defaultCodec = VideoCodec.valueOf(ovConfig.get("OPENVIDU_FORCED_CODEC").getAsString()); - Boolean defaultAllowTranscoding = ovConfig.get("OPENVIDU_ALLOW_TRANSCODING").getAsBoolean(); - String sessionName = "CUSTOM_SESSION_" + ((codec != null) ? codec.name() : "DEFAULT_FORCE_CODEC"); // Configure Session to force Codec @@ -4014,37 +4082,38 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { user.getEventManager().waitUntilEventReaches("streamCreated", 4); user.getEventManager().waitUntilEventReaches("streamPlaying", 4); + // Load properties from session object of node-client + user.getDriver().findElement(By.id("session-info-btn-0")).click(); + JsonObject res = JsonParser.parseString(user.getDriver().findElement(By.id("session-text-area")).getAttribute("value")).getAsJsonObject(); + VideoCodec sessionCodecNodeClient = VideoCodec.valueOf(res.get("properties").getAsJsonObject().get("forcedVideoCodec").getAsString()); + boolean sessionAllowTranscodingNodeClient = res.get("properties").getAsJsonObject().get("allowTranscoding").getAsBoolean(); + user.getDriver().findElement(By.id("close-dialog-btn")).click(); + final int numberOfVideos = user.getDriver().findElements(By.tagName("video")).size(); Assert.assertEquals("Expected 4 videos but found " + numberOfVideos, 4, numberOfVideos); Assert.assertTrue("Videos were expected to have audio and video tracks", user.getEventManager() .assertMediaTracks(user.getDriver().findElements(By.tagName("video")), true, true)); - // Check values - JsonObject sessionJson = restClient.rest(HttpMethod.GET, "/openvidu/api/sessions/" + sessionName, - HttpStatus.SC_OK); - VideoCodec sessionCodec = VideoCodec.valueOf(sessionJson.get("forcedVideoCodec").getAsString()); - boolean sessionAllowTranscoding = sessionJson.get("allowTranscoding").getAsBoolean(); - - // Assert Selected Codec + // Assert Selected Codec in node-client session object if (codec != null) { // If specified codec, assert selected codec - Assert.assertEquals(sessionCodec, codec); + Assert.assertEquals(sessionCodecNodeClient, codec); } else { // If not specified, assert default codec - Assert.assertEquals(sessionCodec, defaultCodec); + Assert.assertEquals(sessionCodecNodeClient, defaultForcedVideoCodec); } - // Assert Selected allow transcoding + // Assert Selected allow transcoding in node-client session object if (allowTranscoding != null) { // If specified allowTranscoding, assert selected - Assert.assertEquals(sessionAllowTranscoding, allowTranscoding); + Assert.assertEquals(sessionAllowTranscodingNodeClient, allowTranscoding); } else { // If not specified, assert default allowTranscoding - Assert.assertEquals(sessionAllowTranscoding, defaultAllowTranscoding); + Assert.assertEquals(sessionAllowTranscodingNodeClient, defaultAllowTranscoding); } // Check browser codecs - VideoCodec codecToCheck = (codec != null) ? codec : defaultCodec; + VideoCodec codecToCheck = (codec != null) ? codec : defaultForcedVideoCodec; List statsButtons = user.getDriver().findElements(By.className("stats-button")); for (WebElement statButton : statsButtons) { statButton.click(); @@ -4061,7 +4130,7 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { * Force codec not allowed by opened browser * @throws Exception */ - private void forceCodecNotSupportedCodec(VideoCodec codec, boolean allowTranscoding) throws Exception { + private void forceNotSupportedCodec(VideoCodec codec, boolean allowTranscoding) throws Exception { CustomHttpClient restClient = new CustomHttpClient(OPENVIDU_URL, "OPENVIDUAPP", OPENVIDU_SECRET); String sessionName = "CUSTOM_SESSION_CODEC_NOT_SUPPORTED"; @@ -4119,4 +4188,19 @@ public class OpenViduTestAppE2eTest extends AbstractOpenViduTestAppE2eTest { restClient.rest(HttpMethod.DELETE, "/openvidu/api/sessions/" + sessionName, HttpStatus.SC_NO_CONTENT); Thread.sleep(1000); } + + private void assertTranscodingSessionProperties(Session sessionDefaultCodec, Session sessionH264AllowTranscoding, Session sessionVP9AllowTranscoding) { + // Check session with default transcoding params + Assert.assertEquals("Wrong default forcedVideoCodec", defaultForcedVideoCodec, sessionDefaultCodec.getProperties().forcedVideoCodec()); + Assert.assertEquals("Wrong default allowTranscoding", defaultAllowTranscoding, sessionDefaultCodec.getProperties().isTranscodingAllowed()); + + // Check session which use H264 and allow transcoding + Assert.assertEquals("Wrong default forcedVideoCodec", VideoCodec.H264, sessionH264AllowTranscoding.getProperties().forcedVideoCodec()); + Assert.assertEquals("Wrong default allowTranscoding", true, sessionH264AllowTranscoding.getProperties().isTranscodingAllowed()); + + // Check session which use VP9 and allow transcoding + Assert.assertEquals("Wrong default forcedVideoCodec", VideoCodec.VP9, sessionVP9AllowTranscoding.getProperties().forcedVideoCodec()); + Assert.assertEquals("Wrong default allowTranscoding", true, sessionVP9AllowTranscoding.getProperties().isTranscodingAllowed()); + } + } diff --git a/openvidu-testapp/src/app/app.module.ts b/openvidu-testapp/src/app/app.module.ts index e838fb8e..9a9f59b5 100644 --- a/openvidu-testapp/src/app/app.module.ts +++ b/openvidu-testapp/src/app/app.module.ts @@ -31,6 +31,7 @@ import { OpenviduRestService } from './services/openvidu-rest.service'; import { OpenviduParamsService } from './services/openvidu-params.service'; import { TestFeedService } from './services/test-feed.service'; import { MuteSubscribersService } from './services/mute-subscribers.service'; +import {SessionInfoDialogComponent} from "./components/dialogs/session-info-dialog/session-info-dialog.component"; @NgModule({ declarations: [ @@ -50,6 +51,7 @@ import { MuteSubscribersService } from './services/mute-subscribers.service'; ScenarioPropertiesDialogComponent, FilterDialogComponent, ShowCodecDialogComponent, + SessionInfoDialogComponent, UsersTableComponent, TableVideoComponent ], @@ -77,7 +79,8 @@ import { MuteSubscribersService } from './services/mute-subscribers.service'; PublisherPropertiesDialogComponent, ScenarioPropertiesDialogComponent, FilterDialogComponent, - ShowCodecDialogComponent + ShowCodecDialogComponent, + SessionInfoDialogComponent ], bootstrap: [AppComponent] }) diff --git a/openvidu-testapp/src/app/components/dialogs/session-info-dialog/session-info-dialog.component.ts b/openvidu-testapp/src/app/components/dialogs/session-info-dialog/session-info-dialog.component.ts new file mode 100644 index 00000000..8c166ea7 --- /dev/null +++ b/openvidu-testapp/src/app/components/dialogs/session-info-dialog/session-info-dialog.component.ts @@ -0,0 +1,38 @@ +import {Component, Inject} from "@angular/core"; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {Session as SessionAPI} from "openvidu-node-client"; + +@Component({ + selector: 'app-session-info-dialog', + template: ` +
+ + + +
+
+ +
+ `, + styles: [` + #app-session-info-dialog-container { + text-align: center + } + #response-text-area { + width: 100%; + } + `] +}) +export class SessionInfoDialogComponent { + + sessionAPIContent: string; + + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { + const sessionApi = data.sessionAPI; + delete sessionApi.ov; + this.sessionAPIContent = JSON.stringify(sessionApi, null, 4); + } + + +} diff --git a/openvidu-testapp/src/app/components/dialogs/show-codec-dialog/show-codec-dialog.component.ts b/openvidu-testapp/src/app/components/dialogs/show-codec-dialog/show-codec-dialog.component.ts index d33cc4cc..80b5f7a8 100644 --- a/openvidu-testapp/src/app/components/dialogs/show-codec-dialog/show-codec-dialog.component.ts +++ b/openvidu-testapp/src/app/components/dialogs/show-codec-dialog/show-codec-dialog.component.ts @@ -7,7 +7,6 @@ import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';

Used Codec: {{usedVideoCodec}}

-
`, styles: [` diff --git a/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.html b/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.html index 471988a5..7bef7a03 100644 --- a/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.html +++ b/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.html @@ -30,8 +30,11 @@ class="mat-icon-custom" (click)="openSessionEventsDialog()"> notifications + -
diff --git a/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts b/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts index ceb940d0..210e3cb4 100644 --- a/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts +++ b/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts @@ -28,6 +28,8 @@ import { EventsDialogComponent } from '../dialogs/events-dialog/events-dialog.co import { SessionPropertiesDialogComponent } from '../dialogs/session-properties-dialog/session-properties-dialog.component'; import { SessionApiDialogComponent } from '../dialogs/session-api-dialog/session-api-dialog.component'; import { PublisherPropertiesDialogComponent } from '../dialogs/publisher-properties-dialog/publisher-properties-dialog.component'; +import { SessionInfoDialogComponent } from "../dialogs/session-info-dialog/session-info-dialog.component"; +import {ShowCodecDialogComponent} from "../dialogs/show-codec-dialog/show-codec-dialog.component"; export interface SessionConf { @@ -719,6 +721,15 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy { }); } + openSessionInfo() { + this.dialog.open(SessionInfoDialogComponent, { + data: { + sessionAPI: this.sessionAPI + }, + width: '450px' + }); + } + async initializeNodeClient(sessionId: string): Promise { this.OV_NodeClient = new OpenViduAPI(this.openviduUrl, this.openviduSecret); this.sessionProperties.customSessionId = sessionId;