1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.google.android.exoplayer2.ext.cast; 17 18 import androidx.test.ext.junit.runners.AndroidJUnit4; 19 import com.google.android.exoplayer2.C; 20 import com.google.android.exoplayer2.testutil.TimelineAsserts; 21 import com.google.android.exoplayer2.util.MimeTypes; 22 import com.google.android.gms.cast.MediaInfo; 23 import com.google.android.gms.cast.MediaStatus; 24 import com.google.android.gms.cast.framework.media.MediaQueue; 25 import com.google.android.gms.cast.framework.media.RemoteMediaClient; 26 import java.util.Collections; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.mockito.Mockito; 30 31 /** Tests for {@link CastTimelineTracker}. */ 32 @RunWith(AndroidJUnit4.class) 33 public class CastTimelineTrackerTest { 34 35 private static final long DURATION_2_MS = 2000; 36 private static final long DURATION_3_MS = 3000; 37 private static final long DURATION_4_MS = 4000; 38 private static final long DURATION_5_MS = 5000; 39 40 /** Tests that duration of the current media info is correctly propagated to the timeline. */ 41 @Test getCastTimelinePersistsDuration()42 public void getCastTimelinePersistsDuration() { 43 CastTimelineTracker tracker = new CastTimelineTracker(); 44 45 RemoteMediaClient remoteMediaClient = 46 mockRemoteMediaClient( 47 /* itemIds= */ new int[] {1, 2, 3, 4, 5}, 48 /* currentItemId= */ 2, 49 /* currentDurationMs= */ DURATION_2_MS); 50 TimelineAsserts.assertPeriodDurations( 51 tracker.getCastTimeline(remoteMediaClient), 52 C.TIME_UNSET, 53 C.msToUs(DURATION_2_MS), 54 C.TIME_UNSET, 55 C.TIME_UNSET, 56 C.TIME_UNSET); 57 58 remoteMediaClient = 59 mockRemoteMediaClient( 60 /* itemIds= */ new int[] {1, 2, 3}, 61 /* currentItemId= */ 3, 62 /* currentDurationMs= */ DURATION_3_MS); 63 TimelineAsserts.assertPeriodDurations( 64 tracker.getCastTimeline(remoteMediaClient), 65 C.TIME_UNSET, 66 C.msToUs(DURATION_2_MS), 67 C.msToUs(DURATION_3_MS)); 68 69 remoteMediaClient = 70 mockRemoteMediaClient( 71 /* itemIds= */ new int[] {1, 3}, 72 /* currentItemId= */ 3, 73 /* currentDurationMs= */ DURATION_3_MS); 74 TimelineAsserts.assertPeriodDurations( 75 tracker.getCastTimeline(remoteMediaClient), C.TIME_UNSET, C.msToUs(DURATION_3_MS)); 76 77 remoteMediaClient = 78 mockRemoteMediaClient( 79 /* itemIds= */ new int[] {1, 2, 3, 4, 5}, 80 /* currentItemId= */ 4, 81 /* currentDurationMs= */ DURATION_4_MS); 82 TimelineAsserts.assertPeriodDurations( 83 tracker.getCastTimeline(remoteMediaClient), 84 C.TIME_UNSET, 85 C.TIME_UNSET, 86 C.msToUs(DURATION_3_MS), 87 C.msToUs(DURATION_4_MS), 88 C.TIME_UNSET); 89 90 remoteMediaClient = 91 mockRemoteMediaClient( 92 /* itemIds= */ new int[] {1, 2, 3, 4, 5}, 93 /* currentItemId= */ 5, 94 /* currentDurationMs= */ DURATION_5_MS); 95 TimelineAsserts.assertPeriodDurations( 96 tracker.getCastTimeline(remoteMediaClient), 97 C.TIME_UNSET, 98 C.TIME_UNSET, 99 C.msToUs(DURATION_3_MS), 100 C.msToUs(DURATION_4_MS), 101 C.msToUs(DURATION_5_MS)); 102 } 103 mockRemoteMediaClient( int[] itemIds, int currentItemId, long currentDurationMs)104 private static RemoteMediaClient mockRemoteMediaClient( 105 int[] itemIds, int currentItemId, long currentDurationMs) { 106 RemoteMediaClient remoteMediaClient = Mockito.mock(RemoteMediaClient.class); 107 MediaStatus status = Mockito.mock(MediaStatus.class); 108 Mockito.when(status.getQueueItems()).thenReturn(Collections.emptyList()); 109 Mockito.when(remoteMediaClient.getMediaStatus()).thenReturn(status); 110 Mockito.when(status.getMediaInfo()).thenReturn(getMediaInfo(currentDurationMs)); 111 Mockito.when(status.getCurrentItemId()).thenReturn(currentItemId); 112 MediaQueue mediaQueue = mockMediaQueue(itemIds); 113 Mockito.when(remoteMediaClient.getMediaQueue()).thenReturn(mediaQueue); 114 return remoteMediaClient; 115 } 116 mockMediaQueue(int[] itemIds)117 private static MediaQueue mockMediaQueue(int[] itemIds) { 118 MediaQueue mediaQueue = Mockito.mock(MediaQueue.class); 119 Mockito.when(mediaQueue.getItemIds()).thenReturn(itemIds); 120 return mediaQueue; 121 } 122 getMediaInfo(long durationMs)123 private static MediaInfo getMediaInfo(long durationMs) { 124 return new MediaInfo.Builder(/*contentId= */ "") 125 .setStreamDuration(durationMs) 126 .setContentType(MimeTypes.APPLICATION_MP4) 127 .setStreamType(MediaInfo.STREAM_TYPE_NONE) 128 .build(); 129 } 130 } 131