Skip to content

Commit

Permalink
Merge pull request #312 from ant-media/release-1.4.0
Browse files Browse the repository at this point in the history
Increase test code coverage
  • Loading branch information
mekya authored Aug 2, 2018
2 parents be41f6d + bfa6463 commit 48600d1
Show file tree
Hide file tree
Showing 5 changed files with 197 additions and 41 deletions.
57 changes: 33 additions & 24 deletions src/main/java/io/antmedia/webrtc/adaptor/RTMPAdaptor.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class RTMPAdaptor extends Adaptor {
private boolean enableAudio = false;

private int audioFrameCount = 0;
private boolean started = false;

public static final String DTLS_SRTP_KEY_AGREEMENT_CONSTRAINT = "DtlsSrtpKeyAgreement";

Expand All @@ -62,7 +63,7 @@ public RTMPAdaptor(FFmpegFrameRecorder recorder, WebSocketCommunityHandler webSo
new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"));
}

public static PeerConnectionFactory createPeerConnectionFactory(){
public PeerConnectionFactory createPeerConnectionFactory(){
PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
options.networkIgnoreMask = 0;
return new PeerConnectionFactory(options);
Expand Down Expand Up @@ -90,6 +91,8 @@ public void start() {

webSocketCommunityHandler.sendStartMessage(getStreamId(), getSession());

started = true;


});

Expand All @@ -102,38 +105,39 @@ public void stop() {
}
isStopped = true;

signallingExecutor.execute(new Runnable() {

@Override
public void run() {
signallingExecutor.execute(() -> {

webSocketCommunityHandler.sendPublishFinishedMessage(getStreamId(), getSession());
webSocketCommunityHandler.sendPublishFinishedMessage(getStreamId(), getSession());


audioEncoderExecutor.shutdownNow();
videoEncoderExecutor.shutdownNow();
audioEncoderExecutor.shutdownNow();
videoEncoderExecutor.shutdownNow();

try {
videoEncoderExecutor.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e1) {
logger.error(ExceptionUtils.getStackTrace(e1));
Thread.currentThread().interrupt();
}
try {
if (peerConnection != null) {
peerConnection.close();
recorder.stop();
peerConnection.dispose();
peerConnectionFactory.dispose();
peerConnection = null;
}
} catch (FrameRecorder.Exception e) {
logger.error(ExceptionUtils.getStackTrace(e));
try {
videoEncoderExecutor.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e1) {
logger.error(ExceptionUtils.getStackTrace(e1));
Thread.currentThread().interrupt();
}
try {
if (peerConnection != null) {
peerConnection.close();
recorder.stop();
peerConnection.dispose();
peerConnectionFactory.dispose();
peerConnection = null;
}
} catch (FrameRecorder.Exception e) {
logger.error(ExceptionUtils.getStackTrace(e));
}

});
signallingExecutor.shutdown();
}

public ExecutorService getSignallingExecutor() {
return signallingExecutor;
}



Expand Down Expand Up @@ -290,5 +294,10 @@ public void run() {
});
}

public boolean isStarted() {
return started;
}



}
112 changes: 95 additions & 17 deletions src/test/java/io/antmedia/test/webrtc/adaptor/RTMPAdaptorTest.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package io.antmedia.test.webrtc.adaptor;

import org.awaitility.Awaitility;
import org.junit.Before;
import org.junit.Test;
import org.red5.net.websocket.WebSocketConnection;
import org.springframework.context.ApplicationContext;
import org.webrtc.MediaStream;
import org.webrtc.PeerConnectionFactory;

import io.antmedia.recorder.FFmpegFrameRecorder;
import io.antmedia.webrtc.adaptor.RTMPAdaptor;
Expand All @@ -14,50 +16,126 @@
import static org.junit.Assert.fail;
import static org.mockito.Mockito.*;

import java.util.concurrent.TimeUnit;

import javax.websocket.Session;

public class RTMPAdaptorTest {

@Before
public void setup() {

}


@Test
public void testGetFileFormat() {
public void testOnAddStream() {

FFmpegFrameRecorder recorder = mock(FFmpegFrameRecorder.class);

WebSocketCommunityHandler webSocketHandlerReal = new WebSocketCommunityHandler() {

@Override
public ApplicationContext getAppContext() {
return null;
}
};

WebSocketCommunityHandler webSocketHandler = spy(webSocketHandlerReal);

RTMPAdaptor adaptorReal = new RTMPAdaptor(recorder, webSocketHandler);
RTMPAdaptor rtmpAdaptor = spy(adaptorReal);

String streamId = "stramId" + (int)(Math.random()*10000);
rtmpAdaptor.setStreamId(streamId);
Session session = mock(Session.class);
rtmpAdaptor.setSession(session);

FFmpegFrameRecorder recorder = WebSocketCommunityHandler.initRecorder("rtmp://test");
MediaStream stream = mock(MediaStream.class);
rtmpAdaptor.onAddStream(stream);

verify(webSocketHandler).sendPublishStartedMessage(streamId, session);
}

@Test
public void testStartandStop() {

FFmpegFrameRecorder recorder = mock(FFmpegFrameRecorder.class);

WebSocketCommunityHandler webSocketHandlerReal = new WebSocketCommunityHandler() {

@Override
public ApplicationContext getAppContext() {
return null;
}
};

WebSocketCommunityHandler webSocketHandler = spy(webSocketHandlerReal);

RTMPAdaptor adaptorReal = new RTMPAdaptor(recorder, webSocketHandler);
RTMPAdaptor rtmpAdaptor = spy(adaptorReal);

String streamId = "stramId" + (int)(Math.random()*10000);
rtmpAdaptor.setStreamId(streamId);
Session session = mock(Session.class);
rtmpAdaptor.setSession(session);

doReturn(mock(PeerConnectionFactory.class)).when(rtmpAdaptor).createPeerConnectionFactory();

rtmpAdaptor.start();

Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() ->
rtmpAdaptor.isStarted()
);

verify(webSocketHandler).sendStartMessage(streamId, session);


rtmpAdaptor.stop();

Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() ->
rtmpAdaptor.getSignallingExecutor().isShutdown()
);

verify(webSocketHandler).sendPublishFinishedMessage(streamId, session);

}


@Test
public void testGetFileFormat() {


FFmpegFrameRecorder recorder = WebSocketCommunityHandler.initRecorder("rtmp://test");

assertEquals("flv", recorder.getFormat());
}

@Test
public void testNoAudioNoVideoInStream() {

try {

WebSocketCommunityHandler handler = mock(WebSocketCommunityHandler.class);

RTMPAdaptor rtmpAdaptor = new RTMPAdaptor(null, handler);

MediaStream stream = mock(MediaStream.class);

Session session = mock(Session.class);

rtmpAdaptor.setSession(session);

rtmpAdaptor.onAddStream(stream);


}
catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());

}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.antmedia.test.webrtc.adaptor;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

import io.antmedia.rest.WebRTCClientStats;

public class WebRTCClientStatsTest {

@Test
public void testStatsClass() {
int measuredBitrate = (int)(Math.random() * 999999);
int sendBitrate = (int)(Math.random() * 999999);
double videoFrameSendPeriod = (Math.random() * 9999);
double audioFrameSendPeriod = (Math.random() * 999999);
double videoThreadCheckInterval = (Math.random() * 9999);
double audioThreadCheckInterval = (Math.random() * 9999);
WebRTCClientStats clientStats = new WebRTCClientStats(measuredBitrate, sendBitrate, videoFrameSendPeriod, audioFrameSendPeriod, videoThreadCheckInterval, audioThreadCheckInterval);

assertEquals(measuredBitrate, clientStats.getMeasuredBitrate());
assertEquals(sendBitrate, clientStats.getSendBitrate());
assertEquals(videoFrameSendPeriod, clientStats.getVideoFrameSendPeriod(), 0.02);
assertEquals(audioFrameSendPeriod, clientStats.getAudioFrameSendPeriod(), 0.02);
assertEquals(videoThreadCheckInterval, clientStats.getVideoThreadCheckInterval(), 0.02);
assertEquals(audioThreadCheckInterval, clientStats.getAudioThreadCheckInterval(), 0.02);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.antmedia.test.webrtc.adaptor;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.io.UnsupportedEncodingException;

import org.junit.Test;
import org.mockito.Mockito;
import org.red5.net.websocket.WebSocketConnection;

import io.antmedia.webrtc.WebSocketClientConnection;

public class WebSocketClientConnectionTest {


@Test
public void testWebSocketClientConnection() {
WebSocketConnection wsConnection = Mockito.mock(WebSocketConnection.class);

long value = (int)(Math.random() * 1000);

Mockito.when(wsConnection.getId()).thenReturn(value);

WebSocketClientConnection connection = new WebSocketClientConnection(wsConnection);

String data = "any data";
connection.send(data);

try {
Mockito.verify(wsConnection).send(data);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
fail(e.getMessage());
}

assertEquals(String.valueOf(value), connection.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -191,4 +191,5 @@ public void testPublishAndStopCommand() {

verify(rtmpAdaptor).stop();
}

}

0 comments on commit 48600d1

Please sign in to comment.