# 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
class MediaSourceTestRunner
```

<br />

*** ** * ** ***

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

## Summary

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

| ### Constants |
|---|---|
| `const https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#TIMEOUT_MS() = 10000` |

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

| ### Public functions |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertCompletedManifestLoads(java.lang.Integer...)(windowIndices: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html!>!)` Asserts that the media source reported completed loads via `https://developer.android.com/reference/kotlin/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. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertCompletedMediaPeriodLoads(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId...)( mediaPeriodIds: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html<https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!>! )` Asserts that the media source reported completed loads via `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://checkerframework.org/api/org/checkerframework/dataflow/qual/SideEffectFree.html https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()` or `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` (or since the runner was created if neither method has been called). |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline!` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()()` Asserts that the source has notified its listener of a single timeline change. |
| `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline!` | `https://developer.android.com/reference/kotlin/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 : https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?> https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#asyncRunOnPlaybackThread(java.util.concurrent.Callable<T>)(callable: https://developer.android.com/reference/java/util/concurrent/Callable.html<T!>!)` 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/kotlin/androidx/media3/exoplayer/source/MediaPeriod!` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId)(periodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!)` Calls `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/exoplayer/source/MediaPeriod` is returned. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod!` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#createPeriod(androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,long)(periodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!, startPositionUs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html)` Calls `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/exoplayer/source/MediaPeriod` is returned. |
| `https://developer.android.com/reference/java/util/concurrent/CountDownLatch.html!` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#preparePeriod(androidx.media3.exoplayer.source.MediaPeriod,long)(mediaPeriod: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod!, positionUs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html)` Calls `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/common/Timeline!` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()()` Prepares the source on the playback thread, asserting that it provides an initial timeline. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#release()()` Releases the runner. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)(mediaPeriod: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod!)` Calls `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releasePeriod(androidx.media3.exoplayer.source.MediaPeriod)` on the playback thread. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#releaseSource()()` Calls `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource#releaseSource(androidx.media3.exoplayer.source.MediaSource.MediaSourceCaller)` on the playback thread. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#runOnPlaybackThread(java.lang.Runnable)(runnable: https://developer.android.com/reference/java/lang/Runnable.html!)` Runs the provided `https://developer.android.com/reference/java/lang/Runnable.html` on the playback thread, blocking until execution completes. |

## Constants

### TIMEOUT_MS

```
const val TIMEOUT_MS = 10000: Int
```

## Public constructors

### MediaSourceTestRunner

```
MediaSourceTestRunner(mediaSource: MediaSource!)
```

Creates an instance.

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

## Public functions

### assertCompletedManifestLoads

```
fun assertCompletedManifestLoads(windowIndices: Array<Int!>!): Unit
```

Asserts that the media source reported completed loads via `https://developer.android.com/reference/kotlin/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

```
fun assertCompletedMediaPeriodLoads(
    mediaPeriodIds: Array<MediaSource.MediaPeriodId!>!
): Unit
```

Asserts that the media source reported completed loads via `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`.

### assertNoTimelineChange

```
@SideEffectFree
fun assertNoTimelineChange(): Unit
```

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

### assertPrepareAndReleaseAllPeriods

```
fun assertPrepareAndReleaseAllPeriods(): Unit
```

Creates and releases all periods (including ad periods) defined in the last timeline to be returned from `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#prepareSource()`, `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChange()` or `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/MediaSourceTestRunner#assertTimelineChangeBlocking()`. The `https://developer.android.com/reference/kotlin/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

```
fun assertTimelineChange(): Timeline!
```

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

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

### assertTimelineChangeBlocking

```
fun assertTimelineChangeBlocking(): Timeline!
```

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/kotlin/androidx/media3/common/Timeline!` | The new `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline`. |

### asyncRunOnPlaybackThread

```
fun <T : Any?> asyncRunOnPlaybackThread(callable: Callable<T!>!): ListenableFuture<T!>!
```

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 |
|---|---|
| `callable: https://developer.android.com/reference/java/util/concurrent/Callable.html<T!>!` | The `https://developer.android.com/reference/java/util/concurrent/Callable.html` to run. |

### createPeriod

```
fun createPeriod(periodId: MediaSource.MediaPeriodId!): MediaPeriod!
```

Calls `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/exoplayer/source/MediaPeriod` is returned.

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

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

### createPeriod

```
fun createPeriod(periodId: MediaSource.MediaPeriodId!, startPositionUs: Long): MediaPeriod!
```

Calls `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/exoplayer/source/MediaPeriod` is returned.

| Parameters |
|---|---|
| `periodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!` | The id of the period to create. |
| `startPositionUs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html` | The expected start position, in microseconds. |

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

### preparePeriod

```
fun preparePeriod(mediaPeriod: MediaPeriod!, positionUs: Long): CountDownLatch!
```

Calls `https://developer.android.com/reference/kotlin/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 |
|---|---|
| `mediaPeriod: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaPeriod` to prepare. |
| `positionUs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html` | 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

```
fun prepareSource(): Timeline!
```

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

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

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

### release

```
fun release(): Unit
```

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

### releasePeriod

```
fun releasePeriod(mediaPeriod: MediaPeriod!): Unit
```

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

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

### releaseSource

```
fun releaseSource(): Unit
```

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

### runOnPlaybackThread

```
fun runOnPlaybackThread(runnable: Runnable!): Unit
```

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

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