package com.bumptech.glide.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.bumptech.glide.load.resource.bitmap.RecyclableBufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketTimeoutException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class ExceptionCatchingInputStreamTest { private RecyclableBufferedInputStream wrapped; private ExceptionCatchingInputStream is; @Before public void setUp() throws Exception { wrapped = mock(RecyclableBufferedInputStream.class); is = new ExceptionCatchingInputStream(); is.setInputStream(wrapped); } @After public void tearDown() { ExceptionCatchingInputStream.clearQueue(); } @Test public void testReturnsWrappedAvailable() throws IOException { when(wrapped.available()).thenReturn(25); assertEquals(25, is.available()); } @Test public void testCallsCloseOnWrapped() throws IOException { is.close(); verify(wrapped).close(); } @Test public void testCallsMarkOnWrapped() { int toMark = 50; is.mark(toMark); verify(wrapped).mark(eq(toMark)); } @Test public void testReturnsWrappedMarkSupported() { when(wrapped.markSupported()).thenReturn(true); assertTrue(is.markSupported()); } @Test public void testCallsReadByteArrayOnWrapped() throws IOException { byte[] buffer = new byte[100]; when(wrapped.read(eq(buffer))).thenReturn(buffer.length); assertEquals(buffer.length, is.read(buffer)); } @Test public void testCallsReadArrayWithOffsetAndCountOnWrapped() throws IOException { int offset = 5; int count = 100; byte[] buffer = new byte[105]; when(wrapped.read(eq(buffer), eq(offset), eq(count))).thenReturn(count); assertEquals(count, is.read(buffer, offset, count)); } @Test public void testCallsReadOnWrapped() throws IOException { when(wrapped.read()).thenReturn(1); assertEquals(1, is.read()); } @Test public void testCallsResetOnWrapped() throws IOException { is.reset(); verify(wrapped).reset(); } @Test public void testCallsSkipOnWrapped() throws IOException { long toSkip = 67; long expected = 55; when(wrapped.skip(eq(toSkip))).thenReturn(expected); assertEquals(expected, is.skip(toSkip)); } @Test public void testCatchesExceptionOnRead() throws IOException { IOException expected = new SocketTimeoutException(); when(wrapped.read()).thenThrow(expected); int read = is.read(); assertEquals(-1, read); assertEquals(expected, is.getException()); } @Test public void testCatchesExceptionOnReadBuffer() throws IOException { IOException exception = new SocketTimeoutException(); when(wrapped.read(any(byte[].class))).thenThrow(exception); int read = is.read(new byte[0]); assertEquals(-1, read); assertEquals(exception, is.getException()); } @Test public void testCatchesExceptionOnReadBufferWithOffsetAndCount() throws IOException { IOException exception = new SocketTimeoutException(); when(wrapped.read(any(byte[].class), anyInt(), anyInt())).thenThrow(exception); int read = is.read(new byte[0], 10, 100); assertEquals(-1, read); assertEquals(exception, is.getException()); } @Test public void testCatchesExceptionOnSkip() throws IOException { IOException exception = new SocketTimeoutException(); when(wrapped.skip(anyLong())).thenThrow(exception); long skipped = is.skip(100); assertEquals(0, skipped); assertEquals(exception, is.getException()); } @Test public void testExceptionIsNotSetInitially() { assertNull(is.getException()); } @SuppressWarnings("ResultOfMethodCallIgnored") @Test public void testResetsExceptionToNullOnRelease() throws IOException { IOException exception = new SocketTimeoutException(); when(wrapped.read()).thenThrow(exception); is.read(); is.release(); assertNull(is.getException()); } @Test public void testCanReleaseAnObtainFromPool() { is.release(); InputStream fromPool = ExceptionCatchingInputStream.obtain(wrapped); assertEquals(is, fromPool); } @Test public void testCanObtainNewStreamFromPool() throws IOException { InputStream fromPool = ExceptionCatchingInputStream.obtain(wrapped); when(wrapped.read()).thenReturn(1); int read = fromPool.read(); assertEquals(1, read); } }