1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.messaging.datamodel.media; 17 18 import android.test.suitebuilder.annotation.SmallTest; 19 20 import com.android.messaging.BugleTestCase; 21 import com.android.messaging.FakeFactory; 22 import com.android.messaging.datamodel.MemoryCacheManager; 23 import com.android.messaging.datamodel.media.MediaResourceManager.MediaResourceLoadListener; 24 25 import java.util.concurrent.CountDownLatch; 26 27 @SmallTest 28 public class MediaResourceManagerTest extends BugleTestCase { 29 private static final int KB = 1024; 30 31 // Loaded image resource from the MediaResourceManager callback. 32 private FakeImageResource mImageResource; 33 private BindableMediaRequest<FakeImageResource> mImageRequest; 34 35 @Override 36 protected void setUp() throws Exception { 37 super.setUp(); 38 FakeFactory.register(getTestContext()) 39 .withMemoryCacheManager(new MemoryCacheManager()) 40 .withMediaCacheManager(new FakeMediaCacheManager()); 41 } 42 43 public void testLoadFromCache() { 44 final MediaResourceManager mediaResourceManager = 45 new MediaResourceManager(); 46 MediaCacheManager.get().reclaim(); 47 assertNotNull(mediaResourceManager); 48 49 // Load one image of 1KB 50 loadImage(mediaResourceManager, "image1", 1 * KB, false /* shouldBeCached */, false); 51 assertEquals("image1", mImageResource.getImageId()); 52 final FakeImageResource loadedResource = mImageResource; 53 54 // Load the same image. 55 loadImage(mediaResourceManager, "image1", 1 * KB, true /* shouldBeCached */, false); 56 assertEquals(loadedResource, mImageResource); 57 } 58 59 public void testCacheEviction() { 60 final MediaResourceManager mediaResourceManager = 61 new MediaResourceManager(); 62 MediaCacheManager.get().reclaim(); 63 assertNotNull(mediaResourceManager); 64 65 // Load one image of 1KB 66 loadImage(mediaResourceManager, "image1", 1 * KB, false /* shouldBeCached */, false); 67 assertEquals("image1", mImageResource.getImageId()); 68 69 // Load another image 70 loadImage(mediaResourceManager, "image2", 2 * KB, false /* shouldBeCached */, false); 71 assertEquals("image2", mImageResource.getImageId()); 72 73 // Load another image. This should fill the cache and cause eviction of image1. 74 loadImage(mediaResourceManager, "image3", 2 * KB, false /* shouldBeCached */, false); 75 assertEquals("image3", mImageResource.getImageId()); 76 77 // Load image1. It shouldn't be cached any more. 78 loadImage(mediaResourceManager, "image1", 1 * KB, false /* shouldBeCached */, false); 79 assertEquals("image1", mImageResource.getImageId()); 80 } 81 82 public void testReclaimMemoryFromMediaCache() { 83 final MediaResourceManager mediaResourceManager = 84 new MediaResourceManager(); 85 MediaCacheManager.get().reclaim(); 86 assertNotNull(mediaResourceManager); 87 88 // Load one image of 1KB 89 loadImage(mediaResourceManager, "image1", 1 * KB, false /* shouldBeCached */, false); 90 assertEquals("image1", mImageResource.getImageId()); 91 92 // Purge everything from the cache, now the image should no longer be cached. 93 MediaCacheManager.get().reclaim(); 94 95 // The image resource should have no ref left. 96 assertEquals(0, mImageResource.getRefCount()); 97 assertTrue(mImageResource.isClosed()); 98 loadImage(mediaResourceManager, "image1", 1 * KB, false /* shouldBeCached */, false); 99 assertEquals("image1", mImageResource.getImageId()); 100 } 101 102 public void testLoadInvalidImage() { 103 final MediaResourceManager mediaResourceManager = 104 new MediaResourceManager(); 105 MediaCacheManager.get().reclaim(); 106 assertNotNull(mediaResourceManager); 107 108 // Test the failure case with invalid resource. 109 loadImage(mediaResourceManager, FakeImageRequest.INVALID_KEY, 1 * KB, false, 110 true /* shouldFail */); 111 } 112 113 public void testLoadImageSynchronously() { 114 final MediaResourceManager mediaResourceManager = 115 new MediaResourceManager(); 116 MediaCacheManager.get().reclaim(); 117 assertNotNull(mediaResourceManager); 118 119 // Test a normal sync load. 120 final FakeImageRequest request = new FakeImageRequest("image1", 1 * KB); 121 final FakeImageResource resource = mediaResourceManager.requestMediaResourceSync(request); 122 assertNotNull(resource); 123 assertFalse(resource.isClosed()); 124 assertNotSame(0, resource.getRefCount()); 125 resource.release(); 126 127 // Test a failed sync load. 128 final FakeImageRequest invalidRequest = 129 new FakeImageRequest(FakeImageRequest.INVALID_KEY, 1 * KB); 130 assertNull(mediaResourceManager.requestMediaResourceSync(invalidRequest)); 131 } 132 133 private void loadImage(final MediaResourceManager manager, final String key, 134 final int size, final boolean shouldBeCached, final boolean shouldFail) { 135 try { 136 final CountDownLatch signal = new CountDownLatch(1); 137 mImageRequest = AsyncMediaRequestWrapper.createWith(new FakeImageRequest(key, size), 138 createAssertListener(shouldBeCached, shouldFail, signal)); 139 mImageRequest.bind("1"); 140 manager.requestMediaResourceAsync(mImageRequest); 141 142 // Wait for the asynchronous callback before proceeding. 143 signal.await(); 144 } catch (final InterruptedException e) { 145 fail("Something interrupted the signal await."); 146 } 147 } 148 149 private MediaResourceLoadListener<FakeImageResource> createAssertListener( 150 final boolean shouldBeCached, final boolean shouldFail, final CountDownLatch signal) { 151 return new MediaResourceLoadListener<FakeImageResource>() { 152 @Override 153 public void onMediaResourceLoaded(final MediaRequest<FakeImageResource> request, 154 final FakeImageResource resource, final boolean isCached) { 155 assertEquals(mImageRequest, request); 156 assertNotNull(resource); 157 assertFalse(resource.isClosed()); 158 assertNotSame(0, resource.getRefCount()); 159 assertFalse(shouldFail); 160 assertEquals(shouldBeCached, resource.getCached()); 161 resource.setCached(true); 162 mImageResource = resource; 163 signal.countDown(); 164 } 165 166 @Override 167 public void onMediaResourceLoadError( 168 final MediaRequest<FakeImageResource> request, final Exception exception) { 169 assertTrue(shouldFail); 170 mImageResource = null; 171 signal.countDown(); 172 }}; 173 } 174 } 175