1 /* 2 * Copyright (C) 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.settings.wifi; 18 19 import static android.net.ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION; 20 import static android.net.ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY; 21 import static android.net.ConnectivityManager.ACTION_PROMPT_UNVALIDATED; 22 import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; 23 24 import static com.google.common.truth.Truth.assertThat; 25 26 import static org.mockito.ArgumentMatchers.any; 27 import static org.mockito.Mockito.eq; 28 import static org.mockito.Mockito.mock; 29 import static org.mockito.Mockito.never; 30 import static org.mockito.Mockito.spy; 31 import static org.mockito.Mockito.times; 32 import static org.mockito.Mockito.verify; 33 import static org.mockito.Mockito.when; 34 35 import android.content.Context; 36 import android.content.DialogInterface; 37 import android.content.Intent; 38 import android.net.ConnectivityManager; 39 import android.net.Network; 40 import android.net.NetworkCapabilities; 41 import android.net.NetworkInfo; 42 import android.net.NetworkRequest; 43 import android.os.Bundle; 44 45 import com.android.settings.R; 46 47 import org.junit.Before; 48 import org.junit.Test; 49 import org.junit.runner.RunWith; 50 import org.mockito.ArgumentCaptor; 51 import org.mockito.Captor; 52 import org.mockito.Mock; 53 import org.mockito.MockitoAnnotations; 54 import org.robolectric.Robolectric; 55 import org.robolectric.RobolectricTestRunner; 56 import org.robolectric.RuntimeEnvironment; 57 58 @RunWith(RobolectricTestRunner.class) 59 public class WifiNoInternetDialogTest { 60 61 private static final String FAKE_SSID = "fake_ssid"; 62 63 @Mock 64 private Network mNetwork; 65 66 @Captor 67 private ArgumentCaptor<ConnectivityManager.NetworkCallback> mCallbackCaptor; 68 69 @Mock 70 private ConnectivityManager mConnectivityManager; 71 72 @Mock 73 private NetworkInfo mNetworkInfo; 74 75 @Mock 76 private NetworkCapabilities mNetworkCapabilities; 77 78 private WifiNoInternetDialog mActivity; 79 80 @Before setUp()81 public void setUp() { 82 MockitoAnnotations.initMocks(this); 83 } 84 85 @Test launchActivity_noIntentAction_shouldNotFatalException()86 public void launchActivity_noIntentAction_shouldNotFatalException() { 87 WifiNoInternetDialog wifiNoInternetDialog = 88 Robolectric.setupActivity(WifiNoInternetDialog.class); 89 } 90 91 @Test setupPromptUnvalidated_shouldShowNoInternetAccessRemember()92 public void setupPromptUnvalidated_shouldShowNoInternetAccessRemember() { 93 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 94 setupNetworkComponents(); 95 96 mActivity.onCreate(new Bundle()); 97 98 assertThat(mActivity.mAlwaysAllow.getText()).isEqualTo( 99 mActivity.getString(R.string.no_internet_access_remember)); 100 } 101 102 @Test setupPromptPartialConnectivity_shouldShowNoInternetAccessRemember()103 public void setupPromptPartialConnectivity_shouldShowNoInternetAccessRemember() { 104 setupActivityWithAction(ACTION_PROMPT_PARTIAL_CONNECTIVITY, mNetwork); 105 setupNetworkComponents(); 106 107 mActivity.onCreate(new Bundle()); 108 109 assertThat(mActivity.mAlwaysAllow.getText()).isEqualTo( 110 mActivity.getString(R.string.no_internet_access_remember)); 111 } 112 113 @Test setupPromptLostValidationAction_shouldShowLostInternetAccessPersist()114 public void setupPromptLostValidationAction_shouldShowLostInternetAccessPersist() { 115 setupActivityWithAction(ACTION_PROMPT_LOST_VALIDATION, mNetwork); 116 setupNetworkComponents(); 117 118 mActivity.onCreate(new Bundle()); 119 120 assertThat(mActivity.mAlwaysAllow.getText()).isEqualTo( 121 mActivity.getString(R.string.lost_internet_access_persist)); 122 } 123 124 @Test clickPositiveButton_whenPromptUnvalidated_shouldCallSetAcceptUnvalidated()125 public void clickPositiveButton_whenPromptUnvalidated_shouldCallSetAcceptUnvalidated() { 126 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 127 setupNetworkComponents(); 128 mActivity.onCreate(new Bundle()); 129 130 mActivity.onClick(null, DialogInterface.BUTTON_POSITIVE); 131 132 verify(mConnectivityManager).setAcceptUnvalidated(any(Network.class), eq(true), eq(false)); 133 } 134 135 @Test positiveButton_withPartialConnectivity_shouldCallSetAcceptPartialConnectivity()136 public void positiveButton_withPartialConnectivity_shouldCallSetAcceptPartialConnectivity() { 137 setupActivityWithAction(ACTION_PROMPT_PARTIAL_CONNECTIVITY, mNetwork); 138 setupNetworkComponents(); 139 mActivity.onCreate(new Bundle()); 140 141 mActivity.onClick(null, DialogInterface.BUTTON_POSITIVE); 142 143 verify(mConnectivityManager).setAcceptPartialConnectivity(any(Network.class), eq(true), 144 eq(false)); 145 } 146 147 @Test positiveButton_withLostValidation_shouldCallSetAvoidUnvalidated()148 public void positiveButton_withLostValidation_shouldCallSetAvoidUnvalidated() { 149 setupActivityWithAction(ACTION_PROMPT_LOST_VALIDATION, mNetwork); 150 setupNetworkComponents(); 151 mActivity.onCreate(new Bundle()); 152 153 mActivity.onClick(null, DialogInterface.BUTTON_POSITIVE); 154 155 verify(mConnectivityManager).setAvoidUnvalidated(any(Network.class)); 156 } 157 158 @Test destroyWithNoClick_inPartialConnectivity_shouldCallSetAcceptPartialConnectivity()159 public void destroyWithNoClick_inPartialConnectivity_shouldCallSetAcceptPartialConnectivity() { 160 setupActivityWithAction(ACTION_PROMPT_PARTIAL_CONNECTIVITY, mNetwork); 161 setupNetworkComponents(); 162 when(mActivity.isFinishing()).thenReturn(true); 163 mActivity.onCreate(new Bundle()); 164 165 mActivity.onDestroy(); 166 167 verify(mConnectivityManager).setAcceptPartialConnectivity(any(Network.class), eq(false), 168 eq(false)); 169 } 170 171 @Test destroyWithNoClick_whenUnvalidated_shouldCallSetAcceptUnvalidated()172 public void destroyWithNoClick_whenUnvalidated_shouldCallSetAcceptUnvalidated() { 173 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 174 setupNetworkComponents(); 175 when(mActivity.isFinishing()).thenReturn(true); 176 mActivity.onCreate(new Bundle()); 177 178 mActivity.onDestroy(); 179 180 verify(mConnectivityManager).setAcceptUnvalidated(any(Network.class), eq(false), eq(false)); 181 } 182 183 @Test networkCallbackOnLost_shouldFinish()184 public void networkCallbackOnLost_shouldFinish() { 185 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 186 setupNetworkComponents(); 187 mActivity.onCreate(new Bundle()); 188 verify(mConnectivityManager, times(1)).registerNetworkCallback( 189 any(NetworkRequest.class), mCallbackCaptor.capture()); 190 191 mCallbackCaptor.getValue().onLost(mNetwork); 192 193 verify(mActivity).finish(); 194 } 195 196 @Test networkCallbackOnLost_shouldNotFinishIfNetworkIsNotTheSame()197 public void networkCallbackOnLost_shouldNotFinishIfNetworkIsNotTheSame() { 198 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 199 setupNetworkComponents(); 200 mActivity.onCreate(new Bundle()); 201 verify(mConnectivityManager, times(1)).registerNetworkCallback( 202 any(NetworkRequest.class), mCallbackCaptor.capture()); 203 204 Network unexpectedNetwork = mock(Network.class); 205 mCallbackCaptor.getValue().onLost(unexpectedNetwork); 206 207 verify(mActivity, never()).finish(); 208 } 209 210 @Test networkCallbackOnCapabilitiesChanged_shouldFinish()211 public void networkCallbackOnCapabilitiesChanged_shouldFinish() { 212 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 213 setupNetworkComponents(); 214 when(mNetworkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)).thenReturn(true); 215 mActivity.onCreate(new Bundle()); 216 verify(mConnectivityManager, times(1)).registerNetworkCallback( 217 any(NetworkRequest.class), mCallbackCaptor.capture()); 218 219 mCallbackCaptor.getValue().onCapabilitiesChanged(mNetwork, mNetworkCapabilities); 220 221 verify(mActivity).finish(); 222 } 223 224 @Test networkCallbackOnCapabilitiesChanged_shouldNotFinishIfNetworkIsNotTheSame()225 public void networkCallbackOnCapabilitiesChanged_shouldNotFinishIfNetworkIsNotTheSame() { 226 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 227 setupNetworkComponents(); 228 when(mNetworkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)).thenReturn(true); 229 mActivity.onCreate(new Bundle()); 230 verify(mConnectivityManager, times(1)).registerNetworkCallback( 231 any(NetworkRequest.class), mCallbackCaptor.capture()); 232 233 Network unexpectedNetwork = mock(Network.class); 234 mCallbackCaptor.getValue().onCapabilitiesChanged(unexpectedNetwork, mNetworkCapabilities); 235 236 verify(mActivity, never()).finish(); 237 } 238 239 @Test networkNotConnectedOrConnecting_shouldFinish()240 public void networkNotConnectedOrConnecting_shouldFinish() { 241 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, mNetwork); 242 setupNetworkComponents(); 243 when(mNetworkInfo.isConnectedOrConnecting()).thenReturn(false); 244 245 mActivity.onCreate(new Bundle()); 246 247 verify(mActivity).finish(); 248 } 249 250 @Test withNullNetwork_shouldFinish()251 public void withNullNetwork_shouldFinish() { 252 setupActivityWithAction(ACTION_PROMPT_UNVALIDATED, null); 253 setupNetworkComponents(); 254 255 mActivity.onCreate(new Bundle()); 256 257 verify(mActivity).finish(); 258 } 259 setupNetworkComponents()260 private void setupNetworkComponents() { 261 when(mActivity.getSystemService(Context.CONNECTIVITY_SERVICE)) 262 .thenReturn(mConnectivityManager); 263 when(mNetworkInfo.isConnectedOrConnecting()).thenReturn(true); 264 when(mNetworkCapabilities.getSsid()).thenReturn(FAKE_SSID); 265 when(mConnectivityManager.getNetworkInfo(any())) 266 .thenReturn(mNetworkInfo); 267 when(mConnectivityManager.getNetworkCapabilities(any())) 268 .thenReturn(mNetworkCapabilities); 269 } 270 setupActivityWithAction(String action, Network network)271 private void setupActivityWithAction(String action, Network network) { 272 final Intent intent = new Intent(action).setClassName( 273 RuntimeEnvironment.application.getPackageName(), 274 WifiNoInternetDialog.class.getName()); 275 intent.putExtra(ConnectivityManager.EXTRA_NETWORK, network); 276 mActivity = spy(Robolectric.buildActivity(WifiNoInternetDialog.class, intent).get()); 277 } 278 }