16c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick/* 26c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * Copyright (C) 2015 The Android Open Source Project 36c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * 46c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * Licensed under the Apache License, Version 2.0 (the "License"); 56c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * you may not use this file except in compliance with the License. 66c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * You may obtain a copy of the License at 76c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * 86c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * http://www.apache.org/licenses/LICENSE-2.0 96c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * 106c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * Unless required by applicable law or agreed to in writing, software 116c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * distributed under the License is distributed on an "AS IS" BASIS, 126c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * See the License for the specific language governing permissions and 146c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick * limitations under the License. 156c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick */ 166c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 176c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickpackage com.android.volley.toolbox; 186c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 196c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport android.graphics.Bitmap; 20e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmannimport android.widget.ImageView; 216c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport com.android.volley.Request; 226c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport com.android.volley.RequestQueue; 236c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport org.junit.Assert; 246c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport org.junit.Before; 256c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport org.junit.Test; 266c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport org.junit.runner.RunWith; 276c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport org.robolectric.RobolectricTestRunner; 286c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 29e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmannimport static org.junit.Assert.assertNotNull; 306c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickimport static org.mockito.Mockito.*; 316c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 326c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick@RunWith(RobolectricTestRunner.class) 336c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrickpublic class ImageLoaderTest { 346c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick private RequestQueue mRequestQueue; 356c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick private ImageLoader.ImageCache mImageCache; 366c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick private ImageLoader mImageLoader; 376c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 386c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick @Before 396c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick public void setUp() { 406c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick mRequestQueue = mock(RequestQueue.class); 416c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick mImageCache = mock(ImageLoader.ImageCache.class); 426c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick mImageLoader = new ImageLoader(mRequestQueue, mImageCache); 436c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick } 446c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 456c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick @Test 466c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick public void isCachedChecksCache() throws Exception { 476c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick when(mImageCache.getBitmap(anyString())).thenReturn(null); 486c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick Assert.assertFalse(mImageLoader.isCached("http://foo", 0, 0)); 496c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick } 506c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 516c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick @Test 526c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick public void getWithCacheHit() throws Exception { 536c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick Bitmap bitmap = Bitmap.createBitmap(1, 1, null); 546c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick ImageLoader.ImageListener listener = mock(ImageLoader.ImageListener.class); 556c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick when(mImageCache.getBitmap(anyString())).thenReturn(bitmap); 566c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick ImageLoader.ImageContainer ic = mImageLoader.get("http://foo", listener); 576c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick Assert.assertSame(bitmap, ic.getBitmap()); 586c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick verify(listener).onResponse(ic, true); 596c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick } 606c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 616c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick @Test 626c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick public void getWithCacheMiss() throws Exception { 636c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick when(mImageCache.getBitmap(anyString())).thenReturn(null); 646c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick ImageLoader.ImageListener listener = mock(ImageLoader.ImageListener.class); 656c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick // Ask for the image to be loaded. 666c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick mImageLoader.get("http://foo", listener); 676c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick // Second pass to test deduping logic. 686c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick mImageLoader.get("http://foo", listener); 696c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick // Response callback should be called both times. 706c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick verify(listener, times(2)).onResponse(any(ImageLoader.ImageContainer.class), eq(true)); 716c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick // But request should be enqueued only once. 726c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick verify(mRequestQueue, times(1)).add(any(Request.class)); 736c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick } 746c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 756c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick @Test 766c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick public void publicMethods() throws Exception { 776c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick // Catch API breaking changes. 786c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick ImageLoader.getImageListener(null, -1, -1); 796c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick mImageLoader.setBatchedResponseDelay(1000); 80e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann 81e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getConstructor(RequestQueue.class, 82e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann ImageLoader.ImageCache.class)); 83e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann 84e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getMethod("getImageListener", ImageView.class, 85e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann int.class, int.class)); 86e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getMethod("isCached", String.class, int.class, int.class)); 87d95219cb1c414de049f90c97fccad638b11bdc85Ralph Bergmann assertNotNull(ImageLoader.class.getMethod("isCached", String.class, int.class, int.class, 88d95219cb1c414de049f90c97fccad638b11bdc85Ralph Bergmann ImageView.ScaleType.class)); 89e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getMethod("get", String.class, 90e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann ImageLoader.ImageListener.class)); 91e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getMethod("get", String.class, 92e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann ImageLoader.ImageListener.class, int.class, int.class)); 93e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getMethod("get", String.class, 94e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann ImageLoader.ImageListener.class, int.class, int.class, ImageView.ScaleType.class)); 95e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.class.getMethod("setBatchedResponseDelay", int.class)); 96e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann 97e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann assertNotNull(ImageLoader.ImageListener.class.getMethod("onResponse", 98e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann ImageLoader.ImageContainer.class, boolean.class)); 996c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick } 1006c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick} 1016c9de79451d6f9410c006e4b17d3d07fae12b273Ficus Kirkpatrick 102