Commit 3656230c by olly Committed by Oliver Woodman

Use MediaSourceTestRunner in additional source tests

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176366471
parent 2a685da4
...@@ -24,7 +24,7 @@ import com.google.android.exoplayer2.Timeline.Window; ...@@ -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 { ...@@ -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; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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; ...@@ -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 { ...@@ -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; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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; ...@@ -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;
...@@ -144,34 +141,6 @@ public class TestUtil { ...@@ -144,34 +141,6 @@ public class TestUtil {
} }
/** /**
* 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}.
* *
* @param dataSource The {@link DataSource} through which to read. * @param dataSource The {@link DataSource} through which to read.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment