package com.bumptech.glide; import static com.bumptech.glide.tests.BackgroundUtil.testInBackground; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import com.bumptech.glide.manager.ConnectivityMonitor; import com.bumptech.glide.manager.ConnectivityMonitor.ConnectivityListener; import com.bumptech.glide.manager.ConnectivityMonitorFactory; import com.bumptech.glide.manager.Lifecycle; import com.bumptech.glide.manager.RequestManagerTreeNode; import com.bumptech.glide.manager.RequestTracker; import com.bumptech.glide.tests.BackgroundUtil; import com.bumptech.glide.tests.GlideShadowLooper; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = 18, shadows = GlideShadowLooper.class) public class RequestManagerTest { @Mock Lifecycle lifecycle = mock(Lifecycle.class); @Mock RequestManagerTreeNode treeNode = mock(RequestManagerTreeNode.class); private RequestManager manager; private ConnectivityMonitor connectivityMonitor; private RequestTracker requestTracker; private ConnectivityListener connectivityListener; @Before public void setUp() { MockitoAnnotations.initMocks(this); connectivityMonitor = mock(ConnectivityMonitor.class); ConnectivityMonitorFactory factory = mock(ConnectivityMonitorFactory.class); when(factory.build(isA(Context.class), isA(ConnectivityMonitor.ConnectivityListener.class))) .thenAnswer(new Answer<ConnectivityMonitor>() { @Override public ConnectivityMonitor answer(InvocationOnMock invocation) throws Throwable { connectivityListener = (ConnectivityListener) invocation.getArguments()[1]; return connectivityMonitor; } }); requestTracker = mock(RequestTracker.class); manager = new RequestManager( Glide.get(RuntimeEnvironment.application), lifecycle, treeNode, requestTracker, factory); } @Test public void testPauseRequestsPausesRequests() { manager.pauseRequests(); verify(requestTracker).pauseRequests(); } @Test public void testResumeRequestsResumesRequests() { manager.resumeRequests(); verify(requestTracker).resumeRequests(); } @Test public void testPausesRequestsOnStop() { manager.onStart(); manager.onStop(); verify(requestTracker).pauseRequests(); } @Test public void testResumesRequestsOnStart() { manager.onStart(); verify(requestTracker).resumeRequests(); } @Test public void testClearsRequestsOnDestroy() { manager.onDestroy(); verify(requestTracker).clearRequests(); } @Test public void testAddsConnectivityMonitorToLifecycleWhenConstructed() { verify(lifecycle).addListener(eq(connectivityMonitor)); } @Test public void testAddsSelfToLifecycleWhenConstructed() { verify(lifecycle).addListener(eq(manager)); } @Test public void testRestartsRequestOnConnected() { connectivityListener.onConnectivityChanged(true); verify(requestTracker).restartRequests(); } @Test public void testDoesNotRestartRequestsOnDisconnected() { connectivityListener.onConnectivityChanged(false); verify(requestTracker, never()).restartRequests(); } @Test(expected = RuntimeException.class) public void testThrowsIfResumeCalledOnBackgroundThread() throws InterruptedException { testInBackground(new BackgroundUtil.BackgroundTester() { @Override public void runTest() throws Exception { manager.resumeRequests(); } }); } @Test(expected = RuntimeException.class) public void testThrowsIfPauseCalledOnBackgroundThread() throws InterruptedException { testInBackground(new BackgroundUtil.BackgroundTester() { @Override public void runTest() throws Exception { manager.pauseRequests(); } }); } @Test public void testDelegatesIsPausedToRequestTracker() { when(requestTracker.isPaused()).thenReturn(true); assertTrue(manager.isPaused()); when(requestTracker.isPaused()).thenReturn(false); assertFalse(manager.isPaused()); } }