Commit 6a6a2c08 authored by Brandon Wylie's avatar Brandon Wylie Committed by Commit Bot

Add unittests for ImageFetcherBridge

Bug: 1066642
Change-Id: Ice49aa71ce66b2c9586d676255c7593eea484525
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2131220
Commit-Queue: Brandon Wylie <wylieb@chromium.org>
Reviewed-by: default avatarEnder <ender@google.com>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#756126}
parent 89e1c1af
......@@ -90,6 +90,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/history/HistoryDeletionBridgeTest.java",
"junit/src/org/chromium/chrome/browser/homepage/HomepagePolicyManagerTest.java",
"junit/src/org/chromium/chrome/browser/image_fetcher/CachedImageFetcherTest.java",
"junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherBridgeTest.java",
"junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherFactoryTest.java",
"junit/src/org/chromium/chrome/browser/image_fetcher/ImageFetcherTest.java",
"junit/src/org/chromium/chrome/browser/image_fetcher/InMemoryCachedImageFetcherTest.java",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.image_fetcher;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import android.graphics.Bitmap;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.robolectric.annotation.Config;
import org.chromium.base.Callback;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.profiles.Profile;
import jp.tomorrowkey.android.gifplayer.BaseGifImage;
/**
* Test for ImageFetcherBridge.java.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class ImageFetcherBridgeTest {
private static long sNativePointer = 100L;
@Rule
public ExpectedException mExpectedException = ExpectedException.none();
@Mock
ImageFetcherBridge.Natives mNatives;
@Mock
Profile mProfile;
@Mock
Callback<Bitmap> mBitmapCallback;
@Mock
Callback<BaseGifImage> mGifCallback;
ImageFetcherBridge mBridge;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
doReturn(sNativePointer).when(mNatives).init(mProfile);
ImageFetcherBridgeJni.TEST_HOOKS.setInstanceForTesting(mNatives);
mBridge = new ImageFetcherBridge(mProfile);
}
@Test
public void testDestroy() {
mBridge.destroy();
verify(mNatives).destroy(sNativePointer, mBridge);
// Check that calling methods after destroy throw AssertionErrors.
mExpectedException.expect(AssertionError.class);
mExpectedException.expectMessage("destroy called twice");
mBridge.destroy();
mExpectedException.expectMessage("getFilePath called after destroy");
mBridge.getFilePath("");
mExpectedException.expectMessage("fetchGif called after destroy");
mBridge.fetchGif(-1, "", "", null);
mExpectedException.expectMessage("fetchImage called after destroy");
mBridge.fetchImage(-1, "", "", 100, 100, null);
mExpectedException.expectMessage("fetchImage called after destroy");
mBridge.fetchImage(-1, "", "", 100, 100, null);
mExpectedException.expectMessage("reportEvent called after destroy");
mBridge.reportEvent("", -1);
mExpectedException.expectMessage("reportCacheHitTime called after destroy");
mBridge.reportCacheHitTime("", -1L);
mExpectedException.expectMessage("reportTotalFetchTimeFromNative called after destroy");
mBridge.reportTotalFetchTimeFromNative("", -1L);
}
@Test
public void testFetchImage() {
ArgumentCaptor<Callback<Bitmap>> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
final Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
doAnswer((InvocationOnMock invocation) -> {
callbackCaptor.getValue().onResult(bitmap);
return null;
})
.when(mNatives)
.fetchImage(eq(sNativePointer), eq(mBridge), anyInt(), anyString(), anyString(),
callbackCaptor.capture());
mBridge.fetchImage(-1, "", "", 10, 10, mBitmapCallback);
verify(mBitmapCallback).onResult(bitmap);
}
@Test
public void testFetchImage_imageResized() {
ArgumentCaptor<Callback<Bitmap>> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
final Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
doAnswer((InvocationOnMock invocation) -> {
callbackCaptor.getValue().onResult(bitmap);
return null;
})
.when(mNatives)
.fetchImage(eq(sNativePointer), eq(mBridge), anyInt(), anyString(), anyString(),
callbackCaptor.capture());
mBridge.fetchImage(-1, "", "", 100, 100, mBitmapCallback);
ArgumentCaptor<Bitmap> bitmapCaptor = ArgumentCaptor.forClass(Bitmap.class);
verify(mBitmapCallback).onResult(bitmapCaptor.capture());
Bitmap actual = bitmapCaptor.getValue();
Assert.assertNotEquals(
"the bitmap should have been copied when it was resized", bitmap, actual);
Assert.assertEquals(100, actual.getWidth());
Assert.assertEquals(100, actual.getHeight());
}
@Test
public void testFetchGif() {
ArgumentCaptor<Callback<byte[]>> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
doAnswer((InvocationOnMock invocation) -> {
callbackCaptor.getValue().onResult(new byte[] {1, 2, 3});
return null;
})
.when(mNatives)
.fetchImageData(eq(sNativePointer), eq(mBridge), anyInt(), anyString(), anyString(),
callbackCaptor.capture());
mBridge.fetchGif(-1, "", "", mGifCallback);
ArgumentCaptor<BaseGifImage> gifCaptor = ArgumentCaptor.forClass(BaseGifImage.class);
verify(mGifCallback).onResult(gifCaptor.capture());
Assert.assertNotNull(gifCaptor.getValue());
}
@Test
public void testFetchGif_imageDataNull() {
ArgumentCaptor<Callback<byte[]>> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
doAnswer((InvocationOnMock invocation) -> {
callbackCaptor.getValue().onResult(new byte[] {});
return null;
})
.when(mNatives)
.fetchImageData(eq(sNativePointer), eq(mBridge), anyInt(), anyString(), anyString(),
callbackCaptor.capture());
mBridge.fetchGif(-1, "", "", mGifCallback);
verify(mGifCallback).onResult(null);
}
@Test
public void testGetFilePath() {
mBridge.getFilePath("testing is cool");
verify(mNatives).getFilePath(sNativePointer, mBridge, "testing is cool");
}
@Test
public void testReportEvent() {
mBridge.reportEvent("client", 10);
verify(mNatives).reportEvent(sNativePointer, mBridge, "client", 10);
}
@Test
public void testReportCacheHitTime() {
mBridge.reportCacheHitTime("client", 10L);
verify(mNatives).reportCacheHitTime(sNativePointer, mBridge, "client", 10L);
}
@Test
public void testReportTotalFetchTimeFromNative() {
mBridge.reportTotalFetchTimeFromNative("client", 10L);
verify(mNatives).reportTotalFetchTimeFromNative(sNativePointer, mBridge, "client", 10L);
}
@Test
public void testSetupForTesting() {
ImageFetcherBridge.setupForTesting(mBridge);
Assert.assertEquals(mBridge, ImageFetcherBridge.getInstance());
}
}
......@@ -6,6 +6,8 @@ package org.chromium.chrome.browser.image_fetcher;
import android.graphics.Bitmap;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
......@@ -36,13 +38,14 @@ public class ImageFetcherBridge {
/**
* Creates a ImageFetcherBridge for accessing the native ImageFetcher implementation.
*/
public ImageFetcherBridge(Profile profile) {
@VisibleForTesting
ImageFetcherBridge(Profile profile) {
mNativeImageFetcherBridge = ImageFetcherBridgeJni.get().init(profile);
}
/** Cleans up native half of bridge. */
public void destroy() {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge != 0 : "destroy called twice";
ImageFetcherBridgeJni.get().destroy(mNativeImageFetcherBridge, ImageFetcherBridge.this);
mNativeImageFetcherBridge = 0;
}
......@@ -54,7 +57,7 @@ public class ImageFetcherBridge {
* @return The full path to the resource on disk.
*/
public String getFilePath(String url) {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge != 0 : "getFilePath called after destroy";
return ImageFetcherBridgeJni.get().getFilePath(
mNativeImageFetcherBridge, ImageFetcherBridge.this, url);
}
......@@ -69,11 +72,12 @@ public class ImageFetcherBridge {
*/
public void fetchGif(@ImageFetcherConfig int config, String url, String clientName,
Callback<BaseGifImage> callback) {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge != 0 : "fetchGif called after destroy";
ImageFetcherBridgeJni.get().fetchImageData(mNativeImageFetcherBridge,
ImageFetcherBridge.this, config, url, clientName, (byte[] data) -> {
if (data == null || data.length == 0) {
callback.onResult(null);
return;
}
callback.onResult(new BaseGifImage(data));
......@@ -93,7 +97,7 @@ public class ImageFetcherBridge {
*/
public void fetchImage(@ImageFetcherConfig int config, String url, String clientName, int width,
int height, Callback<Bitmap> callback) {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge != 0 : "fetchImage called after destroy";
ImageFetcherBridgeJni.get().fetchImage(mNativeImageFetcherBridge, ImageFetcherBridge.this,
config, url, clientName, (bitmap) -> {
callback.onResult(ImageFetcher.tryToResizeImage(bitmap, width, height));
......@@ -107,7 +111,7 @@ public class ImageFetcherBridge {
* @param eventId The event to report.
*/
public void reportEvent(String clientName, @ImageFetcherEvent int eventId) {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge != 0 : "reportEvent called after destroy";
ImageFetcherBridgeJni.get().reportEvent(
mNativeImageFetcherBridge, ImageFetcherBridge.this, clientName, eventId);
}
......@@ -120,7 +124,7 @@ public class ImageFetcherBridge {
* total duration.
*/
public void reportCacheHitTime(String clientName, long startTimeMillis) {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge != 0 : "reportCacheHitTime called after destroy";
ImageFetcherBridgeJni.get().reportCacheHitTime(
mNativeImageFetcherBridge, ImageFetcherBridge.this, clientName, startTimeMillis);
}
......@@ -133,7 +137,8 @@ public class ImageFetcherBridge {
* total duration.
*/
public void reportTotalFetchTimeFromNative(String clientName, long startTimeMillis) {
assert mNativeImageFetcherBridge != 0;
assert mNativeImageFetcherBridge
!= 0 : "reportTotalFetchTimeFromNative called after destroy";
ImageFetcherBridgeJni.get().reportTotalFetchTimeFromNative(
mNativeImageFetcherBridge, ImageFetcherBridge.this, clientName, startTimeMillis);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment