package com.bumptech.glide.load.data;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.model.GlideUrl;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = 18)
public class HttpUrlFetcherTest {
@Mock HttpURLConnection urlConnection;
@Mock HttpUrlFetcher.HttpUrlConnectionFactory connectionFactory;
@Mock GlideUrl glideUrl;
@Mock InputStream stream;
@Mock DataFetcher.DataCallback<InputStream> callback;
private static final int TIMEOUT_MS = 100;
private HttpUrlFetcher fetcher;
@Before
public void setUp() throws IOException {
MockitoAnnotations.initMocks(this);
URL url = new URL("http://www.google.com");
when(connectionFactory.build(eq(url))).thenReturn(urlConnection);
when(urlConnection.getInputStream()).thenReturn(stream);
when(urlConnection.getResponseCode()).thenReturn(200);
when(glideUrl.toURL()).thenReturn(url);
fetcher = new HttpUrlFetcher(glideUrl, TIMEOUT_MS, connectionFactory);
}
@Test
public void testSetsReadTimeout() throws IOException {
fetcher.loadData(Priority.HIGH, callback);
verify(urlConnection).setReadTimeout(eq(TIMEOUT_MS));
}
@Test
public void testSetsConnectTimeout() throws IOException {
fetcher.loadData(Priority.IMMEDIATE, callback);
verify(urlConnection).setConnectTimeout(eq(TIMEOUT_MS));
}
@Test
public void testReturnsNullIfCancelledBeforeConnects() throws IOException {
InputStream notExpected = new ByteArrayInputStream(new byte[0]);
when(urlConnection.getInputStream()).thenReturn(notExpected);
fetcher.cancel();
fetcher.loadData(Priority.LOW, callback);
verify(callback).onDataReady(isNull(InputStream.class));
}
@Test
public void testDisconnectsUrlOnCleanup() throws IOException {
fetcher.loadData(Priority.HIGH, callback);
fetcher.cleanup();
verify(urlConnection).disconnect();
}
@Test
public void testDoesNotThrowIfCleanupCalledBeforeStarted() {
fetcher.cleanup();
}
@Test
public void testDoesNotThrowIfCancelCalledBeforeStart() {
fetcher.cancel();
}
@Test
public void testCancelDoesNotDisconnectIfAlreadyConnected()
throws IOException {
fetcher.loadData(Priority.HIGH, callback);
fetcher.cancel();
verify(urlConnection, never()).disconnect();
}
@Test
public void testClosesStreamInCleanupIfNotNull() throws IOException {
fetcher.loadData(Priority.HIGH, callback);
fetcher.cleanup();
verify(stream).close();
}
@Test
public void testClosesStreamBeforeDisconnectingConnection() throws IOException {
fetcher.loadData(Priority.NORMAL, callback);
fetcher.cleanup();
InOrder order = inOrder(stream, urlConnection);
order.verify(stream).close();
order.verify(urlConnection).disconnect();
}
}