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