blob: 98bb74ad0718c332e864c0a3e17fb95a20a625f7 [file] [log] [blame]
hughchen61c1c9f2019-01-17 14:34:51 +08001/*
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
17package com.android.settingslib.media;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.ArgumentMatchers.any;
22import static org.mockito.ArgumentMatchers.eq;
23import static org.mockito.Mockito.mock;
24import static org.mockito.Mockito.never;
25import static org.mockito.Mockito.verify;
26import static org.mockito.Mockito.when;
27
28import android.content.Context;
29
30import com.android.settingslib.bluetooth.A2dpProfile;
hughchenc0c11632019-03-07 16:21:17 +080031import com.android.settingslib.bluetooth.CachedBluetoothDevice;
hughchen61c1c9f2019-01-17 14:34:51 +080032import com.android.settingslib.bluetooth.HearingAidProfile;
33import com.android.settingslib.bluetooth.LocalBluetoothManager;
34import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
35
36import org.junit.Before;
37import org.junit.Test;
38import org.junit.runner.RunWith;
39import org.mockito.Mock;
40import org.mockito.MockitoAnnotations;
41import org.robolectric.RobolectricTestRunner;
42import org.robolectric.RuntimeEnvironment;
43
44import java.util.ArrayList;
45import java.util.List;
46
47@RunWith(RobolectricTestRunner.class)
48public class LocalMediaManagerTest {
49
50 private static final String TEST_DEVICE_ID_1 = "device_id_1";
51 private static final String TEST_DEVICE_ID_2 = "device_id_2";
52 private static final String TEST_DEVICE_ID_3 = "device_id_3";
53 private static final String TEST_CURRENT_DEVICE_ID = "currentDevice_id";
54
55 @Mock
56 private BluetoothMediaManager mBluetoothMediaManager;
57 @Mock
58 private InfoMediaManager mInfoMediaManager;
59 @Mock
60 private LocalBluetoothManager mLocalBluetoothManager;
61 @Mock
62 private LocalMediaManager.DeviceCallback mCallback;
63 @Mock
64 private HearingAidProfile mHapProfile;
65 @Mock
66 private A2dpProfile mA2dpProfile;
67 @Mock
68 private LocalBluetoothProfileManager mLocalProfileManager;
69
70 private Context mContext;
71 private LocalMediaManager mLocalMediaManager;
72
73 @Before
74 public void setUp() {
75 MockitoAnnotations.initMocks(this);
76 mContext = RuntimeEnvironment.application;
77
78 when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalProfileManager);
79 when(mLocalProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
80 when(mLocalProfileManager.getHearingAidProfile()).thenReturn(mHapProfile);
81
82 mLocalMediaManager = new LocalMediaManager(mContext, mLocalBluetoothManager,
83 mBluetoothMediaManager, mInfoMediaManager);
84 }
85
86 @Test
87 public void startScan_mediaDevicesListShouldBeClear() {
88 final MediaDevice device = mock(MediaDevice.class);
89 mLocalMediaManager.mMediaDevices.add(device);
90
91 assertThat(mLocalMediaManager.mMediaDevices).hasSize(1);
92 mLocalMediaManager.startScan();
93 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
94 }
95
96 @Test
97 public void connectDevice_deviceNotEqualCurrentConnectedDevice_connectDevice() {
98 final MediaDevice currentDevice = mock(MediaDevice.class);
99 final MediaDevice device = mock(MediaDevice.class);
100 mLocalMediaManager.mMediaDevices.add(currentDevice);
101 mLocalMediaManager.mMediaDevices.add(device);
102 mLocalMediaManager.mCurrentConnectedDevice = currentDevice;
103
104 when(device.getId()).thenReturn(TEST_DEVICE_ID_1);
105 when(currentDevice.getId()).thenReturn(TEST_CURRENT_DEVICE_ID);
106
107 mLocalMediaManager.registerCallback(mCallback);
108 mLocalMediaManager.connectDevice(device);
109
110 verify(currentDevice).disconnect();
111 verify(device).connect();
112 verify(mCallback).onSelectedDeviceStateChanged(any(),
113 eq(LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED));
114 }
115
116 @Test
hughchenc0c11632019-03-07 16:21:17 +0800117 public void connectDevice_bluetoothDeviceNotConnected_connectBluetoothDevice() {
118 final MediaDevice device = mock(BluetoothMediaDevice.class);
119 final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
120 mLocalMediaManager.mMediaDevices.add(device);
121
122 when(device.getId()).thenReturn(TEST_DEVICE_ID_1);
123 when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice);
124 when(cachedDevice.isConnected()).thenReturn(false);
125 when(cachedDevice.isBusy()).thenReturn(false);
126
127 mLocalMediaManager.registerCallback(mCallback);
128 mLocalMediaManager.connectDevice(device);
129
130 verify(cachedDevice).connect(true);
131 }
132
133 @Test
hughchen61c1c9f2019-01-17 14:34:51 +0800134 public void getMediaDeviceById_idExist_shouldReturnMediaDevice() {
135 final MediaDevice device1 = mock(MediaDevice.class);
136 final MediaDevice device2 = mock(MediaDevice.class);
137 mLocalMediaManager.mMediaDevices.add(device1);
138 mLocalMediaManager.mMediaDevices.add(device2);
139
140 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
141 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
142
143 final MediaDevice device = mLocalMediaManager
144 .getMediaDeviceById(mLocalMediaManager.mMediaDevices, TEST_DEVICE_ID_2);
145
146 assertThat(device.getId()).isEqualTo(TEST_DEVICE_ID_2);
147 }
148
149 @Test
150 public void getMediaDeviceById_idNotExist_shouldReturnNull() {
151 final MediaDevice device1 = mock(MediaDevice.class);
152 final MediaDevice device2 = mock(MediaDevice.class);
153 mLocalMediaManager.mMediaDevices.add(device1);
154 mLocalMediaManager.mMediaDevices.add(device2);
155
156 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
157 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
158
159 final MediaDevice device = mLocalMediaManager
160 .getMediaDeviceById(mLocalMediaManager.mMediaDevices, TEST_CURRENT_DEVICE_ID);
161
162 assertThat(device).isNull();
163 }
164
165 @Test
166 public void onDeviceAdded_mediaDeviceAndPhoneDeviceNotExistInList_addBothDevice() {
167 final MediaDevice device = mock(MediaDevice.class);
168
169 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
170 mLocalMediaManager.registerCallback(mCallback);
171 mLocalMediaManager.mMediaDeviceCallback.onDeviceAdded(device);
172
173 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
174 verify(mCallback).onDeviceListUpdate(any());
175 }
176
177 @Test
178 public void onDeviceAdded_mediaDeviceNotExistAndPhoneDeviceExistInList_addMediaDevice() {
179 final MediaDevice device1 = mock(MediaDevice.class);
180 final MediaDevice device2 = mock(MediaDevice.class);
181 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
182 mLocalMediaManager.mMediaDevices.add(device1);
183 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
184
185 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
186 mLocalMediaManager.registerCallback(mCallback);
187 mLocalMediaManager.mMediaDeviceCallback.onDeviceAdded(device2);
188
189 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
190 verify(mCallback).onDeviceListUpdate(any());
191 }
192
193 @Test
194 public void onDeviceAdded_mediaDeviceAndPhoneDeviceExistInList_doNothing() {
195 final MediaDevice device1 = mock(MediaDevice.class);
196 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
197 mLocalMediaManager.mMediaDevices.add(device1);
198 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
199
200 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
201 mLocalMediaManager.registerCallback(mCallback);
202 mLocalMediaManager.mMediaDeviceCallback.onDeviceAdded(device1);
203
204 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
205 verify(mCallback, never()).onDeviceListUpdate(any());
206 }
207
208 @Test
209 public void onDeviceListAdded_phoneDeviceNotExistInList_addPhoneDeviceAndDevicesList() {
210 final List<MediaDevice> devices = new ArrayList<>();
211 final MediaDevice device1 = mock(MediaDevice.class);
212 final MediaDevice device2 = mock(MediaDevice.class);
213 devices.add(device1);
214 devices.add(device2);
215
216 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
217 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
218
219 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
220 mLocalMediaManager.registerCallback(mCallback);
221 mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
222
223 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
224 verify(mCallback).onDeviceListUpdate(any());
225 }
226
227 @Test
228 public void onDeviceListAdded_phoneDeviceExistInList_addDeviceList() {
229 final List<MediaDevice> devices = new ArrayList<>();
230 final MediaDevice device1 = mock(MediaDevice.class);
231 final MediaDevice device2 = mock(MediaDevice.class);
232 final MediaDevice device3 = mock(MediaDevice.class);
233 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
234 devices.add(device1);
235 devices.add(device2);
236 mLocalMediaManager.mMediaDevices.add(device3);
237 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
238
239 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
240 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
241 when(device3.getId()).thenReturn(TEST_DEVICE_ID_3);
242 when(mLocalMediaManager.mPhoneDevice.getId()).thenReturn("test_phone_id");
243
244 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
245 mLocalMediaManager.registerCallback(mCallback);
246 mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
247
248 assertThat(mLocalMediaManager.mMediaDevices).hasSize(4);
249 verify(mCallback).onDeviceListUpdate(any());
250 }
251
252 @Test
253 public void onDeviceRemoved_phoneDeviceIsLastDeviceAfterRemoveMediaDevice_removeBothDevice() {
254 final MediaDevice device1 = mock(MediaDevice.class);
255 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
256 mLocalMediaManager.mMediaDevices.add(device1);
257 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
258
259 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
260 mLocalMediaManager.registerCallback(mCallback);
261 mLocalMediaManager.mMediaDeviceCallback.onDeviceRemoved(device1);
262
263 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
264 verify(mCallback).onDeviceListUpdate(any());
265 }
266
267 @Test
268 public void onDeviceRemoved_phoneDeviceNotLastDeviceAfterRemoveMediaDevice_removeMediaDevice() {
269 final MediaDevice device1 = mock(MediaDevice.class);
270 final MediaDevice device2 = mock(MediaDevice.class);
271 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
272 mLocalMediaManager.mMediaDevices.add(device1);
273 mLocalMediaManager.mMediaDevices.add(device2);
274 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
275
276 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
277 mLocalMediaManager.registerCallback(mCallback);
278 mLocalMediaManager.mMediaDeviceCallback.onDeviceRemoved(device2);
279
280 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
281 verify(mCallback).onDeviceListUpdate(any());
282 }
283
284 @Test
285 public void onDeviceRemoved_removeMediaDeviceNotInList_doNothing() {
286 final MediaDevice device1 = mock(MediaDevice.class);
287 final MediaDevice device2 = mock(MediaDevice.class);
288 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
289 mLocalMediaManager.mMediaDevices.add(device2);
290 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
291
292 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
293 mLocalMediaManager.registerCallback(mCallback);
294 mLocalMediaManager.mMediaDeviceCallback.onDeviceRemoved(device1);
295
296 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
297 verify(mCallback, never()).onDeviceListUpdate(any());
298 }
299
300 @Test
301 public void onDeviceListRemoved_phoneDeviceIsLastDeviceAfterRemoveDeviceList_removeAll() {
302 final List<MediaDevice> devices = new ArrayList<>();
303 final MediaDevice device1 = mock(MediaDevice.class);
304 final MediaDevice device2 = mock(MediaDevice.class);
305 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
306 devices.add(device1);
307 devices.add(device2);
308 mLocalMediaManager.mMediaDevices.add(device1);
309 mLocalMediaManager.mMediaDevices.add(device2);
310 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
311
312 assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
313 mLocalMediaManager.registerCallback(mCallback);
314 mLocalMediaManager.mMediaDeviceCallback.onDeviceListRemoved(devices);
315
316 assertThat(mLocalMediaManager.mMediaDevices).isEmpty();
317 verify(mCallback).onDeviceListUpdate(any());
318 }
319
320 @Test
321 public void onDeviceListRemoved_phoneDeviceNotLastDeviceAfterRemoveDeviceList_removeList() {
322 final List<MediaDevice> devices = new ArrayList<>();
323 final MediaDevice device1 = mock(MediaDevice.class);
324 final MediaDevice device2 = mock(MediaDevice.class);
325 final MediaDevice device3 = mock(MediaDevice.class);
326 mLocalMediaManager.mPhoneDevice = mock(PhoneMediaDevice.class);
327 devices.add(device1);
328 devices.add(device3);
329 mLocalMediaManager.mMediaDevices.add(device1);
330 mLocalMediaManager.mMediaDevices.add(device2);
331 mLocalMediaManager.mMediaDevices.add(device3);
332 mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice);
333
334 assertThat(mLocalMediaManager.mMediaDevices).hasSize(4);
335 mLocalMediaManager.registerCallback(mCallback);
336 mLocalMediaManager.mMediaDeviceCallback.onDeviceListRemoved(devices);
337
338 assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
339 verify(mCallback).onDeviceListUpdate(any());
340 }
341
342 @Test
hughchen61c1c9f2019-01-17 14:34:51 +0800343 public void onConnectedDeviceChanged_connectedAndCurrentDeviceAreDifferent_notifyThemChanged() {
344 final MediaDevice device1 = mock(MediaDevice.class);
345 final MediaDevice device2 = mock(MediaDevice.class);
346
347 mLocalMediaManager.mMediaDevices.add(device1);
348 mLocalMediaManager.mMediaDevices.add(device2);
349 mLocalMediaManager.mCurrentConnectedDevice = device1;
350
351 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
352 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
353
354 mLocalMediaManager.registerCallback(mCallback);
355 mLocalMediaManager.mMediaDeviceCallback.onConnectedDeviceChanged(TEST_DEVICE_ID_2);
356
357 assertThat(mLocalMediaManager.getCurrentConnectedDevice()).isEqualTo(device2);
358 verify(mCallback).onDeviceListUpdate(any());
359 }
360
361 @Test
362 public void onConnectedDeviceChanged_connectedAndCurrentDeviceAreSame_doNothing() {
363 final MediaDevice device1 = mock(MediaDevice.class);
364 final MediaDevice device2 = mock(MediaDevice.class);
365
366 mLocalMediaManager.mMediaDevices.add(device1);
367 mLocalMediaManager.mMediaDevices.add(device2);
368 mLocalMediaManager.mCurrentConnectedDevice = device1;
369
370 when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
371 when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
372
373 mLocalMediaManager.registerCallback(mCallback);
374 mLocalMediaManager.mMediaDeviceCallback.onConnectedDeviceChanged(TEST_DEVICE_ID_1);
375
376 verify(mCallback, never()).onDeviceListUpdate(any());
377 }
hughchenc0c11632019-03-07 16:21:17 +0800378
379 @Test
380 public void onDeviceAttributesChanged_shouldDispatchDeviceListUpdate() {
381 mLocalMediaManager.registerCallback(mCallback);
382
383 mLocalMediaManager.mMediaDeviceCallback.onDeviceAttributesChanged();
384
385 verify(mCallback).onDeviceListUpdate(any());
386 }
hughchen61c1c9f2019-01-17 14:34:51 +0800387}