blob: 820fbf600bf8b907be95e9ae345f09b75a4a68a7 [file] [log] [blame]
/*
* Copyright 2013 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
package org.webrtc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Unit tests for {@link VideoTrack}. */
@RunWith(BaseJUnit4ClassRunner.class)
public class VideoTrackTest {
private PeerConnectionFactory factory;
private VideoSource videoSource;
private VideoTrack videoTrack;
@Before
public void setUp() {
PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
.builder(InstrumentationRegistry.getTargetContext())
.setNativeLibraryName(TestConstants.NATIVE_LIBRARY)
.createInitializationOptions());
factory = PeerConnectionFactory.builder().createPeerConnectionFactory();
videoSource = factory.createVideoSource(/* isScreencast= */ false);
videoTrack = factory.createVideoTrack("video", videoSource);
}
@Test
@SmallTest
public void testAddingNullVideoSink() {
try {
videoTrack.addSink(/* sink= */ null);
fail("Should have thrown an IllegalArgumentException.");
} catch (IllegalArgumentException e) {
// Expected path.
}
}
@Test
@SmallTest
public void testRemovingNullVideoSink() {
videoTrack.removeSink(/* sink= */ null);
}
@Test
@SmallTest
public void testRemovingNonExistantVideoSink() {
final VideoSink videoSink = new VideoSink() {
@Override
public void onFrame(VideoFrame frame) {}
};
videoTrack.removeSink(videoSink);
}
@Test
@SmallTest
public void testAddingSameVideoSinkMultipleTimes() {
class FrameCounter implements VideoSink {
private int count;
public int getCount() {
return count;
}
@Override
public void onFrame(VideoFrame frame) {
count += 1;
}
}
final FrameCounter frameCounter = new FrameCounter();
final VideoFrame videoFrame = new VideoFrame(
JavaI420Buffer.allocate(/* width= */ 32, /* height= */ 32), /* rotation= */ 0,
/* timestampNs= */ 0);
videoTrack.addSink(frameCounter);
videoTrack.addSink(frameCounter);
videoSource.getCapturerObserver().onFrameCaptured(videoFrame);
// Even though we called addSink() multiple times, we should only get one frame out.
assertEquals(1, frameCounter.count);
}
@Test
@SmallTest
public void testAddingAndRemovingVideoSink() {
final VideoFrame videoFrame = new VideoFrame(
JavaI420Buffer.allocate(/* width= */ 32, /* height= */ 32), /* rotation= */ 0,
/* timestampNs= */ 0);
final VideoSink failSink = new VideoSink() {
@Override
public void onFrame(VideoFrame frame) {
fail("onFrame() should not be called on removed sink");
}
};
videoTrack.addSink(failSink);
videoTrack.removeSink(failSink);
videoSource.getCapturerObserver().onFrameCaptured(videoFrame);
}
}