blob: 4b93ca3dcaa994a2c4c036794127fe91e8558a45 [file] [log] [blame]
Jerry Zhang327b8092018-01-09 17:53:04 -08001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.server.usb;
17
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertFalse;
20import static org.junit.Assert.assertNotEquals;
21import static org.junit.Assert.assertTrue;
22import static org.mockito.Mockito.verify;
23import static org.mockito.Mockito.when;
24
Jerry Zhangff6095c2018-03-02 12:38:26 -080025import android.app.ActivityManager;
Jerry Zhang327b8092018-01-09 17:53:04 -080026import android.content.ContentResolver;
27import android.content.Context;
28import android.content.Intent;
29import android.content.SharedPreferences;
30import android.hardware.usb.UsbManager;
31import android.os.Handler;
32import android.os.Looper;
Jerry Zhangff6095c2018-03-02 12:38:26 -080033import android.os.Message;
Jerry Zhang327b8092018-01-09 17:53:04 -080034import android.os.UserHandle;
35import android.provider.Settings;
36import android.support.test.InstrumentationRegistry;
37import android.support.test.filters.SmallTest;
38import android.support.test.runner.AndroidJUnit4;
39
40import com.android.server.FgThread;
41
42import org.junit.Before;
43import org.junit.Test;
44import org.junit.runner.RunWith;
45import org.mockito.Mock;
46import org.mockito.MockitoAnnotations;
47
48import java.util.HashMap;
49import java.util.Locale;
50import java.util.Map;
51
52/**
53 * Tests for UsbHandler state changes.
54 */
55@RunWith(AndroidJUnit4.class)
56public class UsbHandlerTest {
57 private static final String TAG = UsbHandlerTest.class.getSimpleName();
58
59 @Mock
60 private UsbDeviceManager mUsbDeviceManager;
61 @Mock
Jerry Zhang327b8092018-01-09 17:53:04 -080062 private UsbAlsaManager mUsbAlsaManager;
63 @Mock
64 private UsbSettingsManager mUsbSettingsManager;
65 @Mock
66 private SharedPreferences mSharedPreferences;
67 @Mock
68 private SharedPreferences.Editor mEditor;
69
70 private MockUsbHandler mUsbHandler;
71
72 private static final int MSG_UPDATE_STATE = 0;
73 private static final int MSG_ENABLE_ADB = 1;
74 private static final int MSG_SET_CURRENT_FUNCTIONS = 2;
75 private static final int MSG_SYSTEM_READY = 3;
76 private static final int MSG_BOOT_COMPLETED = 4;
77 private static final int MSG_USER_SWITCHED = 5;
78 private static final int MSG_UPDATE_USER_RESTRICTIONS = 6;
79 private static final int MSG_SET_SCREEN_UNLOCKED_FUNCTIONS = 12;
80 private static final int MSG_UPDATE_SCREEN_LOCK = 13;
81
82 private Map<String, String> mMockProperties;
83 private Map<String, Integer> mMockGlobalSettings;
84
85 private class MockUsbHandler extends UsbDeviceManager.UsbHandler {
86 boolean mIsUsbTransferAllowed;
87 Intent mBroadcastedIntent;
88
89 MockUsbHandler(Looper looper, Context context, UsbDeviceManager deviceManager,
Kenny Rootc2a54e82018-07-04 13:59:23 +090090 UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) {
91 super(looper, context, deviceManager, alsaManager, settingsManager);
Jerry Zhang327b8092018-01-09 17:53:04 -080092 mUseUsbNotification = false;
93 mIsUsbTransferAllowed = true;
94 mCurrentUsbFunctionsReceived = true;
95 }
96
97 @Override
98 protected void setEnabledFunctions(long functions, boolean force) {
99 mCurrentFunctions = functions;
100 }
101
102 @Override
103 protected void setSystemProperty(String property, String value) {
104 mMockProperties.put(property, value);
105 }
106
107 @Override
108 protected void putGlobalSettings(ContentResolver resolver, String setting, int val) {
109 mMockGlobalSettings.put(setting, val);
110 }
111
112 @Override
113 protected String getSystemProperty(String property, String def) {
114 if (mMockProperties.containsKey(property)) {
115 return mMockProperties.get(property);
116 }
117 return def;
118 }
119
120 @Override
121 protected boolean isUsbTransferAllowed() {
122 return mIsUsbTransferAllowed;
123 }
124
125 @Override
126 protected SharedPreferences getPinnedSharedPrefs(Context context) {
127 return mSharedPreferences;
128 }
129
130 @Override
131 protected void sendStickyBroadcast(Intent intent) {
132 mBroadcastedIntent = intent;
133 }
134 }
135
136 @Before
137 public void before() {
138 MockitoAnnotations.initMocks(this);
139 mMockProperties = new HashMap<>();
140 mMockGlobalSettings = new HashMap<>();
141 when(mSharedPreferences.edit()).thenReturn(mEditor);
142
143 mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
Kenny Rootc2a54e82018-07-04 13:59:23 +0900144 InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
145 mUsbSettingsManager);
Jerry Zhang327b8092018-01-09 17:53:04 -0800146 }
147
148 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800149 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800150 public void setFunctionsMtp() {
151 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
152 UsbManager.FUNCTION_MTP));
153 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
154 }
155
156 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800157 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800158 public void setFunctionsPtp() {
159 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
160 UsbManager.FUNCTION_PTP));
161 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_PTP, 0);
162 }
163
164 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800165 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800166 public void setFunctionsMidi() {
167 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
168 UsbManager.FUNCTION_MIDI));
169 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MIDI, 0);
170 }
171
172 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800173 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800174 public void setFunctionsRndis() {
175 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
176 UsbManager.FUNCTION_RNDIS));
177 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_RNDIS, 0);
178 }
179
180 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800181 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800182 public void enableAdb() {
183 sendBootCompleteMessages(mUsbHandler);
Jerry Zhangff6095c2018-03-02 12:38:26 -0800184 Message msg = mUsbHandler.obtainMessage(MSG_ENABLE_ADB);
185 msg.arg1 = 1;
186 mUsbHandler.handleMessage(msg);
Jerry Zhang327b8092018-01-09 17:53:04 -0800187 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
Jerry Zhang327b8092018-01-09 17:53:04 -0800188 assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
189 .USB_PERSISTENT_CONFIG_PROPERTY), UsbManager.USB_FUNCTION_ADB);
Kenny Rootc2a54e82018-07-04 13:59:23 +0900190 assertTrue(mUsbHandler.isAdbEnabled());
Jerry Zhang327b8092018-01-09 17:53:04 -0800191
192 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 1, 1));
193
194 assertTrue(mUsbHandler.mBroadcastedIntent.getBooleanExtra(UsbManager.USB_CONNECTED, false));
195 assertTrue(mUsbHandler.mBroadcastedIntent
196 .getBooleanExtra(UsbManager.USB_CONFIGURED, false));
197 assertTrue(mUsbHandler.mBroadcastedIntent
198 .getBooleanExtra(UsbManager.USB_FUNCTION_ADB, false));
199 }
200
201 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800202 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800203 public void disableAdb() {
204 mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY,
205 UsbManager.USB_FUNCTION_ADB);
206 mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
Kenny Rootc2a54e82018-07-04 13:59:23 +0900207 InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
208 mUsbSettingsManager);
Jerry Zhang327b8092018-01-09 17:53:04 -0800209
210 sendBootCompleteMessages(mUsbHandler);
211 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_ENABLE_ADB, 0));
212 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
Kenny Rootc2a54e82018-07-04 13:59:23 +0900213 assertFalse(mUsbHandler.isAdbEnabled());
Jerry Zhang327b8092018-01-09 17:53:04 -0800214 assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
215 .USB_PERSISTENT_CONFIG_PROPERTY), "");
Jerry Zhang327b8092018-01-09 17:53:04 -0800216 }
217
218 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800219 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800220 public void bootCompletedCharging() {
221 sendBootCompleteMessages(mUsbHandler);
222 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
223 }
224
Jerry Zhang327b8092018-01-09 17:53:04 -0800225 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800226 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800227 public void bootCompletedAdbEnabled() {
228 mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY, "adb");
229 mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
Kenny Rootc2a54e82018-07-04 13:59:23 +0900230 InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
231 mUsbSettingsManager);
Jerry Zhang327b8092018-01-09 17:53:04 -0800232
233 sendBootCompleteMessages(mUsbHandler);
234 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
235 assertEquals(mMockGlobalSettings.get(Settings.Global.ADB_ENABLED).intValue(), 1);
Kenny Rootc2a54e82018-07-04 13:59:23 +0900236 assertTrue(mUsbHandler.isAdbEnabled());
Jerry Zhang327b8092018-01-09 17:53:04 -0800237 }
238
239 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800240 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800241 public void userSwitchedDisablesMtp() {
242 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
243 UsbManager.FUNCTION_MTP));
244 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
245
Jerry Zhangff6095c2018-03-02 12:38:26 -0800246 Message msg = mUsbHandler.obtainMessage(MSG_USER_SWITCHED);
247 msg.arg1 = ActivityManager.getCurrentUser() + 1;
248 mUsbHandler.handleMessage(msg);
Jerry Zhang327b8092018-01-09 17:53:04 -0800249 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
250 }
251
252 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800253 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800254 public void changedRestrictionsDisablesMtp() {
255 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
256 UsbManager.FUNCTION_MTP));
257 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
258
259 mUsbHandler.mIsUsbTransferAllowed = false;
260 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_USER_RESTRICTIONS));
261 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
262 }
263
264 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800265 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800266 public void disconnectResetsCharging() {
267 sendBootCompleteMessages(mUsbHandler);
268
269 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
270 UsbManager.FUNCTION_MTP));
271 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
272
273 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 0, 0));
274
275 assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
276 }
277
278 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800279 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800280 public void configuredSendsBroadcast() {
281 sendBootCompleteMessages(mUsbHandler);
282 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
283 UsbManager.FUNCTION_MTP));
284 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
285
286 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 1, 1));
287
288 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
289 assertTrue(mUsbHandler.mBroadcastedIntent.getBooleanExtra(UsbManager.USB_CONNECTED, false));
290 assertTrue(mUsbHandler.mBroadcastedIntent
291 .getBooleanExtra(UsbManager.USB_CONFIGURED, false));
292 assertTrue(mUsbHandler.mBroadcastedIntent
293 .getBooleanExtra(UsbManager.USB_FUNCTION_MTP, false));
294 }
295
296 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800297 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800298 public void setScreenUnlockedFunctions() {
299 sendBootCompleteMessages(mUsbHandler);
300 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
301
302 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_SCREEN_UNLOCKED_FUNCTIONS,
303 UsbManager.FUNCTION_MTP));
304 assertNotEquals(mUsbHandler.getScreenUnlockedFunctions() & UsbManager.FUNCTION_MTP, 0);
305 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
306 verify(mEditor).putString(String.format(Locale.ENGLISH,
307 UsbDeviceManager.UNLOCKED_CONFIG_PREF, mUsbHandler.mCurrentUser),
308 UsbManager.USB_FUNCTION_MTP);
309 }
310
311 @SmallTest
Jerry Zhangff6095c2018-03-02 12:38:26 -0800312 @Test
Jerry Zhang327b8092018-01-09 17:53:04 -0800313 public void unlockScreen() {
314 when(mSharedPreferences.getString(String.format(Locale.ENGLISH,
315 UsbDeviceManager.UNLOCKED_CONFIG_PREF, mUsbHandler.mCurrentUser), ""))
316 .thenReturn(UsbManager.USB_FUNCTION_MTP);
Jerry Zhangff6095c2018-03-02 12:38:26 -0800317 mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
Kenny Rootc2a54e82018-07-04 13:59:23 +0900318 InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbAlsaManager,
319 mUsbSettingsManager);
Jerry Zhang327b8092018-01-09 17:53:04 -0800320 sendBootCompleteMessages(mUsbHandler);
Jerry Zhangff6095c2018-03-02 12:38:26 -0800321 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 1));
Jerry Zhang327b8092018-01-09 17:53:04 -0800322 mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
323
324 assertNotEquals(mUsbHandler.getScreenUnlockedFunctions() & UsbManager.FUNCTION_MTP, 0);
325 assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
326 }
327
328 private static void sendBootCompleteMessages(Handler handler) {
329 handler.handleMessage(handler.obtainMessage(MSG_BOOT_COMPLETED));
330 handler.handleMessage(handler.obtainMessage(MSG_SYSTEM_READY));
331 }
Kenny Rootc2a54e82018-07-04 13:59:23 +0900332}