package com.bumptech.glide.load.data; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import com.bumptech.glide.Priority; import java.io.Closeable; import java.io.FileNotFoundException; import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = 18) public class LocalUriFetcherTest { private TestLocalUriFetcher fetcher; @Mock DataFetcher.DataCallback<Closeable> callback; @Before public void setUp() { MockitoAnnotations.initMocks(this); fetcher = new TestLocalUriFetcher(RuntimeEnvironment.application, Uri.parse("content://empty")); } @Test public void testClosesDataOnCleanup() throws Exception { fetcher.loadData(Priority.NORMAL, callback); fetcher.cleanup(); verify(fetcher.closeable).close(); } @Test public void testDoesNotCloseNullData() throws IOException { fetcher.cleanup(); verify(fetcher.closeable, never()).close(); } @Test public void testHandlesExceptionOnClose() throws Exception { fetcher.loadData(Priority.NORMAL, callback); doThrow(new IOException("Test")).when(fetcher.closeable).close(); fetcher.cleanup(); verify(fetcher.closeable).close(); } private static class TestLocalUriFetcher extends LocalUriFetcher<Closeable> { final Closeable closeable = mock(Closeable.class); public TestLocalUriFetcher(Context context, Uri uri) { super(context.getContentResolver(), uri); } @Override protected Closeable loadResource(Uri uri, ContentResolver contentResolver) throws FileNotFoundException { return closeable; } @Override protected void close(Closeable data) throws IOException { data.close(); } @Override public Class<Closeable> getDataClass() { return Closeable.class; } } }