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