1 /* 2 * Copyright 2017 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.bluetooth.avrcp; 18 19 import static org.mockito.Mockito.*; 20 21 import android.media.MediaDescription; 22 import android.media.browse.MediaBrowser.MediaItem; 23 24 import androidx.test.filters.SmallTest; 25 import androidx.test.runner.AndroidJUnit4; 26 27 import org.junit.Assert; 28 import org.junit.Before; 29 import org.junit.Test; 30 import org.junit.runner.RunWith; 31 import org.mockito.ArgumentCaptor; 32 import org.mockito.Captor; 33 import org.mockito.Mock; 34 import org.mockito.MockitoAnnotations; 35 36 import java.util.ArrayList; 37 import java.util.List; 38 39 @SmallTest 40 @RunWith(AndroidJUnit4.class) 41 public class BrowserPlayerWrapperTest { 42 43 @Captor ArgumentCaptor<MediaBrowser.ConnectionCallback> mBrowserConnCb; 44 @Captor ArgumentCaptor<MediaBrowser.SubscriptionCallback> mSubscriptionCb; 45 @Captor ArgumentCaptor<List<ListItem>> mWrapperBrowseCb; 46 @Mock MediaBrowser mMockBrowser; 47 @Mock BrowsedPlayerWrapper.ConnectionCallback mConnCb; 48 @Mock BrowsedPlayerWrapper.BrowseCallback mBrowseCb; 49 50 @Before setUp()51 public void setUp() { 52 MockitoAnnotations.initMocks(this); 53 54 when(mMockBrowser.getRoot()).thenReturn("root_folder"); 55 56 MediaBrowserFactory.inject(mMockBrowser); 57 } 58 59 @Test testWrap()60 public void testWrap() { 61 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 62 wrapper.connect(mConnCb); 63 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 64 verify(mMockBrowser).connect(); 65 66 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 67 browserConnCb.onConnected(); 68 69 verify(mConnCb).run(eq(BrowsedPlayerWrapper.STATUS_SUCCESS), eq(wrapper)); 70 verify(mMockBrowser).disconnect(); 71 } 72 73 @Test testConnect()74 public void testConnect() { 75 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 76 wrapper.connect(mConnCb); 77 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 78 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 79 browserConnCb.onConnectionFailed(); 80 81 verify(mConnCb).run(eq(BrowsedPlayerWrapper.STATUS_CONN_ERROR), eq(wrapper)); 82 83 wrapper.connect(mConnCb); 84 verify(mMockBrowser, times(2)).connect(); 85 86 browserConnCb.onConnected(); 87 verify(mConnCb).run(eq(BrowsedPlayerWrapper.STATUS_SUCCESS), eq(wrapper)); 88 verify(mMockBrowser, times(2)).disconnect(); 89 } 90 91 @Test testEmptyRoot()92 public void testEmptyRoot() { 93 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 94 95 doReturn("").when(mMockBrowser).getRoot(); 96 97 wrapper.connect(mConnCb); 98 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 99 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 100 101 verify(mMockBrowser, times(1)).connect(); 102 103 browserConnCb.onConnected(); 104 verify(mConnCb).run(eq(BrowsedPlayerWrapper.STATUS_CONN_ERROR), eq(wrapper)); 105 verify(mMockBrowser, times(1)).disconnect(); 106 } 107 108 @Test testDisconnect()109 public void testDisconnect() { 110 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 111 wrapper.connect(mConnCb); 112 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 113 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 114 browserConnCb.onConnected(); 115 verify(mMockBrowser).disconnect(); 116 } 117 118 @Test testGetRootId()119 public void testGetRootId() { 120 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 121 wrapper.connect(mConnCb); 122 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 123 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 124 browserConnCb.onConnected(); 125 126 Assert.assertEquals("root_folder", wrapper.getRootId()); 127 verify(mMockBrowser).disconnect(); 128 } 129 130 @Test testPlayItem()131 public void testPlayItem() { 132 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 133 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 134 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 135 136 wrapper.playItem("test_item"); 137 verify(mMockBrowser, times(1)).connect(); 138 139 MediaController mockController = mock(MediaController.class); 140 MediaController.TransportControls mockTransport = 141 mock(MediaController.TransportControls.class); 142 when(mockController.getTransportControls()).thenReturn(mockTransport); 143 MediaControllerFactory.inject(mockController); 144 145 browserConnCb.onConnected(); 146 verify(mockTransport).playFromMediaId(eq("test_item"), eq(null)); 147 verify(mMockBrowser).disconnect(); 148 } 149 150 @Test testGetFolderItems()151 public void testGetFolderItems() { 152 BrowsedPlayerWrapper wrapper = BrowsedPlayerWrapper.wrap(null, "test", "test"); 153 verify(mMockBrowser).testInit(any(), any(), mBrowserConnCb.capture(), any()); 154 MediaBrowser.ConnectionCallback browserConnCb = mBrowserConnCb.getValue(); 155 156 wrapper.getFolderItems("test_folder", mBrowseCb); 157 158 159 browserConnCb.onConnected(); 160 verify(mMockBrowser).subscribe(any(), mSubscriptionCb.capture()); 161 MediaBrowser.SubscriptionCallback subscriptionCb = mSubscriptionCb.getValue(); 162 163 ArrayList<MediaItem> items = new ArrayList<MediaItem>(); 164 MediaDescription.Builder bob = new MediaDescription.Builder(); 165 bob.setTitle("test_song1"); 166 bob.setMediaId("ts1"); 167 items.add(new MediaItem(bob.build(), 0)); 168 bob.setTitle("test_song2"); 169 bob.setMediaId("ts2"); 170 items.add(new MediaItem(bob.build(), 0)); 171 172 subscriptionCb.onChildrenLoaded("test_folder", items); 173 verify(mMockBrowser).unsubscribe(eq("test_folder")); 174 verify(mBrowseCb).run(eq(BrowsedPlayerWrapper.STATUS_SUCCESS), eq("test_folder"), 175 mWrapperBrowseCb.capture()); 176 177 List<ListItem> item_list = mWrapperBrowseCb.getValue(); 178 for (int i = 0; i < item_list.size(); i++) { 179 Assert.assertFalse(item_list.get(i).isFolder); 180 Assert.assertEquals(item_list.get(i).song, Util.toMetadata(items.get(i))); 181 } 182 183 verify(mMockBrowser).disconnect(); 184 } 185 } 186