From 311d21bf8d2c53e05c4eaa502f2c1568a94af2f2 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 29 Jun 2020 16:53:27 +0100 Subject: [PATCH] Remove the multi-threading from DrmSessionManagerTest I don't need to keep a separate playback looper, I can just use ShadowLooper.idleMainLooper(). PiperOrigin-RevId: 318823190 --- .../drm/DefaultDrmSessionManagerTest.java | 101 +++++------------- 1 file changed, 25 insertions(+), 76 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java index 6905c631c7..73f68d1202 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManagerTest.java @@ -17,25 +17,17 @@ package com.google.android.exoplayer2.drm; import static com.google.common.truth.Truth.assertThat; -import android.os.Handler; -import android.os.HandlerThread; -import androidx.annotation.Nullable; +import android.os.Looper; import androidx.test.ext.junit.runners.AndroidJUnit4; -import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.testutil.FakeExoMediaDrm; import com.google.android.exoplayer2.testutil.TestUtil; -import com.google.android.exoplayer2.util.ConditionVariable; -import com.google.android.exoplayer2.util.Function; -import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; -import java.util.Map; import java.util.UUID; -import java.util.concurrent.atomic.AtomicReference; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.shadows.ShadowLooper; /** Tests for {@link DefaultDrmSessionManager} and {@link DefaultDrmSession}. */ // TODO: Test more branches: @@ -46,8 +38,6 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class DefaultDrmSessionManagerTest { - private static final int TIMEOUT_MS = 1_000; - private static final UUID DRM_SCHEME_UUID = UUID.nameUUIDFromBytes(TestUtil.createByteArray(7, 8, 9)); private static final ImmutableList DRM_SCHEME_DATAS = @@ -56,76 +46,35 @@ public class DefaultDrmSessionManagerTest { DRM_SCHEME_UUID, MimeTypes.VIDEO_MP4, /* data= */ TestUtil.createByteArray(1, 2, 3))); private static final DrmInitData DRM_INIT_DATA = new DrmInitData(DRM_SCHEME_DATAS); - private HandlerThread playbackThread; - private Handler playbackThreadHandler; - private MediaSourceEventDispatcher eventDispatcher; - private ConditionVariable keysLoaded; - - @Before - public void setUp() { - playbackThread = new HandlerThread("Test playback thread"); - playbackThread.start(); - playbackThreadHandler = new Handler(playbackThread.getLooper()); - eventDispatcher = new MediaSourceEventDispatcher(); - keysLoaded = TestUtil.createRobolectricConditionVariable(); - eventDispatcher.addEventListener( - playbackThreadHandler, - new DrmSessionEventListener() { - @Override - public void onDrmKeysLoaded( - int windowIndex, @Nullable MediaSource.MediaPeriodId mediaPeriodId) { - keysLoaded.open(); - } - }, - DrmSessionEventListener.class); - } - - @After - public void tearDown() { - playbackThread.quitSafely(); - } - - @Test + @Test(timeout = 10_000) public void acquireSessionTriggersKeyLoadAndSessionIsOpened() throws Exception { FakeExoMediaDrm.LicenseServer licenseServer = FakeExoMediaDrm.LicenseServer.allowingSchemeDatas(DRM_SCHEME_DATAS); - keysLoaded.close(); - AtomicReference drmSession = new AtomicReference<>(); - playbackThreadHandler.post( - () -> { - DefaultDrmSessionManager drmSessionManager = - new DefaultDrmSessionManager.Builder() - .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) - .build(/* mediaDrmCallback= */ licenseServer); + DefaultDrmSessionManager drmSessionManager = + new DefaultDrmSessionManager.Builder() + .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) + .build(/* mediaDrmCallback= */ licenseServer); + drmSessionManager.prepare(); + DrmSession drmSession = + drmSessionManager.acquireSession( + /* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()), + /* eventDispatcher= */ null, + DRM_INIT_DATA); + waitForOpenedWithKeys(drmSession); - drmSessionManager.prepare(); - drmSession.set( - drmSessionManager.acquireSession( - playbackThread.getLooper(), eventDispatcher, DRM_INIT_DATA)); - }); - - keysLoaded.block(TIMEOUT_MS); - - @DrmSession.State int state = post(drmSession.get(), DrmSession::getState); - assertThat(state).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); - Map keyStatus = post(drmSession.get(), DrmSession::queryKeyStatus); - assertThat(keyStatus) + assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); + assertThat(drmSession.queryKeyStatus()) .containsExactly(FakeExoMediaDrm.KEY_STATUS_KEY, FakeExoMediaDrm.KEY_STATUS_AVAILABLE); } - /** Call a function on {@code drmSession} on the playback thread and return the result. */ - private T post(DrmSession drmSession, Function fn) - throws InterruptedException { - AtomicReference result = new AtomicReference<>(); - ConditionVariable resultReady = TestUtil.createRobolectricConditionVariable(); - resultReady.close(); - playbackThreadHandler.post( - () -> { - result.set(fn.apply(drmSession)); - resultReady.open(); - }); - resultReady.block(TIMEOUT_MS); - return result.get(); + private static void waitForOpenedWithKeys(DrmSession drmSession) { + // Check the error first, so we get a meaningful failure if there's been an error. + assertThat(drmSession.getError()).isNull(); + assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); + while (drmSession.getState() != DrmSession.STATE_OPENED_WITH_KEYS) { + // Allow the key response to be handled. + ShadowLooper.idleMainLooper(); + } } }