mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Use MediaSourceTestRunner in additional source tests
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=176366471
This commit is contained in:
parent
7903166886
commit
5c0e1f3e8a
6 changed files with 52 additions and 62 deletions
|
|
@ -24,7 +24,7 @@ import com.google.android.exoplayer2.Timeline.Window;
|
||||||
import com.google.android.exoplayer2.testutil.FakeMediaSource;
|
import com.google.android.exoplayer2.testutil.FakeMediaSource;
|
||||||
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
||||||
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
||||||
import com.google.android.exoplayer2.testutil.TestUtil;
|
import com.google.android.exoplayer2.testutil.MediaSourceTestRunner;
|
||||||
import com.google.android.exoplayer2.testutil.TimelineAsserts;
|
import com.google.android.exoplayer2.testutil.TimelineAsserts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -123,9 +123,14 @@ public final class ClippingMediaSourceTest extends InstrumentationTestCase {
|
||||||
* Wraps the specified timeline in a {@link ClippingMediaSource} and returns the clipped timeline.
|
* Wraps the specified timeline in a {@link ClippingMediaSource} and returns the clipped timeline.
|
||||||
*/
|
*/
|
||||||
private static Timeline getClippedTimeline(Timeline timeline, long startMs, long endMs) {
|
private static Timeline getClippedTimeline(Timeline timeline, long startMs, long endMs) {
|
||||||
MediaSource mediaSource = new FakeMediaSource(timeline, null);
|
FakeMediaSource fakeMediaSource = new FakeMediaSource(timeline, null);
|
||||||
return TestUtil.extractTimelineFromMediaSource(
|
ClippingMediaSource mediaSource = new ClippingMediaSource(fakeMediaSource, startMs, endMs);
|
||||||
new ClippingMediaSource(mediaSource, startMs, endMs));
|
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
|
||||||
|
try {
|
||||||
|
return testRunner.prepareSource();
|
||||||
|
} finally {
|
||||||
|
testRunner.release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ import com.google.android.exoplayer2.testutil.FakeShuffleOrder;
|
||||||
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
||||||
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
||||||
import com.google.android.exoplayer2.testutil.MediaSourceTestRunner;
|
import com.google.android.exoplayer2.testutil.MediaSourceTestRunner;
|
||||||
import com.google.android.exoplayer2.testutil.TestUtil;
|
|
||||||
import com.google.android.exoplayer2.testutil.TimelineAsserts;
|
import com.google.android.exoplayer2.testutil.TimelineAsserts;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
@ -33,8 +32,6 @@ import junit.framework.TestCase;
|
||||||
*/
|
*/
|
||||||
public final class ConcatenatingMediaSourceTest extends TestCase {
|
public final class ConcatenatingMediaSourceTest extends TestCase {
|
||||||
|
|
||||||
private static final int TIMEOUT_MS = 10000;
|
|
||||||
|
|
||||||
public void testEmptyConcatenation() {
|
public void testEmptyConcatenation() {
|
||||||
for (boolean atomic : new boolean[] {false, true}) {
|
for (boolean atomic : new boolean[] {false, true}) {
|
||||||
Timeline timeline = getConcatenatedTimeline(atomic);
|
Timeline timeline = getConcatenatedTimeline(atomic);
|
||||||
|
|
@ -211,7 +208,7 @@ public final class ConcatenatingMediaSourceTest extends TestCase {
|
||||||
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(mediaSourceContentOnly,
|
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(mediaSourceContentOnly,
|
||||||
mediaSourceWithAds);
|
mediaSourceWithAds);
|
||||||
|
|
||||||
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null, TIMEOUT_MS);
|
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
|
||||||
try {
|
try {
|
||||||
Timeline timeline = testRunner.prepareSource();
|
Timeline timeline = testRunner.prepareSource();
|
||||||
TimelineAsserts.assertAdGroupCounts(timeline, 0, 0, 1, 1);
|
TimelineAsserts.assertAdGroupCounts(timeline, 0, 0, 1, 1);
|
||||||
|
|
@ -241,7 +238,12 @@ public final class ConcatenatingMediaSourceTest extends TestCase {
|
||||||
}
|
}
|
||||||
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(isRepeatOneAtomic,
|
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(isRepeatOneAtomic,
|
||||||
new FakeShuffleOrder(mediaSources.length), mediaSources);
|
new FakeShuffleOrder(mediaSources.length), mediaSources);
|
||||||
return TestUtil.extractTimelineFromMediaSource(mediaSource);
|
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
|
||||||
|
try {
|
||||||
|
return testRunner.prepareSource();
|
||||||
|
} finally {
|
||||||
|
testRunner.release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static FakeTimeline createFakeTimeline(int periodCount, int windowId) {
|
private static FakeTimeline createFakeTimeline(int periodCount, int windowId) {
|
||||||
|
|
|
||||||
|
|
@ -39,19 +39,19 @@ import org.mockito.Mockito;
|
||||||
*/
|
*/
|
||||||
public final class DynamicConcatenatingMediaSourceTest extends TestCase {
|
public final class DynamicConcatenatingMediaSourceTest extends TestCase {
|
||||||
|
|
||||||
private static final int TIMEOUT_MS = 10000;
|
|
||||||
|
|
||||||
private DynamicConcatenatingMediaSource mediaSource;
|
private DynamicConcatenatingMediaSource mediaSource;
|
||||||
private MediaSourceTestRunner testRunner;
|
private MediaSourceTestRunner testRunner;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setUp() {
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
mediaSource = new DynamicConcatenatingMediaSource(new FakeShuffleOrder(0));
|
mediaSource = new DynamicConcatenatingMediaSource(new FakeShuffleOrder(0));
|
||||||
testRunner = new MediaSourceTestRunner(mediaSource, null, TIMEOUT_MS);
|
testRunner = new MediaSourceTestRunner(mediaSource, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tearDown() {
|
public void tearDown() throws Exception {
|
||||||
|
super.tearDown();
|
||||||
testRunner.release();
|
testRunner.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -623,7 +623,7 @@ public final class DynamicConcatenatingMediaSourceTest extends TestCase {
|
||||||
finishedCondition.open();
|
finishedCondition.open();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
assertTrue(finishedCondition.block(TIMEOUT_MS));
|
assertTrue(finishedCondition.block(MediaSourceTestRunner.TIMEOUT_MS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void release() {
|
public void release() {
|
||||||
|
|
@ -656,7 +656,7 @@ public final class DynamicConcatenatingMediaSourceTest extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Timeline assertTimelineChangeBlocking() {
|
public Timeline assertTimelineChangeBlocking() {
|
||||||
assertTrue(finishedCondition.block(TIMEOUT_MS));
|
assertTrue(finishedCondition.block(MediaSourceTestRunner.TIMEOUT_MS));
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.testutil.FakeMediaSource;
|
import com.google.android.exoplayer2.testutil.FakeMediaSource;
|
||||||
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
||||||
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
||||||
import com.google.android.exoplayer2.testutil.TestUtil;
|
import com.google.android.exoplayer2.testutil.MediaSourceTestRunner;
|
||||||
import com.google.android.exoplayer2.testutil.TimelineAsserts;
|
import com.google.android.exoplayer2.testutil.TimelineAsserts;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
@ -110,10 +110,14 @@ public class LoopingMediaSourceTest extends TestCase {
|
||||||
* the looping timeline.
|
* the looping timeline.
|
||||||
*/
|
*/
|
||||||
private static Timeline getLoopingTimeline(Timeline timeline, int loopCount) {
|
private static Timeline getLoopingTimeline(Timeline timeline, int loopCount) {
|
||||||
MediaSource mediaSource = new FakeMediaSource(timeline, null);
|
FakeMediaSource fakeMediaSource = new FakeMediaSource(timeline, null);
|
||||||
return TestUtil.extractTimelineFromMediaSource(
|
LoopingMediaSource mediaSource = new LoopingMediaSource(fakeMediaSource, loopCount);
|
||||||
new LoopingMediaSource(mediaSource, loopCount));
|
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
|
||||||
|
try {
|
||||||
|
return testRunner.prepareSource();
|
||||||
|
} finally {
|
||||||
|
testRunner.release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@ import com.google.android.exoplayer2.source.MediaSource;
|
||||||
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
|
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
|
||||||
import com.google.android.exoplayer2.upstream.Allocator;
|
import com.google.android.exoplayer2.upstream.Allocator;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
|
import com.google.android.exoplayer2.util.Util;
|
||||||
|
|
||||||
import java.util.concurrent.LinkedBlockingDeque;
|
import java.util.concurrent.LinkedBlockingDeque;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
|
@ -39,7 +41,8 @@ import java.util.concurrent.TimeUnit;
|
||||||
*/
|
*/
|
||||||
public class MediaSourceTestRunner {
|
public class MediaSourceTestRunner {
|
||||||
|
|
||||||
private final long timeoutMs;
|
public static final int TIMEOUT_MS = 10000;
|
||||||
|
|
||||||
private final StubExoPlayer player;
|
private final StubExoPlayer player;
|
||||||
private final MediaSource mediaSource;
|
private final MediaSource mediaSource;
|
||||||
private final MediaSourceListener mediaSourceListener;
|
private final MediaSourceListener mediaSourceListener;
|
||||||
|
|
@ -53,12 +56,10 @@ public class MediaSourceTestRunner {
|
||||||
/**
|
/**
|
||||||
* @param mediaSource The source under test.
|
* @param mediaSource The source under test.
|
||||||
* @param allocator The allocator to use during the test run.
|
* @param allocator The allocator to use during the test run.
|
||||||
* @param timeoutMs The timeout for operations in milliseconds.
|
|
||||||
*/
|
*/
|
||||||
public MediaSourceTestRunner(MediaSource mediaSource, Allocator allocator, long timeoutMs) {
|
public MediaSourceTestRunner(MediaSource mediaSource, Allocator allocator) {
|
||||||
this.mediaSource = mediaSource;
|
this.mediaSource = mediaSource;
|
||||||
this.allocator = allocator;
|
this.allocator = allocator;
|
||||||
this.timeoutMs = timeoutMs;
|
|
||||||
playbackThread = new HandlerThread("PlaybackThread");
|
playbackThread = new HandlerThread("PlaybackThread");
|
||||||
playbackThread.start();
|
playbackThread.start();
|
||||||
Looper playbackLooper = playbackThread.getLooper();
|
Looper playbackLooper = playbackThread.getLooper();
|
||||||
|
|
@ -74,15 +75,24 @@ public class MediaSourceTestRunner {
|
||||||
* @param runnable The {@link Runnable} to run.
|
* @param runnable The {@link Runnable} to run.
|
||||||
*/
|
*/
|
||||||
public void runOnPlaybackThread(final Runnable runnable) {
|
public void runOnPlaybackThread(final Runnable runnable) {
|
||||||
|
final Throwable[] throwable = new Throwable[1];
|
||||||
final ConditionVariable finishedCondition = new ConditionVariable();
|
final ConditionVariable finishedCondition = new ConditionVariable();
|
||||||
playbackHandler.post(new Runnable() {
|
playbackHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
runnable.run();
|
try {
|
||||||
finishedCondition.open();
|
runnable.run();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
throwable[0] = e;
|
||||||
|
} finally {
|
||||||
|
finishedCondition.open();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
assertTrue(finishedCondition.block(timeoutMs));
|
assertTrue(finishedCondition.block(TIMEOUT_MS));
|
||||||
|
if (throwable[0] != null) {
|
||||||
|
Util.sneakyThrow(throwable[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -200,7 +210,7 @@ public class MediaSourceTestRunner {
|
||||||
*/
|
*/
|
||||||
public Timeline assertTimelineChangeBlocking() {
|
public Timeline assertTimelineChangeBlocking() {
|
||||||
try {
|
try {
|
||||||
timeline = timelines.poll(timeoutMs, TimeUnit.MILLISECONDS);
|
timeline = timelines.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
|
||||||
assertNotNull(timeline); // Null indicates the poll timed out.
|
assertNotNull(timeline); // Null indicates the poll timed out.
|
||||||
assertNoTimelineChange();
|
assertNoTimelineChange();
|
||||||
return timeline;
|
return timeline;
|
||||||
|
|
@ -231,12 +241,12 @@ public class MediaSourceTestRunner {
|
||||||
private void assertPrepareAndReleasePeriod(MediaPeriodId mediaPeriodId) {
|
private void assertPrepareAndReleasePeriod(MediaPeriodId mediaPeriodId) {
|
||||||
MediaPeriod mediaPeriod = createPeriod(mediaPeriodId);
|
MediaPeriod mediaPeriod = createPeriod(mediaPeriodId);
|
||||||
ConditionVariable preparedCondition = preparePeriod(mediaPeriod, 0);
|
ConditionVariable preparedCondition = preparePeriod(mediaPeriod, 0);
|
||||||
assertTrue(preparedCondition.block(timeoutMs));
|
assertTrue(preparedCondition.block(TIMEOUT_MS));
|
||||||
// MediaSource is supposed to support multiple calls to createPeriod with the same id without an
|
// MediaSource is supposed to support multiple calls to createPeriod with the same id without an
|
||||||
// intervening call to releasePeriod.
|
// intervening call to releasePeriod.
|
||||||
MediaPeriod secondMediaPeriod = createPeriod(mediaPeriodId);
|
MediaPeriod secondMediaPeriod = createPeriod(mediaPeriodId);
|
||||||
ConditionVariable secondPreparedCondition = preparePeriod(secondMediaPeriod, 0);
|
ConditionVariable secondPreparedCondition = preparePeriod(secondMediaPeriod, 0);
|
||||||
assertTrue(secondPreparedCondition.block(timeoutMs));
|
assertTrue(secondPreparedCondition.block(TIMEOUT_MS));
|
||||||
// Release the periods.
|
// Release the periods.
|
||||||
releasePeriod(mediaPeriod);
|
releasePeriod(mediaPeriod);
|
||||||
releasePeriod(secondMediaPeriod);
|
releasePeriod(secondMediaPeriod);
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,7 @@ import android.app.Instrumentation;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.test.MoreAsserts;
|
import android.test.MoreAsserts;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.Timeline;
|
|
||||||
import com.google.android.exoplayer2.extractor.Extractor;
|
import com.google.android.exoplayer2.extractor.Extractor;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
|
||||||
import com.google.android.exoplayer2.source.MediaSource.Listener;
|
|
||||||
import com.google.android.exoplayer2.testutil.FakeExtractorInput.SimulatedIOException;
|
import com.google.android.exoplayer2.testutil.FakeExtractorInput.SimulatedIOException;
|
||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
import com.google.android.exoplayer2.upstream.DataSource;
|
||||||
import com.google.android.exoplayer2.upstream.DataSpec;
|
import com.google.android.exoplayer2.upstream.DataSpec;
|
||||||
|
|
@ -143,34 +140,6 @@ public class TestUtil {
|
||||||
return new String(getByteArray(instrumentation, fileName));
|
return new String(getByteArray(instrumentation, fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts the timeline from a media source.
|
|
||||||
*/
|
|
||||||
// TODO: Remove this method and transition callers over to MediaSourceTestRunner.
|
|
||||||
public static Timeline extractTimelineFromMediaSource(MediaSource mediaSource) {
|
|
||||||
class TimelineListener implements Listener {
|
|
||||||
private Timeline timeline;
|
|
||||||
@Override
|
|
||||||
public synchronized void onSourceInfoRefreshed(MediaSource source, Timeline timeline,
|
|
||||||
Object manifest) {
|
|
||||||
this.timeline = timeline;
|
|
||||||
this.notify();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TimelineListener listener = new TimelineListener();
|
|
||||||
mediaSource.prepareSource(null, true, listener);
|
|
||||||
synchronized (listener) {
|
|
||||||
while (listener.timeline == null) {
|
|
||||||
try {
|
|
||||||
listener.wait();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Assert.fail(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return listener.timeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that data read from a {@link DataSource} matches {@code expected}.
|
* Asserts that data read from a {@link DataSource} matches {@code expected}.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue