# MediaSourceTestRunner

Artifact: [androidx.media3:media3-test-utils](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/test/utils/MediaSourceTestRunner.java+class:androidx.media3.test.utils.MediaSourceTestRunner)

*** ** * ** ***


```
@UnstableApi
public class MediaSourceTestRunner
```

<br />

*** ** * ** ***

A runner for `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource` tests.

## Summary

| ### Nested types |
|---|
| `public inner class https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner.MediaSourceListener implements https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaSourceCaller, https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener` |

| ### Constants |
|---|---|
| `static final int` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#TIMEOUT_MS() = 10000` |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#MediaSourceTestRunner(androidx.media3.exoplayer.source.MediaSource)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource mediaSource)` Creates an instance. |

| ### Public methods |
|---|---|
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertCompletedManifestLoads(java.lang.Integer...)(Integer[] windowIndices)` Asserts that the media source reported completed loads via `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener#onLoadCompleted(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)` for each specified window index and a null period id. |
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertCompletedMediaPeriodLoads(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId...)( MediaSource.MediaPeriodId[] mediaPeriodIds )` Asserts that the media source reported completed loads via `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener#onLoadCompleted(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)` for each specified media period id, and asserts that the associated window index matches the one in the last known timeline returned from `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`. |
| `void` | `@https://checkerframework.org/api/org/checkerframework/dataflow/qual/SideEffectFree.html https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertNoTimelineChange()()` Asserts that the source has not notified its listener of a timeline change since the last call to `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()` or `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` (or since the runner was created if neither method has been called). |
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertPrepareAndReleaseAllPeriods()()` Creates and releases all periods (including ad periods) defined in the last timeline to be returned from `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`. |
| `https://developer.android.com/reference/androidx/media3/common/Timeline` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()()` Asserts that the source has notified its listener of a single timeline change. |
| `https://developer.android.com/reference/androidx/media3/common/Timeline` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()()` Asserts that the source notifies its listener of a single timeline change. |
| `https://guava.dev/releases/snapshot-android/api/docs/com/google/common/util/concurrent/ListenableFuture.html<T>` | `<T extends https://developer.android.com/reference/java/lang/Object.html> https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#asyncRunOnPlaybackThread(java.util.concurrent.Callable<T>)(https://developer.android.com/reference/java/util/concurrent/Callable.html<T> callable)` Runs the provided `https://developer.android.com/reference/java/util/concurrent/Callable.html` on the playback thread and returns a future of the result. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId periodId)` Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)` with a zero start position on the playback thread, asserting that a non-null `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` is returned. |
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId periodId, long startPositionUs)` Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)` on the playback thread, asserting that a non-null `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` is returned. |
| `https://developer.android.com/reference/java/util/concurrent/CountDownLatch.html` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#preparePeriod(androidx.media3.exoplayer.source.MediaPeriod,long)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod mediaPeriod, long positionUs)` Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod#prepare(androidx.media3.exoplayer.source.MediaPeriod.Callback,long)` on the playback thread and blocks until the method has been called. |
| `https://developer.android.com/reference/androidx/media3/common/Timeline` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()()` Prepares the source on the playback thread, asserting that it provides an initial timeline. |
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#release()()` Releases the runner. |
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)(https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod mediaPeriod)` Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)` on the playback thread. |
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#releaseSource()()` Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)` on the playback thread. |
| `void` | `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#runOnPlaybackThread(java.lang.Runnable)(https://developer.android.com/reference/java/lang/Runnable.html runnable)` Runs the provided `https://developer.android.com/reference/java/lang/Runnable.html` on the playback thread, blocking until execution completes. |

## Constants

### TIMEOUT_MS

```
public static final int TIMEOUT_MS = 10000
```

## Public constructors

### MediaSourceTestRunner

```
public MediaSourceTestRunner(MediaSource mediaSource)
```

Creates an instance.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource mediaSource` | The source under test. |

## Public methods

### assertCompletedManifestLoads

```
public void assertCompletedManifestLoads(Integer[] windowIndices)
```

Asserts that the media source reported completed loads via `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener#onLoadCompleted(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)` for each specified window index and a null period id. Also asserts that no other loads with media period id null are reported.

### assertCompletedMediaPeriodLoads

```
public void assertCompletedMediaPeriodLoads(
    MediaSource.MediaPeriodId[] mediaPeriodIds
)
```

Asserts that the media source reported completed loads via `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSourceEventListener#onLoadCompleted(int,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.source.LoadEventInfo,androidx.media3.exoplayer.source.MediaLoadData)` for each specified media period id, and asserts that the associated window index matches the one in the last known timeline returned from `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`.

### assertNoTimelineChange

```
@SideEffectFree
public void assertNoTimelineChange()
```

Asserts that the source has not notified its listener of a timeline change since the last call to `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()` or `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` (or since the runner was created if neither method has been called).

### assertPrepareAndReleaseAllPeriods

```
public void assertPrepareAndReleaseAllPeriods()
```

Creates and releases all periods (including ad periods) defined in the last timeline to be returned from `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`. The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId#windowSequenceNumber()` is set to the index of the window.

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/InterruptedException.html` |   |

### assertTimelineChange

```
public Timeline assertTimelineChange()
```

Asserts that the source has notified its listener of a single timeline change.

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/Timeline` | The new `https://developer.android.com/reference/androidx/media3/common/Timeline`. |

### assertTimelineChangeBlocking

```
public Timeline assertTimelineChangeBlocking()
```

Asserts that the source notifies its listener of a single timeline change. If the source has not yet notified its listener, it has up to the timeout passed to the constructor to do so.

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/Timeline` | The new `https://developer.android.com/reference/androidx/media3/common/Timeline`. |

### asyncRunOnPlaybackThread

```
public ListenableFuture<T> <T extends Object> asyncRunOnPlaybackThread(Callable<T> callable)
```

Runs the provided `https://developer.android.com/reference/java/util/concurrent/Callable.html` on the playback thread and returns a future of the result.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/util/concurrent/Callable.html<T> callable` | The `https://developer.android.com/reference/java/util/concurrent/Callable.html` to run. |

### createPeriod

```
public MediaPeriod createPeriod(MediaSource.MediaPeriodId periodId)
```

Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)` with a zero start position on the playback thread, asserting that a non-null `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` is returned.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId periodId` | The id of the period to create. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` | The created `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. |

### createPeriod

```
public MediaPeriod createPeriod(MediaSource.MediaPeriodId periodId, long startPositionUs)
```

Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.exoplayer.upstream.Allocator,long)` on the playback thread, asserting that a non-null `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` is returned.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId periodId` | The id of the period to create. |
| `long startPositionUs` | The expected start position, in microseconds. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` | The created `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod`. |

### preparePeriod

```
public CountDownLatch preparePeriod(MediaPeriod mediaPeriod, long positionUs)
```

Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod#prepare(androidx.media3.exoplayer.source.MediaPeriod.Callback,long)` on the playback thread and blocks until the method has been called.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod mediaPeriod` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` to prepare. |
| `long positionUs` | The position at which to prepare. |

| Returns |
|---|---|
| `https://developer.android.com/reference/java/util/concurrent/CountDownLatch.html` | A `https://developer.android.com/reference/java/util/concurrent/CountDownLatch.html` that will be counted down when preparation completes. |

### prepareSource

```
public Timeline prepareSource()
```

Prepares the source on the playback thread, asserting that it provides an initial timeline.

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/Timeline` | The initial `https://developer.android.com/reference/androidx/media3/common/Timeline`. |

| Throws |
|---|---|
| `https://developer.android.com/reference/java/io/IOException.html` |   |

### release

```
public void release()
```

Releases the runner. Should be called when the runner is no longer required.

### releasePeriod

```
public void releasePeriod(MediaPeriod mediaPeriod)
```

Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)` on the playback thread.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod mediaPeriod` | The `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaPeriod` to release. |

### releaseSource

```
public void releaseSource()
```

Calls `https://developer.android.com/reference/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)` on the playback thread.

### runOnPlaybackThread

```
public void runOnPlaybackThread(Runnable runnable)
```

Runs the provided `https://developer.android.com/reference/java/lang/Runnable.html` on the playback thread, blocking until execution completes.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/lang/Runnable.html runnable` | The `https://developer.android.com/reference/java/lang/Runnable.html` to run. |