package com.bumptech.glide.load.model; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; import android.net.Uri; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.tests.Util; import java.io.File; 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; /** * Tests for the {@link com.bumptech.glide.load.model.StringLoader} class. */ @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = 18) public class StringLoaderTest { // Not a magic number, just an arbitrary non zero value. private static final int IMAGE_SIDE = 100; @Mock ModelLoader<Uri, Object> uriLoader; @Mock DataFetcher<Object> fetcher; @Mock Key key; private StringLoader<Object> loader; private Options options; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); options = new Options(); when(uriLoader.handles(any(Uri.class))).thenReturn(true); loader = new StringLoader<>(uriLoader); } @Test public void testHandlesPaths() throws IOException { // TODO on windows it will fail with schema being the drive letter (C:\... -> C) assumeTrue(!Util.isWindows()); File f = RuntimeEnvironment.application.getCacheDir(); Uri expected = Uri.fromFile(f); when(uriLoader.buildLoadData(eq(expected), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(f.getAbsolutePath())); assertEquals(fetcher, loader.buildLoadData(f.getAbsolutePath(), IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testCanHandleComplexFilePaths() { assumeTrue(!Util.isWindows()); String testPath = "/storage/emulated/0/DCIM/Camera/IMG_20140520_100001:nopm:.jpg,mimeType=image/jpeg," + "2448x3264,orientation=0,date=Tue"; Uri expected = Uri.fromFile(new File(testPath)); when(uriLoader.buildLoadData(eq(expected), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(testPath)); assertEquals(fetcher, loader.buildLoadData(testPath, IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testHandlesFileUris() throws IOException { File f = RuntimeEnvironment.application.getCacheDir(); Uri expected = Uri.fromFile(f); when(uriLoader.buildLoadData(eq(expected), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(f.getAbsolutePath())); assertEquals(fetcher, loader.buildLoadData(expected.toString(), IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testHandlesResourceUris() throws IOException { Uri resourceUri = Uri.parse("android.resource://com.bumptech.glide.tests/raw/ic_launcher"); when(uriLoader.buildLoadData(eq(resourceUri), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(resourceUri.toString())); assertEquals(fetcher, loader.buildLoadData(resourceUri.toString(), IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testHandlesHttp() { String url = "http://www.google.com"; Uri expected = Uri.parse(url); when(uriLoader.buildLoadData(eq(expected), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(url)); assertEquals(fetcher, loader.buildLoadData(url, IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testHandlesHttps() { String url = "https://www.google.com"; Uri expected = Uri.parse(url); when(uriLoader.buildLoadData(eq(expected), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(url)); assertEquals(fetcher, loader.buildLoadData(url, IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testHandlesContent() { String content = "content://com.bumptech.glide"; Uri expected = Uri.parse(content); when(uriLoader.buildLoadData(eq(expected), eq(IMAGE_SIDE), eq(IMAGE_SIDE), eq(options))) .thenReturn(new ModelLoader.LoadData<>(key, fetcher)); assertTrue(loader.handles(content)); assertEquals(fetcher, loader.buildLoadData(content, IMAGE_SIDE, IMAGE_SIDE, options).fetcher); } @Test public void testGetResourceFetcher_withEmptyString_returnsNull() { assertThat(loader.buildLoadData("", IMAGE_SIDE, IMAGE_SIDE, options)).isNull(); assertThat(loader.buildLoadData(" ", IMAGE_SIDE, IMAGE_SIDE, options)).isNull(); assertThat(loader.buildLoadData(" \n", IMAGE_SIDE, IMAGE_SIDE, options)).isNull(); } }