Skip to content

Commit d1dcb26

Browse files
committed
Add failing unit test
1 parent df4ae49 commit d1dcb26

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaSessionServiceTest.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,17 @@
2828
import android.content.Context;
2929
import android.os.Bundle;
3030
import android.os.Handler;
31+
import android.os.HandlerThread;
3132
import android.os.Looper;
3233
import android.service.notification.StatusBarNotification;
3334
import android.support.v4.media.session.MediaControllerCompat;
3435
import android.support.v4.media.session.MediaSessionCompat;
3536
import android.support.v4.media.session.PlaybackStateCompat;
3637
import androidx.annotation.Nullable;
38+
import androidx.core.content.ContextCompat;
3739
import androidx.media3.common.ForwardingPlayer;
3840
import androidx.media3.common.MediaItem;
41+
import androidx.media3.common.PlaybackParameters;
3942
import androidx.media3.common.Player;
4043
import androidx.media3.common.util.ConditionVariable;
4144
import androidx.media3.exoplayer.ExoPlayer;
@@ -51,6 +54,8 @@
5154
import androidx.test.filters.MediumTest;
5255
import com.google.common.collect.ImmutableList;
5356
import com.google.common.collect.Lists;
57+
import com.google.common.util.concurrent.FutureCallback;
58+
import com.google.common.util.concurrent.Futures;
5459
import com.google.common.util.concurrent.ListenableFuture;
5560
import com.google.common.util.concurrent.SettableFuture;
5661
import java.util.ArrayList;
@@ -248,6 +253,70 @@ public ListenableFuture<List<MediaItem>> onAddMediaItems(
248253
service.blockUntilAllControllersUnbind(TIMEOUT_MS);
249254
}
250255

256+
@Test
257+
public void onPlayRequested_doesNotCauseDeadlock_ifPlaybackThreadIsNotMain() throws Exception {
258+
HandlerThread ht = new HandlerThread("MSSTest:PlaybackThread");
259+
ht.start();
260+
TestServiceRegistry testServiceRegistry = TestServiceRegistry.getInstance();
261+
ConditionVariable playerToldToSpeedUp = new ConditionVariable();
262+
AtomicReference<MediaController> mediaController = new AtomicReference<>();
263+
AtomicReference<MediaSession> mediaSession = new AtomicReference<>();
264+
testServiceRegistry.setOnGetSessionHandler(
265+
controllerInfo -> {
266+
MockMediaSessionService service =
267+
(MockMediaSessionService) testServiceRegistry.getServiceInstance();
268+
Player player = new ExoPlayer.Builder(service).setLooper(ht.getLooper()).build();
269+
player.addListener(
270+
new Player.Listener() {
271+
@Override
272+
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
273+
if (playbackParameters.speed == 2f) {
274+
playerToldToSpeedUp.open();
275+
}
276+
}
277+
});
278+
mediaSession.set(new MediaSession.Builder(service, player).build());
279+
return mediaSession.get();
280+
});
281+
TestHandler handler = new TestHandler(Looper.getMainLooper());
282+
TestHandler bgHandler = new TestHandler(ht.getLooper());
283+
handler.post(
284+
() -> {
285+
ListenableFuture<MediaController> controllerFuture =
286+
new MediaController.Builder(context, token).buildAsync();
287+
Futures.addCallback(
288+
controllerFuture,
289+
new FutureCallback<MediaController>() {
290+
@Override
291+
public void onSuccess(MediaController controller) {
292+
controller.addMediaItem(new MediaItem.Builder().setMediaId("media_id").build());
293+
controller.play();
294+
bgHandler.post(
295+
() ->
296+
handler.post(
297+
() -> {
298+
controller.setPlaybackSpeed(2f);
299+
mediaController.set(controller);
300+
}));
301+
}
302+
303+
@Override
304+
public void onFailure(Throwable t) {
305+
throw new RuntimeException(t);
306+
}
307+
},
308+
ContextCompat.getMainExecutor(context));
309+
});
310+
playerToldToSpeedUp.block(TIMEOUT_MS);
311+
if (!playerToldToSpeedUp.isOpen()) {
312+
ht.interrupt(); // avoid deadlocking the test forever.
313+
}
314+
assertThat(playerToldToSpeedUp.isOpen()).isTrue();
315+
handler.postAndSync(() -> mediaController.get().release());
316+
mediaSession.get().release();
317+
ht.quitSafely();
318+
}
319+
251320
@Test
252321
public void onCreate_withCustomLayout_correctSessionStateFromOnConnect() throws Exception {
253322
SessionCommand command1 = new SessionCommand("command1", Bundle.EMPTY);

0 commit comments

Comments
 (0)