diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java index a87a610ad0..3e4abe6ca7 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java @@ -271,6 +271,8 @@ public final class ExoPlayerTest { assertThat(renderer.getFormatsRead()).isEmpty(); assertThat(renderer.sampleBufferReadCount).isEqualTo(0); assertThat(renderer.isEnded).isFalse(); + + player.release(); } /** Tests playback of a source that exposes a single period. */ @@ -313,6 +315,8 @@ public final class ExoPlayerTest { assertThat(renderer.getFormatsRead()).containsExactly(ExoPlayerTestRunner.VIDEO_FORMAT); assertThat(renderer.sampleBufferReadCount).isEqualTo(1); assertThat(renderer.isEnded).isTrue(); + + player.release(); } /** Tests playback of a source that exposes three periods. */ @@ -349,6 +353,8 @@ public final class ExoPlayerTest { ExoPlayerTestRunner.VIDEO_FORMAT); assertThat(renderer.sampleBufferReadCount).isEqualTo(3); assertThat(renderer.isEnded).isTrue(); + + player.release(); } /** Tests playback of periods with very short duration. */ @@ -383,6 +389,8 @@ public final class ExoPlayerTest { assertThat(renderer.getFormatsRead()).hasSize(100); assertThat(renderer.sampleBufferReadCount).isEqualTo(100); assertThat(renderer.isEnded).isTrue(); + + player.release(); } @Test @@ -607,6 +615,8 @@ public final class ExoPlayerTest { assertThat(audioRenderer.positionResetCount).isEqualTo(1); assertThat(videoRenderer.isEnded).isTrue(); assertThat(audioRenderer.isEnded).isTrue(); + + player.release(); } @Test @@ -688,6 +698,8 @@ public final class ExoPlayerTest { new int[] {C.FORMAT_HANDLED}, /* trackSelected= */ new boolean[] {true}))))); assertThat(renderer.isEnded).isTrue(); + + player.release(); } @Test @@ -730,6 +742,8 @@ public final class ExoPlayerTest { .containsExactly(0, 1, 1, 2, 2, 0, 0, 0, 1, 2) .inOrder(); assertThat(renderer.isEnded).isTrue(); + + player.release(); } @Test @@ -2979,6 +2993,8 @@ public final class ExoPlayerTest { assertThat(player.getPlayerError()).isNull(); verify(secondMediaItemTarget, times(2)).handleMessage(anyInt(), any()); + + player.release(); } @Test @@ -3174,6 +3190,8 @@ public final class ExoPlayerTest { // When the ad finishes, the player position should be at or after the requested seek position. runUntilPositionDiscontinuity(player, Player.DISCONTINUITY_REASON_AUTO_TRANSITION); assertThat(player.getCurrentPosition()).isAtLeast(seekPositionMs); + + player.release(); } @Test @@ -3317,6 +3335,8 @@ public final class ExoPlayerTest { // We expect the change to null to be notified, but not onPlayerError. verify(mockListener).onPlayerErrorChanged(ArgumentMatchers.isNull()); verify(mockListener, never()).onPlayerError(any()); + + player.release(); } @Test @@ -5099,6 +5119,8 @@ public final class ExoPlayerTest { // This times out if playback info updates after the seek are blocked. runUntilPlaybackState(player, Player.STATE_ENDED); + + player.release(); } @Test @@ -5850,6 +5872,8 @@ public final class ExoPlayerTest { runUntilPendingCommandsAreFullyHandled(player); assertThat(player.getPlayerError()).isNull(); + + player.release(); } @Test @@ -5936,6 +5960,8 @@ public final class ExoPlayerTest { // The player is not stuck in the buffering state. TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); + + player.release(); } @Test @@ -9345,6 +9371,8 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SET_TRACK_SELECTION_PARAMETERS)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_GET_TRACKS)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_RELEASE)).isTrue(); + + player.release(); } @SuppressWarnings("deprecation") // Checking old volume commands @@ -9358,6 +9386,8 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)).isTrue(); assertThat(player.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)).isTrue(); + + player.release(); } @SuppressWarnings("deprecation") // Checking old volume commands @@ -9372,6 +9402,8 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS)).isFalse(); + + player.release(); } @Test @@ -9410,6 +9442,8 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); + + player.release(); } @Test @@ -9430,6 +9464,8 @@ public final class ExoPlayerTest { assertThat(player.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_BACK)).isFalse(); assertThat(player.isCommandAvailable(COMMAND_SEEK_FORWARD)).isFalse(); + + player.release(); } @Test @@ -9455,6 +9491,8 @@ public final class ExoPlayerTest { runUntilPlaybackState(player, Player.STATE_READY); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isFalse(); + + player.release(); } @Test @@ -9483,6 +9521,8 @@ public final class ExoPlayerTest { runUntilPlaybackState(player, Player.STATE_READY); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); + + player.release(); } @Test @@ -9507,6 +9547,8 @@ public final class ExoPlayerTest { runUntilPlaybackState(player, Player.STATE_READY); assertThat(player.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); + + player.release(); } @Test @@ -9544,6 +9586,8 @@ public final class ExoPlayerTest { player.seekTo(/* mediaItemIndex= */ 3, /* positionMs= */ 0); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousWindow); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9582,6 +9626,8 @@ public final class ExoPlayerTest { player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 0); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToNextWindow); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9598,6 +9644,8 @@ public final class ExoPlayerTest { player.seekTo(/* mediaItemIndex= */ 0, /* positionMs= */ 100); // Check that there were no other calls to onAvailableCommandsChanged. verify(mockListener).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9657,6 +9705,8 @@ public final class ExoPlayerTest { runUntilPlaybackState(player, Player.STATE_ENDED); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekInCurrentAndToPreviousWindow); verify(mockListener, times(4)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9679,6 +9729,8 @@ public final class ExoPlayerTest { player.addMediaSource(new FakeMediaSource()); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9701,6 +9753,8 @@ public final class ExoPlayerTest { player.addMediaSource(/* index= */ 0, new FakeMediaSource()); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9731,6 +9785,8 @@ public final class ExoPlayerTest { player.removeMediaItem(/* index= */ 0); verify(mockListener).onAvailableCommandsChanged(emptyTimelineCommands); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9762,6 +9818,8 @@ public final class ExoPlayerTest { player.removeMediaItem(/* index= */ 0); verify(mockListener).onAvailableCommandsChanged(emptyTimelineCommands); verify(mockListener, times(3)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9781,6 +9839,8 @@ public final class ExoPlayerTest { player.removeMediaItem(/* index= */ 0); verify(mockListener).onAvailableCommandsChanged(defaultCommands); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9803,6 +9863,8 @@ public final class ExoPlayerTest { player.setRepeatMode(Player.REPEAT_MODE_ALL); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousAndNextWindow); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9817,6 +9879,8 @@ public final class ExoPlayerTest { player.setRepeatMode(Player.REPEAT_MODE_ONE); verify(mockListener).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9843,6 +9907,8 @@ public final class ExoPlayerTest { player.setShuffleModeEnabled(true); verify(mockListener).onAvailableCommandsChanged(commandsWithSeekToPreviousWindow); verify(mockListener, times(2)).onAvailableCommandsChanged(any()); + + player.release(); } @Test @@ -9870,6 +9936,8 @@ public final class ExoPlayerTest { .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); + + player.release(); } @Test @@ -9916,6 +9984,8 @@ public final class ExoPlayerTest { .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); + + player.release(); } @Test @@ -9979,6 +10049,8 @@ public final class ExoPlayerTest { .uid; assertThat(error.mediaPeriodId.periodUid).isEqualTo(period1Uid); assertThat(player.getCurrentMediaItemIndex()).isEqualTo(1); + + player.release(); } @Test @@ -10030,6 +10102,8 @@ public final class ExoPlayerTest { inOrderEvents .verify(mockListener) .onMediaItemTransition(any(), any(), eq(Player.MEDIA_ITEM_TRANSITION_REASON_AUTO)); + + player.release(); } @Test @@ -10059,6 +10133,8 @@ public final class ExoPlayerTest { runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ true); assertThat(player.experimentalIsSleepingForOffload()).isTrue(); + + player.release(); } @Test @@ -10079,6 +10155,8 @@ public final class ExoPlayerTest { runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false); assertThat(player.experimentalIsSleepingForOffload()).isFalse(); runUntilPlaybackState(player, Player.STATE_ENDED); + + player.release(); } @Test @@ -10097,6 +10175,8 @@ public final class ExoPlayerTest { runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false); assertThat(player.experimentalIsSleepingForOffload()).isFalse(); runUntilPlaybackState(player, Player.STATE_ENDED); + + player.release(); } @Test @@ -10121,6 +10201,8 @@ public final class ExoPlayerTest { assertThat(newPosition - currentPosition).isNotEqualTo(0); assertThat(newPosition).isEqualTo(800); + + player.release(); } @Test @@ -10146,6 +10228,8 @@ public final class ExoPlayerTest { long currentPosition = player.getCurrentPosition(); assertThat(currentPosition).isEqualTo(800); + + player.release(); } @Test @@ -10173,6 +10257,8 @@ public final class ExoPlayerTest { long currentPosition = player.getCurrentPosition(); assertThat(currentPosition).isEqualTo(1800); + + player.release(); } @Test @@ -10400,6 +10486,8 @@ public final class ExoPlayerTest { verify(mockListener) .onPlaybackParametersChanged(new PlaybackParameters(/* speed= */ 2, /* pitch= */ 2)); + + player.release(); } @Test @@ -12361,6 +12449,8 @@ public final class ExoPlayerTest { .build()); assertThat(player.getMediaMetadata()).isEqualTo(mediaMetadata); + + player.release(); } @Test @@ -12386,12 +12476,15 @@ public final class ExoPlayerTest { shadowOf(Looper.getMainLooper()).idle(); assertThat(player.getMediaMetadata()).isEqualTo(mediaMetadata); + + player.release(); } @Test @Config(sdk = Config.ALL_SDKS) public void builder_inBackgroundThreadWithAllowedAnyThreadMethods_doesNotThrow() throws Exception { + AtomicReference playerReference = new AtomicReference<>(); Thread builderThread = new Thread( () -> { @@ -12403,6 +12496,7 @@ public final class ExoPlayerTest { player.getClock(); player.getApplicationLooper(); player.getPlaybackLooper(); + playerReference.set(player); }); AtomicReference builderThrow = new AtomicReference<>(); builderThread.setUncaughtExceptionHandler((thread, throwable) -> builderThrow.set(throwable)); @@ -12411,6 +12505,7 @@ public final class ExoPlayerTest { builderThread.join(); assertThat(builderThrow.get()).isNull(); + playerReference.get().release(); } @Test @@ -12427,6 +12522,8 @@ public final class ExoPlayerTest { verify(playerListener).onPlaylistMetadataChanged(mediaMetadata); verify(analyticsListener).onPlaylistMetadataChanged(any(), eq(mediaMetadata)); + + player.release(); } @Test @@ -12633,6 +12730,8 @@ public final class ExoPlayerTest { assertThat(minVolume).isEqualTo(0); assertThat(maxVolume).isEqualTo(0); + + player.release(); } @Test @@ -12653,6 +12752,8 @@ public final class ExoPlayerTest { runUntilPlaybackState(player, Player.STATE_ENDED); // Assert that playing works without getting stuck due to the memory used by the back buffer. + + player.release(); } @Test