Add a test for handling of DRM key refresh events
In a follow-up change I will add an additional test to ensure these events continue to be correctly handled when DefaultDrmSessionManager has prepareCount==0 but a non-null ExoMediaDrm instance. PiperOrigin-RevId: 376190225
This commit is contained in:
parent
10e96c99e5
commit
fd25d2f5ea
@ -25,12 +25,14 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
|
import com.google.android.exoplayer2.drm.ExoMediaDrm.AppManagedProvider;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
import com.google.android.exoplayer2.source.MediaSource;
|
||||||
import com.google.android.exoplayer2.testutil.FakeExoMediaDrm;
|
import com.google.android.exoplayer2.testutil.FakeExoMediaDrm;
|
||||||
import com.google.android.exoplayer2.testutil.TestUtil;
|
import com.google.android.exoplayer2.testutil.TestUtil;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -408,6 +410,48 @@ public class DefaultDrmSessionManagerTest {
|
|||||||
drmSessionManager.release();
|
drmSessionManager.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 10_000)
|
||||||
|
public void keyRefreshEvent_triggersKeyRefresh() throws Exception {
|
||||||
|
FakeExoMediaDrm exoMediaDrm = new FakeExoMediaDrm();
|
||||||
|
FakeExoMediaDrm.LicenseServer licenseServer =
|
||||||
|
FakeExoMediaDrm.LicenseServer.allowingSchemeDatas(DRM_SCHEME_DATAS);
|
||||||
|
DrmSessionManager drmSessionManager =
|
||||||
|
new DefaultDrmSessionManager.Builder()
|
||||||
|
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, new AppManagedProvider(exoMediaDrm))
|
||||||
|
.build(/* mediaDrmCallback= */ licenseServer);
|
||||||
|
|
||||||
|
drmSessionManager.prepare();
|
||||||
|
|
||||||
|
DefaultDrmSession drmSession =
|
||||||
|
(DefaultDrmSession)
|
||||||
|
checkNotNull(
|
||||||
|
drmSessionManager.acquireSession(
|
||||||
|
/* playbackLooper= */ checkNotNull(Looper.myLooper()),
|
||||||
|
/* eventDispatcher= */ null,
|
||||||
|
FORMAT_WITH_DRM_INIT_DATA));
|
||||||
|
waitForOpenedWithKeys(drmSession);
|
||||||
|
|
||||||
|
assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1);
|
||||||
|
|
||||||
|
exoMediaDrm.triggerEvent(
|
||||||
|
drmSession::hasSessionId,
|
||||||
|
ExoMediaDrm.EVENT_KEY_REQUIRED,
|
||||||
|
/* extra= */ 0,
|
||||||
|
/* data= */ Util.EMPTY_BYTE_ARRAY);
|
||||||
|
|
||||||
|
while (licenseServer.getReceivedSchemeDatas().size() == 1) {
|
||||||
|
// Allow the key refresh event to be handled.
|
||||||
|
ShadowLooper.idleMainLooper();
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(2);
|
||||||
|
assertThat(ImmutableSet.copyOf(licenseServer.getReceivedSchemeDatas())).hasSize(1);
|
||||||
|
|
||||||
|
drmSession.release(/* eventDispatcher= */ null);
|
||||||
|
drmSessionManager.release();
|
||||||
|
exoMediaDrm.release();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void managerNotPrepared_acquireSessionAndPreacquireSessionFail() throws Exception {
|
public void managerNotPrepared_acquireSessionAndPreacquireSessionFail() throws Exception {
|
||||||
FakeExoMediaDrm.LicenseServer licenseServer =
|
FakeExoMediaDrm.LicenseServer licenseServer =
|
||||||
|
@ -33,6 +33,7 @@ import com.google.android.exoplayer2.drm.MediaDrmCallback;
|
|||||||
import com.google.android.exoplayer2.drm.MediaDrmCallbackException;
|
import com.google.android.exoplayer2.drm.MediaDrmCallbackException;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
@ -81,6 +82,7 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
|
|||||||
private final AtomicInteger sessionIdGenerator;
|
private final AtomicInteger sessionIdGenerator;
|
||||||
|
|
||||||
private int referenceCount;
|
private int referenceCount;
|
||||||
|
@Nullable private OnEventListener onEventListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs an instance that returns random and unique {@code sessionIds} for subsequent calls
|
* Constructs an instance that returns random and unique {@code sessionIds} for subsequent calls
|
||||||
@ -107,11 +109,11 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
|
|||||||
referenceCount = 1;
|
referenceCount = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExoMediaCrypto implementation
|
// ExoMediaDrm implementation
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setOnEventListener(@Nullable OnEventListener listener) {
|
public void setOnEventListener(@Nullable OnEventListener listener) {
|
||||||
// Do nothing.
|
this.onEventListener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -279,6 +281,27 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
|
|||||||
return FakeExoMediaCrypto.class;
|
return FakeExoMediaCrypto.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Methods to facilitate testing
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls {@link OnEventListener#onEvent(ExoMediaDrm, byte[], int, int, byte[])} on the attached
|
||||||
|
* listener (if present) once for each open session ID which passes {@code sessionIdPredicate},
|
||||||
|
* passing the provided values for {@code event}, {@code extra} and {@code data}.
|
||||||
|
*/
|
||||||
|
public void triggerEvent(
|
||||||
|
Predicate<byte[]> sessionIdPredicate, int event, int extra, @Nullable byte[] data) {
|
||||||
|
@Nullable OnEventListener onEventListener = this.onEventListener;
|
||||||
|
if (onEventListener == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (List<Byte> sessionId : openSessionIds) {
|
||||||
|
byte[] sessionIdArray = Bytes.toArray(sessionId);
|
||||||
|
if (sessionIdPredicate.apply(sessionIdArray)) {
|
||||||
|
onEventListener.onEvent(this, sessionIdArray, event, extra, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static ImmutableList<Byte> toByteList(byte[] byteArray) {
|
private static ImmutableList<Byte> toByteList(byte[] byteArray) {
|
||||||
return ImmutableList.copyOf(Bytes.asList(byteArray));
|
return ImmutableList.copyOf(Bytes.asList(byteArray));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user