• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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