1 /* 2 * Copyright (C) 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.settings.wifi; 18 19 import static android.Manifest.permission.ACCESS_COARSE_LOCATION; 20 import static android.Manifest.permission.ACCESS_FINE_LOCATION; 21 import static android.os.UserManager.DISALLOW_ADD_WIFI_CONFIG; 22 import static android.os.UserManager.DISALLOW_CONFIG_WIFI; 23 24 import static com.android.settings.wifi.WifiDialogActivity.REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER; 25 import static com.android.settings.wifi.WifiDialogActivity.RESULT_CONNECTED; 26 import static com.android.settings.wifi.WifiDialogActivity.RESULT_OK; 27 28 import static com.google.common.truth.Truth.assertThat; 29 30 import static org.mockito.ArgumentMatchers.any; 31 import static org.mockito.ArgumentMatchers.anyLong; 32 import static org.mockito.Mockito.doNothing; 33 import static org.mockito.Mockito.mock; 34 import static org.mockito.Mockito.never; 35 import static org.mockito.Mockito.spy; 36 import static org.mockito.Mockito.verify; 37 import static org.mockito.Mockito.when; 38 39 import android.app.KeyguardManager; 40 import android.content.Intent; 41 import android.content.pm.PackageManager; 42 import android.net.wifi.WifiConfiguration; 43 import android.net.wifi.WifiManager; 44 import android.os.UserManager; 45 46 import com.android.settings.testutils.FakeFeatureFactory; 47 import com.android.settingslib.wifi.AccessPoint; 48 import com.android.wifitrackerlib.NetworkDetailsTracker; 49 import com.android.wifitrackerlib.WifiEntry; 50 51 import com.google.android.setupcompat.util.WizardManagerHelper; 52 53 import org.junit.Before; 54 import org.junit.Test; 55 import org.junit.runner.RunWith; 56 import org.mockito.Mock; 57 import org.mockito.MockitoAnnotations; 58 import org.robolectric.Robolectric; 59 import org.robolectric.RobolectricTestRunner; 60 61 @RunWith(RobolectricTestRunner.class) 62 public class WifiDialogActivityTest { 63 64 static final String CALLING_PACKAGE = "calling_package"; 65 static final int REQUEST_CODE = REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER; 66 private static final String SSID = "SSID"; 67 68 @Mock 69 UserManager mUserManager; 70 @Mock 71 PackageManager mPackageManager; 72 @Mock 73 WifiDialog mWifiDialog; 74 @Mock 75 WifiConfiguration mWifiConfiguration; 76 @Mock 77 AccessPoint mAccessPoint; 78 @Mock 79 WifiDialog2 mWifiDialog2; 80 @Mock 81 WifiConfigController2 mWifiConfiguration2; 82 @Mock 83 WifiEntry mWifiEntry; 84 @Mock 85 Intent mResultData; 86 @Mock 87 WifiConfigController mController; 88 @Mock 89 KeyguardManager mKeyguardManager; 90 91 WifiDialogActivity mActivity; 92 93 @Before setUp()94 public void setUp() { 95 MockitoAnnotations.initMocks(this); 96 when(mWifiDialog.getController()).thenReturn(mController); 97 mWifiConfiguration.SSID = SSID; 98 when(mController.getConfig()).thenReturn(mWifiConfiguration); 99 when(mController.getAccessPoint()).thenReturn(mAccessPoint); 100 when(mWifiDialog2.getController()).thenReturn(mWifiConfiguration2); 101 when(mWifiConfiguration2.getWifiEntry()).thenReturn(mWifiEntry); 102 when(mWifiEntry.canConnect()).thenReturn(true); 103 FakeFeatureFactory.setupForTest(); 104 WifiTrackerLibProvider mockWifiTrackerLibProvider = 105 FakeFeatureFactory.getFeatureFactory().getWifiTrackerLibProvider(); 106 when(mockWifiTrackerLibProvider.createNetworkDetailsTracker( 107 any(), any(), any(), any(), any(), anyLong(), anyLong(), any()) 108 ).thenReturn(mock(NetworkDetailsTracker.class)); 109 110 mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); 111 when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); 112 113 when(mActivity.getSystemService(KeyguardManager.class)).thenReturn(mKeyguardManager); 114 } 115 116 @Test onSubmit_shouldConnectToNetwork()117 public void onSubmit_shouldConnectToNetwork() { 118 mActivity.onSubmit(mWifiDialog); 119 120 WifiManager wifiManager = mActivity.getSystemService(WifiManager.class); 121 assertThat(wifiManager.getConnectionInfo().getSSID()).isEqualTo("\"SSID\""); 122 } 123 124 @Test onSubmit_noPermissionForResult_setResultWithoutData()125 public void onSubmit_noPermissionForResult_setResultWithoutData() { 126 when(mActivity.hasPermissionForResult()).thenReturn(false); 127 128 mActivity.onSubmit(mWifiDialog); 129 130 verify(mActivity).setResult(RESULT_CONNECTED, null); 131 } 132 133 @Test onSubmit_hasPermissionForResult_setResultWithData()134 public void onSubmit_hasPermissionForResult_setResultWithData() { 135 when(mActivity.hasPermissionForResult()).thenReturn(true); 136 when(mActivity.createResultData(any(), any())).thenReturn(mResultData); 137 138 mActivity.onSubmit(mWifiDialog); 139 140 verify(mActivity).setResult(RESULT_CONNECTED, mResultData); 141 } 142 143 @Test onSubmit2_noPermissionForResult_setResultWithoutData()144 public void onSubmit2_noPermissionForResult_setResultWithoutData() { 145 when(mActivity.hasPermissionForResult()).thenReturn(false); 146 147 mActivity.onSubmit(mWifiDialog2); 148 149 verify(mActivity).setResult(RESULT_CONNECTED, null); 150 } 151 152 @Test onSubmit2_hasPermissionForResult_setResultWithData()153 public void onSubmit2_hasPermissionForResult_setResultWithData() { 154 when(mActivity.hasPermissionForResult()).thenReturn(true); 155 when(mActivity.createResultData(any(), any())).thenReturn(mResultData); 156 157 mActivity.onSubmit(mWifiDialog2); 158 159 verify(mActivity).setResult(RESULT_CONNECTED, mResultData); 160 } 161 162 @Test onSubmit2_whenConnectForCallerIsTrue_shouldConnectToNetwork()163 public void onSubmit2_whenConnectForCallerIsTrue_shouldConnectToNetwork() { 164 final Intent intent = new Intent("com.android.settings.WIFI_DIALOG"); 165 intent.putExtra(WifiDialogActivity.KEY_CHOSEN_WIFIENTRY_KEY, "FAKE_KEY"); 166 intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, true); 167 mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get()); 168 169 mActivity.onSubmit(mWifiDialog2); 170 171 verify(mWifiEntry).connect(any()); 172 } 173 174 @Test onSubmit_whenConnectForCallerIsFalse_shouldNotConnectToNetwork()175 public void onSubmit_whenConnectForCallerIsFalse_shouldNotConnectToNetwork() { 176 final Intent intent = new Intent(); 177 intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false); 178 mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get()); 179 180 mActivity.onSubmit(mWifiDialog); 181 182 WifiManager wifiManager = mActivity.getSystemService(WifiManager.class); 183 assertThat(wifiManager.getConnectionInfo().getSSID()).isEqualTo(WifiManager.UNKNOWN_SSID); 184 } 185 186 @Test onSubmit2_whenConnectForCallerIsFalse_shouldNotConnectToNetwork()187 public void onSubmit2_whenConnectForCallerIsFalse_shouldNotConnectToNetwork() { 188 final Intent intent = new Intent("com.android.settings.WIFI_DIALOG"); 189 intent.putExtra(WifiDialogActivity.KEY_CHOSEN_WIFIENTRY_KEY, "FAKE_KEY"); 190 intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false); 191 mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get()); 192 193 mActivity.onSubmit(mWifiDialog2); 194 195 verify(mWifiEntry, never()).connect(any()); 196 } 197 198 @Test onStart_whenLaunchInSetupFlow_shouldCreateDialogWithSuwTheme()199 public void onStart_whenLaunchInSetupFlow_shouldCreateDialogWithSuwTheme() { 200 final Intent intent = new Intent(); 201 intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false); 202 intent.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true); 203 intent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true); 204 mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).create().get()); 205 doNothing().when(mActivity).createDialogWithSuwTheme(); 206 207 mActivity.onStart(); 208 209 verify(mActivity).createDialogWithSuwTheme(); 210 } 211 212 @Test onActivityResult_noPermissionForResult_setResultWithoutData()213 public void onActivityResult_noPermissionForResult_setResultWithoutData() { 214 when(mActivity.hasPermissionForResult()).thenReturn(false); 215 216 mActivity.onActivityResult(REQUEST_CODE, RESULT_OK, mResultData); 217 218 verify(mActivity).setResult(RESULT_CONNECTED); 219 } 220 221 @Test onActivityResult_hasPermissionForResult_setResultWithData()222 public void onActivityResult_hasPermissionForResult_setResultWithData() { 223 when(mActivity.hasPermissionForResult()).thenReturn(true); 224 225 mActivity.onActivityResult(REQUEST_CODE, RESULT_OK, mResultData); 226 227 verify(mActivity).setResult(RESULT_CONNECTED, mResultData); 228 } 229 230 @Test isConfigWifiAllowed_hasNoUserRestriction_returnTrue()231 public void isConfigWifiAllowed_hasNoUserRestriction_returnTrue() { 232 when(mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)).thenReturn(false); 233 234 assertThat(mActivity.isConfigWifiAllowed()).isTrue(); 235 } 236 237 @Test isConfigWifiAllowed_hasUserRestriction_returnFalse()238 public void isConfigWifiAllowed_hasUserRestriction_returnFalse() { 239 when(mUserManager.hasUserRestriction(DISALLOW_CONFIG_WIFI)).thenReturn(true); 240 241 assertThat(mActivity.isConfigWifiAllowed()).isFalse(); 242 } 243 244 @Test isAddWifiConfigAllowed_hasNoUserRestriction_returnTrue()245 public void isAddWifiConfigAllowed_hasNoUserRestriction_returnTrue() { 246 when(mUserManager.hasUserRestriction(DISALLOW_ADD_WIFI_CONFIG)).thenReturn(false); 247 248 assertThat(mActivity.isAddWifiConfigAllowed()).isTrue(); 249 } 250 251 @Test isAddWifiConfigAllowed_hasUserRestriction_returnFalse()252 public void isAddWifiConfigAllowed_hasUserRestriction_returnFalse() { 253 when(mUserManager.hasUserRestriction(DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true); 254 255 assertThat(mActivity.isAddWifiConfigAllowed()).isFalse(); 256 } 257 258 @Test hasPermissionForResult_noCallingPackage_returnFalse()259 public void hasPermissionForResult_noCallingPackage_returnFalse() { 260 when(mActivity.getCallingPackage()).thenReturn(null); 261 262 final boolean result = mActivity.hasPermissionForResult(); 263 264 assertThat(result).isFalse(); 265 } 266 267 @Test hasPermissionForResult_noPermission_returnFalse()268 public void hasPermissionForResult_noPermission_returnFalse() { 269 when(mActivity.getCallingPackage()).thenReturn(null); 270 when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) 271 .thenReturn(PackageManager.PERMISSION_DENIED); 272 when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) 273 .thenReturn(PackageManager.PERMISSION_DENIED); 274 275 final boolean result = mActivity.hasPermissionForResult(); 276 277 assertThat(result).isFalse(); 278 } 279 280 @Test hasPermissionForResult_hasCoarseLocationPermission_returnFalse()281 public void hasPermissionForResult_hasCoarseLocationPermission_returnFalse() { 282 when(mActivity.getCallingPackage()).thenReturn(CALLING_PACKAGE); 283 when(mActivity.getPackageManager()).thenReturn(mPackageManager); 284 when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) 285 .thenReturn(PackageManager.PERMISSION_GRANTED); 286 when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) 287 .thenReturn(PackageManager.PERMISSION_DENIED); 288 289 final boolean result = mActivity.hasPermissionForResult(); 290 291 assertThat(result).isFalse(); 292 } 293 294 @Test hasPermissionForResult_hasFineLocationPermission_returnTrue()295 public void hasPermissionForResult_hasFineLocationPermission_returnTrue() { 296 when(mActivity.getCallingPackage()).thenReturn(CALLING_PACKAGE); 297 when(mActivity.getPackageManager()).thenReturn(mPackageManager); 298 when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) 299 .thenReturn(PackageManager.PERMISSION_DENIED); 300 when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) 301 .thenReturn(PackageManager.PERMISSION_GRANTED); 302 303 final boolean result = mActivity.hasPermissionForResult(); 304 305 assertThat(result).isTrue(); 306 } 307 308 @Test hasPermissionForResult_haveBothLocationPermissions_returnTrue()309 public void hasPermissionForResult_haveBothLocationPermissions_returnTrue() { 310 when(mActivity.getCallingPackage()).thenReturn(CALLING_PACKAGE); 311 when(mActivity.getPackageManager()).thenReturn(mPackageManager); 312 when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) 313 .thenReturn(PackageManager.PERMISSION_GRANTED); 314 when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) 315 .thenReturn(PackageManager.PERMISSION_GRANTED); 316 317 final boolean result = mActivity.hasPermissionForResult(); 318 319 assertThat(result).isTrue(); 320 } 321 322 @Test dismissDialog_hasDialog_dialogDismiss()323 public void dismissDialog_hasDialog_dialogDismiss() { 324 mActivity.mDialog = mWifiDialog; 325 mActivity.mDialog2 = mWifiDialog2; 326 327 mActivity.dismissDialog(); 328 329 verify(mWifiDialog).dismiss(); 330 verify(mWifiDialog2).dismiss(); 331 } 332 333 @Test onKeyguardLockedStateChanged_keyguardIsNotLocked_doNotDismissDialog()334 public void onKeyguardLockedStateChanged_keyguardIsNotLocked_doNotDismissDialog() { 335 WifiDialogActivity.LockScreenMonitor lockScreenMonitor = 336 new WifiDialogActivity.LockScreenMonitor(mActivity); 337 338 lockScreenMonitor.onKeyguardLockedStateChanged(false /* isKeyguardLocked */); 339 340 verify(mActivity, never()).dismissDialog(); 341 } 342 343 @Test onKeyguardLockedStateChanged_keyguardIsLocked_dismissDialog()344 public void onKeyguardLockedStateChanged_keyguardIsLocked_dismissDialog() { 345 WifiDialogActivity.LockScreenMonitor lockScreenMonitor = 346 new WifiDialogActivity.LockScreenMonitor(mActivity); 347 348 lockScreenMonitor.onKeyguardLockedStateChanged(true /* isKeyguardLocked */); 349 350 verify(mActivity).dismissDialog(); 351 } 352 } 353