org.kurento.test.base.StabilityTest Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kurento-test Show documentation
Show all versions of kurento-test Show documentation
This project contains test cases for testing Kurento
Java Client and Kurento Media Server.
/*
* (C) Copyright 2014 Kurento (http://kurento.org/)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.kurento.test.base;
import java.awt.Color;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.experimental.categories.Category;
import org.kurento.client.EndOfStreamEvent;
import org.kurento.client.EventListener;
import org.kurento.client.MediaFlowInStateChangeEvent;
import org.kurento.client.MediaFlowState;
import org.kurento.client.MediaPipeline;
import org.kurento.client.PlayerEndpoint;
import org.kurento.client.WebRtcEndpoint;
import org.kurento.commons.exception.KurentoException;
import org.kurento.commons.testing.SystemStabilityTests;
import org.kurento.test.browser.WebRtcChannel;
import org.kurento.test.browser.WebRtcMode;
import org.kurento.test.config.Protocol;
import org.kurento.test.utils.Shell;
/**
* Stability tests.
*
* @author Boni Garcia ([email protected])
* @since 5.0.5
*/
@Category(SystemStabilityTests.class)
public class StabilityTest extends RepositoryMongoTest {
private static final int WAIT_POLL_TIME = 200; // milliseconds
public final long DEFAULT_TEST_DURATION = 300000; // ms
public long endTestTime = 0;
public StabilityTest() {
setDeleteLogsIfSuccess(false);
}
public boolean isTimeToFinishTest() {
return System.currentTimeMillis() > endTestTime;
}
public void testPlayerMultipleSeek(String mediaUrl, WebRtcChannel webRtcChannel,
int pauseTimeSeconds, int numSeeks, Map expectedPositionAndColor)
throws Exception {
MediaPipeline mp = kurentoClient.createMediaPipeline();
PlayerEndpoint playerEp = new PlayerEndpoint.Builder(mp, mediaUrl).build();
WebRtcEndpoint webRtcEp = new WebRtcEndpoint.Builder(mp).build();
playerEp.connect(webRtcEp);
final CountDownLatch eosLatch = new CountDownLatch(1);
final CountDownLatch flowingLatch = new CountDownLatch(1);
playerEp.addEndOfStreamListener(new EventListener() {
@Override
public void onEvent(EndOfStreamEvent event) {
log.debug("Received EndOfStream Event");
eosLatch.countDown();
}
});
webRtcEp.addMediaFlowInStateChangeListener(new EventListener() {
@Override
public void onEvent(MediaFlowInStateChangeEvent event) {
if (event.getState().equals(MediaFlowState.FLOWING)) {
flowingLatch.countDown();
}
}
});
// Test execution
getPage().subscribeEvents("playing");
getPage().initWebRtc(webRtcEp, webRtcChannel, WebRtcMode.RCV_ONLY);
playerEp.play();
Assert.assertTrue(
"Not received media (timeout waiting playing event): " + mediaUrl + " " + webRtcChannel,
getPage().waitForEvent("playing"));
Assert.assertTrue(
"Not received FLOWING IN event in webRtcEp: " + mediaUrl + " " + webRtcChannel,
flowingLatch.await(getPage().getTimeout(), TimeUnit.SECONDS));
// TODO: Check with playerEP.getVideoInfo().getIsSeekable() if the video is seekable. If not,
// assert with exception from KMS
Thread.sleep(TimeUnit.SECONDS.toMillis(pauseTimeSeconds));
Integer executions = -1;
for (int i = 0; i < numSeeks; i++) {
executions++;
log.debug("Try to set position in 0");
playerEp.setPosition(0);
for (Integer position : expectedPositionAndColor.keySet()) {
executions++;
log.debug("Try to set position in {}", position);
playerEp.setPosition(position);
if (webRtcChannel != WebRtcChannel.AUDIO_ONLY) {
boolean isSimilarColor = getPage().similarColor(expectedPositionAndColor.get(position));
log.debug("Is the color of the video: {} ? {} ", expectedPositionAndColor.get(position),
isSimilarColor);
if (eosLatch.getCount() == 0) {
break;
}
Assert.assertTrue("After set position to " + position
+ "ms, the color of the video should be " + expectedPositionAndColor.get(position),
isSimilarColor);
}
// TODO: Add new method for checking that audio did pause properly when kurento-utils has
// the
// feature.
}
if (eosLatch.getCount() == 0) {
break;
}
}
Integer executionsExpected = (numSeeks * expectedPositionAndColor.size()) + numSeeks - 1;
log.debug("The times executed. Expected {}. Total {}.", executionsExpected, executions);
Assert.assertTrue("The times executed is wrong. Minimun should be 1. Total: " + executions,
(executions > 1));
// Assertions
Assert.assertTrue("Not received EOS event in player: " + mediaUrl + " " + webRtcChannel,
eosLatch.await(getPage().getTimeout(), TimeUnit.SECONDS));
// Release Media Pipeline
playerEp.release();
mp.release();
}
protected void waitForFileExists(String recordingFile) {
boolean exists = false;
String pathToMedia_[] = recordingFile.split("://");
String protocol = "";
String path = "";
if (pathToMedia_.length > 1) {
protocol = pathToMedia_[0];
path = pathToMedia_[1];
} else {
String recordDefaultPath = KurentoTest.getRecordDefaultPath();
if (recordDefaultPath != null) {
String defaultPathToMedia_[] = recordDefaultPath.split("://");
protocol = defaultPathToMedia_[0];
String pathStart = defaultPathToMedia_[1];
path = pathStart + pathToMedia_[0];
}
}
log.debug("Waiting for the file to be saved: {}", recordingFile);
long timeoutMs = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(WAIT_POLL_TIME);
do {
if (Protocol.FILE.toString().equals(protocol)) {
String output = Shell.runAndWaitString("ls " + path);
if (!output.contains("No such file or directory")) {
exists = true;
}
} else if (Protocol.HTTP.toString().equals(protocol)
|| Protocol.HTTPS.toString().equals(protocol)) {
exists = true;
} else if (Protocol.S3.toString().equals(protocol)) {
recordingFile = protocol + "://" + path;
String output = Shell.runAndWaitString("aws s3 ls " + recordingFile);
if (!output.equals("")) {
exists = true;
}
} else if (Protocol.MONGODB.toString().equals(protocol)) {
// TODO
}
if (!exists) {
// Check timeout
if (System.currentTimeMillis() > timeoutMs) {
throw new KurentoException(
"Timeout of " + WAIT_POLL_TIME + " seconds waiting for file: " + recordingFile);
}
try {
// Wait WAIT_HUB_POLL_TIME ms
log.debug("File {} does not exist ... waiting {} ms", recordingFile, WAIT_POLL_TIME);
Thread.sleep(WAIT_POLL_TIME);
} catch (InterruptedException e) {
log.error("Exception waiting for recording file");
}
}
} while (!exists);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy