package com.bumptech.glide.load.data.mediastore;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.MediaStore;
import com.bumptech.glide.load.ImageHeaderParser;
import com.bumptech.glide.load.engine.bitmap_recycle.ArrayPool;
import com.bumptech.glide.load.engine.bitmap_recycle.LruArrayPool;
import com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
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.fakes.RoboCursor;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = 18)
public class ThumbnailStreamOpenerTest {
private Harness harness;
@Before
public void setUp() {
harness = new Harness();
}
@Test
public void testReturnsNullIfCursorIsNull() throws FileNotFoundException {
when(harness.query.query(eq(harness.uri))).thenReturn(null);
assertNull(harness.get().open(harness.uri));
}
@Test
public void testReturnsNullIfCursorIsEmpty() throws FileNotFoundException {
when(harness.query.query(eq(harness.uri))).thenReturn(new MatrixCursor(new String[1]));
assertNull(harness.get().open(harness.uri));
}
@Test
public void testReturnsNullIfCursorHasEmptyPath() throws FileNotFoundException {
MatrixCursor cursor = new MatrixCursor(new String[1]);
cursor.addRow(new Object[] { "" });
when(harness.query.query(eq(harness.uri))).thenReturn(cursor);
assertNull(harness.get().open(harness.uri));
}
@Test
public void testReturnsNullIfFileDoesNotExist() throws FileNotFoundException {
when(harness.service.get(anyString())).thenReturn(harness.file);
when(harness.service.exists(eq(harness.file))).thenReturn(false);
assertNull(harness.get().open(harness.uri));
}
@Test
public void testReturnNullIfFileLengthIsZero() throws FileNotFoundException {
when(harness.service.get(anyString())).thenReturn(harness.file);
when(harness.service.length(eq(harness.file))).thenReturn(0L);
assertNull(harness.get().open(harness.uri));
}
@Test
public void testClosesCursor() throws FileNotFoundException {
harness.get().open(harness.uri);
assertTrue(harness.cursor.isClosed());
}
@Test
public void testReturnsOpenedInputStreamWhenFileFound() throws FileNotFoundException {
InputStream expected = new ByteArrayInputStream(new byte[0]);
Shadows.shadowOf(RuntimeEnvironment.application.getContentResolver())
.registerInputStream(harness.uri, expected);
assertEquals(expected, harness.get().open(harness.uri));
}
@Test
public void testVideoQueryReturnsVideoCursor() {
Uri queryUri = MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI;
ThumbFetcher.VideoThumbnailQuery query =
new ThumbFetcher.VideoThumbnailQuery(getContentResolver());
RoboCursor testCursor = new RoboCursor();
Shadows.shadowOf(RuntimeEnvironment.application.getContentResolver())
.setCursor(queryUri, testCursor);
assertEquals(testCursor, query.query(harness.uri));
}
@Test
public void testImageQueryReturnsImageCursor() {
Uri queryUri = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI;
ThumbFetcher.ImageThumbnailQuery query =
new ThumbFetcher.ImageThumbnailQuery(getContentResolver());
RoboCursor testCursor = new RoboCursor();
Shadows.shadowOf(RuntimeEnvironment.application.getContentResolver())
.setCursor(queryUri, testCursor);
assertEquals(testCursor, query.query(harness.uri));
}
private static ContentResolver getContentResolver() {
return RuntimeEnvironment.application.getContentResolver();
}
private static class Harness {
MatrixCursor cursor = new MatrixCursor(new String[1]);
File file = new File("fake/uri");
Uri uri = Uri.fromFile(file);
ThumbnailQuery query = mock(ThumbnailQuery.class);
FileService service = mock(FileService.class);
ArrayPool byteArrayPool = new LruArrayPool();
public Harness() {
cursor.addRow(new String[] { file.getAbsolutePath() });
when(query.query(eq(uri))).thenReturn(cursor);
when(service.get(eq(file.getAbsolutePath()))).thenReturn(file);
when(service.exists(eq(file))).thenReturn(true);
when(service.length(eq(file))).thenReturn(1L);
}
public ThumbnailStreamOpener get() {
List<ImageHeaderParser> parsers = new ArrayList<ImageHeaderParser>();
parsers.add(new DefaultImageHeaderParser());
return new ThumbnailStreamOpener(
parsers, service, query, byteArrayPool, getContentResolver());
}
}
}