1 package org.robolectric.shadows; 2 3 import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED; 4 import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED; 5 import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED; 6 import static android.os.Build.VERSION_CODES.M; 7 import static android.os.Build.VERSION_CODES.N; 8 import static android.os.Build.VERSION_CODES.O; 9 import static android.os.Build.VERSION_CODES.S; 10 import static androidx.test.core.app.ApplicationProvider.getApplicationContext; 11 import static com.google.common.truth.Truth.assertThat; 12 import static org.junit.Assert.assertThrows; 13 import static org.mockito.Mockito.spy; 14 import static org.mockito.Mockito.times; 15 import static org.mockito.Mockito.verify; 16 import static org.robolectric.Shadows.shadowOf; 17 18 import android.app.PendingIntent; 19 import android.content.Context; 20 import android.content.Intent; 21 import android.net.ConnectivityManager; 22 import android.net.LinkProperties; 23 import android.net.Network; 24 import android.net.NetworkCapabilities; 25 import android.net.NetworkInfo; 26 import android.net.NetworkRequest; 27 import android.net.ProxyInfo; 28 import android.os.Handler; 29 import android.provider.Settings; 30 import android.telephony.TelephonyManager; 31 import androidx.test.ext.junit.runners.AndroidJUnit4; 32 import java.util.Arrays; 33 import java.util.Map; 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.robolectric.annotation.Config; 38 import org.robolectric.util.ReflectionHelpers; 39 40 @RunWith(AndroidJUnit4.class) 41 public class ShadowConnectivityManagerTest { 42 private ConnectivityManager connectivityManager; 43 private ShadowNetworkInfo shadowOfActiveNetworkInfo; 44 45 @Before setUp()46 public void setUp() throws Exception { 47 connectivityManager = 48 (ConnectivityManager) 49 getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 50 shadowOfActiveNetworkInfo = shadowOf(connectivityManager.getActiveNetworkInfo()); 51 } 52 53 @Test getActiveNetworkInfo_shouldInitializeItself()54 public void getActiveNetworkInfo_shouldInitializeItself() { 55 assertThat(connectivityManager.getActiveNetworkInfo()).isNotNull(); 56 } 57 58 @Test getActiveNetworkInfo_shouldReturnTrueCorrectly()59 public void getActiveNetworkInfo_shouldReturnTrueCorrectly() { 60 shadowOfActiveNetworkInfo.setConnectionStatus(NetworkInfo.State.CONNECTED); 61 assertThat(connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()).isTrue(); 62 assertThat(connectivityManager.getActiveNetworkInfo().isConnected()).isTrue(); 63 64 shadowOfActiveNetworkInfo.setConnectionStatus(NetworkInfo.State.CONNECTING); 65 assertThat(connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()).isTrue(); 66 assertThat(connectivityManager.getActiveNetworkInfo().isConnected()).isFalse(); 67 68 shadowOfActiveNetworkInfo.setConnectionStatus(NetworkInfo.State.DISCONNECTED); 69 assertThat(connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()).isFalse(); 70 assertThat(connectivityManager.getActiveNetworkInfo().isConnected()).isFalse(); 71 } 72 73 @Test getNetworkInfo_shouldReturnDefaultNetworks()74 public void getNetworkInfo_shouldReturnDefaultNetworks() { 75 NetworkInfo wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 76 assertThat(wifi.getDetailedState()).isEqualTo(NetworkInfo.DetailedState.DISCONNECTED); 77 78 NetworkInfo mobile = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 79 assertThat(mobile.getDetailedState()).isEqualTo(NetworkInfo.DetailedState.CONNECTED); 80 } 81 82 @Test getNetworkInfo_shouldReturnSomeForAllNetworks()83 public void getNetworkInfo_shouldReturnSomeForAllNetworks() { 84 Network[] allNetworks = connectivityManager.getAllNetworks(); 85 for (Network network: allNetworks) { 86 NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network); 87 assertThat(networkInfo).isNotNull(); 88 } 89 } 90 91 @Test getNetworkInfo_shouldReturnAddedNetwork()92 public void getNetworkInfo_shouldReturnAddedNetwork() { 93 Network vpnNetwork = ShadowNetwork.newInstance(123); 94 NetworkInfo vpnNetworkInfo = 95 ShadowNetworkInfo.newInstance( 96 NetworkInfo.DetailedState.CONNECTED, 97 ConnectivityManager.TYPE_VPN, 98 0, 99 true, 100 NetworkInfo.State.CONNECTED); 101 shadowOf(connectivityManager).addNetwork(vpnNetwork, vpnNetworkInfo); 102 103 NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(vpnNetwork); 104 assertThat(returnedNetworkInfo).isSameInstanceAs(vpnNetworkInfo); 105 } 106 107 @Test getNetworkInfo_shouldNotReturnRemovedNetwork()108 public void getNetworkInfo_shouldNotReturnRemovedNetwork() { 109 Network wifiNetwork = ShadowNetwork.newInstance(ShadowConnectivityManager.NET_ID_WIFI); 110 shadowOf(connectivityManager).removeNetwork(wifiNetwork); 111 112 NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(wifiNetwork); 113 assertThat(returnedNetworkInfo).isNull(); 114 } 115 116 @Test setConnectionType_shouldReturnTypeCorrectly()117 public void setConnectionType_shouldReturnTypeCorrectly() { 118 shadowOfActiveNetworkInfo.setConnectionType(ConnectivityManager.TYPE_MOBILE); 119 assertThat(shadowOfActiveNetworkInfo.getType()).isEqualTo(ConnectivityManager.TYPE_MOBILE); 120 121 shadowOfActiveNetworkInfo.setConnectionType(ConnectivityManager.TYPE_WIFI); 122 assertThat(shadowOfActiveNetworkInfo.getType()).isEqualTo(ConnectivityManager.TYPE_WIFI); 123 } 124 125 @Test shouldGetAndSetBackgroundDataSetting()126 public void shouldGetAndSetBackgroundDataSetting() { 127 assertThat(connectivityManager.getBackgroundDataSetting()).isFalse(); 128 shadowOf(connectivityManager).setBackgroundDataSetting(true); 129 assertThat(connectivityManager.getBackgroundDataSetting()).isTrue(); 130 } 131 132 @Test setActiveNetworkInfo_shouldSetActiveNetworkInfo()133 public void setActiveNetworkInfo_shouldSetActiveNetworkInfo() { 134 shadowOf(connectivityManager).setActiveNetworkInfo(null); 135 assertThat(connectivityManager.getActiveNetworkInfo()).isNull(); 136 shadowOf(connectivityManager) 137 .setActiveNetworkInfo( 138 ShadowNetworkInfo.newInstance( 139 null, 140 ConnectivityManager.TYPE_MOBILE_HIPRI, 141 TelephonyManager.NETWORK_TYPE_EDGE, 142 true, 143 NetworkInfo.State.DISCONNECTED)); 144 145 NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 146 147 assertThat(info.getType()).isEqualTo(ConnectivityManager.TYPE_MOBILE_HIPRI); 148 assertThat(info.getSubtype()).isEqualTo(TelephonyManager.NETWORK_TYPE_EDGE); 149 assertThat(info.isAvailable()).isTrue(); 150 assertThat(info.isConnected()).isFalse(); 151 } 152 153 @Test 154 @Config(minSdk = M) getActiveNetwork_shouldInitializeItself()155 public void getActiveNetwork_shouldInitializeItself() { 156 assertThat(connectivityManager.getActiveNetwork()).isNotNull(); 157 } 158 159 @Test 160 @Config(minSdk = M) getActiveNetwork_nullIfNetworkNotActive()161 public void getActiveNetwork_nullIfNetworkNotActive() { 162 shadowOf(connectivityManager).setDefaultNetworkActive(false); 163 assertThat(connectivityManager.getActiveNetwork()).isNull(); 164 } 165 166 @Test 167 @Config(minSdk = M) setActiveNetworkInfo_shouldSetActiveNetwork()168 public void setActiveNetworkInfo_shouldSetActiveNetwork() { 169 shadowOf(connectivityManager).setActiveNetworkInfo(null); 170 assertThat(connectivityManager.getActiveNetworkInfo()).isNull(); 171 shadowOf(connectivityManager) 172 .setActiveNetworkInfo( 173 ShadowNetworkInfo.newInstance( 174 null, 175 ConnectivityManager.TYPE_MOBILE_HIPRI, 176 TelephonyManager.NETWORK_TYPE_EDGE, 177 true, 178 NetworkInfo.State.DISCONNECTED)); 179 180 NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 181 182 assertThat(info.getType()).isEqualTo(ConnectivityManager.TYPE_MOBILE_HIPRI); 183 assertThat(info.getSubtype()).isEqualTo(TelephonyManager.NETWORK_TYPE_EDGE); 184 assertThat(info.isAvailable()).isTrue(); 185 assertThat(info.isConnected()).isFalse(); 186 assertThat(shadowOf(connectivityManager.getActiveNetwork()).getNetId()).isEqualTo(info.getType()); 187 } 188 189 @Test getAllNetworkInfo_shouldReturnAllNetworkInterfaces()190 public void getAllNetworkInfo_shouldReturnAllNetworkInterfaces() { 191 NetworkInfo[] infos = connectivityManager.getAllNetworkInfo(); 192 assertThat(infos).asList().hasSize(2); 193 assertThat(infos).asList().contains(connectivityManager.getActiveNetworkInfo()); 194 195 shadowOf(connectivityManager).setActiveNetworkInfo(null); 196 assertThat(connectivityManager.getAllNetworkInfo()).isEmpty(); 197 } 198 199 @Test getAllNetworkInfo_shouldEqualGetAllNetworks()200 public void getAllNetworkInfo_shouldEqualGetAllNetworks() { 201 // Update the active network so that we're no longer in the default state. 202 NetworkInfo networkInfo = 203 ShadowNetworkInfo.newInstance( 204 NetworkInfo.DetailedState.CONNECTED, 205 ConnectivityManager.TYPE_WIFI, 206 0 /* subType */, 207 true /* isAvailable */, 208 true /* isConnected */); 209 shadowOf(connectivityManager).setActiveNetworkInfo(networkInfo); 210 211 // Verify that getAllNetworks and getAllNetworkInfo match. 212 Network[] networks = connectivityManager.getAllNetworks(); 213 NetworkInfo[] networkInfos = new NetworkInfo[networks.length]; 214 for (int i = 0; i < networks.length; i++) { 215 networkInfos[i] = connectivityManager.getNetworkInfo(networks[i]); 216 assertThat(connectivityManager.getAllNetworkInfo()).asList().contains(networkInfos[i]); 217 } 218 assertThat(networkInfos).hasLength(connectivityManager.getAllNetworkInfo().length); 219 } 220 221 @Test getAllNetworkInfo_nullIfNetworkNotActive()222 public void getAllNetworkInfo_nullIfNetworkNotActive() { 223 shadowOf(connectivityManager).setDefaultNetworkActive(false); 224 assertThat(connectivityManager.getAllNetworkInfo()).isNull(); 225 } 226 227 @Test getAllNetworks_shouldReturnAllNetworks()228 public void getAllNetworks_shouldReturnAllNetworks() { 229 Network[] networks = connectivityManager.getAllNetworks(); 230 assertThat(networks).asList().hasSize(2); 231 } 232 233 @Test getAllNetworks_shouldReturnNoNetworksWhenCleared()234 public void getAllNetworks_shouldReturnNoNetworksWhenCleared() { 235 shadowOf(connectivityManager).clearAllNetworks(); 236 Network[] networks = connectivityManager.getAllNetworks(); 237 assertThat(networks).isEmpty(); 238 } 239 240 @Test getAllNetworks_shouldReturnAddedNetworks()241 public void getAllNetworks_shouldReturnAddedNetworks() { 242 // Let's start clear. 243 shadowOf(connectivityManager).clearAllNetworks(); 244 245 // Add a "VPN network". 246 Network vpnNetwork = ShadowNetwork.newInstance(123); 247 NetworkInfo vpnNetworkInfo = 248 ShadowNetworkInfo.newInstance( 249 NetworkInfo.DetailedState.CONNECTED, 250 ConnectivityManager.TYPE_VPN, 251 0, 252 true, 253 NetworkInfo.State.CONNECTED); 254 shadowOf(connectivityManager).addNetwork(vpnNetwork, vpnNetworkInfo); 255 256 Network[] networks = connectivityManager.getAllNetworks(); 257 assertThat(networks).asList().hasSize(1); 258 259 Network returnedNetwork = networks[0]; 260 assertThat(returnedNetwork).isSameInstanceAs(vpnNetwork); 261 262 NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(returnedNetwork); 263 assertThat(returnedNetworkInfo).isSameInstanceAs(vpnNetworkInfo); 264 } 265 266 @Test getAllNetworks_shouldNotReturnRemovedNetworks()267 public void getAllNetworks_shouldNotReturnRemovedNetworks() { 268 Network wifiNetwork = ShadowNetwork.newInstance(ShadowConnectivityManager.NET_ID_WIFI); 269 shadowOf(connectivityManager).removeNetwork(wifiNetwork); 270 271 Network[] networks = connectivityManager.getAllNetworks(); 272 assertThat(networks).asList().hasSize(1); 273 274 Network returnedNetwork = networks[0]; 275 ShadowNetwork shadowReturnedNetwork = shadowOf(returnedNetwork); 276 assertThat(shadowReturnedNetwork.getNetId()).isNotEqualTo(ShadowConnectivityManager.NET_ID_WIFI); 277 } 278 279 @Test getNetworkPreference_shouldGetDefaultValue()280 public void getNetworkPreference_shouldGetDefaultValue() { 281 assertThat(connectivityManager.getNetworkPreference()).isEqualTo(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE); 282 } 283 284 @Test 285 @Config(minSdk = M) getReportedNetworkConnectivity()286 public void getReportedNetworkConnectivity() { 287 Network wifiNetwork = ShadowNetwork.newInstance(ShadowConnectivityManager.NET_ID_WIFI); 288 connectivityManager.reportNetworkConnectivity(wifiNetwork, true); 289 290 Map<Network, Boolean> reportedNetworks = 291 shadowOf(connectivityManager).getReportedNetworkConnectivity(); 292 assertThat(reportedNetworks.size()).isEqualTo(1); 293 assertThat(reportedNetworks.get(wifiNetwork)).isTrue(); 294 295 // Update the status. 296 connectivityManager.reportNetworkConnectivity(wifiNetwork, false); 297 reportedNetworks = shadowOf(connectivityManager).getReportedNetworkConnectivity(); 298 assertThat(reportedNetworks.size()).isEqualTo(1); 299 assertThat(reportedNetworks.get(wifiNetwork)).isFalse(); 300 } 301 302 @Test setNetworkPreference_shouldSetDefaultValue()303 public void setNetworkPreference_shouldSetDefaultValue() { 304 connectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE); 305 assertThat(connectivityManager.getNetworkPreference()).isEqualTo(connectivityManager.getNetworkPreference()); 306 connectivityManager.setNetworkPreference(ConnectivityManager.TYPE_WIFI); 307 assertThat(connectivityManager.getNetworkPreference()).isEqualTo(ConnectivityManager.TYPE_WIFI); 308 } 309 310 @Test getNetworkCallbacks_shouldHaveEmptyDefault()311 public void getNetworkCallbacks_shouldHaveEmptyDefault() { 312 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).isEmpty(); 313 } 314 createSimpleCallback()315 private static ConnectivityManager.NetworkCallback createSimpleCallback() { 316 return new ConnectivityManager.NetworkCallback() { 317 @Override 318 public void onAvailable(Network network) {} 319 @Override 320 public void onLost(Network network) {} 321 }; 322 } 323 createSimplePendingIntent()324 private static PendingIntent createSimplePendingIntent() { 325 return PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0); 326 } 327 328 @Test requestNetwork_shouldAddCallback()329 public void requestNetwork_shouldAddCallback() { 330 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 331 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 332 connectivityManager.requestNetwork(builder.build(), callback); 333 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 334 } 335 336 @Test registerCallback_shouldAddCallback()337 public void registerCallback_shouldAddCallback() { 338 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 339 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 340 connectivityManager.registerNetworkCallback(builder.build(), callback); 341 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 342 } 343 344 @Test 345 @Config(minSdk = M) registerCallback_withPendingIntent_shouldAddCallback()346 public void registerCallback_withPendingIntent_shouldAddCallback() { 347 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 348 PendingIntent pendingIntent = createSimplePendingIntent(); 349 connectivityManager.registerNetworkCallback(builder.build(), pendingIntent); 350 assertThat(shadowOf(connectivityManager).getNetworkCallbackPendingIntents()).hasSize(1); 351 } 352 353 @Test 354 @Config(minSdk = O) requestNetwork_withTimeout_shouldAddCallback()355 public void requestNetwork_withTimeout_shouldAddCallback() { 356 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 357 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 358 connectivityManager.requestNetwork(builder.build(), callback, 0); 359 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 360 } 361 362 @Test 363 @Config(minSdk = O) requestNetwork_withHandler_shouldAddCallback()364 public void requestNetwork_withHandler_shouldAddCallback() { 365 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 366 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 367 connectivityManager.requestNetwork(builder.build(), callback, new Handler()); 368 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 369 } 370 371 @Test 372 @Config(minSdk = O) requestNetwork_withHandlerAndTimer_shouldAddCallback()373 public void requestNetwork_withHandlerAndTimer_shouldAddCallback() { 374 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 375 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 376 connectivityManager.requestNetwork(builder.build(), callback, new Handler(), 0); 377 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 378 } 379 380 @Test 381 @Config(minSdk = N) registerDefaultCallback_shouldAddCallback()382 public void registerDefaultCallback_shouldAddCallback() { 383 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 384 connectivityManager.registerDefaultNetworkCallback(callback); 385 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 386 } 387 388 @Test 389 @Config(minSdk = O) registerDefaultCallback_withHandler_shouldAddCallback()390 public void registerDefaultCallback_withHandler_shouldAddCallback() { 391 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 392 connectivityManager.registerDefaultNetworkCallback(callback, new Handler()); 393 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 394 } 395 396 @Test 397 @Config(minSdk = S) registerBestMatchingNetworkCallback_shouldAddCallback()398 public void registerBestMatchingNetworkCallback_shouldAddCallback() { 399 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 400 ConnectivityManager.NetworkCallback callback = createSimpleCallback(); 401 connectivityManager.registerBestMatchingNetworkCallback( 402 builder.build(), callback, new Handler()); 403 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 404 } 405 406 @Test unregisterCallback_shouldRemoveCallbacks()407 public void unregisterCallback_shouldRemoveCallbacks() { 408 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 409 // Add two different callbacks. 410 ConnectivityManager.NetworkCallback callback1 = createSimpleCallback(); 411 ConnectivityManager.NetworkCallback callback2 = createSimpleCallback(); 412 connectivityManager.registerNetworkCallback(builder.build(), callback1); 413 connectivityManager.registerNetworkCallback(builder.build(), callback2); 414 // Remove one at the time. 415 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(2); 416 connectivityManager.unregisterNetworkCallback(callback2); 417 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1); 418 connectivityManager.unregisterNetworkCallback(callback1); 419 assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).isEmpty(); 420 } 421 422 @Test 423 @Config(minSdk = M) unregisterCallback_withPendingIntent_shouldRemoveCallbacks()424 public void unregisterCallback_withPendingIntent_shouldRemoveCallbacks() { 425 NetworkRequest.Builder builder = new NetworkRequest.Builder(); 426 // Add two pendingIntents, should treat them as equal based on Intent#filterEquals 427 PendingIntent pendingIntent1 = createSimplePendingIntent(); 428 PendingIntent pendingIntent2 = createSimplePendingIntent(); 429 connectivityManager.registerNetworkCallback(builder.build(), pendingIntent1); 430 connectivityManager.registerNetworkCallback(builder.build(), pendingIntent2); 431 432 assertThat(shadowOf(connectivityManager).getNetworkCallbackPendingIntents()).hasSize(1); 433 connectivityManager.unregisterNetworkCallback(pendingIntent2); 434 assertThat(shadowOf(connectivityManager).getNetworkCallbackPendingIntents()).isEmpty(); 435 } 436 437 @Test unregisterCallback_shouldNotAllowNullCallback()438 public void unregisterCallback_shouldNotAllowNullCallback() { 439 // Verify that exception is thrown. 440 assertThrows( 441 IllegalArgumentException.class, 442 () -> 443 connectivityManager.unregisterNetworkCallback( 444 (ConnectivityManager.NetworkCallback) null)); 445 } 446 447 @Config(minSdk = M) 448 @Test unregisterCallback_withPendingIntent_shouldNotAllowNullCallback()449 public void unregisterCallback_withPendingIntent_shouldNotAllowNullCallback() { 450 // Verify that exception is thrown. 451 assertThrows( 452 IllegalArgumentException.class, 453 () -> connectivityManager.unregisterNetworkCallback((PendingIntent) null)); 454 } 455 456 @Test isActiveNetworkMetered_defaultsToTrue()457 public void isActiveNetworkMetered_defaultsToTrue() { 458 assertThat(connectivityManager.isActiveNetworkMetered()).isTrue(); 459 } 460 461 @Test isActiveNetworkMetered_mobileIsMetered()462 public void isActiveNetworkMetered_mobileIsMetered() { 463 shadowOf(connectivityManager) 464 .setActiveNetworkInfo(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)); 465 assertThat(connectivityManager.isActiveNetworkMetered()).isTrue(); 466 } 467 468 @Test isActiveNetworkMetered_nonMobileIsUnmetered()469 public void isActiveNetworkMetered_nonMobileIsUnmetered() { 470 shadowOf(connectivityManager) 471 .setActiveNetworkInfo(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)); 472 assertThat(connectivityManager.isActiveNetworkMetered()).isFalse(); 473 } 474 475 @Test isActiveNetworkMetered_noActiveNetwork()476 public void isActiveNetworkMetered_noActiveNetwork() { 477 shadowOf(connectivityManager).setActiveNetworkInfo(null); 478 assertThat(connectivityManager.isActiveNetworkMetered()).isFalse(); 479 } 480 481 @Test isActiveNetworkMetered_noDefaultNetworkActive()482 public void isActiveNetworkMetered_noDefaultNetworkActive() { 483 shadowOf(connectivityManager).setDefaultNetworkActive(false); 484 assertThat(connectivityManager.isActiveNetworkMetered()).isFalse(); 485 } 486 487 @Test 488 @Config(minSdk = M) bindProcessToNetwork_shouldGetBoundNetworkForProcess()489 public void bindProcessToNetwork_shouldGetBoundNetworkForProcess() { 490 Network network = ShadowNetwork.newInstance(789); 491 connectivityManager.bindProcessToNetwork(network); 492 assertThat(connectivityManager.getBoundNetworkForProcess()).isSameInstanceAs(network); 493 } 494 495 @Test isDefaultNetworkActive_defaultActive()496 public void isDefaultNetworkActive_defaultActive() { 497 assertThat(shadowOf(connectivityManager).isDefaultNetworkActive()).isTrue(); 498 } 499 500 @Test isDefaultNetworkActive_notActive()501 public void isDefaultNetworkActive_notActive() { 502 shadowOf(connectivityManager).setDefaultNetworkActive(false); 503 assertThat(shadowOf(connectivityManager).isDefaultNetworkActive()).isFalse(); 504 } 505 createSimpleOnNetworkActiveListener()506 private static ConnectivityManager.OnNetworkActiveListener createSimpleOnNetworkActiveListener() { 507 return new ConnectivityManager.OnNetworkActiveListener() { 508 @Override 509 public void onNetworkActive() {} 510 }; 511 } 512 513 @Test addDefaultNetworkActiveListener_shouldAddListener()514 public void addDefaultNetworkActiveListener_shouldAddListener() { 515 ConnectivityManager.OnNetworkActiveListener listener1 = 516 spy(createSimpleOnNetworkActiveListener()); 517 ConnectivityManager.OnNetworkActiveListener listener2 = 518 spy(createSimpleOnNetworkActiveListener()); 519 connectivityManager.addDefaultNetworkActiveListener(listener1); 520 connectivityManager.addDefaultNetworkActiveListener(listener2); 521 522 shadowOf(connectivityManager).setDefaultNetworkActive(true); 523 524 verify(listener1).onNetworkActive(); 525 verify(listener2).onNetworkActive(); 526 } 527 528 @Test removeDefaultNetworkActiveListener_shouldRemoveListeners()529 public void removeDefaultNetworkActiveListener_shouldRemoveListeners() { 530 // Add two different callbacks. 531 ConnectivityManager.OnNetworkActiveListener listener1 = 532 spy(createSimpleOnNetworkActiveListener()); 533 ConnectivityManager.OnNetworkActiveListener listener2 = 534 spy(createSimpleOnNetworkActiveListener()); 535 connectivityManager.addDefaultNetworkActiveListener(listener1); 536 connectivityManager.addDefaultNetworkActiveListener(listener2); 537 538 shadowOf(connectivityManager).setDefaultNetworkActive(true); 539 540 verify(listener1).onNetworkActive(); 541 verify(listener2).onNetworkActive(); 542 // Remove one at the time. 543 connectivityManager.removeDefaultNetworkActiveListener(listener2); 544 545 shadowOf(connectivityManager).setDefaultNetworkActive(true); 546 547 verify(listener1, times(2)).onNetworkActive(); 548 verify(listener2).onNetworkActive(); 549 550 connectivityManager.removeDefaultNetworkActiveListener(listener1); 551 552 shadowOf(connectivityManager).setDefaultNetworkActive(true); 553 554 verify(listener1, times(2)).onNetworkActive(); 555 verify(listener2).onNetworkActive(); 556 } 557 558 @Test removeDefaultNetworkActiveListener_shouldNotAllowNullListener()559 public void removeDefaultNetworkActiveListener_shouldNotAllowNullListener() { 560 // Verify that exception is thrown. 561 assertThrows( 562 IllegalArgumentException.class, 563 () -> connectivityManager.removeDefaultNetworkActiveListener(null)); 564 } 565 566 @Test getNetworkCapabilities()567 public void getNetworkCapabilities() { 568 NetworkCapabilities nc = ShadowNetworkCapabilities.newInstance(); 569 shadowOf(nc).addCapability(NetworkCapabilities.NET_CAPABILITY_MMS); 570 571 shadowOf(connectivityManager).setNetworkCapabilities( 572 shadowOf(connectivityManager).getActiveNetwork(), nc); 573 574 assertThat( 575 shadowOf(connectivityManager) 576 .getNetworkCapabilities(shadowOf(connectivityManager).getActiveNetwork()) 577 .hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) 578 .isTrue(); 579 } 580 581 @Test getNetworkCapabilities_shouldReturnDefaultCapabilities()582 public void getNetworkCapabilities_shouldReturnDefaultCapabilities() { 583 for (Network network : connectivityManager.getAllNetworks()) { 584 NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network); 585 assertThat(nc).isNotNull(); 586 587 int netId = shadowOf(network).getNetId(); 588 if (netId == ShadowConnectivityManager.NET_ID_WIFI) { 589 assertThat(nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)).isTrue(); 590 } 591 if (netId == ShadowConnectivityManager.NET_ID_MOBILE) { 592 assertThat(nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).isTrue(); 593 } 594 } 595 } 596 597 @Test 598 @Config(minSdk = N) getCaptivePortalServerUrl_shouldReturnAddedUrl()599 public void getCaptivePortalServerUrl_shouldReturnAddedUrl() { 600 assertThat(connectivityManager.getCaptivePortalServerUrl()).isEqualTo("http://10.0.0.2"); 601 602 shadowOf(connectivityManager).setCaptivePortalServerUrl("http://10.0.0.1"); 603 assertThat(connectivityManager.getCaptivePortalServerUrl()).isEqualTo("http://10.0.0.1"); 604 605 shadowOf(connectivityManager).setCaptivePortalServerUrl("http://10.0.0.2"); 606 assertThat(connectivityManager.getCaptivePortalServerUrl()).isEqualTo("http://10.0.0.2"); 607 } 608 609 @Test setAirplaneMode()610 public void setAirplaneMode() { 611 connectivityManager.setAirplaneMode(false); 612 assertThat( 613 Settings.Global.getInt( 614 getApplicationContext().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, -1)) 615 .isEqualTo(0); 616 connectivityManager.setAirplaneMode(true); 617 assertThat( 618 Settings.Global.getInt( 619 getApplicationContext().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, -1)) 620 .isEqualTo(1); 621 } 622 623 @Test getLinkProperties()624 public void getLinkProperties() { 625 Network network = shadowOf(connectivityManager).getActiveNetwork(); 626 LinkProperties lp = ReflectionHelpers.callConstructor(LinkProperties.class); 627 shadowOf(connectivityManager).setLinkProperties(network, lp); 628 629 assertThat(connectivityManager.getLinkProperties(network)).isEqualTo(lp); 630 } 631 632 @Test getLinkProperties_shouldReturnNull()633 public void getLinkProperties_shouldReturnNull() { 634 Network network = shadowOf(connectivityManager).getActiveNetwork(); 635 shadowOf(connectivityManager).setLinkProperties(network, null); 636 637 assertThat(connectivityManager.getLinkProperties(network)).isNull(); 638 } 639 640 @Test 641 @Config(minSdk = N) setRestrictBackgroundStatus()642 public void setRestrictBackgroundStatus() { 643 shadowOf(connectivityManager).setRestrictBackgroundStatus(1); 644 assertThat(connectivityManager.getRestrictBackgroundStatus()) 645 .isEqualTo(RESTRICT_BACKGROUND_STATUS_DISABLED); 646 647 shadowOf(connectivityManager).setRestrictBackgroundStatus(2); 648 assertThat(connectivityManager.getRestrictBackgroundStatus()) 649 .isEqualTo(RESTRICT_BACKGROUND_STATUS_WHITELISTED); 650 651 shadowOf(connectivityManager).setRestrictBackgroundStatus(3); 652 assertThat(connectivityManager.getRestrictBackgroundStatus()) 653 .isEqualTo(RESTRICT_BACKGROUND_STATUS_ENABLED); 654 } 655 656 @Test 657 @Config(minSdk = N) setRestrictBackgroundStatus_defaultValueIsDisabled()658 public void setRestrictBackgroundStatus_defaultValueIsDisabled() { 659 assertThat(connectivityManager.getRestrictBackgroundStatus()) 660 .isEqualTo(RESTRICT_BACKGROUND_STATUS_DISABLED); 661 } 662 663 @Config(minSdk = N) 664 @Test setRestrictBackgroundStatus_throwsExceptionOnIncorrectStatus0()665 public void setRestrictBackgroundStatus_throwsExceptionOnIncorrectStatus0() { 666 assertThrows( 667 IllegalArgumentException.class, 668 () -> shadowOf(connectivityManager).setRestrictBackgroundStatus(0)); 669 } 670 671 @Config(minSdk = N) 672 @Test setRestrictBackgroundStatus_throwsExceptionOnIncorrectStatus4()673 public void setRestrictBackgroundStatus_throwsExceptionOnIncorrectStatus4() { 674 assertThrows( 675 IllegalArgumentException.class, 676 () -> shadowOf(connectivityManager).setRestrictBackgroundStatus(4)); 677 } 678 679 @Test checkPollingTetherThreadNotCreated()680 public void checkPollingTetherThreadNotCreated() { 681 for (StackTraceElement[] elements : Thread.getAllStackTraces().values()) { 682 for (StackTraceElement element : elements) { 683 if (element.toString().contains("android.net.TetheringManager")) { 684 throw new RuntimeException("Found polling thread " + Arrays.toString(elements)); 685 } 686 } 687 } 688 } 689 690 @Test 691 @Config(minSdk = M) getProxyForNetwork()692 public void getProxyForNetwork() { 693 Network network = connectivityManager.getActiveNetwork(); 694 connectivityManager.bindProcessToNetwork(network); 695 ProxyInfo proxyInfo = ProxyInfo.buildDirectProxy("10.11.12.13", 1234); 696 697 shadowOf(connectivityManager).setProxyForNetwork(network, proxyInfo); 698 699 assertThat(connectivityManager.getProxyForNetwork(network)).isEqualTo(proxyInfo); 700 assertThat(connectivityManager.getDefaultProxy()).isEqualTo(proxyInfo); 701 } 702 703 @Test 704 @Config(minSdk = M) getProxyForNetwork_shouldReturnNullByDefaultWithBoundProcess()705 public void getProxyForNetwork_shouldReturnNullByDefaultWithBoundProcess() { 706 Network network = connectivityManager.getActiveNetwork(); 707 connectivityManager.bindProcessToNetwork(network); 708 709 assertThat(connectivityManager.getProxyForNetwork(network)).isNull(); 710 assertThat(connectivityManager.getDefaultProxy()).isNull(); 711 } 712 713 @Test 714 @Config(minSdk = M) getProxyForNetwork_shouldReturnNullByDefaultNoBoundProcess()715 public void getProxyForNetwork_shouldReturnNullByDefaultNoBoundProcess() { 716 Network network = connectivityManager.getActiveNetwork(); 717 718 assertThat(connectivityManager.getProxyForNetwork(network)).isNull(); 719 assertThat(connectivityManager.getDefaultProxy()).isNull(); 720 } 721 } 722