package com.bumptech.glide.manager;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.shadows.ShadowConnectivityManager;
import org.robolectric.shadows.ShadowNetworkInfo;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = 18)
public class DefaultConnectivityMonitorTest {
private ConnectivityMonitor.ConnectivityListener listener;
private DefaultConnectivityMonitor monitor;
@Before
public void setUp() {
listener = mock(ConnectivityMonitor.ConnectivityListener.class);
monitor = new DefaultConnectivityMonitor(RuntimeEnvironment.application, listener);
}
@Test
public void testRegistersReceiverOnStart() {
monitor.onStart();
assertThat(getConnectivityReceivers()).hasSize(1);
}
@Test
public void testDoesNotRegisterTwiceOnStart() {
monitor.onStart();
monitor.onStart();
assertThat(getConnectivityReceivers()).hasSize(1);
}
@Test
public void testUnregistersReceiverOnStop() {
monitor.onStart();
monitor.onStop();
assertThat(getConnectivityReceivers()).isEmpty();
}
@Test
public void testHandlesUnregisteringTwiceInARow() {
monitor.onStop();
monitor.onStop();
assertThat(getConnectivityReceivers()).isEmpty();
}
@Test
public void testDoesNotNotifyListenerIfConnectedAndBecomesConnected() {
ConnectivityHarness harness = new ConnectivityHarness();
harness.connect();
monitor.onStart();
harness.broadcast();
verify(listener, never()).onConnectivityChanged(anyBoolean());
}
@Test
public void testNotifiesListenerIfConnectedAndBecomesDisconnected() {
ConnectivityHarness harness = new ConnectivityHarness();
harness.connect();
monitor.onStart();
harness.disconnect();
harness.broadcast();
verify(listener).onConnectivityChanged(eq(false));
}
@Test
public void testNotifiesListenerIfDisconnectedAndBecomesConnected() {
ConnectivityHarness harness = new ConnectivityHarness();
harness.disconnect();
monitor.onStart();
harness.connect();
harness.broadcast();
verify(listener).onConnectivityChanged(eq(true));
}
@Test
public void testDoesNotNotifyListenerWhenNotRegistered() {
ConnectivityHarness harness = new ConnectivityHarness();
harness.disconnect();
monitor.onStart();
monitor.onStop();
harness.connect();
harness.broadcast();
verify(listener, never()).onConnectivityChanged(anyBoolean());
}
private List<BroadcastReceiver> getConnectivityReceivers() {
Intent connectivity = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
return ShadowApplication.getInstance().getReceiversForIntent(connectivity);
}
private static class ConnectivityHarness {
private final ShadowConnectivityManager shadowConnectivityManager;
public ConnectivityHarness() {
ConnectivityManager connectivityManager = (ConnectivityManager) RuntimeEnvironment.application
.getSystemService(Context.CONNECTIVITY_SERVICE);
shadowConnectivityManager = Shadows.shadowOf(connectivityManager);
}
public void disconnect() {
shadowConnectivityManager.setActiveNetworkInfo(null);
}
public void connect() {
NetworkInfo networkInfo =
ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, 0, 0, true, true);
shadowConnectivityManager.setActiveNetworkInfo(networkInfo);
}
public void broadcast() {
Intent connected = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
ShadowApplication.getInstance().sendBroadcast(connected);
}
}
}