1 /*
2  * Copyright 2019 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 
17 package com.android.settingslib.media;
18 
19 import static android.media.MediaRoute2Info.TYPE_BLUETOOTH_A2DP;
20 import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER;
21 import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
22 import static android.media.MediaRoute2Info.TYPE_USB_DEVICE;
23 import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
24 import static android.media.MediaRoute2ProviderService.REASON_NETWORK_ERROR;
25 import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
26 
27 import static com.google.common.truth.Truth.assertThat;
28 
29 import static org.mockito.ArgumentMatchers.any;
30 import static org.mockito.ArgumentMatchers.anyString;
31 import static org.mockito.Mockito.doReturn;
32 import static org.mockito.Mockito.mock;
33 import static org.mockito.Mockito.spy;
34 import static org.mockito.Mockito.verify;
35 import static org.mockito.Mockito.when;
36 
37 import android.bluetooth.BluetoothDevice;
38 import android.content.Context;
39 import android.media.MediaRoute2Info;
40 import android.media.MediaRouter2Manager;
41 import android.media.RoutingSessionInfo;
42 import android.media.session.MediaSessionManager;
43 
44 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
45 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
46 import com.android.settingslib.bluetooth.LocalBluetoothManager;
47 import com.android.settingslib.testutils.shadow.ShadowRouter2Manager;
48 
49 import org.junit.Before;
50 import org.junit.Test;
51 import org.junit.runner.RunWith;
52 import org.mockito.Mock;
53 import org.mockito.MockitoAnnotations;
54 import org.robolectric.RobolectricTestRunner;
55 import org.robolectric.RuntimeEnvironment;
56 import org.robolectric.annotation.Config;
57 
58 import java.util.ArrayList;
59 import java.util.List;
60 
61 @RunWith(RobolectricTestRunner.class)
62 @Config(shadows = {ShadowRouter2Manager.class})
63 public class InfoMediaManagerTest {
64 
65     private static final String TEST_PACKAGE_NAME = "com.test.packagename";
66     private static final String TEST_ID = "test_id";
67     private static final String TEST_NAME = "test_name";
68 
69     @Mock
70     private MediaRouter2Manager mRouterManager;
71     @Mock
72     private LocalBluetoothManager mLocalBluetoothManager;
73     @Mock
74     private MediaManager.MediaDeviceCallback mCallback;
75     @Mock
76     private MediaSessionManager mMediaSessionManager;
77 
78     private InfoMediaManager mInfoMediaManager;
79     private Context mContext;
80     private ShadowRouter2Manager mShadowRouter2Manager;
81 
82     @Before
setUp()83     public void setUp() {
84         MockitoAnnotations.initMocks(this);
85         mContext = spy(RuntimeEnvironment.application);
86 
87         doReturn(mMediaSessionManager).when(mContext).getSystemService(
88                 Context.MEDIA_SESSION_SERVICE);
89         mInfoMediaManager =
90                 new InfoMediaManager(mContext, TEST_PACKAGE_NAME, null, mLocalBluetoothManager);
91         mShadowRouter2Manager = ShadowRouter2Manager.getShadow();
92         mInfoMediaManager.mRouterManager = MediaRouter2Manager.getInstance(mContext);
93     }
94 
95     @Test
onRouteAdded_getAvailableRoutes_shouldAddMediaDevice()96     public void onRouteAdded_getAvailableRoutes_shouldAddMediaDevice() {
97         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
98         final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
99         routingSessionInfos.add(sessionInfo);
100         final List<String> selectedRoutes = new ArrayList<>();
101         selectedRoutes.add(TEST_ID);
102         when(sessionInfo.getSelectedRoutes()).thenReturn(selectedRoutes);
103         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
104 
105         final MediaRoute2Info info = mock(MediaRoute2Info.class);
106         when(info.getId()).thenReturn(TEST_ID);
107         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
108 
109         final List<MediaRoute2Info> routes = new ArrayList<>();
110         routes.add(info);
111         mShadowRouter2Manager.setAvailableRoutes(routes);
112 
113         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
114         assertThat(mediaDevice).isNull();
115 
116         mInfoMediaManager.mMediaRouterCallback.onRoutesAdded(routes);
117 
118         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
119         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
120         assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
121         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
122     }
123 
124     @Test
onRouteAdded_buildAllRoutes_shouldAddMediaDevice()125     public void onRouteAdded_buildAllRoutes_shouldAddMediaDevice() {
126         final MediaRoute2Info info = mock(MediaRoute2Info.class);
127         when(info.getId()).thenReturn(TEST_ID);
128         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
129         when(info.isSystemRoute()).thenReturn(true);
130 
131         final List<MediaRoute2Info> routes = new ArrayList<>();
132         routes.add(info);
133         mShadowRouter2Manager.setAllRoutes(routes);
134 
135         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
136         assertThat(mediaDevice).isNull();
137 
138         mInfoMediaManager.mPackageName = "";
139         mInfoMediaManager.mMediaRouterCallback.onRoutesAdded(routes);
140 
141         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
142         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
143         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
144     }
145 
146     @Test
onPreferredFeaturesChanged_samePackageName_shouldAddMediaDevice()147     public void onPreferredFeaturesChanged_samePackageName_shouldAddMediaDevice() {
148         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
149         final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
150         routingSessionInfos.add(sessionInfo);
151         final List<String> selectedRoutes = new ArrayList<>();
152         selectedRoutes.add(TEST_ID);
153         when(sessionInfo.getSelectedRoutes()).thenReturn(selectedRoutes);
154         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
155 
156         final MediaRoute2Info info = mock(MediaRoute2Info.class);
157         when(info.getId()).thenReturn(TEST_ID);
158         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
159 
160         final List<MediaRoute2Info> routes = new ArrayList<>();
161         routes.add(info);
162         mShadowRouter2Manager.setAvailableRoutes(routes);
163 
164         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
165         assertThat(mediaDevice).isNull();
166 
167         mInfoMediaManager.mMediaRouterCallback.onPreferredFeaturesChanged(TEST_PACKAGE_NAME, null);
168 
169         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
170         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
171         assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
172         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
173     }
174 
175     @Test
onPreferredFeaturesChanged_differentPackageName_doNothing()176     public void onPreferredFeaturesChanged_differentPackageName_doNothing() {
177         mInfoMediaManager.mMediaRouterCallback.onPreferredFeaturesChanged("com.fake.play", null);
178 
179         assertThat(mInfoMediaManager.mMediaDevices).hasSize(0);
180     }
181 
182     @Test
onRoutesChanged_getAvailableRoutes_shouldAddMediaDevice()183     public void onRoutesChanged_getAvailableRoutes_shouldAddMediaDevice() {
184         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
185         final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
186         routingSessionInfos.add(sessionInfo);
187         final List<String> selectedRoutes = new ArrayList<>();
188         selectedRoutes.add(TEST_ID);
189         when(sessionInfo.getSelectedRoutes()).thenReturn(selectedRoutes);
190         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
191 
192         final MediaRoute2Info info = mock(MediaRoute2Info.class);
193         when(info.getId()).thenReturn(TEST_ID);
194         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
195 
196         final List<MediaRoute2Info> routes = new ArrayList<>();
197         routes.add(info);
198         mShadowRouter2Manager.setAvailableRoutes(routes);
199 
200         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
201         assertThat(mediaDevice).isNull();
202 
203         mInfoMediaManager.mMediaRouterCallback.onRoutesChanged(routes);
204 
205         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
206         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
207         assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
208         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
209     }
210 
211     @Test
onRoutesChanged_buildAllRoutes_shouldAddMediaDevice()212     public void onRoutesChanged_buildAllRoutes_shouldAddMediaDevice() {
213         final MediaRoute2Info info = mock(MediaRoute2Info.class);
214         when(info.getId()).thenReturn(TEST_ID);
215         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
216         when(info.isSystemRoute()).thenReturn(true);
217 
218         final List<MediaRoute2Info> routes = new ArrayList<>();
219         routes.add(info);
220         mShadowRouter2Manager.setAllRoutes(routes);
221 
222         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
223         assertThat(mediaDevice).isNull();
224 
225         mInfoMediaManager.mPackageName = "";
226         mInfoMediaManager.mMediaRouterCallback.onRoutesChanged(routes);
227 
228         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
229         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
230         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
231     }
232 
233     @Test
connectDeviceWithoutPackageName_noSession_returnFalse()234     public void connectDeviceWithoutPackageName_noSession_returnFalse() {
235         final MediaRoute2Info info = mock(MediaRoute2Info.class);
236         final MediaDevice device = new InfoMediaDevice(mContext, mInfoMediaManager.mRouterManager,
237                 info, TEST_PACKAGE_NAME);
238 
239         final List<RoutingSessionInfo> infos = new ArrayList<>();
240 
241         mShadowRouter2Manager.setActiveSessions(infos);
242 
243         assertThat(mInfoMediaManager.connectDeviceWithoutPackageName(device)).isFalse();
244     }
245 
246     @Test
onRoutesRemoved_getAvailableRoutes_shouldAddMediaDevice()247     public void onRoutesRemoved_getAvailableRoutes_shouldAddMediaDevice() {
248         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
249         final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
250         routingSessionInfos.add(sessionInfo);
251         final List<String> selectedRoutes = new ArrayList<>();
252         selectedRoutes.add(TEST_ID);
253         when(sessionInfo.getSelectedRoutes()).thenReturn(selectedRoutes);
254         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
255 
256         final MediaRoute2Info info = mock(MediaRoute2Info.class);
257         when(info.getId()).thenReturn(TEST_ID);
258         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
259 
260         final List<MediaRoute2Info> routes = new ArrayList<>();
261         routes.add(info);
262         when(mRouterManager.getAvailableRoutes(TEST_PACKAGE_NAME)).thenReturn(routes);
263 
264         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
265         assertThat(mediaDevice).isNull();
266 
267         mInfoMediaManager.mMediaRouterCallback.onRoutesRemoved(routes);
268 
269         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
270         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
271         assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
272         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
273     }
274 
275     @Test
onRoutesRemoved_buildAllRoutes_shouldAddMediaDevice()276     public void onRoutesRemoved_buildAllRoutes_shouldAddMediaDevice() {
277         final MediaRoute2Info info = mock(MediaRoute2Info.class);
278         when(info.getId()).thenReturn(TEST_ID);
279         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
280         when(info.isSystemRoute()).thenReturn(true);
281 
282         final List<MediaRoute2Info> routes = new ArrayList<>();
283         routes.add(info);
284         when(mRouterManager.getAllRoutes()).thenReturn(routes);
285 
286         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
287         assertThat(mediaDevice).isNull();
288 
289         mInfoMediaManager.mPackageName = "";
290         mInfoMediaManager.mMediaRouterCallback.onRoutesRemoved(routes);
291 
292         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
293         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
294         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
295     }
296 
297     @Test
addDeviceToPlayMedia_packageNameIsNull_returnFalse()298     public void addDeviceToPlayMedia_packageNameIsNull_returnFalse() {
299         mInfoMediaManager.mPackageName = null;
300         final MediaDevice device = mock(MediaDevice.class);
301 
302         assertThat(mInfoMediaManager.addDeviceToPlayMedia(device)).isFalse();
303     }
304 
305     @Test
addDeviceToPlayMedia_containSelectableRoutes_returnTrue()306     public void addDeviceToPlayMedia_containSelectableRoutes_returnTrue() {
307         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
308         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
309         routingSessionInfos.add(info);
310 
311         final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
312         final MediaDevice device =
313                 new InfoMediaDevice(mContext, mInfoMediaManager.mRouterManager, route2Info,
314                         TEST_PACKAGE_NAME);
315 
316         final List<String> list = new ArrayList<>();
317         list.add(TEST_ID);
318 
319         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
320         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
321         when(info.getSelectableRoutes()).thenReturn(list);
322         when(route2Info.getId()).thenReturn(TEST_ID);
323         when(route2Info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
324 
325         assertThat(mInfoMediaManager.addDeviceToPlayMedia(device)).isTrue();
326     }
327 
328     @Test
addDeviceToPlayMedia_notContainSelectableRoutes_returnFalse()329     public void addDeviceToPlayMedia_notContainSelectableRoutes_returnFalse() {
330         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
331         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
332         routingSessionInfos.add(info);
333 
334         final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
335         final MediaDevice device =
336                 new InfoMediaDevice(mContext, mInfoMediaManager.mRouterManager, route2Info,
337                         TEST_PACKAGE_NAME);
338 
339         final List<String> list = new ArrayList<>();
340         list.add("fake_id");
341 
342         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
343         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
344         when(info.getSelectableRoutes()).thenReturn(list);
345         when(route2Info.getId()).thenReturn(TEST_ID);
346         when(route2Info.getName()).thenReturn(TEST_NAME);
347         when(route2Info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
348 
349         assertThat(mInfoMediaManager.addDeviceToPlayMedia(device)).isFalse();
350     }
351 
352     @Test
removeDeviceFromMedia_packageNameIsNull_returnFalse()353     public void removeDeviceFromMedia_packageNameIsNull_returnFalse() {
354         mInfoMediaManager.mPackageName = null;
355         final MediaDevice device = mock(MediaDevice.class);
356 
357         assertThat(mInfoMediaManager.removeDeviceFromPlayMedia(device)).isFalse();
358     }
359 
360     @Test
removeDeviceFromMedia_containSelectedRoutes_returnTrue()361     public void removeDeviceFromMedia_containSelectedRoutes_returnTrue() {
362         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
363         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
364         routingSessionInfos.add(info);
365 
366         final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
367         final MediaDevice device =
368                 new InfoMediaDevice(mContext, mInfoMediaManager.mRouterManager, route2Info,
369                         TEST_PACKAGE_NAME);
370 
371         final List<String> list = new ArrayList<>();
372         list.add(TEST_ID);
373 
374         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
375         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
376         when(info.getSelectedRoutes()).thenReturn(list);
377         when(route2Info.getId()).thenReturn(TEST_ID);
378         when(route2Info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
379 
380         assertThat(mInfoMediaManager.removeDeviceFromPlayMedia(device)).isTrue();
381     }
382 
383     @Test
removeDeviceFromMedia_notContainSelectedRoutes_returnFalse()384     public void removeDeviceFromMedia_notContainSelectedRoutes_returnFalse() {
385         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
386         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
387         routingSessionInfos.add(info);
388 
389         final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
390         final MediaDevice device =
391                 new InfoMediaDevice(mContext, mInfoMediaManager.mRouterManager, route2Info,
392                         TEST_PACKAGE_NAME);
393 
394         final List<String> list = new ArrayList<>();
395         list.add("fake_id");
396 
397         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
398         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
399         when(info.getSelectedRoutes()).thenReturn(list);
400         when(route2Info.getId()).thenReturn(TEST_ID);
401         when(route2Info.getName()).thenReturn(TEST_NAME);
402         when(route2Info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
403 
404         assertThat(mInfoMediaManager.removeDeviceFromPlayMedia(device)).isFalse();
405     }
406 
407     @Test
getSelectableMediaDevice_packageNameIsNull_returnFalse()408     public void getSelectableMediaDevice_packageNameIsNull_returnFalse() {
409         mInfoMediaManager.mPackageName = null;
410 
411         assertThat(mInfoMediaManager.getSelectableMediaDevice()).isEmpty();
412     }
413 
414     @Test
getSelectableMediaDevice_notContainPackageName_returnEmpty()415     public void getSelectableMediaDevice_notContainPackageName_returnEmpty() {
416         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
417         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
418         routingSessionInfos.add(info);
419 
420         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
421         when(info.getClientPackageName()).thenReturn("com.fake.packagename");
422 
423         assertThat(mInfoMediaManager.getSelectableMediaDevice()).isEmpty();
424     }
425 
426     @Test
getDeselectableMediaDevice_packageNameIsNull_returnFalse()427     public void getDeselectableMediaDevice_packageNameIsNull_returnFalse() {
428         mInfoMediaManager.mPackageName = null;
429 
430         assertThat(mInfoMediaManager.getDeselectableMediaDevice()).isEmpty();
431     }
432 
433     @Test
getDeselectableMediaDevice_checkList()434     public void getDeselectableMediaDevice_checkList() {
435         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
436         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
437         routingSessionInfos.add(info);
438         final List<MediaRoute2Info> mediaRoute2Infos = new ArrayList<>();
439         final MediaRoute2Info mediaRoute2Info = mock(MediaRoute2Info.class);
440         mediaRoute2Infos.add(mediaRoute2Info);
441         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
442         mShadowRouter2Manager.setDeselectableRoutes(mediaRoute2Infos);
443         when(mediaRoute2Info.getName()).thenReturn(TEST_NAME);
444 
445         final List<MediaDevice> mediaDevices = mInfoMediaManager.getDeselectableMediaDevice();
446 
447         assertThat(mediaDevices.size()).isEqualTo(1);
448         assertThat(mediaDevices.get(0).getName()).isEqualTo(TEST_NAME);
449     }
450 
451     @Test
adjustSessionVolume_routingSessionInfoIsNull_noCrash()452     public void adjustSessionVolume_routingSessionInfoIsNull_noCrash() {
453         mInfoMediaManager.adjustSessionVolume(null, 10);
454     }
455 
456     @Test
adjustSessionVolume_packageNameIsNull_noCrash()457     public void adjustSessionVolume_packageNameIsNull_noCrash() {
458         mInfoMediaManager.mPackageName = null;
459 
460         mInfoMediaManager.adjustSessionVolume(10);
461     }
462 
463     @Test
getSessionVolumeMax_packageNameIsNull_returnNotFound()464     public void getSessionVolumeMax_packageNameIsNull_returnNotFound() {
465         mInfoMediaManager.mPackageName = null;
466 
467         assertThat(mInfoMediaManager.getSessionVolumeMax()).isEqualTo(-1);
468     }
469 
470     @Test
getSessionVolumeMax_containPackageName_returnMaxVolume()471     public void getSessionVolumeMax_containPackageName_returnMaxVolume() {
472         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
473         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
474         routingSessionInfos.add(info);
475 
476         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
477         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
478 
479         mInfoMediaManager.getSessionVolumeMax();
480 
481         verify(info).getVolumeMax();
482     }
483 
484     @Test
getSessionVolumeMax_routeSessionInfoIsNull_returnNotFound()485     public void getSessionVolumeMax_routeSessionInfoIsNull_returnNotFound() {
486         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
487         final RoutingSessionInfo info = null;
488         routingSessionInfos.add(info);
489 
490         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
491 
492         assertThat(mInfoMediaManager.getSessionVolumeMax()).isEqualTo(-1);
493     }
494 
495     @Test
getSessionVolume_packageNameIsNull_returnNotFound()496     public void getSessionVolume_packageNameIsNull_returnNotFound() {
497         mInfoMediaManager.mPackageName = null;
498 
499         assertThat(mInfoMediaManager.getSessionVolume()).isEqualTo(-1);
500     }
501 
502     @Test
getSessionVolume_containPackageName_returnMaxVolume()503     public void getSessionVolume_containPackageName_returnMaxVolume() {
504         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
505         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
506         routingSessionInfos.add(info);
507 
508         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
509         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
510 
511         mInfoMediaManager.getSessionVolume();
512 
513         verify(info).getVolume();
514     }
515 
516     @Test
getSessionVolume_routeSessionInfoIsNull_returnNotFound()517     public void getSessionVolume_routeSessionInfoIsNull_returnNotFound() {
518         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
519         final RoutingSessionInfo info = null;
520         routingSessionInfos.add(info);
521 
522         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
523 
524         assertThat(mInfoMediaManager.getSessionVolume()).isEqualTo(-1);
525     }
526 
527     @Test
getActiveMediaSession_returnActiveSession()528     public void getActiveMediaSession_returnActiveSession() {
529         final List<RoutingSessionInfo> infos = new ArrayList<>();
530         mShadowRouter2Manager.setActiveSessions(infos);
531 
532         assertThat(mInfoMediaManager.getActiveMediaSession()).containsExactlyElementsIn(infos);
533     }
534 
535     @Test
releaseSession_packageNameIsNull_returnFalse()536     public void releaseSession_packageNameIsNull_returnFalse() {
537         mInfoMediaManager.mPackageName = null;
538 
539         assertThat(mInfoMediaManager.releaseSession()).isFalse();
540     }
541 
542     @Test
releaseSession_removeSuccessfully_returnTrue()543     public void releaseSession_removeSuccessfully_returnTrue() {
544         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
545         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
546         routingSessionInfos.add(info);
547 
548         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
549         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
550 
551         assertThat(mInfoMediaManager.releaseSession()).isTrue();
552     }
553 
554     @Test
getSessionName_packageNameIsNull_returnNull()555     public void getSessionName_packageNameIsNull_returnNull() {
556         mInfoMediaManager.mPackageName = null;
557 
558         assertThat(mInfoMediaManager.getSessionName()).isNull();
559     }
560 
561     @Test
getSessionName_routeSessionInfoIsNull_returnNull()562     public void getSessionName_routeSessionInfoIsNull_returnNull() {
563         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
564         final RoutingSessionInfo info = null;
565         routingSessionInfos.add(info);
566 
567         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
568 
569         assertThat(mInfoMediaManager.getSessionName()).isNull();
570     }
571 
572     @Test
getSessionName_containPackageName_returnName()573     public void getSessionName_containPackageName_returnName() {
574         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
575         final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
576         routingSessionInfos.add(info);
577 
578         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
579         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
580         when(info.getName()).thenReturn(TEST_NAME);
581 
582         assertThat(mInfoMediaManager.getSessionName()).isEqualTo(TEST_NAME);
583     }
584 
585     @Test
onTransferFailed_shouldDispatchOnRequestFailed()586     public void onTransferFailed_shouldDispatchOnRequestFailed() {
587         mInfoMediaManager.registerCallback(mCallback);
588 
589         mInfoMediaManager.mMediaRouterCallback.onTransferFailed(null, null);
590 
591         verify(mCallback).onRequestFailed(REASON_UNKNOWN_ERROR);
592     }
593 
594     @Test
onRequestFailed_shouldDispatchOnRequestFailed()595     public void onRequestFailed_shouldDispatchOnRequestFailed() {
596         mInfoMediaManager.registerCallback(mCallback);
597 
598         mInfoMediaManager.mMediaRouterCallback.onRequestFailed(REASON_NETWORK_ERROR);
599 
600         verify(mCallback).onRequestFailed(REASON_NETWORK_ERROR);
601     }
602 
603     @Test
onTransferred_getAvailableRoutes_shouldAddMediaDevice()604     public void onTransferred_getAvailableRoutes_shouldAddMediaDevice() {
605         final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
606         final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
607         routingSessionInfos.add(sessionInfo);
608         final List<String> selectedRoutes = new ArrayList<>();
609         selectedRoutes.add(TEST_ID);
610         when(sessionInfo.getSelectedRoutes()).thenReturn(selectedRoutes);
611         mShadowRouter2Manager.setRoutingSessions(routingSessionInfos);
612 
613         final MediaRoute2Info info = mock(MediaRoute2Info.class);
614         mInfoMediaManager.registerCallback(mCallback);
615 
616         when(info.getId()).thenReturn(TEST_ID);
617         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
618 
619         final List<MediaRoute2Info> routes = new ArrayList<>();
620         routes.add(info);
621         mShadowRouter2Manager.setAvailableRoutes(routes);
622 
623         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
624         assertThat(mediaDevice).isNull();
625 
626         mInfoMediaManager.mMediaRouterCallback.onTransferred(sessionInfo, sessionInfo);
627 
628         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
629         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
630         assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
631         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
632         verify(mCallback).onConnectedDeviceChanged(TEST_ID);
633     }
634 
635     @Test
onTransferred_buildAllRoutes_shouldAddMediaDevice()636     public void onTransferred_buildAllRoutes_shouldAddMediaDevice() {
637         final MediaRoute2Info info = mock(MediaRoute2Info.class);
638         final RoutingSessionInfo sessionInfo = mock(RoutingSessionInfo.class);
639         mInfoMediaManager.registerCallback(mCallback);
640 
641         when(info.getId()).thenReturn(TEST_ID);
642         when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
643         when(info.isSystemRoute()).thenReturn(true);
644 
645         final List<MediaRoute2Info> routes = new ArrayList<>();
646         routes.add(info);
647         mShadowRouter2Manager.setAllRoutes(routes);
648 
649         final MediaDevice mediaDevice = mInfoMediaManager.findMediaDevice(TEST_ID);
650         assertThat(mediaDevice).isNull();
651 
652         mInfoMediaManager.mPackageName = "";
653         mInfoMediaManager.mMediaRouterCallback.onTransferred(sessionInfo, sessionInfo);
654 
655         final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
656         assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
657         assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
658         verify(mCallback).onConnectedDeviceChanged(null);
659     }
660 
661     @Test
onSessionUpdated_shouldDispatchDataChanged()662     public void onSessionUpdated_shouldDispatchDataChanged() {
663         mInfoMediaManager.registerCallback(mCallback);
664 
665         mInfoMediaManager.mMediaRouterCallback.onSessionUpdated(mock(RoutingSessionInfo.class));
666 
667         verify(mCallback).onDeviceAttributesChanged();
668     }
669 
670     @Test
addMediaDevice_verifyDeviceTypeCanCorrespondToMediaDevice()671     public void addMediaDevice_verifyDeviceTypeCanCorrespondToMediaDevice() {
672         final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
673         final CachedBluetoothDeviceManager cachedBluetoothDeviceManager =
674                 mock(CachedBluetoothDeviceManager.class);
675         final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
676 
677         when(route2Info.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
678         mInfoMediaManager.addMediaDevice(route2Info);
679         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof InfoMediaDevice).isTrue();
680 
681         when(route2Info.getType()).thenReturn(TYPE_USB_DEVICE);
682         mInfoMediaManager.mMediaDevices.clear();
683         mInfoMediaManager.addMediaDevice(route2Info);
684         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
685 
686         when(route2Info.getType()).thenReturn(TYPE_WIRED_HEADSET);
687         mInfoMediaManager.mMediaDevices.clear();
688         mInfoMediaManager.addMediaDevice(route2Info);
689         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
690 
691         when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
692         when(route2Info.getAddress()).thenReturn("00:00:00:00:00:00");
693         when(mLocalBluetoothManager.getCachedDeviceManager())
694                 .thenReturn(cachedBluetoothDeviceManager);
695         when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class)))
696                 .thenReturn(cachedDevice);
697         mInfoMediaManager.mMediaDevices.clear();
698         mInfoMediaManager.addMediaDevice(route2Info);
699         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof BluetoothMediaDevice).isTrue();
700 
701         when(route2Info.getType()).thenReturn(TYPE_BUILTIN_SPEAKER);
702         mInfoMediaManager.mMediaDevices.clear();
703         mInfoMediaManager.addMediaDevice(route2Info);
704         assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
705     }
706 
707     @Test
addMediaDevice_cachedBluetoothDeviceIsNull_shouldNotAdded()708     public void addMediaDevice_cachedBluetoothDeviceIsNull_shouldNotAdded() {
709         final MediaRoute2Info route2Info = mock(MediaRoute2Info.class);
710         final CachedBluetoothDeviceManager cachedBluetoothDeviceManager =
711                 mock(CachedBluetoothDeviceManager.class);
712 
713         when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
714         when(route2Info.getAddress()).thenReturn("00:00:00:00:00:00");
715         when(mLocalBluetoothManager.getCachedDeviceManager())
716                 .thenReturn(cachedBluetoothDeviceManager);
717         when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class)))
718                 .thenReturn(null);
719 
720         mInfoMediaManager.mMediaDevices.clear();
721         mInfoMediaManager.addMediaDevice(route2Info);
722 
723         assertThat(mInfoMediaManager.mMediaDevices.size()).isEqualTo(0);
724     }
725 
726     @Test
shouldDisableMediaOutput_infosSizeEqual1_returnsTrue()727     public void shouldDisableMediaOutput_infosSizeEqual1_returnsTrue() {
728         final MediaRoute2Info info = mock(MediaRoute2Info.class);
729         final List<MediaRoute2Info> infos = new ArrayList<>();
730         infos.add(info);
731         mShadowRouter2Manager.setAvailableRoutes(infos);
732 
733         when(mRouterManager.getAvailableRoutes(anyString())).thenReturn(infos);
734         when(info.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
735 
736         assertThat(mInfoMediaManager.shouldDisableMediaOutput("test")).isTrue();
737     }
738 
739     @Test
shouldDisableMediaOutput_infosSizeEqual1AndNotCastDevice_returnsFalse()740     public void shouldDisableMediaOutput_infosSizeEqual1AndNotCastDevice_returnsFalse() {
741         final MediaRoute2Info info = mock(MediaRoute2Info.class);
742         final List<MediaRoute2Info> infos = new ArrayList<>();
743         infos.add(info);
744         mShadowRouter2Manager.setAvailableRoutes(infos);
745 
746         when(mRouterManager.getAvailableRoutes(anyString())).thenReturn(infos);
747         when(info.getType()).thenReturn(TYPE_BUILTIN_SPEAKER);
748 
749         assertThat(mInfoMediaManager.shouldDisableMediaOutput("test")).isFalse();
750     }
751 
752 
753     @Test
shouldDisableMediaOutput_infosSizeOverThan1_returnsFalse()754     public void shouldDisableMediaOutput_infosSizeOverThan1_returnsFalse() {
755         final MediaRoute2Info info = mock(MediaRoute2Info.class);
756         final MediaRoute2Info info2 = mock(MediaRoute2Info.class);
757         final List<MediaRoute2Info> infos = new ArrayList<>();
758         infos.add(info);
759         infos.add(info2);
760         mShadowRouter2Manager.setAvailableRoutes(infos);
761 
762         when(mRouterManager.getAvailableRoutes(anyString())).thenReturn(infos);
763         when(info.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
764         when(info2.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
765 
766         assertThat(mInfoMediaManager.shouldDisableMediaOutput("test")).isFalse();
767     }
768 }
769