Test DefaultDrmSession provisioning is requested by provideKeyResponse

Follow-up to
<unknown commit>

PiperOrigin-RevId: 393132950
This commit is contained in:
ibaker 2021-08-26 16:45:03 +01:00 committed by bachinger
parent f574ec952a
commit 84cf63a72f
2 changed files with 57 additions and 3 deletions

View File

@ -665,6 +665,33 @@ public class DefaultDrmSessionManagerTest {
assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(2);
}
@Test
public void keyResponseIndicatesProvisioningRequired_provisioningDone() {
FakeExoMediaDrm.LicenseServer licenseServer =
FakeExoMediaDrm.LicenseServer.requiringProvisioningThenAllowingSchemeDatas(
DRM_SCHEME_DATAS);
DefaultDrmSessionManager drmSessionManager =
new DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(
DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm.Builder().build())
.build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare();
DrmSession drmSession =
checkNotNull(
drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()),
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED);
waitForOpenedWithKeys(drmSession);
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS);
assertThat(drmSession.queryKeyStatus())
.containsExactly(FakeExoMediaDrm.KEY_STATUS_KEY, FakeExoMediaDrm.KEY_STATUS_AVAILABLE);
assertThat(licenseServer.getReceivedProvisionRequests()).hasSize(1);
}
@Test
public void provisioningUndoneWhileManagerIsActive_deviceReprovisioned() {
FakeExoMediaDrm.LicenseServer licenseServer =

View File

@ -138,6 +138,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
private static final ImmutableList<Byte> VALID_KEY_RESPONSE = TestUtil.createByteList(1, 2, 3);
private static final ImmutableList<Byte> KEY_DENIED_RESPONSE = TestUtil.createByteList(9, 8, 7);
private static final ImmutableList<Byte> PROVISIONING_REQUIRED_RESPONSE =
TestUtil.createByteList(4, 5, 6);
private final int provisionsRequired;
private final int maxConcurrentSessions;
@ -258,7 +260,6 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
return new KeyRequest(requestData.toByteArray(), /* licenseServerUrl= */ "", requestType);
}
@Nullable
@Override
public byte[] provideKeyResponse(byte[] scope, byte[] response)
throws NotProvisionedException, DeniedByServerException {
@ -268,6 +269,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
sessionIdsWithValidKeys.add(Bytes.asList(scope));
} else if (responseAsList.equals(KEY_DENIED_RESPONSE)) {
throw new DeniedByServerException("Key request denied");
} else if (responseAsList.equals(PROVISIONING_REQUIRED_RESPONSE)) {
throw new NotProvisionedException("Provisioning required");
}
return Util.EMPTY_BYTE_ARRAY;
}
@ -417,6 +420,8 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
private final List<ImmutableList<Byte>> receivedProvisionRequests;
private final List<ImmutableList<DrmInitData.SchemeData>> receivedSchemeDatas;
private boolean nextResponseIndicatesProvisioningRequired;
@SafeVarargs
public static LicenseServer allowingSchemeDatas(List<DrmInitData.SchemeData>... schemeDatas) {
ImmutableSet.Builder<ImmutableList<DrmInitData.SchemeData>> schemeDatasBuilder =
@ -427,6 +432,19 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
return new LicenseServer(schemeDatasBuilder.build());
}
@SafeVarargs
public static LicenseServer requiringProvisioningThenAllowingSchemeDatas(
List<DrmInitData.SchemeData>... schemeDatas) {
ImmutableSet.Builder<ImmutableList<DrmInitData.SchemeData>> schemeDatasBuilder =
ImmutableSet.builder();
for (List<DrmInitData.SchemeData> schemeData : schemeDatas) {
schemeDatasBuilder.add(ImmutableList.copyOf(schemeData));
}
LicenseServer licenseServer = new LicenseServer(schemeDatasBuilder.build());
licenseServer.nextResponseIndicatesProvisioningRequired = true;
return licenseServer;
}
private LicenseServer(ImmutableSet<ImmutableList<DrmInitData.SchemeData>> allowedSchemeDatas) {
this.allowedSchemeDatas = allowedSchemeDatas;
@ -459,8 +477,17 @@ public final class FakeExoMediaDrm implements ExoMediaDrm {
ImmutableList<DrmInitData.SchemeData> schemeDatas =
KeyRequestData.fromByteArray(request.getData()).schemeDatas;
receivedSchemeDatas.add(schemeDatas);
return Bytes.toArray(
allowedSchemeDatas.contains(schemeDatas) ? VALID_KEY_RESPONSE : KEY_DENIED_RESPONSE);
ImmutableList<Byte> response;
if (nextResponseIndicatesProvisioningRequired) {
nextResponseIndicatesProvisioningRequired = false;
response = PROVISIONING_REQUIRED_RESPONSE;
} else if (allowedSchemeDatas.contains(schemeDatas)) {
response = VALID_KEY_RESPONSE;
} else {
response = KEY_DENIED_RESPONSE;
}
return Bytes.toArray(response);
}
}