Use MediaSourceTestRunner in additional source tests

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=176366471
This commit is contained in:
olly 2017-11-20 08:48:10 -08:00 committed by Oliver Woodman
parent 2a685da4eb
commit 3656230cb1
6 changed files with 52 additions and 62 deletions

View file

@ -24,7 +24,7 @@ import com.google.android.exoplayer2.Timeline.Window;
import com.google.android.exoplayer2.testutil.FakeMediaSource;
import com.google.android.exoplayer2.testutil.FakeTimeline;
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;
/**
@ -123,9 +123,14 @@ public final class ClippingMediaSourceTest extends InstrumentationTestCase {
* Wraps the specified timeline in a {@link ClippingMediaSource} and returns the clipped timeline.
*/
private static Timeline getClippedTimeline(Timeline timeline, long startMs, long endMs) {
MediaSource mediaSource = new FakeMediaSource(timeline, null);
return TestUtil.extractTimelineFromMediaSource(
new ClippingMediaSource(mediaSource, startMs, endMs));
FakeMediaSource fakeMediaSource = new FakeMediaSource(timeline, null);
ClippingMediaSource mediaSource = new ClippingMediaSource(fakeMediaSource, startMs, endMs);
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
try {
return testRunner.prepareSource();
} finally {
testRunner.release();
}
}
}

View file

@ -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.TimelineWindowDefinition;
import com.google.android.exoplayer2.testutil.MediaSourceTestRunner;
import com.google.android.exoplayer2.testutil.TestUtil;
import com.google.android.exoplayer2.testutil.TimelineAsserts;
import junit.framework.TestCase;
@ -33,8 +32,6 @@ import junit.framework.TestCase;
*/
public final class ConcatenatingMediaSourceTest extends TestCase {
private static final int TIMEOUT_MS = 10000;
public void testEmptyConcatenation() {
for (boolean atomic : new boolean[] {false, true}) {
Timeline timeline = getConcatenatedTimeline(atomic);
@ -211,7 +208,7 @@ public final class ConcatenatingMediaSourceTest extends TestCase {
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(mediaSourceContentOnly,
mediaSourceWithAds);
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null, TIMEOUT_MS);
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
try {
Timeline timeline = testRunner.prepareSource();
TimelineAsserts.assertAdGroupCounts(timeline, 0, 0, 1, 1);
@ -241,7 +238,12 @@ public final class ConcatenatingMediaSourceTest extends TestCase {
}
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource(isRepeatOneAtomic,
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) {

View file

@ -39,19 +39,19 @@ import org.mockito.Mockito;
*/
public final class DynamicConcatenatingMediaSourceTest extends TestCase {
private static final int TIMEOUT_MS = 10000;
private DynamicConcatenatingMediaSource mediaSource;
private MediaSourceTestRunner testRunner;
@Override
public void setUp() {
public void setUp() throws Exception {
super.setUp();
mediaSource = new DynamicConcatenatingMediaSource(new FakeShuffleOrder(0));
testRunner = new MediaSourceTestRunner(mediaSource, null, TIMEOUT_MS);
testRunner = new MediaSourceTestRunner(mediaSource, null);
}
@Override
public void tearDown() {
public void tearDown() throws Exception {
super.tearDown();
testRunner.release();
}
@ -623,7 +623,7 @@ public final class DynamicConcatenatingMediaSourceTest extends TestCase {
finishedCondition.open();
}
});
assertTrue(finishedCondition.block(TIMEOUT_MS));
assertTrue(finishedCondition.block(MediaSourceTestRunner.TIMEOUT_MS));
}
public void release() {
@ -656,7 +656,7 @@ public final class DynamicConcatenatingMediaSourceTest extends TestCase {
}
public Timeline assertTimelineChangeBlocking() {
assertTrue(finishedCondition.block(TIMEOUT_MS));
assertTrue(finishedCondition.block(MediaSourceTestRunner.TIMEOUT_MS));
if (error != null) {
throw error;
}

View file

@ -21,7 +21,7 @@ import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.testutil.FakeMediaSource;
import com.google.android.exoplayer2.testutil.FakeTimeline;
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 junit.framework.TestCase;
@ -110,10 +110,14 @@ public class LoopingMediaSourceTest extends TestCase {
* the looping timeline.
*/
private static Timeline getLoopingTimeline(Timeline timeline, int loopCount) {
MediaSource mediaSource = new FakeMediaSource(timeline, null);
return TestUtil.extractTimelineFromMediaSource(
new LoopingMediaSource(mediaSource, loopCount));
FakeMediaSource fakeMediaSource = new FakeMediaSource(timeline, null);
LoopingMediaSource mediaSource = new LoopingMediaSource(fakeMediaSource, loopCount);
MediaSourceTestRunner testRunner = new MediaSourceTestRunner(mediaSource, null);
try {
return testRunner.prepareSource();
} finally {
testRunner.release();
}
}
}

View file

@ -31,6 +31,8 @@ import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
@ -39,7 +41,8 @@ import java.util.concurrent.TimeUnit;
*/
public class MediaSourceTestRunner {
private final long timeoutMs;
public static final int TIMEOUT_MS = 10000;
private final StubExoPlayer player;
private final MediaSource mediaSource;
private final MediaSourceListener mediaSourceListener;
@ -53,12 +56,10 @@ public class MediaSourceTestRunner {
/**
* @param mediaSource The source under test.
* @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.allocator = allocator;
this.timeoutMs = timeoutMs;
playbackThread = new HandlerThread("PlaybackThread");
playbackThread.start();
Looper playbackLooper = playbackThread.getLooper();
@ -74,15 +75,24 @@ public class MediaSourceTestRunner {
* @param runnable The {@link Runnable} to run.
*/
public void runOnPlaybackThread(final Runnable runnable) {
final Throwable[] throwable = new Throwable[1];
final ConditionVariable finishedCondition = new ConditionVariable();
playbackHandler.post(new Runnable() {
@Override
public void run() {
runnable.run();
finishedCondition.open();
try {
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() {
try {
timeline = timelines.poll(timeoutMs, TimeUnit.MILLISECONDS);
timeline = timelines.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
assertNotNull(timeline); // Null indicates the poll timed out.
assertNoTimelineChange();
return timeline;
@ -231,12 +241,12 @@ public class MediaSourceTestRunner {
private void assertPrepareAndReleasePeriod(MediaPeriodId mediaPeriodId) {
MediaPeriod mediaPeriod = createPeriod(mediaPeriodId);
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
// intervening call to releasePeriod.
MediaPeriod secondMediaPeriod = createPeriod(mediaPeriodId);
ConditionVariable secondPreparedCondition = preparePeriod(secondMediaPeriod, 0);
assertTrue(secondPreparedCondition.block(timeoutMs));
assertTrue(secondPreparedCondition.block(TIMEOUT_MS));
// Release the periods.
releasePeriod(mediaPeriod);
releasePeriod(secondMediaPeriod);

View file

@ -19,10 +19,7 @@ import android.app.Instrumentation;
import android.content.Context;
import android.test.MoreAsserts;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Timeline;
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.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DataSpec;
@ -143,34 +140,6 @@ public class TestUtil {
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}.
*