package com.bumptech.glide.load.engine.cache; import static com.bumptech.glide.load.engine.cache.MemoryCache.ResourceRemovedListener; import static com.bumptech.glide.tests.Util.mockResource; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.TargetApi; import android.content.ComponentCallbacks2; import android.os.Build; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.engine.Resource; import java.security.MessageDigest; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @RunWith(JUnit4.class) @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public class LruResourceCacheTest { private static class TrimClearMemoryCacheHarness { LruResourceCache resourceCache = new LruResourceCache(100); Resource<?> first = mockResource(); Resource<?> second = mockResource(); ResourceRemovedListener listener = mock(ResourceRemovedListener.class); public TrimClearMemoryCacheHarness() { when(first.getSize()).thenReturn(50); when(second.getSize()).thenReturn(50); resourceCache.put(new MockKey(), first); resourceCache.put(new MockKey(), second); resourceCache.setResourceRemovedListener(listener); } } @Test public void testTrimMemoryBackground() { TrimClearMemoryCacheHarness harness = new TrimClearMemoryCacheHarness(); harness.resourceCache.trimMemory(ComponentCallbacks2.TRIM_MEMORY_BACKGROUND); verify(harness.listener).onResourceRemoved(eq(harness.first)); verify(harness.listener).onResourceRemoved(eq(harness.second)); } @Test public void testTrimMemoryModerate() { TrimClearMemoryCacheHarness harness = new TrimClearMemoryCacheHarness(); harness.resourceCache.trimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE); verify(harness.listener).onResourceRemoved(harness.first); verify(harness.listener).onResourceRemoved(harness.second); } @Test public void testTrimMemoryUiHidden() { TrimClearMemoryCacheHarness harness = new TrimClearMemoryCacheHarness(); harness.resourceCache.trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN); verify(harness.listener).onResourceRemoved(harness.first); verify(harness.listener, never()).onResourceRemoved(harness.second); } @Test public void testResourceRemovedListenerIsNotifiedWhenResourceIsRemoved() { LruResourceCache resourceCache = new LruResourceCache(100); Resource<?> resource = mockResource(); when(resource.getSize()).thenReturn(200); ResourceRemovedListener listener = mock(ResourceRemovedListener.class); resourceCache.setResourceRemovedListener(listener); resourceCache.put(new MockKey(), resource); verify(listener).onResourceRemoved(eq(resource)); } @Test public void testSizeIsBasedOnResource() { LruResourceCache resourceCache = new LruResourceCache(100); Resource<?> first = getResource(50); MockKey firstKey = new MockKey(); resourceCache.put(firstKey, first); Resource<?> second = getResource(50); MockKey secondKey = new MockKey(); resourceCache.put(secondKey, second); assertTrue(resourceCache.contains(firstKey)); assertTrue(resourceCache.contains(secondKey)); Resource<?> third = getResource(50); MockKey thirdKey = new MockKey(); resourceCache.put(thirdKey, third); assertFalse(resourceCache.contains(firstKey)); assertTrue(resourceCache.contains(secondKey)); assertTrue(resourceCache.contains(thirdKey)); } private Resource<?> getResource(int size) { Resource<?> resource = mockResource(); when(resource.getSize()).thenReturn(size); return resource; } private static class MockKey implements Key { @Override public void updateDiskCacheKey(MessageDigest messageDigest) { messageDigest.update(toString().getBytes(CHARSET)); } } }