Commit 7d945f30 authored by Eric Stevenson's avatar Eric Stevenson Committed by Commit Bot

JNI refactor: @NativeMethods conversion (UrlFormatter.java).

This CL was partially generated by
//base/android/jni_generator/jni_refactorer.py.

Some media unit tests needed to be refactored to use JNI mocks as they
depended on an UnsatisfiedLinkError to pass successfully.

In the process, converted MediaNotificationTestTabHolder to use
lambdas for stubbing to make the test code more readable.

Bug: 929661
Change-Id: I5937168ff0b20cd3e980fe08d877c558bfd70bad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1825583Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Reviewed-by: default avatarTommy Li <tommycli@chromium.org>
Commit-Queue: Eric Stevenson <estevenson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699949}
parent 567040bd
......@@ -327,9 +327,7 @@ public class MediaSessionTabHelper implements MediaImageCallback {
try {
URI uri = new URI(origin);
origin = UrlFormatter.formatUrlForSecurityDisplay(origin);
} catch (URISyntaxException | UnsatisfiedLinkError e) {
// UnstatisfiedLinkError can only happen in tests as the natives are not initialized
// yet.
} catch (URISyntaxException e) {
Log.e(TAG, "Unable to parse the origin from the URL. "
+ "Using the full URL instead.");
}
......
......@@ -51,7 +51,7 @@ public class MediaNotificationActionsUpdatedTest extends MediaNotificationManage
doCallRealMethod()
.when(mMockForegroundServiceUtils)
.startForegroundService(any(Intent.class));
mTabHolder = new MediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
mTabHolder = createMediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
}
@Test
......
......@@ -79,7 +79,7 @@ public class MediaNotificationFaviconTest extends MediaNotificationManagerTestBa
doCallRealMethod()
.when(mMockForegroundServiceUtils)
.startForegroundService(any(Intent.class));
mTabHolder = new MediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
mTabHolder = createMediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
}
@Override
......
......@@ -25,6 +25,7 @@ import android.view.KeyEvent;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RuntimeEnvironment;
......@@ -32,6 +33,7 @@ import org.robolectric.shadows.ShadowLog;
import org.robolectric.shadows.ShadowLooper;
import org.chromium.base.ContextUtils;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.media.ui.MediaNotificationManager.ListenerService;
import org.chromium.chrome.browser.notifications.ForegroundServiceUtils;
......@@ -54,6 +56,14 @@ public class MediaNotificationManagerTestBase {
MediaNotificationInfo.Builder mMediaNotificationInfoBuilder;
@Rule
public JniMocker mocker = new JniMocker();
protected MediaNotificationTestTabHolder createMediaNotificationTestTabHolder(
int tabId, String url, String title) {
return new MediaNotificationTestTabHolder(tabId, url, title, mocker);
}
static class MockMediaNotificationManager extends MediaNotificationManager {
public MockMediaNotificationManager(NotificationUmaTracker umaTracker, int notificationId) {
super(umaTracker, notificationId);
......
......@@ -4,17 +4,19 @@
package org.chromium.chrome.browser.media.ui;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.when;
import android.graphics.Bitmap;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.favicon.LargeIconBridge;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.components.url_formatter.UrlFormatterJni;
import org.chromium.content_public.browser.MediaSession;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.WebContents;
......@@ -26,6 +28,8 @@ import java.util.Set;
* Utility class for holding a Tab and relevant objects for media notification tests.
*/
public class MediaNotificationTestTabHolder {
@Mock
UrlFormatter.Natives mUrlFormatterJniMock;
@Mock
WebContents mWebContents;
@Mock
......@@ -47,24 +51,20 @@ public class MediaNotificationTestTabHolder {
}
}
public MediaNotificationTestTabHolder(int tabId, String url, String title) {
public MediaNotificationTestTabHolder(int tabId, String url, String title, JniMocker mocker) {
MockitoAnnotations.initMocks(this);
mocker.mock(UrlFormatterJni.TEST_HOOKS, mUrlFormatterJniMock);
// We don't want this matcher to match the current value of mUrl. Wrapping it in a matcher
// allows us to match on the updated value of mUrl.
when(mUrlFormatterJniMock.formatUrlForSecurityDisplay(
argThat(urlArg -> urlArg.equals(mUrl))))
.thenAnswer(invocation -> mUrl);
when(mTab.getWebContents()).thenReturn(mWebContents);
when(mTab.getId()).thenReturn(tabId);
when(mTab.isIncognito()).thenReturn(false);
when(mTab.getTitle()).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) {
return mTitle;
}
});
when(mTab.getUrl()).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) {
return mUrl;
}
});
when(mTab.getTitle()).thenAnswer(invocation -> mTitle);
when(mTab.getUrl()).thenAnswer(invocation -> mUrl);
MediaSessionTabHelper.sOverriddenMediaSession = mMediaSession;
mMediaSessionTabHelper = new MediaSessionTabHelper(mTab);
......
......@@ -54,7 +54,7 @@ public class MediaNotificationTitleUpdatedTest extends MediaNotificationManagerT
doCallRealMethod()
.when(mMockForegroundServiceUtils)
.startForegroundService(any(Intent.class));
mTabHolder = new MediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
mTabHolder = createMediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
}
@Test
......@@ -136,7 +136,7 @@ public class MediaNotificationTitleUpdatedTest extends MediaNotificationManagerT
mTabHolder.simulateMediaSessionStateChanged(false, false);
MediaNotificationTestTabHolder newTabHolder =
new MediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
createMediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
newTabHolder.simulateMediaSessionStateChanged(true, false);
newTabHolder.simulateTitleUpdated("title3");
......@@ -160,7 +160,7 @@ public class MediaNotificationTitleUpdatedTest extends MediaNotificationManagerT
assertEquals("title1", getDisplayedTitle());
MediaNotificationTestTabHolder newTabHolder =
new MediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
createMediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
newTabHolder.simulateMediaSessionStateChanged(true, false);
newTabHolder.simulateTitleUpdated("title3");
......
......@@ -7,7 +7,9 @@ import("//build/config/android/rules.gni")
android_library("url_formatter_java") {
deps = [
"//base:base_java",
"//base:jni_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
java_files =
[ "java/src/org/chromium/components/url_formatter/UrlFormatter.java" ]
......
......@@ -6,7 +6,9 @@ package org.chromium.components.url_formatter;
import android.text.TextUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/**
* Wrapper for utilities in url_formatter.
......@@ -23,7 +25,7 @@ public final class UrlFormatter {
* - "..." -> null
*/
public static String fixupUrl(String uri) {
return TextUtils.isEmpty(uri) ? null : nativeFixupUrl(uri);
return TextUtils.isEmpty(uri) ? null : UrlFormatterJni.get().fixupUrl(uri);
}
/**
......@@ -42,7 +44,7 @@ public final class UrlFormatter {
* @return Formatted URL.
*/
public static String formatUrlForDisplayOmitScheme(String uri) {
return nativeFormatUrlForDisplayOmitScheme(uri);
return UrlFormatterJni.get().formatUrlForDisplayOmitScheme(uri);
}
/**
......@@ -62,7 +64,7 @@ public final class UrlFormatter {
* @return Formatted URL.
*/
public static String formatUrlForDisplayOmitHTTPScheme(String uri) {
return nativeFormatUrlForDisplayOmitHTTPScheme(uri);
return UrlFormatterJni.get().formatUrlForDisplayOmitHTTPScheme(uri);
}
/**
......@@ -75,7 +77,7 @@ public final class UrlFormatter {
* @return Formatted URL.
*/
public static String formatUrlForCopy(String uri) {
return nativeFormatUrlForCopy(uri);
return UrlFormatterJni.get().formatUrlForCopy(uri);
}
/**
......@@ -85,7 +87,7 @@ public final class UrlFormatter {
* it fails to parse it.
*/
public static String formatUrlForSecurityDisplay(String uri) {
return nativeFormatUrlForSecurityDisplay(uri);
return UrlFormatterJni.get().formatUrlForSecurityDisplay(uri);
}
/**
......@@ -95,13 +97,17 @@ public final class UrlFormatter {
* it fails to parse it.
*/
public static String formatUrlForSecurityDisplayOmitScheme(String uri) {
return nativeFormatUrlForSecurityDisplayOmitScheme(uri);
return UrlFormatterJni.get().formatUrlForSecurityDisplayOmitScheme(uri);
}
private static native String nativeFixupUrl(String url);
private static native String nativeFormatUrlForDisplayOmitScheme(String url);
private static native String nativeFormatUrlForDisplayOmitHTTPScheme(String url);
private static native String nativeFormatUrlForCopy(String url);
private static native String nativeFormatUrlForSecurityDisplay(String url);
private static native String nativeFormatUrlForSecurityDisplayOmitScheme(String url);
@VisibleForTesting
@NativeMethods
public interface Natives {
String fixupUrl(String url);
String formatUrlForDisplayOmitScheme(String url);
String formatUrlForDisplayOmitHTTPScheme(String url);
String formatUrlForCopy(String url);
String formatUrlForSecurityDisplay(String url);
String formatUrlForSecurityDisplayOmitScheme(String url);
}
}
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