1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.chrome.browser.image_fetcher; 6 7 import static org.junit.Assert.assertEquals; 8 import static org.junit.Assert.assertFalse; 9 import static org.junit.Assert.assertNotEquals; 10 import static org.junit.Assert.assertTrue; 11 import static org.mockito.ArgumentMatchers.any; 12 import static org.mockito.ArgumentMatchers.eq; 13 import static org.mockito.Mockito.verify; 14 15 import android.graphics.Bitmap; 16 17 import org.junit.Before; 18 import org.junit.Test; 19 import org.junit.runner.RunWith; 20 import org.mockito.Mock; 21 import org.mockito.Mockito; 22 import org.mockito.MockitoAnnotations; 23 import org.robolectric.annotation.Config; 24 25 import org.chromium.base.Callback; 26 import org.chromium.base.test.BaseRobolectricTestRunner; 27 28 import jp.tomorrowkey.android.gifplayer.BaseGifImage; 29 30 /** 31 * Test for ImageFetcher.java. 32 */ 33 @RunWith(BaseRobolectricTestRunner.class) 34 @Config(manifest = Config.NONE) 35 public class ImageFetcherTest { 36 private static final String URL = "https://www.example.com/image"; 37 private static final String CLIENT_NAME = "client"; 38 private static final int WIDTH_PX = 100; 39 private static final int HEIGHT_PX = 200; 40 private static final int EXPIRATION_INTERVAL = 60; 41 42 /** 43 * Concrete implementation for testing purposes. 44 */ 45 private class ImageFetcherForTest extends ImageFetcher { ImageFetcherForTest(ImageFetcherBridge imageFetcherBridge)46 ImageFetcherForTest(ImageFetcherBridge imageFetcherBridge) { 47 super(imageFetcherBridge); 48 } 49 50 @Override fetchGif(final Params params, Callback<BaseGifImage> callback)51 public void fetchGif(final Params params, Callback<BaseGifImage> callback) {} 52 53 @Override fetchImage(final Params params, Callback<Bitmap> callback)54 public void fetchImage(final Params params, Callback<Bitmap> callback) {} 55 56 @Override clear()57 public void clear() {} 58 59 @Override getConfig()60 public int getConfig() { 61 return 0; 62 } 63 64 @Override destroy()65 public void destroy() {} 66 } 67 68 @Mock 69 ImageFetcherBridge mBridge; 70 71 private final Bitmap mBitmap = 72 Bitmap.createBitmap(WIDTH_PX, HEIGHT_PX, Bitmap.Config.ARGB_8888); 73 74 private ImageFetcherForTest mImageFetcher; 75 76 @Before setUp()77 public void setUp() { 78 MockitoAnnotations.initMocks(this); 79 mImageFetcher = Mockito.spy(new ImageFetcherForTest(mBridge)); 80 } 81 82 @Test testResize()83 public void testResize() { 84 Bitmap result = ImageFetcher.resizeImage(mBitmap, WIDTH_PX / 2, HEIGHT_PX / 2); 85 assertNotEquals(result, mBitmap); 86 } 87 88 @Test testResizeBailsOutIfSizeIsZeroOrLess()89 public void testResizeBailsOutIfSizeIsZeroOrLess() { 90 Bitmap result = ImageFetcher.resizeImage(mBitmap, WIDTH_PX - 1, HEIGHT_PX - 1); 91 assertNotEquals(result, mBitmap); 92 93 result = ImageFetcher.resizeImage(mBitmap, 0, HEIGHT_PX); 94 assertEquals(result, mBitmap); 95 96 result = ImageFetcher.resizeImage(mBitmap, WIDTH_PX, 0); 97 assertEquals(result, mBitmap); 98 99 result = ImageFetcher.resizeImage(mBitmap, 0, 0); 100 assertEquals(result, mBitmap); 101 102 result = ImageFetcher.resizeImage(mBitmap, -1, HEIGHT_PX); 103 assertEquals(result, mBitmap); 104 105 result = ImageFetcher.resizeImage(mBitmap, WIDTH_PX, -1); 106 assertEquals(result, mBitmap); 107 } 108 109 @Test testFetchImageNoDimensionsAlias()110 public void testFetchImageNoDimensionsAlias() { 111 mImageFetcher.fetchImage(ImageFetcher.Params.create(URL, CLIENT_NAME), result -> {}); 112 113 // No arguments should alias to 0, 0. 114 verify(mImageFetcher) 115 .fetchImage(eq(ImageFetcher.Params.create(URL, CLIENT_NAME, 0, 0)), any()); 116 } 117 118 @Test testCreateParams()119 public void testCreateParams() { 120 // Verifies params without size specified. 121 ImageFetcher.Params params = ImageFetcher.Params.create(URL, CLIENT_NAME); 122 assertEquals(URL, params.url); 123 assertEquals(CLIENT_NAME, params.clientName); 124 assertEquals(0, params.width); 125 assertEquals(0, params.height); 126 assertEquals(0, params.expirationIntervalMinutes); 127 128 // Verifies params with size. 129 params = ImageFetcher.Params.create(URL, CLIENT_NAME, WIDTH_PX, HEIGHT_PX); 130 assertEquals(URL, params.url); 131 assertEquals(CLIENT_NAME, params.clientName); 132 assertEquals(WIDTH_PX, params.width); 133 assertEquals(HEIGHT_PX, params.height); 134 assertEquals(0, params.expirationIntervalMinutes); 135 } 136 137 @Test testCreateParamsWithExpirationInterval()138 public void testCreateParamsWithExpirationInterval() { 139 // Verifies params with expiration interval. 140 ImageFetcher.Params params = ImageFetcher.Params.createWithExpirationInterval( 141 URL, CLIENT_NAME, WIDTH_PX, HEIGHT_PX, EXPIRATION_INTERVAL); 142 assertEquals(URL, params.url); 143 assertEquals(CLIENT_NAME, params.clientName); 144 assertEquals(WIDTH_PX, params.width); 145 assertEquals(HEIGHT_PX, params.height); 146 assertEquals(EXPIRATION_INTERVAL, params.expirationIntervalMinutes); 147 } 148 149 @Test testParamsEqual()150 public void testParamsEqual() { 151 // Different URLs. 152 ImageFetcher.Params params1 = ImageFetcher.Params.create(URL, CLIENT_NAME); 153 ImageFetcher.Params params2 = ImageFetcher.Params.create("Not the same URL", CLIENT_NAME); 154 assertFalse(params1.equals(params2)); 155 assertFalse(params2.equals(params1)); 156 assertNotEquals(params1.hashCode(), params2.hashCode()); 157 158 // Different width and height. 159 params2 = ImageFetcher.Params.create(URL, CLIENT_NAME, WIDTH_PX, HEIGHT_PX); 160 assertFalse(params1.equals(params2)); 161 assertFalse(params2.equals(params1)); 162 assertNotEquals(params1.hashCode(), params2.hashCode()); 163 164 // Different expiration intervals. 165 params1 = ImageFetcher.Params.createWithExpirationInterval( 166 URL, CLIENT_NAME, WIDTH_PX, HEIGHT_PX, EXPIRATION_INTERVAL); 167 assertFalse(params1.equals(params2)); 168 assertFalse(params2.equals(params1)); 169 assertNotEquals(params1.hashCode(), params2.hashCode()); 170 171 // Same parameters comparison. 172 params2 = ImageFetcher.Params.createWithExpirationInterval( 173 URL, CLIENT_NAME, WIDTH_PX, HEIGHT_PX, EXPIRATION_INTERVAL); 174 assertTrue(params1.equals(params2)); 175 assertTrue(params2.equals(params1)); 176 assertEquals(params1.hashCode(), params2.hashCode()); 177 178 // Edge cases. 179 assertFalse(params1.equals(null)); 180 assertFalse(params1.equals(new String("Params is not a string."))); 181 assertTrue(params1.equals(params1)); 182 } 183 } 184