Enforce valid key responses in FakeExoMediaDrm

Make this behaviour optional, so it can be disabled for
AnalyticsCollectorTest where we don't use
FakeExoMediaDrm.LicenseServer.

PiperOrigin-RevId: 393133721
This commit is contained in:
ibaker 2021-08-26 16:49:05 +01:00 committed by bachinger
parent 84cf63a72f
commit 9c2b4b860b
2 changed files with 41 additions and 8 deletions

View file

@ -173,7 +173,9 @@ public final class AnalyticsCollectorTest {
private final DrmSessionManager drmSessionManager = private final DrmSessionManager drmSessionManager =
new DefaultDrmSessionManager.Builder() new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) .setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID,
uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build())
.setMultiSession(true) .setMultiSession(true)
.build(new EmptyDrmCallback()); .build(new EmptyDrmCallback());
@ -1452,7 +1454,9 @@ public final class AnalyticsCollectorTest {
BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.returnsEmpty(); BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.returnsEmpty();
DrmSessionManager blockingDrmSessionManager = DrmSessionManager blockingDrmSessionManager =
new DefaultDrmSessionManager.Builder() new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) .setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID,
uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build())
.setMultiSession(true) .setMultiSession(true)
.build(mediaDrmCallback); .build(mediaDrmCallback);
MediaSource mediaSource = MediaSource mediaSource =
@ -1518,7 +1522,9 @@ public final class AnalyticsCollectorTest {
BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.alwaysFailing(); BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.alwaysFailing();
DrmSessionManager failingDrmSessionManager = DrmSessionManager failingDrmSessionManager =
new DefaultDrmSessionManager.Builder() new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) .setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID,
uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build())
.setMultiSession(true) .setMultiSession(true)
.build(mediaDrmCallback); .build(mediaDrmCallback);
MediaSource mediaSource = MediaSource mediaSource =

View file

@ -65,16 +65,29 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
/** Builder for {@link FakeExoMediaDrm} instances. */ /** Builder for {@link FakeExoMediaDrm} instances. */
public static class Builder { public static class Builder {
private boolean enforceValidKeyResponses;
private int provisionsRequired; private int provisionsRequired;
private boolean throwNotProvisionedExceptionFromGetKeyRequest; private boolean throwNotProvisionedExceptionFromGetKeyRequest;
private int maxConcurrentSessions; private int maxConcurrentSessions;
/** Constructs an instance. */ /** Constructs an instance. */
public Builder() { public Builder() {
enforceValidKeyResponses = true;
provisionsRequired = 0; provisionsRequired = 0;
maxConcurrentSessions = Integer.MAX_VALUE; maxConcurrentSessions = Integer.MAX_VALUE;
} }
/**
* Sets whether key responses passed to {@link #provideKeyResponse(byte[], byte[])} should be
* checked for validity (i.e. that they came from a {@link LicenseServer}).
*
* <p>Defaults to true.
*/
public Builder setEnforceValidKeyResponses(boolean enforceValidKeyResponses) {
this.enforceValidKeyResponses = enforceValidKeyResponses;
return this;
}
/** /**
* Sets how many successful provisioning round trips are needed for the {@link FakeExoMediaDrm} * Sets how many successful provisioning round trips are needed for the {@link FakeExoMediaDrm}
* to be provisioned. * to be provisioned.
@ -120,7 +133,10 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
*/ */
public FakeExoMediaDrm build() { public FakeExoMediaDrm build() {
return new FakeExoMediaDrm( return new FakeExoMediaDrm(
provisionsRequired, throwNotProvisionedExceptionFromGetKeyRequest, maxConcurrentSessions); enforceValidKeyResponses,
provisionsRequired,
throwNotProvisionedExceptionFromGetKeyRequest,
maxConcurrentSessions);
} }
} }
@ -141,6 +157,7 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
private static final ImmutableList<Byte> PROVISIONING_REQUIRED_RESPONSE = private static final ImmutableList<Byte> PROVISIONING_REQUIRED_RESPONSE =
TestUtil.createByteList(4, 5, 6); TestUtil.createByteList(4, 5, 6);
private final boolean enforceValidKeyResponses;
private final int provisionsRequired; private final int provisionsRequired;
private final int maxConcurrentSessions; private final int maxConcurrentSessions;
private final boolean throwNotProvisionedExceptionFromGetKeyRequest; private final boolean throwNotProvisionedExceptionFromGetKeyRequest;
@ -164,15 +181,18 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
@Deprecated @Deprecated
public FakeExoMediaDrm(int maxConcurrentSessions) { public FakeExoMediaDrm(int maxConcurrentSessions) {
this( this(
/* enforceValidKeyResponses= */ true,
/* provisionsRequired= */ 0, /* provisionsRequired= */ 0,
/* throwNotProvisionedExceptionFromGetKeyRequest= */ false, /* throwNotProvisionedExceptionFromGetKeyRequest= */ false,
maxConcurrentSessions); maxConcurrentSessions);
} }
private FakeExoMediaDrm( private FakeExoMediaDrm(
boolean enforceValidKeyResponses,
int provisionsRequired, int provisionsRequired,
boolean throwNotProvisionedExceptionFromGetKeyRequest, boolean throwNotProvisionedExceptionFromGetKeyRequest,
int maxConcurrentSessions) { int maxConcurrentSessions) {
this.enforceValidKeyResponses = enforceValidKeyResponses;
this.provisionsRequired = provisionsRequired; this.provisionsRequired = provisionsRequired;
this.maxConcurrentSessions = maxConcurrentSessions; this.maxConcurrentSessions = maxConcurrentSessions;
this.throwNotProvisionedExceptionFromGetKeyRequest = this.throwNotProvisionedExceptionFromGetKeyRequest =
@ -265,13 +285,20 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
throws NotProvisionedException, DeniedByServerException { throws NotProvisionedException, DeniedByServerException {
Assertions.checkState(referenceCount > 0); Assertions.checkState(referenceCount > 0);
List<Byte> responseAsList = Bytes.asList(response); List<Byte> responseAsList = Bytes.asList(response);
if (responseAsList.equals(VALID_KEY_RESPONSE)) { if (responseAsList.equals(KEY_DENIED_RESPONSE)) {
sessionIdsWithValidKeys.add(Bytes.asList(scope));
} else if (responseAsList.equals(KEY_DENIED_RESPONSE)) {
throw new DeniedByServerException("Key request denied"); throw new DeniedByServerException("Key request denied");
} else if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) { }
if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) {
throw new NotProvisionedException("Provisioning required"); throw new NotProvisionedException("Provisioning required");
} }
if (enforceValidKeyResponses && !responseAsList.equals(VALID_KEY_RESPONSE)) {
throw new IllegalArgumentException(
"Unrecognised response. scope="
+ Util.toHexString(scope)
+ ", response="
+ Util.toHexString(response));
}
sessionIdsWithValidKeys.add(Bytes.asList(scope));
return Util.EMPTY_BYTE_ARRAY; return Util.EMPTY_BYTE_ARRAY;
} }