Rename TestPlayerRunHelper.run(...) to advance(...)

This avoids a clash with the `run` keyword in Kotlin.

PiperOrigin-RevId: 726461032
This commit is contained in:
ibaker 2025-02-13 06:35:42 -08:00 committed by Copybara-Service
parent 9e22f03718
commit 12072f7248
16 changed files with 308 additions and 284 deletions

View File

@ -58,10 +58,10 @@ import static androidx.media3.test.utils.FakeTimeline.TimelineWindowDefinition.D
import static androidx.media3.test.utils.TestUtil.assertTimelinesSame;
import static androidx.media3.test.utils.TestUtil.timelinesAreSame;
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runMainLooperUntil;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.play;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.playUntilPosition;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.playUntilStartOfMediaItem;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilError;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPlayWhenReady;
@ -4465,7 +4465,7 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
player.release();
@ -4501,14 +4501,14 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
shadowOf(audioManager)
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReadyAfterGain = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason
int suppressionReasonAfterGain = player.getPlaybackSuppressionReason();
@ -4553,7 +4553,7 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.pause();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
@ -4610,7 +4610,7 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
player.release();
@ -4644,7 +4644,7 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
player.release();
@ -4684,14 +4684,14 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
shadowOf(audioManager)
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReadyAfterGain = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason
int suppressionReasonAfterGain = player.getPlaybackSuppressionReason();
@ -4740,7 +4740,7 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.play();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
@ -4803,7 +4803,7 @@ public class ExoPlayerTest {
.getLastAudioFocusRequest()
.listener
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
boolean playWhenReady = player.getPlayWhenReady();
@Player.PlaybackSuppressionReason int suppressionReason = player.getPlaybackSuppressionReason();
player.release();
@ -7278,7 +7278,7 @@ public class ExoPlayerTest {
player.setMediaSource(mediaSource);
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
assertThat(createdMediaPeriodIds).hasSize(2);
player.setRepeatMode(Player.REPEAT_MODE_OFF);
@ -7384,7 +7384,7 @@ public class ExoPlayerTest {
player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2));
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
// Assert both media periods are created, prepared and loaded when paused after preparation.
assertThat(createdMediaPeriodIds)
@ -7492,7 +7492,7 @@ public class ExoPlayerTest {
player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2));
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
// Assert the media period of the second source isn't created yet.
assertThat(createdMediaPeriodIds).containsExactly(firstMediaPeriodId);
@ -11305,9 +11305,9 @@ public class ExoPlayerTest {
player.play();
runUntilPlaybackState(player, Player.STATE_READY);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
renderCounter.set(0);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 800);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 800);
assertThat(renderCounter.get()).isEqualTo(2);
@ -11329,9 +11329,9 @@ public class ExoPlayerTest {
player.play();
runUntilPlaybackState(player, Player.STATE_READY);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
renderCounter.set(0);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 800);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 800);
assertThat(renderCounter.get()).isEqualTo(30);
@ -11365,9 +11365,9 @@ public class ExoPlayerTest {
player.play();
runUntilPlaybackState(player, Player.STATE_READY);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
renderCounter.set(0);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 800);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 800);
assertThat(renderCounter.get()).isEqualTo(10);
@ -11392,9 +11392,9 @@ public class ExoPlayerTest {
new FakeMediaSource(new FakeTimeline(), ExoPlayerTestRunner.AUDIO_FORMAT));
player.prepare();
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 1000);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 1000);
renderCounter.set(0);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 3000);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 3000);
assertThat(renderCounter.get()).isEqualTo(2);
@ -11432,9 +11432,9 @@ public class ExoPlayerTest {
player.play();
runUntilPlaybackState(player, Player.STATE_BUFFERING);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 200);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 200);
renderCounter.set(0);
run(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
advance(player).untilBackgroundThreadCondition(() -> clock.currentTimeMillis() >= 500);
assertThat(renderCounter.get()).isEqualTo(30);
@ -14188,7 +14188,7 @@ public class ExoPlayerTest {
.setDeviceVolumeControlEnabled(true))
.build();
Player.Listener listener = mock(Player.Listener.class);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
int deviceVolume = player.getDeviceVolume();
int noVolumeFlags = 0;
@ -14537,8 +14537,8 @@ public class ExoPlayerTest {
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int audioState1 = audioRenderer.getState();
// Play until we reached the start of the second item.
run(player).untilBackgroundThreadCondition(() -> player.getCurrentMediaItemIndex() == 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilBackgroundThreadCondition(() -> player.getCurrentMediaItemIndex() == 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int audioState2 = audioRenderer.getState();
player.release();
@ -14569,17 +14569,17 @@ public class ExoPlayerTest {
play(player).untilBackgroundThreadCondition(() -> player.getCurrentPosition() >= 5000);
// Pause in this "Read Ahead" state.
player.pause();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int audioState1 = audioRenderer.getState();
// Play in this "Read Ahead" state.
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int audioState2 = audioRenderer.getState();
// Play until the start of the second item.
run(player).untilBackgroundThreadCondition(() -> player.getCurrentMediaItemIndex() == 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilBackgroundThreadCondition(() -> player.getCurrentMediaItemIndex() == 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState3 = videoRenderer.getState();
@Renderer.State int audioState3 = audioRenderer.getState();
player.release();
@ -16015,7 +16015,7 @@ public class ExoPlayerTest {
(format, mediaPeriodId) -> ImmutableList.of(),
ExoPlayerTestRunner.VIDEO_FORMAT));
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
priorityTaskManager.add(C.PRIORITY_PLAYBACK + 1); // Higher priority than playback.
boolean canProcessOtherTask = priorityTaskManager.proceedNonBlocking(C.PRIORITY_PLAYBACK + 1);
@ -16045,7 +16045,7 @@ public class ExoPlayerTest {
(format, mediaPeriodId) -> ImmutableList.of(),
ExoPlayerTestRunner.VIDEO_FORMAT));
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
priorityTaskManager.add(C.PRIORITY_PLAYBACK - 1); // Lower priority than playback.
boolean canProcessOtherTask = priorityTaskManager.proceedNonBlocking(C.PRIORITY_PLAYBACK + 1);
@ -16078,7 +16078,7 @@ public class ExoPlayerTest {
.build();
player.setPriority(C.PRIORITY_DOWNLOAD);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.release();
// Assert default setting and updated setting arrived in the renderer.
@ -16099,10 +16099,10 @@ public class ExoPlayerTest {
FakeMediaSource fakeMediaSource = new FakeMediaSource(timeline1);
player.setMediaSources(ImmutableList.of(fakeMediaSource, new FakeMediaSource()));
player.prepare();
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
fakeMediaSource.setNewSourceInfo(timeline2);
run(player).untilTimelineChanges();
advance(player).untilTimelineChanges();
int windowIndexAfterUpdate = player.getCurrentMediaItemIndex();
player.release();
@ -16136,10 +16136,10 @@ public class ExoPlayerTest {
FakeMediaSource liveSource = new FakeMediaSource(liveTimeline1);
player.setMediaSources(ImmutableList.of(liveSource, new FakeMediaSource()));
player.prepare();
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
liveSource.setNewSourceInfo(liveTimeline2);
run(player).untilTimelineChanges();
advance(player).untilTimelineChanges();
int windowIndexAfterUpdate = player.getCurrentMediaItemIndex();
player.release();
@ -16175,20 +16175,20 @@ public class ExoPlayerTest {
player.setMediaSources(ImmutableList.of(liveSource, new FakeMediaSource()));
player.prepare();
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player
.createMessage(
(message, payload) -> {
throw new IllegalStateException();
})
.send();
run(player).untilPlayerError();
advance(player).untilPlayerError();
liveSource.setNewSourceInfo(liveTimeline2);
liveSource.setAllowPreparation(false); // Lazily update timeline to simulate new manifest load
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
liveSource.setAllowPreparation(true);
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
int mediaItemIndexAfterReprepare = player.getCurrentMediaItemIndex();
player.release();
@ -16257,10 +16257,10 @@ public class ExoPlayerTest {
player.setPlayWhenReady(true);
player.prepare();
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.setPlayWhenReady(false);
player.setPlayWhenReady(true);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.release();
assertThat(reportedPlayWhenReadyChanges).containsExactly(true, false, true).inOrder();
@ -16293,10 +16293,10 @@ public class ExoPlayerTest {
player.setPlaybackSpeed(2f);
player.prepare();
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.setPlaybackSpeed(1.5f);
player.setPlaybackSpeed(1f);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.release();
assertThat(reportedSpeedChanges).containsExactly(2f, 1.5f, 1f).inOrder();

View File

@ -18,7 +18,7 @@ package androidx.media3.exoplayer;
import static androidx.media3.common.Player.REPEAT_MODE_ONE;
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.oneByteSample;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilError;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@ -114,13 +114,13 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is being pre-warmed.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Play until second item is started.
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
@Renderer.State int videoState2 = videoRenderer.getState();
@ -162,18 +162,18 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the secondary renderer is being pre-warmed.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Play until until the primary renderer is being pre-warmed.
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
// Play until past transition back to primary renderer for third media item.
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_STARTED);
@Renderer.State int videoState3 = videoRenderer.getState();
@Renderer.State int secondaryVideoState3 = secondaryVideoRenderer.getState();
@ -210,7 +210,7 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Advance media periods until secondary renderer is being pre-warmed.
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int secondaryVideoState = secondaryVideoRenderer.getState();
@ -251,19 +251,19 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the primary renderer has been enabled, but not yet started.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
player.pause();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
@Renderer.State int videoState3 = videoRenderer.getState();
@ -302,16 +302,16 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the primary renderer has been enabled, but not yet started.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
player.pause();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState3 = videoRenderer.getState();
player.release();
@ -349,10 +349,10 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the primary renderer is being prewarmed, but not yet started.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
@ -363,8 +363,8 @@ public class ExoPlayerWithPrewarmingRenderersTest {
.buildUpon()
.setTrackTypeDisabled(C.TRACK_TYPE_AUDIO, true)
.build());
run(player).untilPendingCommandsAreFullyHandled();
run(player)
advance(player).untilPendingCommandsAreFullyHandled();
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
@ -409,9 +409,9 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the primary renderer is being pre-warmed, but not yet started.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
SampleStream sampleStream1 = videoRenderer.getStream();
@ -422,11 +422,11 @@ public class ExoPlayerWithPrewarmingRenderersTest {
.buildUpon()
.setMaxVideoBitrate(videoFormat1.averageBitrate)
.build());
run(player).untilPendingCommandsAreFullyHandled();
run(player)
advance(player).untilPendingCommandsAreFullyHandled();
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
SampleStream sampleStream2 = videoRenderer.getStream();
@ -466,9 +466,9 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play until the second renderer has been enabled and reading period has not advanced.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
SampleStream videoStream1 = videoRenderer.getStream();
@ -480,10 +480,10 @@ public class ExoPlayerWithPrewarmingRenderersTest {
.buildUpon()
.setMaxVideoBitrate(videoFormat2.averageBitrate)
.build());
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
SampleStream videoStream2 = videoRenderer.getStream();
SampleStream secondaryVideoStream2 = secondaryVideoRenderer.getStream();
player.release();
@ -521,9 +521,9 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play until the second renderer has been enabled and reading period has not advanced.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
SampleStream videoStream1 = videoRenderer.getStream();
@ -534,7 +534,7 @@ public class ExoPlayerWithPrewarmingRenderersTest {
.buildUpon()
.setMaxVideoBitrate(videoFormat2.averageBitrate)
.build());
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
SampleStream videoStream2 = videoRenderer.getStream();
player.release();
@ -598,14 +598,14 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the final media source has been prepared and gone through track selection.
player.play();
run(player).untilBackgroundThreadCondition(() -> selectedAudioTrack.get() != null);
advance(player).untilBackgroundThreadCondition(() -> selectedAudioTrack.get() != null);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
SampleStream secondaryVideoStream1 = secondaryVideoRenderer.getStream();
// Disable the Audio track to trigger track reselection.
player.setTrackSelectionParameters(
player.getTrackSelectionParameters().buildUpon().setMaxAudioBitrate(60_000).build());
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> audioRenderer.getState() == Renderer.STATE_DISABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
@ -647,7 +647,7 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is pre-warming.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@ -655,8 +655,8 @@ public class ExoPlayerWithPrewarmingRenderersTest {
SampleStream secondaryVideoStream1 = secondaryVideoRenderer.getStream();
// Seek to position in current period.
player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 3000);
run(player).untilPendingCommandsAreFullyHandled();
run(player)
advance(player).untilPendingCommandsAreFullyHandled();
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@ -697,15 +697,15 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is started.
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
SampleStream videoStream1 = videoRenderer.getStream();
// Seek to position in current period.
player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 3000);
run(player).untilPendingCommandsAreFullyHandled();
run(player)
advance(player).untilPendingCommandsAreFullyHandled();
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
SampleStream videoStream2 = videoRenderer.getStream();
@Renderer.State int videoState2 = videoRenderer.getState();
@ -744,18 +744,18 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is started.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Seek to position in current period.
player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 500);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
// Play until secondary renderer is being pre-warmed on third media item.
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@ -793,13 +793,13 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is started.
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Seek to position in following period.
player.seekTo(/* mediaItemIndex= */ 2, /* positionMs= */ 3000);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -841,16 +841,16 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is started and primary is pre-warming.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Remove the reading period.
player.removeMediaItem(1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -894,15 +894,15 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is started and primary is pre-warming.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
player.removeMediaItem(1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -946,17 +946,17 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is started and primary is pre-warming.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Remove pre-warming media item.
player.removeMediaItem(2);
run(player).untilPendingCommandsAreFullyHandled();
run(player)
advance(player).untilPendingCommandsAreFullyHandled();
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@ -999,15 +999,15 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is started.
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Replace media item past pre-warming period.
player.replaceMediaItem(
3,
new FakeMediaSource(new FakeTimeline(), ExoPlayerTestRunner.VIDEO_FORMAT).getMediaItem());
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -1044,15 +1044,15 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the primary renderer is pre-warming.
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Replace pre-warming media item.
player.replaceMediaItem(
2,
new FakeMediaSource(new FakeTimeline(), ExoPlayerTestRunner.VIDEO_FORMAT).getMediaItem());
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -1094,15 +1094,15 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is started and primary is pre-warming.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_STARTED);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
player.setRepeatMode(REPEAT_MODE_ONE);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -1140,9 +1140,9 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is enabled and throws errors.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState = videoRenderer.getState();
@Renderer.State int secondaryVideoState = secondaryVideoRenderer.getState();
player.release();
@ -1179,17 +1179,17 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is enabled and throws error.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
assertThat(attemptedRenderWithSecondaryRenderer.get()).isTrue();
attemptedRenderWithSecondaryRenderer.set(false);
// Play a bit so that primary renderer is enabled on second media item.
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -1229,16 +1229,16 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is enabled and throws error.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilBackgroundThreadCondition(attemptedRenderWithSecondaryRenderer::get);
advance(player).untilBackgroundThreadCondition(attemptedRenderWithSecondaryRenderer::get);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
assertThat(attemptedRenderWithSecondaryRenderer.get()).isTrue();
shouldSecondaryRendererThrow.set(false);
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
player.release();
@ -1278,19 +1278,19 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is started.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
assertThat(attemptedRenderWithSecondaryRenderer.get()).isTrue();
run(player).untilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 500);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 500);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
shouldSecondaryRendererThrow.set(false);
run(player).untilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 500);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPosition(/* mediaItemIndex= */ 1, /* positionMs= */ 500);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState3 = videoRenderer.getState();
@Renderer.State int secondaryVideoState3 = secondaryVideoRenderer.getState();
player.release();
@ -1361,17 +1361,17 @@ public class ExoPlayerWithPrewarmingRenderersTest {
// Play a bit until the second renderer is pre-warming.
player.play();
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
shouldPrimaryRendererThrow.set(true);
run(player)
advance(player)
.untilBackgroundThreadCondition(() -> videoRenderer.getState() == Renderer.STATE_DISABLED);
@Renderer.State int videoState3 = videoRenderer.getState();
@Renderer.State int secondaryVideoState3 = secondaryVideoRenderer.getState();
@ -1442,22 +1442,22 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until the second renderer is enabled.
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Force primary renderer to error, killing playback.
shouldPrimaryRendererThrow.set(true);
run(player).untilPlayerError();
advance(player).untilPlayerError();
@Renderer.State int videoState2 = videoRenderer.getState();
@Renderer.State int secondaryVideoState2 = secondaryVideoRenderer.getState();
// Restart playback with primary renderer functioning properly.
shouldPrimaryRendererThrow.set(false);
player.prepare();
player.play();
run(player).untilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 500);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 500);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState3 = videoRenderer.getState();
@Renderer.State int secondaryVideoState3 = secondaryVideoRenderer.getState();
player.release();
@ -1499,8 +1499,8 @@ public class ExoPlayerWithPrewarmingRenderersTest {
player.prepare();
// Play a bit until on second media item and the primary renderer is pre-warming.
run(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilStartOfMediaItem(/* mediaItemIndex= */ 1);
advance(player).untilPendingCommandsAreFullyHandled();
@Renderer.State int videoState1 = videoRenderer.getState();
@Renderer.State int secondaryVideoState1 = secondaryVideoRenderer.getState();
// Force secondary renderer to error, killing playback.
@ -1510,7 +1510,7 @@ public class ExoPlayerWithPrewarmingRenderersTest {
shouldSecondaryRendererThrow.set(false);
player.prepare();
// Play until secondary renderer is pre-warming.
run(player)
advance(player)
.untilBackgroundThreadCondition(
() -> secondaryVideoRenderer.getState() == Renderer.STATE_ENABLED);
@Renderer.State int videoState2 = videoRenderer.getState();

View File

@ -51,9 +51,9 @@ import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_VIDEO_
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.oneByteSample;
import static androidx.media3.test.utils.TestUtil.assertSubclassOverridesAllMethods;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.play;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.playUntilPosition;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilError;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilIsLoading;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPlaybackState;
@ -472,10 +472,10 @@ public final class DefaultAnalyticsCollectorTest {
player.setMediaSources(ImmutableList.of(mediaSource1, mediaSource2));
player.prepare();
// Wait until second period has fully loaded to assert loading events.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.seekTo(/* mediaItemIndex= */ 1, /* positionMs= */ 0);
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
populateEventIds(listener.lastReportedTimeline);
assertThat(listener.getEvents(EVENT_PLAYER_STATE_CHANGED))
@ -969,15 +969,15 @@ public final class DefaultAnalyticsCollectorTest {
player.setMediaSource(fakeMediaSource);
player.prepare();
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_READY);
player.addMediaSource(fakeMediaSource);
// Wait until second period has fully loaded to assert loading events.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.removeMediaItem(/* index= */ 0);
run(player).untilState(Player.STATE_BUFFERING);
run(player).untilState(Player.STATE_READY);
advance(player).untilState(Player.STATE_BUFFERING);
advance(player).untilState(Player.STATE_READY);
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
// Populate event ids with second to last timeline that still contained both periods.
populateEventIds(listener.reportedTimelines.get(listener.reportedTimelines.size() - 2));
@ -1133,17 +1133,17 @@ public final class DefaultAnalyticsCollectorTest {
player.setMediaSource(fakeMediaSource);
player.prepare();
// Ensure everything is preloaded.
run(player).untilFullyBuffered();
run(player).untilState(Player.STATE_READY);
advance(player).untilFullyBuffered();
advance(player).untilState(Player.STATE_READY);
// Wait in each content part to ensure previously triggered events get a chance to be delivered.
play(player).untilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 3_000);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
play(player).untilPosition(/* mediaItemIndex= */ 0, /* positionMs= */ 8_000);
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
// Wait for final timeline change that marks post-roll played.
run(player).untilTimelineChanges();
advance(player).untilTimelineChanges();
Object periodUid = listener.lastReportedTimeline.getUidOfPeriod(/* periodIndex= */ 0);
EventWindowAndPeriodId prerollAd =
@ -1343,13 +1343,13 @@ public final class DefaultAnalyticsCollectorTest {
player.setMediaSource(fakeMediaSource);
player.prepare();
// Ensure everything is preloaded.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
// Seek behind the midroll.
player.seekTo(/* positionMs= */ 6_000);
// Wait until loading started again to assert loading events.
run(player).untilLoadingIs(true);
advance(player).untilLoadingIs(true);
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
Object periodUid = listener.lastReportedTimeline.getUidOfPeriod(/* periodIndex= */ 0);
EventWindowAndPeriodId midrollAd =
@ -1515,9 +1515,9 @@ public final class DefaultAnalyticsCollectorTest {
// Wait for the media to be fully buffered before unblocking the DRM key request. This
// ensures both periods report the same load event (because period1's DRM session is
// already preacquired by the time the key load completes).
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
mediaDrmCallback.keyCondition.open();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
populateEventIds(listener.lastReportedTimeline);
assertThat(listener.getEvents(EVENT_DRM_SESSION_MANAGER_ERROR)).isEmpty();
@ -1587,9 +1587,9 @@ public final class DefaultAnalyticsCollectorTest {
player.play();
player.setMediaSource(mediaSource);
player.prepare();
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
mediaDrmCallback.keyCondition.open();
run(player).untilPlayerError();
advance(player).untilPlayerError();
populateEventIds(listener.lastReportedTimeline);
assertThat(listener.getEvents(EVENT_DRM_SESSION_MANAGER_ERROR)).containsExactly(period0);

View File

@ -19,7 +19,7 @@ import static android.media.AudioFormat.CHANNEL_OUT_5POINT1;
import static android.media.AudioFormat.CHANNEL_OUT_STEREO;
import static android.media.AudioFormat.ENCODING_AC3;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@ -143,7 +143,7 @@ public class AudioCapabilitiesEndToEndTest {
player.addListener(listener);
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
ArgumentCaptor<Tracks> tracks = ArgumentCaptor.forClass(Tracks.class);
@ -207,7 +207,7 @@ public class AudioCapabilitiesEndToEndTest {
player.addAnalyticsListener(createAnalyticsListener());
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
// We expect to start playing audio via passthrough and mid-playback switch to a local decoder.

View File

@ -15,7 +15,7 @@
*/
package androidx.media3.exoplayer.e2etest;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
@ -108,7 +108,7 @@ public final class MergingPlaylistPlaybackTest {
player.prepare();
// Load all content prior to play to reduce flaky-ness resulting from the playback advancement
// speed and handling of discontinuities.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
// Reset the listener to avoid verifying the onIsLoadingChanged events from prepare().
reset(listener);
player.play();
@ -154,7 +154,7 @@ public final class MergingPlaylistPlaybackTest {
player.prepare();
// Load all content prior to play to reduce flaky-ness resulting from the playback advancement
// speed and handling of discontinuities.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
// Reset the listener to avoid verifying the onIsLoadingChanged events from prepare().
reset(listener);
player.play();

View File

@ -15,7 +15,7 @@
*/
package androidx.media3.exoplayer.e2etest;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static com.google.common.truth.Truth.assertThat;
import static org.robolectric.annotation.GraphicsMode.Mode.NATIVE;
@ -89,9 +89,9 @@ public final class PlaylistPlaybackTest {
player.addMediaItem(MediaItem.fromUri("asset:///media/mka/bear-opus.mka"));
player.prepare();
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.addMediaItem(MediaItem.fromUri("asset:///media/wav/sample.wav"));
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
// Wait until second period has fully loaded to start the playback.
player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
@ -116,7 +116,7 @@ public final class PlaylistPlaybackTest {
player.addMediaItem(MediaItem.fromUri("asset:///media/mp4/preroll-5s.mp4"));
player.prepare();
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
MediaItem mediaItemWithSubtitle =
new MediaItem.Builder()
.setUri("asset:///media/mp4/preroll-5s.mp4")
@ -130,7 +130,7 @@ public final class PlaylistPlaybackTest {
.build()))
.build();
player.addMediaItem(mediaItemWithSubtitle);
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
// Wait until second period has fully loaded to start the playback.
player.play();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);

View File

@ -15,7 +15,7 @@
*/
package androidx.media3.exoplayer.e2etest;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import android.content.Context;
import android.graphics.SurfaceTexture;
@ -165,7 +165,7 @@ public class PrewarmingRendererPlaybackTest {
player.prepare();
player.play();
run(player).untilStartOfMediaItem(1);
advance(player).untilStartOfMediaItem(1);
// Stop and reset player to simulate stop, reset, and transition back to using primary.
player.stop();

View File

@ -15,7 +15,7 @@
*/
package androidx.media3.exoplayer.e2etest;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
@ -103,10 +103,10 @@ public class SubtitlePlaybackTest {
player.setMediaItem(mediaItem);
player.prepare();
run(player).untilState(Player.STATE_READY);
run(player).untilLoadingIs(false);
advance(player).untilState(Player.STATE_READY);
advance(player).untilLoadingIs(false);
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
assertThat(loadStartedUris).containsNoneOf(typicalVttUri, simpleTtmlUri);
@ -137,10 +137,10 @@ public class SubtitlePlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/mp4/fragmented_captions.mp4"));
player.prepare();
run(player).untilState(Player.STATE_READY);
run(player).untilFullyBuffered();
advance(player).untilState(Player.STATE_READY);
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -178,10 +178,10 @@ public class SubtitlePlaybackTest {
player.setMediaItems(ImmutableList.of(mediaItemClipped, mediaItemFull));
player.prepare();
run(player).untilState(Player.STATE_READY);
run(player).untilFullyBuffered();
advance(player).untilState(Player.STATE_READY);
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -230,10 +230,10 @@ public class SubtitlePlaybackTest {
player.setMediaItem(mediaItem);
player.prepare();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_READY);
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_READY);
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -291,10 +291,10 @@ public class SubtitlePlaybackTest {
player.setMediaItem(mediaItem);
player.prepare();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_READY);
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_READY);
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -330,10 +330,10 @@ public class SubtitlePlaybackTest {
player.setMediaItem(mediaItem);
player.prepare();
run(player).untilState(Player.STATE_READY);
run(player).untilFullyBuffered();
advance(player).untilState(Player.STATE_READY);
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();

View File

@ -15,8 +15,8 @@
*/
package androidx.media3.exoplayer.e2etest;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.play;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
@ -97,10 +97,10 @@ public class WebvttPlaybackTest {
player.setMediaItem(mediaItem);
player.prepare();
run(player).untilState(Player.STATE_READY);
run(player).untilFullyBuffered();
advance(player).untilState(Player.STATE_READY);
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -140,15 +140,15 @@ public class WebvttPlaybackTest {
// Play media fully (with back buffer) to ensure we have all the segment data available.
player.setMediaItem(mediaItem);
player.prepare();
run(player).untilState(Player.STATE_READY);
run(player).untilFullyBuffered();
advance(player).untilState(Player.STATE_READY);
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
// Seek back to within first subtitle.
player.seekTo(1000);
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -365,7 +365,7 @@ public class WebvttPlaybackTest {
}
player.pause();
player.play();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
}
if (player.getPlayerError() != null) {
throw player.getPlayerError();

View File

@ -21,8 +21,8 @@ import static androidx.media3.exoplayer.source.ads.ServerSideAdInsertionUtil.add
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.END_OF_STREAM_ITEM;
import static androidx.media3.test.utils.FakeSampleStream.FakeSampleStreamItem.oneByteSample;
import static androidx.media3.test.utils.robolectric.RobolectricUtil.runMainLooperUntil;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.playUntilPosition;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPlaybackState;
import static com.google.common.truth.Truth.assertThat;
@ -524,7 +524,7 @@ public final class ServerSideAdInsertionMediaSourceTest {
// Add ad at the current playback position during playback.
runUntilPlaybackState(player, Player.STATE_READY);
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
AdPlaybackState secondAdPlaybackState =
addAdGroupToAdPlaybackState(
firstAdPlaybackState,

View File

@ -16,7 +16,7 @@
package androidx.media3.exoplayer.dash.e2etest;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@ -97,9 +97,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -137,9 +137,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -176,9 +176,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-webvtt/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -213,9 +213,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/standalone-ttml/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -244,9 +244,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/webvtt-in-mp4/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -274,9 +274,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -314,9 +314,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -353,9 +353,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/ttml-in-mp4/sample.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -397,9 +397,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/cea608/manifest.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -437,9 +437,9 @@ public final class DashPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/dash/cea608/manifest.mpd"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -713,9 +713,9 @@ public final class DashPlaybackTest {
MediaItem.fromUri("asset:///media/dash/multi-period-with-offset/sample.mpd"));
player.prepare();
// Ensure media is fully buffered to avoid flakiness from loading second period too late.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();

View File

@ -16,7 +16,7 @@
package androidx.media3.exoplayer.hls.e2etest;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@ -87,9 +87,9 @@ public final class HlsPlaybackTest {
MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -125,9 +125,9 @@ public final class HlsPlaybackTest {
MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -162,9 +162,9 @@ public final class HlsPlaybackTest {
MediaItem.fromUri("asset:///media/hls/standalone-webvtt/multivariant_playlist.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -193,9 +193,9 @@ public final class HlsPlaybackTest {
MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -230,9 +230,9 @@ public final class HlsPlaybackTest {
MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -266,9 +266,9 @@ public final class HlsPlaybackTest {
MediaItem.fromUri("asset:///media/hls/ttml-in-mp4/multivariant_playlist.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).ignoringNonFatalErrors().untilFullyBuffered();
advance(player).ignoringNonFatalErrors().untilFullyBuffered();
player.play();
run(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
advance(player).ignoringNonFatalErrors().untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -306,9 +306,9 @@ public final class HlsPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();
@ -342,9 +342,9 @@ public final class HlsPlaybackTest {
player.setMediaItem(MediaItem.fromUri("asset:///media/hls/cea608/manifest.m3u8"));
player.prepare();
// Ensure media is fully buffered so that the first subtitle is ready at the start of playback.
run(player).untilFullyBuffered();
advance(player).untilFullyBuffered();
player.play();
run(player).untilState(Player.STATE_ENDED);
advance(player).untilState(Player.STATE_ENDED);
player.release();
surface.release();

View File

@ -15,7 +15,7 @@
*/
package androidx.media3.exoplayer.ima;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.run;
import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.advance;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
@ -96,13 +96,13 @@ public class ImaServerSideAdInsertionMediaSourceTest {
MediaItem.fromUri("ssai://dai.google.com/?assetKey=ABC&format=0&adsId=2"));
player.setMediaSource(mediaSource);
player.prepare();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
// Clearing the playlist will cause internal state of the ads source to be invalid and
// potentially accessing empty timelines. See b/354026260. The test simply ensures that clearing
// the playlist will not throw any exceptions.
player.clearMediaItems();
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
player.release();
}
}

View File

@ -38,6 +38,7 @@ import androidx.media3.exoplayer.source.LoadEventInfo;
import androidx.media3.exoplayer.source.MediaLoadData;
import androidx.media3.test.utils.ThreadTestUtil;
import com.google.common.base.Supplier;
import com.google.errorprone.annotations.InlineMe;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@ -544,7 +545,7 @@ public final class TestPlayerRunHelper {
* <p>Callers can use the returned {@link PlayerRunResult} to run the main {@link Looper} until
* certain conditions are met.
*/
public static PlayerRunResult run(Player player) {
public static PlayerRunResult advance(Player player) {
return new PlayerRunResult(
player, /* playBeforeWaiting= */ false, /* throwNonFatalErrors= */ true);
}
@ -555,19 +556,41 @@ public final class TestPlayerRunHelper {
* <p>Callers can use the returned {@link ExoPlayerRunResult} to run the main {@link Looper} until
* certain conditions are met.
*/
public static ExoPlayerRunResult run(ExoPlayer player) {
public static ExoPlayerRunResult advance(ExoPlayer player) {
return new ExoPlayerRunResult(
player, /* playBeforeWaiting= */ false, /* throwNonFatalErrors= */ true);
}
/**
* @deprecated Use {@link #advance(Player)} instead.
*/
@InlineMe(
replacement = "TestPlayerRunHelper.advance(player)",
imports = "androidx.media3.test.utils.robolectric.TestPlayerRunHelper")
@Deprecated
public static PlayerRunResult run(Player player) {
return advance(player);
}
/**
* @deprecated Use {@link #advance(ExoPlayer)} instead.
*/
@InlineMe(
replacement = "TestPlayerRunHelper.advance(player)",
imports = "androidx.media3.test.utils.robolectric.TestPlayerRunHelper")
@Deprecated
public static ExoPlayerRunResult run(ExoPlayer player) {
return advance(player);
}
/**
* Entry point for a fluent "start playback and wait for condition X" assertion.
*
* <p>Callers can use the returned {@link PlayerRunResult} to run the main {@link Looper} until
* certain conditions are met.
*
* <p>This is the same as {@link #run(Player)} but ensures {@link Player#play()} is called before
* waiting in subsequent {@code untilXXX(...)} methods.
* <p>This is the same as {@link #advance(Player)} but ensures {@link Player#play()} is called
* before waiting in subsequent {@code untilXXX(...)} methods.
*/
public static PlayerRunResult play(Player player) {
return new PlayerRunResult(
@ -580,8 +603,8 @@ public final class TestPlayerRunHelper {
* <p>Callers can use the returned {@link ExoPlayerRunResult} to run the main {@link Looper} until
* certain conditions are met.
*
* <p>This is the same as {@link #run(ExoPlayer)} but ensures {@link ExoPlayer#play()} is called
* before waiting in subsequent {@code untilXXX(...)} methods.
* <p>This is the same as {@link #advance(ExoPlayer)} but ensures {@link ExoPlayer#play()} is
* called before waiting in subsequent {@code untilXXX(...)} methods.
*/
public static ExoPlayerRunResult play(ExoPlayer player) {
return new ExoPlayerRunResult(
@ -595,7 +618,8 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link PlayerRunResult#untilState(int)}.
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilState(int)}.
*
* @param player The {@link Player}.
* @param expectedState The expected {@link Player.State}.
@ -605,7 +629,7 @@ public final class TestPlayerRunHelper {
public static void runUntilPlaybackState(Player player, @Player.State int expectedState)
throws TimeoutException {
try {
run(player).untilState(expectedState);
advance(player).untilState(expectedState);
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -618,7 +642,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilPlayWhenReadyIs(boolean)}.
*
* @param player The {@link Player}.
@ -629,7 +653,7 @@ public final class TestPlayerRunHelper {
public static void runUntilPlayWhenReady(Player player, boolean expectedPlayWhenReady)
throws TimeoutException {
try {
run(player).untilPlayWhenReadyIs(expectedPlayWhenReady);
advance(player).untilPlayWhenReadyIs(expectedPlayWhenReady);
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -642,7 +666,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilLoadingIs(boolean)}.
*
* @param player The {@link Player}.
@ -653,7 +677,7 @@ public final class TestPlayerRunHelper {
public static void runUntilIsLoading(Player player, boolean expectedIsLoading)
throws TimeoutException {
try {
run(player).untilLoadingIs(expectedIsLoading);
advance(player).untilLoadingIs(expectedIsLoading);
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -666,7 +690,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilTimelineChangesTo(Timeline)}.
*
* @param player The {@link Player}.
@ -677,7 +701,7 @@ public final class TestPlayerRunHelper {
public static void runUntilTimelineChanged(Player player, Timeline expectedTimeline)
throws TimeoutException {
try {
run(player).untilTimelineChangesTo(expectedTimeline);
advance(player).untilTimelineChangesTo(expectedTimeline);
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -689,7 +713,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilTimelineChanges()}.
*
* @param player The {@link Player}.
@ -699,7 +723,7 @@ public final class TestPlayerRunHelper {
*/
public static Timeline runUntilTimelineChanged(Player player) throws TimeoutException {
try {
return run(player).untilTimelineChanges();
return advance(player).untilTimelineChanges();
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -713,7 +737,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilPositionDiscontinuityWithReason(int)}.
*
* @param player The {@link Player}.
@ -724,7 +748,7 @@ public final class TestPlayerRunHelper {
public static void runUntilPositionDiscontinuity(
Player player, @Player.DiscontinuityReason int expectedReason) throws TimeoutException {
try {
run(player).untilPositionDiscontinuityWithReason(expectedReason);
advance(player).untilPositionDiscontinuityWithReason(expectedReason);
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -735,7 +759,7 @@ public final class TestPlayerRunHelper {
*
* <p>Non-fatal errors are ignored.
*
* <p>New usages should prefer {@link #run(ExoPlayer)} and {@link
* <p>New usages should prefer {@link #advance(ExoPlayer)} and {@link
* ExoPlayerRunResult#untilPlayerError()}.
*
* @param player The {@link Player}.
@ -744,7 +768,7 @@ public final class TestPlayerRunHelper {
* exceeded.
*/
public static ExoPlaybackException runUntilError(ExoPlayer player) throws TimeoutException {
return run(player).untilPlayerError();
return advance(player).untilPlayerError();
}
/**
@ -754,7 +778,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(ExoPlayer)} and {@link
* <p>New usages should prefer {@link #advance(ExoPlayer)} and {@link
* ExoPlayerRunResult#untilSleepingForOffloadBecomes(boolean)}.
*
* @param player The {@link Player}.
@ -765,7 +789,7 @@ public final class TestPlayerRunHelper {
public static void runUntilSleepingForOffload(ExoPlayer player, boolean expectedSleepForOffload)
throws TimeoutException {
try {
run(player).untilSleepingForOffloadBecomes(expectedSleepForOffload);
advance(player).untilSleepingForOffloadBecomes(expectedSleepForOffload);
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -778,7 +802,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(Player)} and {@link
* <p>New usages should prefer {@link #advance(Player)} and {@link
* PlayerRunResult#untilFirstFrameIsRendered()}.
*
* @param player The {@link Player}.
@ -787,7 +811,7 @@ public final class TestPlayerRunHelper {
*/
public static void runUntilRenderedFirstFrame(ExoPlayer player) throws TimeoutException {
try {
run(player).untilFirstFrameIsRendered();
advance(player).untilFirstFrameIsRendered();
} catch (PlaybackException e) {
throw new IllegalStateException(e);
}
@ -805,7 +829,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(ExoPlayer)} and {@link
* <p>New usages should prefer {@link #advance(ExoPlayer)} and {@link
* ExoPlayerRunResult#untilPosition(int, long)}.
*
* @param player The {@link Player}.
@ -835,7 +859,7 @@ public final class TestPlayerRunHelper {
* <p>If a fatal {@link PlaybackException} occurs it will be thrown wrapped in an {@link
* IllegalStateException}.
*
* <p>New usages should prefer {@link #run(ExoPlayer)} and {@link
* <p>New usages should prefer {@link #advance(ExoPlayer)} and {@link
* ExoPlayerRunResult#untilStartOfMediaItem(int)}.
*
* @param player The {@link Player}.
@ -864,7 +888,7 @@ public final class TestPlayerRunHelper {
*/
public static void runUntilPendingCommandsAreFullyHandled(ExoPlayer player)
throws TimeoutException {
run(player).untilPendingCommandsAreFullyHandled();
advance(player).untilPendingCommandsAreFullyHandled();
}
private static void verifyMainTestThread(Player player) {

View File

@ -75,7 +75,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.setComposition(composition);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -105,7 +105,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.setComposition(composition);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -132,7 +132,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.setComposition(composition);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -157,7 +157,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.setComposition(composition);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -199,7 +199,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.setComposition(composition);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -496,7 +496,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.seekTo(/* positionMs= */ 500);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -525,7 +525,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.seekTo(/* positionMs= */ 1200);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -557,7 +557,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.seekTo(/* positionMs= */ 500);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(
@ -599,7 +599,7 @@ public final class CompositionPlayerAudioPlaybackTest {
player.seekTo(/* positionMs= */ 800);
player.prepare();
player.play();
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
DumpFileAsserts.assertOutput(

View File

@ -211,7 +211,7 @@ public class CompositionPlayerTest {
player.setComposition(buildComposition());
player.prepare();
TestPlayerRunHelper.run(player).untilState(Player.STATE_READY);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_READY);
player.release();
@ -838,7 +838,7 @@ public class CompositionPlayerTest {
player.play();
player.seekTo(/* positionMs= */ 1100);
TestPlayerRunHelper.run(player).untilState(Player.STATE_ENDED);
TestPlayerRunHelper.advance(player).untilState(Player.STATE_ENDED);
player.release();
}