Commit 9c2b4b86 by ibaker Committed by bachinger

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
parent 84cf63a7
......@@ -173,7 +173,9 @@ public final class AnalyticsCollectorTest {
private final DrmSessionManager drmSessionManager =
new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm())
.setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID,
uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build())
.setMultiSession(true)
.build(new EmptyDrmCallback());
......@@ -1452,7 +1454,9 @@ public final class AnalyticsCollectorTest {
BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.returnsEmpty();
DrmSessionManager blockingDrmSessionManager =
new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm())
.setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID,
uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build())
.setMultiSession(true)
.build(mediaDrmCallback);
MediaSource mediaSource =
......@@ -1518,7 +1522,9 @@ public final class AnalyticsCollectorTest {
BlockingDrmCallback mediaDrmCallback = BlockingDrmCallback.alwaysFailing();
DrmSessionManager failingDrmSessionManager =
new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm())
.setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID,
uuid -> new FakeExoMediaDrm.Builder().setEnforceValidKeyResponses(false).build())
.setMultiSession(true)
.build(mediaDrmCallback);
MediaSource mediaSource =
......
......@@ -65,17 +65,30 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
/** Builder for {@link FakeExoMediaDrm} instances. */
public static class Builder {
private boolean enforceValidKeyResponses;
private int provisionsRequired;
private boolean throwNotProvisionedExceptionFromGetKeyRequest;
private int maxConcurrentSessions;
/** Constructs an instance. */
public Builder() {
enforceValidKeyResponses = true;
provisionsRequired = 0;
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}
* to be provisioned.
*
......@@ -120,7 +133,10 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
*/
public FakeExoMediaDrm build() {
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 =
TestUtil.createByteList(4, 5, 6);
private final boolean enforceValidKeyResponses;
private final int provisionsRequired;
private final int maxConcurrentSessions;
private final boolean throwNotProvisionedExceptionFromGetKeyRequest;
......@@ -164,15 +181,18 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
@Deprecated
public FakeExoMediaDrm(int maxConcurrentSessions) {
this(
/* enforceValidKeyResponses= */ true,
/* provisionsRequired= */ 0,
/* throwNotProvisionedExceptionFromGetKeyRequest= */ false,
maxConcurrentSessions);
}
private FakeExoMediaDrm(
boolean enforceValidKeyResponses,
int provisionsRequired,
boolean throwNotProvisionedExceptionFromGetKeyRequest,
int maxConcurrentSessions) {
this.enforceValidKeyResponses = enforceValidKeyResponses;
this.provisionsRequired = provisionsRequired;
this.maxConcurrentSessions = maxConcurrentSessions;
this.throwNotProvisionedExceptionFromGetKeyRequest =
......@@ -265,13 +285,20 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
throws NotProvisionedException, DeniedByServerException {
Assertions.checkState(referenceCount > 0);
List<Byte> responseAsList = Bytes.asList(response);
if (responseAsList.equals(VALID_KEY_RESPONSE)) {
sessionIdsWithValidKeys.add(Bytes.asList(scope));
} else if (responseAsList.equals(KEY_DENIED_RESPONSE)) {
if (responseAsList.equals(KEY_DENIED_RESPONSE)) {
throw new DeniedByServerException("Key request denied");
} else if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) {
}
if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) {
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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment