• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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