Add clearkey-based DRM playback emulator tests
These give some documentation-as-code for a clearkey integration with ExoPlayer. #exofixit PiperOrigin-RevId: 398017708
This commit is contained in:
parent
e0a9540cd3
commit
c927bc8358
@ -48,6 +48,7 @@ dependencies {
|
|||||||
androidTestImplementation(project(modulePrefix + 'testutils')) {
|
androidTestImplementation(project(modulePrefix + 'testutils')) {
|
||||||
exclude module: modulePrefix.substring(1) + 'library-core'
|
exclude module: modulePrefix.substring(1) + 'library-core'
|
||||||
}
|
}
|
||||||
|
androidTestImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion
|
||||||
testImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion
|
testImplementation 'com.squareup.okhttp3:mockwebserver:' + okhttpVersion
|
||||||
testImplementation 'org.robolectric:robolectric:' + robolectricVersion
|
testImplementation 'org.robolectric:robolectric:' + robolectricVersion
|
||||||
testImplementation project(modulePrefix + 'testutils')
|
testImplementation project(modulePrefix + 'testutils')
|
||||||
|
@ -19,11 +19,13 @@
|
|||||||
package="com.google.android.exoplayer2.core.test">
|
package="com.google.android.exoplayer2.core.test">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-sdk/>
|
<uses-sdk/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
tools:ignore="MissingApplicationIcon,HardcodedDebugMode">
|
tools:ignore="MissingApplicationIcon,HardcodedDebugMode"
|
||||||
|
android:usesCleartextTraffic="true">
|
||||||
<provider
|
<provider
|
||||||
android:authorities="com.google.android.exoplayer2.core.test"
|
android:authorities="com.google.android.exoplayer2.core.test"
|
||||||
android:name="com.google.android.exoplayer2.upstream.TestContentProvider"/>
|
android:name="com.google.android.exoplayer2.upstream.TestContentProvider"/>
|
||||||
|
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.google.android.exoplayer2.drm;
|
||||||
|
|
||||||
|
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
import com.google.android.exoplayer2.C;
|
||||||
|
import com.google.android.exoplayer2.ExoPlayer;
|
||||||
|
import com.google.android.exoplayer2.MediaItem;
|
||||||
|
import com.google.android.exoplayer2.PlaybackException;
|
||||||
|
import com.google.android.exoplayer2.Player;
|
||||||
|
import com.google.android.exoplayer2.SimpleExoPlayer;
|
||||||
|
import com.google.android.exoplayer2.util.ConditionVariable;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import okhttp3.mockwebserver.MockResponse;
|
||||||
|
import okhttp3.mockwebserver.MockWebServer;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
/** Instrumentation tests for DRM playback. */
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public final class DrmPlaybackTest {
|
||||||
|
|
||||||
|
/** The license response needed to play the {@code drm/sample_fragmented_clearkey.mp4} file. */
|
||||||
|
// NOTE: Changing this response *should* make the test fail, but it seems the clearkey CDM
|
||||||
|
// implementation is quite robust. This means an 'invalid' response means it just incorrectly
|
||||||
|
// decrypts the content, resulting in invalid data fed to the decoder and no video shown on the
|
||||||
|
// screen (but no error thrown that's detectable by this test).
|
||||||
|
private static final String CLEARKEY_RESPONSE =
|
||||||
|
"{\"keys\":"
|
||||||
|
+ "[{"
|
||||||
|
+ "\"kty\":\"oct\","
|
||||||
|
+ "\"k\":\"Y8tfcYTdS2iaXF_xHuajKA\","
|
||||||
|
+ "\"kid\":\"zX65_4jzTK6wYYWwACTkwg\""
|
||||||
|
+ "}],"
|
||||||
|
+ "\"type\":\"temporary\"}";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearkeyPlayback() throws Exception {
|
||||||
|
MockWebServer mockWebServer = new MockWebServer();
|
||||||
|
mockWebServer.enqueue(new MockResponse().setResponseCode(200).setBody(CLEARKEY_RESPONSE));
|
||||||
|
mockWebServer.start();
|
||||||
|
|
||||||
|
MediaItem mediaItem =
|
||||||
|
new MediaItem.Builder()
|
||||||
|
.setUri("asset:///media/drm/sample_fragmented_clearkey.mp4")
|
||||||
|
.setDrmConfiguration(
|
||||||
|
new MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID)
|
||||||
|
.setLicenseUri(mockWebServer.url("license").toString())
|
||||||
|
.build())
|
||||||
|
.build();
|
||||||
|
AtomicReference<SimpleExoPlayer> player = new AtomicReference<>();
|
||||||
|
ConditionVariable playbackComplete = new ConditionVariable();
|
||||||
|
AtomicReference<PlaybackException> playbackException = new AtomicReference<>();
|
||||||
|
getInstrumentation()
|
||||||
|
.runOnMainSync(
|
||||||
|
() -> {
|
||||||
|
player.set(new ExoPlayer.Builder(getInstrumentation().getContext()).build());
|
||||||
|
player
|
||||||
|
.get()
|
||||||
|
.addListener(
|
||||||
|
new Player.Listener() {
|
||||||
|
@Override
|
||||||
|
public void onPlaybackStateChanged(@Player.State int playbackState) {
|
||||||
|
if (playbackState == Player.STATE_ENDED) {
|
||||||
|
playbackComplete.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerError(PlaybackException error) {
|
||||||
|
playbackException.set(error);
|
||||||
|
playbackComplete.open();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
player.get().setMediaItem(mediaItem);
|
||||||
|
player.get().prepare();
|
||||||
|
player.get().play();
|
||||||
|
});
|
||||||
|
|
||||||
|
playbackComplete.block();
|
||||||
|
getInstrumentation().runOnMainSync(() -> player.get().release());
|
||||||
|
getInstrumentation().waitForIdleSync();
|
||||||
|
assertThat(playbackException.get()).isNull();
|
||||||
|
}
|
||||||
|
}
|
BIN
testdata/src/test/assets/media/drm/sample_fragmented_clearkey.mp4
vendored
Normal file
BIN
testdata/src/test/assets/media/drm/sample_fragmented_clearkey.mp4
vendored
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user