blob: adfbc60085a03e8fe059f224a8deafac9abdc8d3 [file] [log] [blame]
/*
* Copyright 2020 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;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.net.Uri;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.util.MimeTypes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Unit test for {@link MediaItem MediaItems}. */
@RunWith(AndroidJUnit4.class)
public class MediaItemTest {
private static final String URI_STRING = "http://www.google.com";
@Test
public void builder_needsSourceUriOrMediaId() {
assertThrows(NullPointerException.class, () -> new MediaItem.Builder().build());
}
@Test
public void builderWithUri_setsSourceUri() {
Uri uri = Uri.parse(URI_STRING);
MediaItem mediaItem = MediaItem.fromUri(uri);
assertThat(mediaItem.playbackProperties.sourceUri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.mediaId).isEqualTo(URI_STRING);
assertThat(mediaItem.mediaMetadata).isNotNull();
}
@Test
public void builderWithUriAsString_setsSourceUri() {
MediaItem mediaItem = MediaItem.fromUri(URI_STRING);
assertThat(mediaItem.playbackProperties.sourceUri.toString()).isEqualTo(URI_STRING);
assertThat(mediaItem.mediaId).isEqualTo(URI_STRING);
}
@Test
public void builderSetMimeType_isNullByDefault() {
MediaItem mediaItem = MediaItem.fromUri(URI_STRING);
assertThat(mediaItem.playbackProperties.mimeType).isNull();
}
@Test
public void builderSetMimeType_setsMimeType() {
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build();
assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD);
}
@Test
public void builderSetDrmConfig_isNullByDefault() {
// Null value by default.
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNull();
}
@Test
public void builderSetDrmConfig_setsAllProperties() {
Uri licenseUri = Uri.parse(URI_STRING);
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Referer", "http://www.google.com");
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmLicenseRequestHeaders(requestHeaders)
.setDrmMultiSession(/* multiSession= */ true)
.setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration).isNotNull();
assertThat(mediaItem.playbackProperties.drmConfiguration.uuid).isEqualTo(C.WIDEVINE_UUID);
assertThat(mediaItem.playbackProperties.drmConfiguration.licenseUri).isEqualTo(licenseUri);
assertThat(mediaItem.playbackProperties.drmConfiguration.requestHeaders)
.isEqualTo(requestHeaders);
assertThat(mediaItem.playbackProperties.drmConfiguration.multiSession).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.playClearContentWithoutKey).isTrue();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO);
}
@Test
public void builderSetDrmSessionForClearPeriods_setsAudioAndVideoTracks() {
Uri licenseUri = Uri.parse(URI_STRING);
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(licenseUri)
.setDrmSessionForClearTypes(Arrays.asList(C.TRACK_TYPE_AUDIO))
.setDrmSessionForClearPeriods(true)
.build();
assertThat(mediaItem.playbackProperties.drmConfiguration.sessionForClearTypes)
.containsExactly(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO);
}
@Test
public void builderSetDrmUuid_notCalled_throwsIllegalStateException() {
assertThrows(
IllegalStateException.class,
() ->
new MediaItem.Builder()
.setSourceUri(URI_STRING)
// missing uuid
.setDrmLicenseUri(Uri.parse(URI_STRING))
.build());
}
@Test
public void builderSetCustomCacheKey_setsCustomCacheKey() {
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setCustomCacheKey("key").build();
assertThat(mediaItem.playbackProperties.customCacheKey).isEqualTo("key");
}
@Test
public void builderSetStreamKeys_setsStreamKeys() {
List<StreamKey> streamKeys = new ArrayList<>();
streamKeys.add(new StreamKey(1, 0, 0));
streamKeys.add(new StreamKey(0, 1, 1));
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setStreamKeys(streamKeys).build();
assertThat(mediaItem.playbackProperties.streamKeys).isEqualTo(streamKeys);
}
@Test
public void builderSetSubtitles_setsSubtitles() {
List<MediaItem.Subtitle> subtitles =
Arrays.asList(
new MediaItem.Subtitle(
Uri.parse(URI_STRING + "/en"), MimeTypes.APPLICATION_TTML, /* language= */ "en"),
new MediaItem.Subtitle(
Uri.parse(URI_STRING + "/de"),
MimeTypes.APPLICATION_TTML,
/* language= */ null,
C.SELECTION_FLAG_DEFAULT));
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setSubtitles(subtitles).build();
assertThat(mediaItem.playbackProperties.subtitles).isEqualTo(subtitles);
}
@Test
public void builderSetTag_isNullByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
assertThat(mediaItem.playbackProperties.tag).isNull();
}
@Test
public void builderSetTag_setsTag() {
Object tag = new Object();
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).setTag(tag).build();
assertThat(mediaItem.playbackProperties.tag).isEqualTo(tag);
}
@Test
public void builderSetStartPositionMs_setsStartPositionMs() {
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setClipStartPositionMs(1000L).build();
assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(1000L);
}
@Test
public void builderSetStartPositionMs_zeroByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
assertThat(mediaItem.clippingProperties.startPositionMs).isEqualTo(0);
}
@Test
public void builderSetStartPositionMs_negativeValue_throws() {
MediaItem.Builder builder = new MediaItem.Builder();
assertThrows(IllegalArgumentException.class, () -> builder.setClipStartPositionMs(-1));
}
@Test
public void builderSetEndPositionMs_setsEndPositionMs() {
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setClipEndPositionMs(1000L).build();
assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(1000L);
}
@Test
public void builderSetEndPositionMs_timeEndOfSourceByDefault() {
MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_STRING).build();
assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE);
}
@Test
public void builderSetEndPositionMs_timeEndOfSource_setsEndPositionMs() {
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setClipEndPositionMs(1000)
.setClipEndPositionMs(C.TIME_END_OF_SOURCE)
.build();
assertThat(mediaItem.clippingProperties.endPositionMs).isEqualTo(C.TIME_END_OF_SOURCE);
}
@Test
public void builderSetEndPositionMs_negativeValue_throws() {
MediaItem.Builder builder = new MediaItem.Builder();
assertThrows(IllegalArgumentException.class, () -> builder.setClipEndPositionMs(-1));
}
@Test
public void builderSetClippingFlags_setsClippingFlags() {
MediaItem mediaItem =
new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setClipRelativeToDefaultPosition(true)
.setClipRelativeToLiveWindow(true)
.setClipStartsAtKeyFrame(true)
.build();
assertThat(mediaItem.clippingProperties.relativeToDefaultPosition).isTrue();
assertThat(mediaItem.clippingProperties.relativeToLiveWindow).isTrue();
assertThat(mediaItem.clippingProperties.startsAtKeyFrame).isTrue();
}
@Test
public void builderSetMediaMetadata_setsMetadata() {
MediaMetadata mediaMetadata = new MediaMetadata.Builder().setTitle("title").build();
MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setMediaMetadata(mediaMetadata).build();
assertThat(mediaItem.mediaMetadata).isEqualTo(mediaMetadata);
}
@Test
public void buildUpon_equalsToOriginal() {
MediaItem mediaItem =
new MediaItem.Builder()
.setClipEndPositionMs(1000)
.setClipRelativeToDefaultPosition(true)
.setClipRelativeToLiveWindow(true)
.setClipStartPositionMs(100)
.setClipStartsAtKeyFrame(true)
.setCustomCacheKey("key")
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmLicenseUri(URI_STRING + "/license")
.setDrmLicenseRequestHeaders(
Collections.singletonMap("Referer", "http://www.google.com"))
.setDrmMultiSession(true)
.setDrmPlayClearContentWithoutKey(true)
.setDrmSessionForClearTypes(Collections.singletonList(C.TRACK_TYPE_AUDIO))
.setMediaId("mediaId")
.setMediaMetadata(new MediaMetadata.Builder().setTitle("title").build())
.setMimeType(MimeTypes.APPLICATION_MP4)
.setSourceUri(URI_STRING)
.setStreamKeys(Collections.singletonList(new StreamKey(1, 0, 0)))
.setSubtitles(
Collections.singletonList(
new MediaItem.Subtitle(
Uri.parse(URI_STRING + "/en"),
MimeTypes.APPLICATION_TTML,
/* language= */ "en")))
.setTag(new Object())
.build();
MediaItem copy = mediaItem.buildUpon().build();
assertThat(copy).isEqualTo(mediaItem);
}
}