0

Android: Convert more legacy JNI calls to Proxy Natives

Hopefully this is the last batch

Bug: 1407278
Change-Id: Ic82a056d8bb6631ffdd39426d63ad92bbe05abeb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4174393
Reviewed-by: Sam Maier <smaier@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1093528}
This commit is contained in:
Andrew Grieve
2023-01-17 21:13:31 +00:00
committed by Chromium LUCI CQ
parent 896f391d74
commit ec09b3a7e8
39 changed files with 361 additions and 321 deletions
chrome
android
javatests
browser
test
BUILD.gn
android
test_support
src
org
chromium
components/heap_profiling/multi_process
BUILD.gnheap_profiling_test_shim.ccheap_profiling_test_shim.h
javatests
src
org
chromium
components
heap_profiling
content/public/test/android
device
BUILD.gn
bluetooth
test
android
java
src
org
chromium
device
bluetooth
mojo/public/java/system
net
testing/android/native_test
url

@ -10,6 +10,7 @@ import org.junit.Assert;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.task.PostTask; import org.chromium.base.task.PostTask;
import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.CriteriaHelper;
@ -31,7 +32,8 @@ import java.util.concurrent.atomic.AtomicReference;
public class OfflineTestUtil { public class OfflineTestUtil {
// Forces request coordinator to process the requests in the queue. // Forces request coordinator to process the requests in the queue.
public static void startRequestCoordinatorProcessing() { public static void startRequestCoordinatorProcessing() {
TestThreadUtils.runOnUiThreadBlocking(() -> nativeStartRequestCoordinatorProcessing()); TestThreadUtils.runOnUiThreadBlocking(
() -> OfflineTestUtilJni.get().startRequestCoordinatorProcessing());
} }
// Gets all the URLs in the request queue. // Gets all the URLs in the request queue.
@ -39,7 +41,7 @@ public class OfflineTestUtil {
final AtomicReference<SavePageRequest[]> result = new AtomicReference<>(); final AtomicReference<SavePageRequest[]> result = new AtomicReference<>();
final CallbackHelper callbackHelper = new CallbackHelper(); final CallbackHelper callbackHelper = new CallbackHelper();
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
nativeGetRequestsInQueue((SavePageRequest[] requests) -> { OfflineTestUtilJni.get().getRequestsInQueue((SavePageRequest[] requests) -> {
result.set(requests); result.set(requests);
callbackHelper.notifyCalled(); callbackHelper.notifyCalled();
}); });
@ -54,10 +56,11 @@ public class OfflineTestUtil {
new AtomicReference<List<OfflinePageItem>>(); new AtomicReference<List<OfflinePageItem>>();
final CallbackHelper callbackHelper = new CallbackHelper(); final CallbackHelper callbackHelper = new CallbackHelper();
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
nativeGetAllPages(new ArrayList<OfflinePageItem>(), (List<OfflinePageItem> items) -> { OfflineTestUtilJni.get().getAllPages(
result.set(items); new ArrayList<OfflinePageItem>(), (List<OfflinePageItem> items) -> {
callbackHelper.notifyCalled(); result.set(items);
}); callbackHelper.notifyCalled();
});
}); });
callbackHelper.waitForCallback(0); callbackHelper.waitForCallback(0);
return result.get(); return result.get();
@ -69,7 +72,7 @@ public class OfflineTestUtil {
final CallbackHelper callbackHelper = new CallbackHelper(); final CallbackHelper callbackHelper = new CallbackHelper();
final AtomicReference<String> result = new AtomicReference<String>(); final AtomicReference<String> result = new AtomicReference<String>();
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
nativeDumpRequestCoordinatorState((String dump) -> { OfflineTestUtilJni.get().dumpRequestCoordinatorState((String dump) -> {
result.set(dump); result.set(dump);
callbackHelper.notifyCalled(); callbackHelper.notifyCalled();
}); });
@ -108,7 +111,7 @@ public class OfflineTestUtil {
final AtomicReference<byte[]> result = new AtomicReference<>(); final AtomicReference<byte[]> result = new AtomicReference<>();
final CallbackHelper callbackHelper = new CallbackHelper(); final CallbackHelper callbackHelper = new CallbackHelper();
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
nativeGetRawThumbnail(offlineId, (byte[] rawThumbnail) -> { OfflineTestUtilJni.get().getRawThumbnail(offlineId, (byte[] rawThumbnail) -> {
result.set(rawThumbnail); result.set(rawThumbnail);
callbackHelper.notifyCalled(); callbackHelper.notifyCalled();
}); });
@ -147,21 +150,24 @@ public class OfflineTestUtil {
public static void interceptWithOfflineError(String url) throws TimeoutException { public static void interceptWithOfflineError(String url) throws TimeoutException {
final CallbackHelper callbackHelper = new CallbackHelper(); final CallbackHelper callbackHelper = new CallbackHelper();
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
nativeInterceptWithOfflineError(url, () -> callbackHelper.notifyCalled()); OfflineTestUtilJni.get().interceptWithOfflineError(
url, () -> callbackHelper.notifyCalled());
}); });
callbackHelper.waitForCallback(0); callbackHelper.waitForCallback(0);
} }
// Clears all previous intercepts installed by interceptWithOfflineError. // Clears all previous intercepts installed by interceptWithOfflineError.
public static void clearIntercepts() { public static void clearIntercepts() {
TestThreadUtils.runOnUiThreadBlocking(() -> nativeClearIntercepts()); TestThreadUtils.runOnUiThreadBlocking(() -> OfflineTestUtilJni.get().clearIntercepts());
} }
// Waits for the connectivity state to change in the native network change notifier. // Waits for the connectivity state to change in the native network change notifier.
public static void waitForConnectivityState(boolean connected) { public static void waitForConnectivityState(boolean connected) {
AtomicBoolean done = new AtomicBoolean(); AtomicBoolean done = new AtomicBoolean();
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> nativeWaitForConnectivityState(connected, () -> done.set(true))); ()
-> OfflineTestUtilJni.get().waitForConnectivityState(
connected, () -> done.set(true)));
CriteriaHelper.pollInstrumentationThread(() -> done.get()); CriteriaHelper.pollInstrumentationThread(() -> done.get());
} }
@ -169,22 +175,26 @@ public class OfflineTestUtil {
// also ensures that the server-enabled check is due. // also ensures that the server-enabled check is due.
public static void setPrefetchingEnabledByServer(boolean enabled) { public static void setPrefetchingEnabledByServer(boolean enabled) {
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> { nativeSetPrefetchingEnabledByServer(enabled); }); () -> { OfflineTestUtilJni.get().setPrefetchingEnabledByServer(enabled); });
} }
public static void setGCMTokenForTesting(String gcmToken) { public static void setGCMTokenForTesting(String gcmToken) {
TestThreadUtils.runOnUiThreadBlocking(() -> { nativeSetGCMTokenForTesting(gcmToken); }); TestThreadUtils.runOnUiThreadBlocking(
() -> { OfflineTestUtilJni.get().setGCMTokenForTesting(gcmToken); });
} }
private static native void nativeGetRequestsInQueue(Callback<SavePageRequest[]> callback); @NativeMethods
private static native void nativeGetAllPages( interface Natives {
List<OfflinePageItem> offlinePages, final Callback<List<OfflinePageItem>> callback); void getRequestsInQueue(Callback<SavePageRequest[]> callback);
private static native void nativeGetRawThumbnail(long offlineId, Callback<byte[]> callback); void getAllPages(
private static native void nativeStartRequestCoordinatorProcessing(); List<OfflinePageItem> offlinePages, final Callback<List<OfflinePageItem>> callback);
private static native void nativeInterceptWithOfflineError(String url, Runnable readyRunnable); void getRawThumbnail(long offlineId, Callback<byte[]> callback);
private static native void nativeClearIntercepts(); void startRequestCoordinatorProcessing();
private static native void nativeDumpRequestCoordinatorState(Callback<String> callback); void interceptWithOfflineError(String url, Runnable readyRunnable);
private static native void nativeWaitForConnectivityState(boolean connected, Runnable callback); void clearIntercepts();
private static native void nativeSetPrefetchingEnabledByServer(boolean enabled); void dumpRequestCoordinatorState(Callback<String> callback);
private static native void nativeSetGCMTokenForTesting(String gcmToken); void waitForConnectivityState(boolean connected, Runnable callback);
void setPrefetchingEnabledByServer(boolean enabled);
void setGCMTokenForTesting(String gcmToken);
}
} }

@ -5,27 +5,32 @@
package org.chromium.chrome.browser.offlinepages.prefetch; package org.chromium.chrome.browser.offlinepages.prefetch;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/** Prefetch test Java to native bridge. */ /** Prefetch test Java to native bridge. */
@JNINamespace("offline_pages::prefetch") @JNINamespace("offline_pages::prefetch")
public class PrefetchTestBridge { public class PrefetchTestBridge {
public static void enableLimitlessPrefetching(boolean enabled) { public static void enableLimitlessPrefetching(boolean enabled) {
nativeEnableLimitlessPrefetching(enabled); PrefetchTestBridgeJni.get().enableLimitlessPrefetching(enabled);
} }
public static boolean isLimitlessPrefetchingEnabled() { public static boolean isLimitlessPrefetchingEnabled() {
return nativeIsLimitlessPrefetchingEnabled(); return PrefetchTestBridgeJni.get().isLimitlessPrefetchingEnabled();
} }
public static void insertIntoCachedImageFetcher(String url, byte[] imageData) { public static void insertIntoCachedImageFetcher(String url, byte[] imageData) {
nativeInsertIntoCachedImageFetcher(url, imageData); PrefetchTestBridgeJni.get().insertIntoCachedImageFetcher(url, imageData);
} }
public static void addCandidatePrefetchURL(String url, String title, String thumbnailUrl, public static void addCandidatePrefetchURL(String url, String title, String thumbnailUrl,
String faviconUrl, String snippet, String attribution) { String faviconUrl, String snippet, String attribution) {
nativeAddCandidatePrefetchURL(url, title, thumbnailUrl, faviconUrl, snippet, attribution); PrefetchTestBridgeJni.get().addCandidatePrefetchURL(
url, title, thumbnailUrl, faviconUrl, snippet, attribution);
} }
static native void nativeEnableLimitlessPrefetching(boolean enabled); @NativeMethods
static native boolean nativeIsLimitlessPrefetchingEnabled(); interface Natives {
static native void nativeInsertIntoCachedImageFetcher(String url, byte[] imageData); void enableLimitlessPrefetching(boolean enabled);
static native void nativeAddCandidatePrefetchURL(String url, String title, String thumbnailUrl, boolean isLimitlessPrefetchingEnabled();
String faviconUrl, String snippet, String attribution); void insertIntoCachedImageFetcher(String url, byte[] imageData);
void addCandidatePrefetchURL(String url, String title, String thumbnailUrl,
String faviconUrl, String snippet, String attribution);
}
} }

@ -5,6 +5,7 @@
package org.chromium.chrome.browser.query_tiles; package org.chromium.chrome.browser.query_tiles;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.annotations.NativeMethods;
/** /**
* Spins up a test server and starts serving query tiles in native. * Spins up a test server and starts serving query tiles in native.
@ -19,9 +20,13 @@ public class QueryTileFakeServer {
*/ */
public static void setupFakeServer( public static void setupFakeServer(
int levels, int tilesPerLevel, Callback<Boolean> onFetchCompletedCallback) { int levels, int tilesPerLevel, Callback<Boolean> onFetchCompletedCallback) {
nativeSetupFakeServer(onFetchCompletedCallback, levels, tilesPerLevel); QueryTileFakeServerJni.get().setupFakeServer(
onFetchCompletedCallback, levels, tilesPerLevel);
} }
static native void nativeSetupFakeServer( @NativeMethods
Callback<Boolean> onFetchCompletedCallback, int levels, int tilesPerLevel); interface Natives {
void setupFakeServer(
Callback<Boolean> onFetchCompletedCallback, int levels, int tilesPerLevel);
}
} }

@ -5,6 +5,7 @@
package org.chromium.chrome.browser.subresource_filter; package org.chromium.chrome.browser.subresource_filter;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods;
/** /**
* Class which aids in publishing test rulesets for SubresourceFilter instrumentation tests. * Class which aids in publishing test rulesets for SubresourceFilter instrumentation tests.
@ -14,7 +15,8 @@ public final class TestRulesetPublisher {
private boolean mPublished; private boolean mPublished;
public void createAndPublishRulesetDisallowingSuffixForTesting(String suffix) { public void createAndPublishRulesetDisallowingSuffixForTesting(String suffix) {
nativeCreateAndPublishRulesetDisallowingSuffixForTesting(suffix); TestRulesetPublisherJni.get().createAndPublishRulesetDisallowingSuffixForTesting(
this, suffix);
} }
public boolean isPublished() { public boolean isPublished() {
@ -26,5 +28,9 @@ public final class TestRulesetPublisher {
mPublished = true; mPublished = true;
} }
private native void nativeCreateAndPublishRulesetDisallowingSuffixForTesting(String suffix); @NativeMethods
interface Natives {
void createAndPublishRulesetDisallowingSuffixForTesting(
TestRulesetPublisher obj, String suffix);
}
} }

@ -25,29 +25,28 @@ public class MockCertVerifierRuleAndroid extends ExternalResource {
protected void before() { protected void before() {
NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
mNativePtr = MockCertVerifierRuleAndroidJni.get().init(); mNativePtr = MockCertVerifierRuleAndroidJni.get().init();
nativeSetResult(mNativePtr, mResult); MockCertVerifierRuleAndroidJni.get().setResult(mNativePtr, mResult);
nativeSetUp(mNativePtr); MockCertVerifierRuleAndroidJni.get().setUp(mNativePtr);
} }
public void setResult(int result) { public void setResult(int result) {
mResult = result; mResult = result;
if (mNativePtr != 0) { if (mNativePtr != 0) {
nativeSetResult(mNativePtr, result); MockCertVerifierRuleAndroidJni.get().setResult(mNativePtr, result);
} }
} }
@Override @Override
protected void after() { protected void after() {
nativeTearDown(mNativePtr); MockCertVerifierRuleAndroidJni.get().tearDown(mNativePtr);
mNativePtr = 0; mNativePtr = 0;
} }
private native void nativeSetUp(long nativeMockCertVerifierRuleAndroid);
private native void nativeSetResult(long nativeMockCertVerifierRuleAndroid, int result);
private native void nativeTearDown(long nativeMockCertVerifierRuleAndroid);
@NativeMethods @NativeMethods
interface Natives { interface Natives {
long init(); long init();
void setUp(long nativeMockCertVerifierRuleAndroid);
void setResult(long nativeMockCertVerifierRuleAndroid, int result);
void tearDown(long nativeMockCertVerifierRuleAndroid);
} }
} }

@ -13,22 +13,15 @@ jlong JNI_MockCertVerifierRuleAndroid_Init(JNIEnv* env) {
MockCertVerifierRuleAndroid::MockCertVerifierRuleAndroid() = default; MockCertVerifierRuleAndroid::MockCertVerifierRuleAndroid() = default;
void MockCertVerifierRuleAndroid::SetResult( void MockCertVerifierRuleAndroid::SetResult(JNIEnv* env, int result) {
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
int result) {
mock_cert_verifier_.mock_cert_verifier()->set_default_result(result); mock_cert_verifier_.mock_cert_verifier()->set_default_result(result);
} }
void MockCertVerifierRuleAndroid::SetUp( void MockCertVerifierRuleAndroid::SetUp(JNIEnv* env) {
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
mock_cert_verifier_.SetUpCommandLine(base::CommandLine::ForCurrentProcess()); mock_cert_verifier_.SetUpCommandLine(base::CommandLine::ForCurrentProcess());
mock_cert_verifier_.SetUpInProcessBrowserTestFixture(); mock_cert_verifier_.SetUpInProcessBrowserTestFixture();
} }
void MockCertVerifierRuleAndroid::TearDown( void MockCertVerifierRuleAndroid::TearDown(JNIEnv* env) {
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
mock_cert_verifier_.TearDownInProcessBrowserTestFixture(); mock_cert_verifier_.TearDownInProcessBrowserTestFixture();
} }

@ -18,12 +18,9 @@ class MockCertVerifierRuleAndroid {
delete; delete;
// Sets the certificate verification result to force. // Sets the certificate verification result to force.
void SetResult(JNIEnv* env, void SetResult(JNIEnv* env, int result);
const base::android::JavaParamRef<jobject>& obj, void SetUp(JNIEnv* env);
int result); void TearDown(JNIEnv* env);
void SetUp(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
void TearDown(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
private: private:
content::ContentMockCertVerifier mock_cert_verifier_; content::ContentMockCertVerifier mock_cert_verifier_;

@ -13,6 +13,7 @@ if (is_android) {
android_library("subresource_filter_java_test_support") { android_library("subresource_filter_java_test_support") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ "../../android/javatests/src/org/chromium/chrome/browser/subresource_filter/TestRulesetPublisher.java" ] sources = [ "../../android/javatests/src/org/chromium/chrome/browser/subresource_filter/TestRulesetPublisher.java" ]
deps = [ "//base:jni_java" ] deps = [ "//base:jni_java" ]
} }

@ -89,6 +89,7 @@ if (is_android) {
"android/test_support/src/org/chromium/chrome/test_support/PaymentRequestTestBridge.java", "android/test_support/src/org/chromium/chrome/test_support/PaymentRequestTestBridge.java",
"android/test_support/src/org/chromium/chrome/test_support/ToolbarManagerTestHelper.java", "android/test_support/src/org/chromium/chrome/test_support/ToolbarManagerTestHelper.java",
] ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
} }
generate_jni("test_support_jni_headers") { generate_jni("test_support_jni_headers") {

@ -10,6 +10,7 @@ import androidx.annotation.Nullable;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.payments.ChromePaymentRequestFactory; import org.chromium.chrome.browser.payments.ChromePaymentRequestFactory;
import org.chromium.chrome.browser.payments.ChromePaymentRequestService; import org.chromium.chrome.browser.payments.ChromePaymentRequestService;
import org.chromium.components.autofill.EditableOption; import org.chromium.components.autofill.EditableOption;
@ -96,8 +97,8 @@ public class PaymentRequestTestBridge {
/** /**
* Implements NativeObserverForTest by holding pointers to C++ callbacks, and invoking * Implements NativeObserverForTest by holding pointers to C++ callbacks, and invoking
* them through nativeResolvePaymentRequestObserverCallback() when the observer's * them through PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback() when
* methods are called. * the observer's methods are called.
*/ */
private static class PaymentRequestNativeObserverBridgeToNativeForTest private static class PaymentRequestNativeObserverBridgeToNativeForTest
implements NativeObserverForTest { implements NativeObserverForTest {
@ -152,19 +153,23 @@ public class PaymentRequestTestBridge {
@Override @Override
public void onCanMakePaymentCalled() { public void onCanMakePaymentCalled() {
nativeResolvePaymentRequestObserverCallback(mOnCanMakePaymentCalledPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnCanMakePaymentCalledPtr);
} }
@Override @Override
public void onCanMakePaymentReturned() { public void onCanMakePaymentReturned() {
nativeResolvePaymentRequestObserverCallback(mOnCanMakePaymentReturnedPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnCanMakePaymentReturnedPtr);
} }
@Override @Override
public void onHasEnrolledInstrumentCalled() { public void onHasEnrolledInstrumentCalled() {
nativeResolvePaymentRequestObserverCallback(mOnHasEnrolledInstrumentCalledPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnHasEnrolledInstrumentCalledPtr);
} }
@Override @Override
public void onHasEnrolledInstrumentReturned() { public void onHasEnrolledInstrumentReturned() {
nativeResolvePaymentRequestObserverCallback(mOnHasEnrolledInstrumentReturnedPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnHasEnrolledInstrumentReturnedPtr);
} }
@Override @Override
@ -184,23 +189,28 @@ public class PaymentRequestTestBridge {
} }
} }
nativeSetAppDescriptions(mSetAppDescriptionsPtr, appLabels, appSublabels, appTotals); PaymentRequestTestBridgeJni.get().setAppDescriptions(
nativeResolvePaymentRequestObserverCallback(mOnAppListReadyPtr); mSetAppDescriptionsPtr, appLabels, appSublabels, appTotals);
PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnAppListReadyPtr);
} }
@Override @Override
public void onShippingSectionVisibilityChange(boolean isShippingSectionVisible) { public void onShippingSectionVisibilityChange(boolean isShippingSectionVisible) {
nativeInvokeBooleanCallback(mSetShippingSectionVisiblePtr, isShippingSectionVisible); PaymentRequestTestBridgeJni.get().invokeBooleanCallback(
mSetShippingSectionVisiblePtr, isShippingSectionVisible);
} }
@Override @Override
public void onContactSectionVisibilityChange(boolean isContactSectionVisible) { public void onContactSectionVisibilityChange(boolean isContactSectionVisible) {
nativeInvokeBooleanCallback(mSetContactSectionVisiblePtr, isContactSectionVisible); PaymentRequestTestBridgeJni.get().invokeBooleanCallback(
mSetContactSectionVisiblePtr, isContactSectionVisible);
} }
@Override @Override
public void onErrorDisplayed() { public void onErrorDisplayed() {
nativeResolvePaymentRequestObserverCallback(mOnErrorDisplayedPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnErrorDisplayedPtr);
} }
private static String ensureNotNull(@Nullable String value) { private static String ensureNotNull(@Nullable String value) {
@ -209,23 +219,27 @@ public class PaymentRequestTestBridge {
@Override @Override
public void onNotSupportedError() { public void onNotSupportedError() {
nativeResolvePaymentRequestObserverCallback(mOnNotSupportedErrorPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnNotSupportedErrorPtr);
} }
@Override @Override
public void onConnectionTerminated() { public void onConnectionTerminated() {
nativeResolvePaymentRequestObserverCallback(mOnConnectionTerminatedPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnConnectionTerminatedPtr);
} }
@Override @Override
public void onAbortCalled() { public void onAbortCalled() {
nativeResolvePaymentRequestObserverCallback(mOnAbortCalledPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnAbortCalledPtr);
} }
@Override @Override
public void onCompleteHandled() { public void onCompleteHandled() {
nativeResolvePaymentRequestObserverCallback(mOnCompleteHandledPtr); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(
mOnCompleteHandledPtr);
} }
@Override @Override
public void onUiDisplayed() { public void onUiDisplayed() {
nativeResolvePaymentRequestObserverCallback(mOnUiDisplayed); PaymentRequestTestBridgeJni.get().resolvePaymentRequestObserverCallback(mOnUiDisplayed);
} }
} }
@ -297,14 +311,16 @@ public class PaymentRequestTestBridge {
return false; return false;
} }
/** @NativeMethods
* The native method responsible to executing RepeatingClosure pointers. interface Natives {
*/ /**
private static native void nativeResolvePaymentRequestObserverCallback(long callbackPtr); * The native method responsible to executing RepeatingClosure pointers.
*/
void resolvePaymentRequestObserverCallback(long callbackPtr);
private static native void nativeSetAppDescriptions( void setAppDescriptions(
long callbackPtr, String[] appLabels, String[] appSublabels, String[] appTotals); long callbackPtr, String[] appLabels, String[] appSublabels, String[] appTotals);
/** The native method responsible for executing RepatingCallback<void(bool)> pointers. */
/** The native method responsible for executing RepatingCallback<void(bool)> pointers. */ void invokeBooleanCallback(long callbackPtr, boolean value);
private static native void nativeInvokeBooleanCallback(long callbackPtr, boolean value); }
} }

@ -33,8 +33,12 @@ if (is_android) {
# shim to function correctly. # shim to function correctly.
android_library("heap_profiling_java_test_support") { android_library("heap_profiling_java_test_support") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ "javatests/src/org/chromium/components/heap_profiling/multi_process/HeapProfilingTestShim.java" ] sources = [ "javatests/src/org/chromium/components/heap_profiling/multi_process/HeapProfilingTestShim.java" ]
deps = [ "//build/android:build_java" ] deps = [
"//base:jni_java",
"//build/android:build_java",
]
} }
} }

@ -21,14 +21,12 @@ static jlong JNI_HeapProfilingTestShim_Init(JNIEnv* env,
HeapProfilingTestShim::HeapProfilingTestShim(JNIEnv* env, jobject obj) {} HeapProfilingTestShim::HeapProfilingTestShim(JNIEnv* env, jobject obj) {}
HeapProfilingTestShim::~HeapProfilingTestShim() = default; HeapProfilingTestShim::~HeapProfilingTestShim() = default;
void HeapProfilingTestShim::Destroy(JNIEnv* env, void HeapProfilingTestShim::Destroy(JNIEnv* env) {
const JavaParamRef<jobject>& obj) {
delete this; delete this;
} }
jboolean HeapProfilingTestShim::RunTestForMode( jboolean HeapProfilingTestShim::RunTestForMode(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& mode, const base::android::JavaParamRef<jstring>& mode,
jboolean dynamically_start_profiling, jboolean dynamically_start_profiling,
const base::android::JavaParamRef<jstring>& stack_mode, const base::android::JavaParamRef<jstring>& stack_mode,

@ -14,14 +14,13 @@
class HeapProfilingTestShim { class HeapProfilingTestShim {
public: public:
HeapProfilingTestShim(JNIEnv* env, jobject obj); HeapProfilingTestShim(JNIEnv* env, jobject obj);
void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); void Destroy(JNIEnv* env);
HeapProfilingTestShim(const HeapProfilingTestShim&) = delete; HeapProfilingTestShim(const HeapProfilingTestShim&) = delete;
HeapProfilingTestShim& operator=(const HeapProfilingTestShim&) = delete; HeapProfilingTestShim& operator=(const HeapProfilingTestShim&) = delete;
jboolean RunTestForMode( jboolean RunTestForMode(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& mode, const base::android::JavaParamRef<jstring>& mode,
jboolean dynamically_start_profiling, jboolean dynamically_start_profiling,
const base::android::JavaParamRef<jstring>& stack_mode, const base::android::JavaParamRef<jstring>& stack_mode,

@ -4,6 +4,7 @@
package org.chromium.components.heap_profiling.multi_process; package org.chromium.components.heap_profiling.multi_process;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.build.annotations.MainDex; import org.chromium.build.annotations.MainDex;
/** /**
@ -13,7 +14,7 @@ import org.chromium.build.annotations.MainDex;
@MainDex @MainDex
public class HeapProfilingTestShim { public class HeapProfilingTestShim {
public HeapProfilingTestShim() { public HeapProfilingTestShim() {
mNativeHeapProfilingTestShim = nativeInit(); mNativeHeapProfilingTestShim = HeapProfilingTestShimJni.get().init(this);
} }
/** /**
@ -24,8 +25,8 @@ public class HeapProfilingTestShim {
*/ */
public boolean runTestForMode(String mode, boolean dynamicallyStartProfiling, String stackMode, public boolean runTestForMode(String mode, boolean dynamicallyStartProfiling, String stackMode,
boolean shouldSample, boolean sampleEverything) { boolean shouldSample, boolean sampleEverything) {
return nativeRunTestForMode(mNativeHeapProfilingTestShim, mode, dynamicallyStartProfiling, return HeapProfilingTestShimJni.get().runTestForMode(mNativeHeapProfilingTestShim, mode,
stackMode, shouldSample, sampleEverything); dynamicallyStartProfiling, stackMode, shouldSample, sampleEverything);
} }
/** /**
@ -34,15 +35,19 @@ public class HeapProfilingTestShim {
*/ */
public void destroy() { public void destroy() {
if (mNativeHeapProfilingTestShim != 0) { if (mNativeHeapProfilingTestShim != 0) {
nativeDestroy(mNativeHeapProfilingTestShim); HeapProfilingTestShimJni.get().destroy(mNativeHeapProfilingTestShim);
mNativeHeapProfilingTestShim = 0; mNativeHeapProfilingTestShim = 0;
} }
} }
private long mNativeHeapProfilingTestShim; private long mNativeHeapProfilingTestShim;
private native long nativeInit();
private native void nativeDestroy(long nativeHeapProfilingTestShim); @NativeMethods
private native boolean nativeRunTestForMode(long nativeHeapProfilingTestShim, String mode, interface Natives {
boolean dynamicallyStartProfiling, String stackMode, boolean shouldSample, long init(HeapProfilingTestShim obj);
boolean sampleEverything); void destroy(long nativeHeapProfilingTestShim);
boolean runTestForMode(long nativeHeapProfilingTestShim, String mode,
boolean dynamicallyStartProfiling, String stackMode, boolean shouldSample,
boolean sampleEverything);
}
} }

@ -17,6 +17,7 @@ android_library("android_test_message_pump_support_java") {
android_library("content_java_test_support") { android_library("content_java_test_support") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
deps = [ deps = [
":android_test_message_pump_support_java", ":android_test_message_pump_support_java",
"//base:base_java", "//base:base_java",
@ -39,7 +40,6 @@ android_library("content_java_test_support") {
"//url:gurl_java", "//url:gurl_java",
"//url:origin_java", "//url:origin_java",
] ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ sources = [
"javatests/src/org/chromium/content_public/browser/test/ChildProcessAllocatorSettings.java", "javatests/src/org/chromium/content_public/browser/test/ChildProcessAllocatorSettings.java",
"javatests/src/org/chromium/content_public/browser/test/ChildProcessAllocatorSettingsHook.java", "javatests/src/org/chromium/content_public/browser/test/ChildProcessAllocatorSettingsHook.java",

@ -6,6 +6,7 @@ package org.chromium.content_public.browser.test;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.content.browser.framehost.RenderFrameHostImpl; import org.chromium.content.browser.framehost.RenderFrameHostImpl;
import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.RenderFrameHost;
@ -17,7 +18,8 @@ public class RenderFrameHostTestExt {
private final long mNativeRenderFrameHostTestExt; private final long mNativeRenderFrameHostTestExt;
public RenderFrameHostTestExt(RenderFrameHost host) { public RenderFrameHostTestExt(RenderFrameHost host) {
mNativeRenderFrameHostTestExt = nativeInit(((RenderFrameHostImpl) host).getNativePtr()); mNativeRenderFrameHostTestExt =
RenderFrameHostTestExtJni.get().init(((RenderFrameHostImpl) host).getNativePtr());
} }
/** /**
@ -28,26 +30,31 @@ public class RenderFrameHostTestExt {
* serialized to a String using JSONStringValueSerializer. * serialized to a String using JSONStringValueSerializer.
*/ */
public void executeJavaScript(String script, Callback<String> callback) { public void executeJavaScript(String script, Callback<String> callback) {
nativeExecuteJavaScript(mNativeRenderFrameHostTestExt, script, callback, false); RenderFrameHostTestExtJni.get().executeJavaScript(
mNativeRenderFrameHostTestExt, script, callback, false);
} }
public void executeJavaScriptWithUserGesture(String script) { public void executeJavaScriptWithUserGesture(String script) {
nativeExecuteJavaScript(mNativeRenderFrameHostTestExt, script, (String r) -> {}, true); RenderFrameHostTestExtJni.get().executeJavaScript(
mNativeRenderFrameHostTestExt, script, (String r) -> {}, true);
} }
public void updateVisualState(Callback<Boolean> callback) { public void updateVisualState(Callback<Boolean> callback) {
nativeUpdateVisualState(mNativeRenderFrameHostTestExt, callback); RenderFrameHostTestExtJni.get().updateVisualState(mNativeRenderFrameHostTestExt, callback);
} }
public void notifyVirtualKeyboardOverlayRect(int x, int y, int width, int height) { public void notifyVirtualKeyboardOverlayRect(int x, int y, int width, int height) {
nativeNotifyVirtualKeyboardOverlayRect(mNativeRenderFrameHostTestExt, x, y, width, height); RenderFrameHostTestExtJni.get().notifyVirtualKeyboardOverlayRect(
mNativeRenderFrameHostTestExt, x, y, width, height);
} }
private native long nativeInit(long renderFrameHostAndroidPtr); @NativeMethods
private native void nativeExecuteJavaScript(long nativeRenderFrameHostTestExt, String script, interface Natives {
Callback<String> callback, boolean withUserGesture); long init(long renderFrameHostAndroidPtr);
private native void nativeUpdateVisualState( void executeJavaScript(long nativeRenderFrameHostTestExt, String script,
long nativeRenderFrameHostTestExt, Callback<Boolean> callback); Callback<String> callback, boolean withUserGesture);
private native void nativeNotifyVirtualKeyboardOverlayRect( void updateVisualState(long nativeRenderFrameHostTestExt, Callback<Boolean> callback);
long nativeRenderFrameHostTestExt, int x, int y, int width, int height); void notifyVirtualKeyboardOverlayRect(
long nativeRenderFrameHostTestExt, int x, int y, int width, int height);
}
} }

@ -5,6 +5,7 @@
package org.chromium.content_public.browser.test.util; package org.chromium.content_public.browser.test.util;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/** /**
* Collection of test-only WebContents utilities. * Collection of test-only WebContents utilities.
@ -15,8 +16,11 @@ public class RenderProcessHostUtils {
public static int getCurrentRenderProcessCount() { public static int getCurrentRenderProcessCount() {
return TestThreadUtils.runOnUiThreadBlockingNoException( return TestThreadUtils.runOnUiThreadBlockingNoException(
() -> { return nativeGetCurrentRenderProcessCount(); }); () -> { return RenderProcessHostUtilsJni.get().getCurrentRenderProcessCount(); });
} }
private static native int nativeGetCurrentRenderProcessCount(); @NativeMethods
interface Natives {
int getCurrentRenderProcessCount();
}
} }

@ -35,7 +35,6 @@ void OnExecuteJavaScriptResult(const base::android::JavaRef<jobject>& jcallback,
} // namespace } // namespace
jlong JNI_RenderFrameHostTestExt_Init(JNIEnv* env, jlong JNI_RenderFrameHostTestExt_Init(JNIEnv* env,
const JavaParamRef<jobject>& obj,
jlong render_frame_host_android_ptr) { jlong render_frame_host_android_ptr) {
RenderFrameHostAndroid* rfha = RenderFrameHostAndroid* rfha =
reinterpret_cast<RenderFrameHostAndroid*>(render_frame_host_android_ptr); reinterpret_cast<RenderFrameHostAndroid*>(render_frame_host_android_ptr);
@ -52,7 +51,6 @@ RenderFrameHostTestExt::RenderFrameHostTestExt(RenderFrameHostImpl* rfhi)
void RenderFrameHostTestExt::ExecuteJavaScript( void RenderFrameHostTestExt::ExecuteJavaScript(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& jscript, const JavaParamRef<jstring>& jscript,
const JavaParamRef<jobject>& jcallback, const JavaParamRef<jobject>& jcallback,
jboolean with_user_gesture) { jboolean with_user_gesture) {
@ -70,7 +68,6 @@ void RenderFrameHostTestExt::ExecuteJavaScript(
void RenderFrameHostTestExt::UpdateVisualState( void RenderFrameHostTestExt::UpdateVisualState(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& jcallback) { const JavaParamRef<jobject>& jcallback) {
auto result_callback = base::BindOnce( auto result_callback = base::BindOnce(
&base::android::RunBooleanCallbackAndroid, &base::android::RunBooleanCallbackAndroid,
@ -78,13 +75,11 @@ void RenderFrameHostTestExt::UpdateVisualState(
render_frame_host_->InsertVisualStateCallback(std::move(result_callback)); render_frame_host_->InsertVisualStateCallback(std::move(result_callback));
} }
void RenderFrameHostTestExt::NotifyVirtualKeyboardOverlayRect( void RenderFrameHostTestExt::NotifyVirtualKeyboardOverlayRect(JNIEnv* env,
JNIEnv* env, jint x,
const JavaParamRef<jobject>& obj, jint y,
jint x, jint width,
jint y, jint height) {
jint width,
jint height) {
gfx::Size size(width, height); gfx::Size size(width, height);
gfx::Point origin(x, y); gfx::Point origin(x, y);
render_frame_host_->GetPage().NotifyVirtualKeyboardOverlayRect( render_frame_host_->GetPage().NotifyVirtualKeyboardOverlayRect(

@ -20,23 +20,19 @@ class RenderFrameHostTestExt : public base::SupportsUserData::Data {
explicit RenderFrameHostTestExt(RenderFrameHostImpl* rfhi); explicit RenderFrameHostTestExt(RenderFrameHostImpl* rfhi);
void ExecuteJavaScript(JNIEnv* env, void ExecuteJavaScript(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jscript, const base::android::JavaParamRef<jstring>& jscript,
const base::android::JavaParamRef<jobject>& jcallback, const base::android::JavaParamRef<jobject>& jcallback,
jboolean with_user_gesture); jboolean with_user_gesture);
// This calls InsertVisualStateCallback(). See it for details on the return // This calls InsertVisualStateCallback(). See it for details on the return
// value. // value.
void UpdateVisualState(JNIEnv* env, void UpdateVisualState(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& jcallback); const base::android::JavaParamRef<jobject>& jcallback);
void NotifyVirtualKeyboardOverlayRect( void NotifyVirtualKeyboardOverlayRect(JNIEnv* env,
JNIEnv* env, jint x,
const base::android::JavaParamRef<jobject>& obj, jint y,
jint x, jint width,
jint y, jint height);
jint width,
jint height);
private: private:
const raw_ptr<RenderFrameHostImpl> render_frame_host_; const raw_ptr<RenderFrameHostImpl> render_frame_host_;

@ -454,6 +454,7 @@ if (is_android) {
android_library("bluetooth_test_java") { android_library("bluetooth_test_java") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = bluetooth_java_sources_needing_jni sources = bluetooth_java_sources_needing_jni
deps = [ deps = [
"//base:base_java", "//base:base_java",

@ -21,6 +21,7 @@ import android.util.SparseArray;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.components.location.LocationUtils; import org.chromium.components.location.LocationUtils;
import org.chromium.device.bluetooth.test.TestRSSI; import org.chromium.device.bluetooth.test.TestRSSI;
import org.chromium.device.bluetooth.test.TestTxPower; import org.chromium.device.bluetooth.test.TestTxPower;
@ -71,7 +72,7 @@ class Fakes {
* Sets the factory for ThreadUtilsWrapper to always post a task to the UI thread * Sets the factory for ThreadUtilsWrapper to always post a task to the UI thread
* rather than running the task immediately. This simulates events arriving on a separate * rather than running the task immediately. This simulates events arriving on a separate
* thread on Android. * thread on Android.
* runOnUiThread uses nativePostTaskFromJava. This allows java to post tasks to the * runOnUiThread uses FakesJni.get().postTaskFromJava. This allows java to post tasks to the
* message loop that the test is using rather than to the Java message loop which * message loop that the test is using rather than to the Java message loop which
* is not running during tests. * is not running during tests.
*/ */
@ -83,7 +84,7 @@ class Fakes {
return new Wrappers.ThreadUtilsWrapper() { return new Wrappers.ThreadUtilsWrapper() {
@Override @Override
public void runOnUiThread(Runnable r) { public void runOnUiThread(Runnable r) {
nativePostTaskFromJava(nativeBluetoothTestAndroid, r); FakesJni.get().postTaskFromJava(nativeBluetoothTestAndroid, r);
} }
}; };
} }
@ -245,11 +246,11 @@ class Fakes {
public boolean disable() { public boolean disable() {
// android.bluetooth.BluetoothAdapter::disable() is an async call, so we simulate this // android.bluetooth.BluetoothAdapter::disable() is an async call, so we simulate this
// by posting a task to the UI thread. // by posting a task to the UI thread.
nativePostTaskFromJava(mNativeBluetoothTestAndroid, new Runnable() { FakesJni.get().postTaskFromJava(mNativeBluetoothTestAndroid, new Runnable() {
@Override @Override
public void run() { public void run() {
mPowered = false; mPowered = false;
nativeOnFakeAdapterStateChanged(mNativeBluetoothTestAndroid, false); FakesJni.get().onFakeAdapterStateChanged(mNativeBluetoothTestAndroid, false);
} }
}); });
return true; return true;
@ -259,11 +260,11 @@ class Fakes {
public boolean enable() { public boolean enable() {
// android.bluetooth.BluetoothAdapter::enable() is an async call, so we simulate this by // android.bluetooth.BluetoothAdapter::enable() is an async call, so we simulate this by
// posting a task to the UI thread. // posting a task to the UI thread.
nativePostTaskFromJava(mNativeBluetoothTestAndroid, new Runnable() { FakesJni.get().postTaskFromJava(mNativeBluetoothTestAndroid, new Runnable() {
@Override @Override
public void run() { public void run() {
mPowered = true; mPowered = true;
nativeOnFakeAdapterStateChanged(mNativeBluetoothTestAndroid, true); FakesJni.get().onFakeAdapterStateChanged(mNativeBluetoothTestAndroid, true);
} }
}); });
return true; return true;
@ -530,7 +531,8 @@ class Fakes {
"BluetoothGattWrapper doesn't support calls to connectGatt() with " "BluetoothGattWrapper doesn't support calls to connectGatt() with "
+ "multiple distinct callbacks."); + "multiple distinct callbacks.");
} }
nativeOnFakeBluetoothDeviceConnectGattCalled(mAdapter.mNativeBluetoothTestAndroid); FakesJni.get().onFakeBluetoothDeviceConnectGattCalled(
mAdapter.mNativeBluetoothTestAndroid);
mGattCallback = callback; mGattCallback = callback;
return mGatt; return mGatt;
} }
@ -576,12 +578,13 @@ class Fakes {
@Override @Override
public void disconnect() { public void disconnect() {
nativeOnFakeBluetoothGattDisconnect(mDevice.mAdapter.mNativeBluetoothTestAndroid); FakesJni.get().onFakeBluetoothGattDisconnect(
mDevice.mAdapter.mNativeBluetoothTestAndroid);
} }
@Override @Override
public void close() { public void close() {
nativeOnFakeBluetoothGattClose(mDevice.mAdapter.mNativeBluetoothTestAndroid); FakesJni.get().onFakeBluetoothGattClose(mDevice.mAdapter.mNativeBluetoothTestAndroid);
} }
@Override @Override
@ -591,7 +594,8 @@ class Fakes {
@Override @Override
public void discoverServices() { public void discoverServices() {
nativeOnFakeBluetoothGattDiscoverServices(mDevice.mAdapter.mNativeBluetoothTestAndroid); FakesJni.get().onFakeBluetoothGattDiscoverServices(
mDevice.mAdapter.mNativeBluetoothTestAndroid);
} }
@Override @Override
@ -605,7 +609,7 @@ class Fakes {
mReadCharacteristicWillFailSynchronouslyOnce = false; mReadCharacteristicWillFailSynchronouslyOnce = false;
return false; return false;
} }
nativeOnFakeBluetoothGattReadCharacteristic( FakesJni.get().onFakeBluetoothGattReadCharacteristic(
mDevice.mAdapter.mNativeBluetoothTestAndroid); mDevice.mAdapter.mNativeBluetoothTestAndroid);
return true; return true;
} }
@ -617,7 +621,7 @@ class Fakes {
mSetCharacteristicNotificationWillFailSynchronouslyOnce = false; mSetCharacteristicNotificationWillFailSynchronouslyOnce = false;
return false; return false;
} }
nativeOnFakeBluetoothGattSetCharacteristicNotification( FakesJni.get().onFakeBluetoothGattSetCharacteristicNotification(
mDevice.mAdapter.mNativeBluetoothTestAndroid); mDevice.mAdapter.mNativeBluetoothTestAndroid);
return true; return true;
} }
@ -628,7 +632,7 @@ class Fakes {
mWriteCharacteristicWillFailSynchronouslyOnce = false; mWriteCharacteristicWillFailSynchronouslyOnce = false;
return false; return false;
} }
nativeOnFakeBluetoothGattWriteCharacteristic( FakesJni.get().onFakeBluetoothGattWriteCharacteristic(
mDevice.mAdapter.mNativeBluetoothTestAndroid, characteristic.getValue()); mDevice.mAdapter.mNativeBluetoothTestAndroid, characteristic.getValue());
return true; return true;
} }
@ -639,7 +643,8 @@ class Fakes {
mReadDescriptorWillFailSynchronouslyOnce = false; mReadDescriptorWillFailSynchronouslyOnce = false;
return false; return false;
} }
nativeOnFakeBluetoothGattReadDescriptor(mDevice.mAdapter.mNativeBluetoothTestAndroid); FakesJni.get().onFakeBluetoothGattReadDescriptor(
mDevice.mAdapter.mNativeBluetoothTestAndroid);
return true; return true;
} }
@ -649,7 +654,7 @@ class Fakes {
mWriteDescriptorWillFailSynchronouslyOnce = false; mWriteDescriptorWillFailSynchronouslyOnce = false;
return false; return false;
} }
nativeOnFakeBluetoothGattWriteDescriptor( FakesJni.get().onFakeBluetoothGattWriteDescriptor(
mDevice.mAdapter.mNativeBluetoothTestAndroid, descriptor.getValue()); mDevice.mAdapter.mNativeBluetoothTestAndroid, descriptor.getValue());
return true; return true;
} }
@ -987,45 +992,40 @@ class Fakes {
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
// BluetoothTestAndroid C++ methods declared for access from java: // BluetoothTestAndroid C++ methods declared for access from java:
@NativeMethods
interface Natives {
// Bind to BluetoothTestAndroid::PostTaskFromJava. // Bind to BluetoothTestAndroid::PostTaskFromJava.
private static native void nativePostTaskFromJava(long nativeBluetoothTestAndroid, Runnable r); void postTaskFromJava(long nativeBluetoothTestAndroid, Runnable r);
// Binds to BluetoothTestAndroid::OnFakeAdapterStateChanged. // Binds to BluetoothTestAndroid::OnFakeAdapterStateChanged.
private static native void nativeOnFakeAdapterStateChanged( void onFakeAdapterStateChanged(long nativeBluetoothTestAndroid, boolean powered);
long nativeBluetoothTestAndroid, boolean powered);
// Binds to BluetoothTestAndroid::OnFakeBluetoothDeviceConnectGattCalled. // Binds to BluetoothTestAndroid::OnFakeBluetoothDeviceConnectGattCalled.
private static native void nativeOnFakeBluetoothDeviceConnectGattCalled( void onFakeBluetoothDeviceConnectGattCalled(long nativeBluetoothTestAndroid);
long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattDisconnect. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattDisconnect.
private static native void nativeOnFakeBluetoothGattDisconnect(long nativeBluetoothTestAndroid); void onFakeBluetoothGattDisconnect(long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattClose. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattClose.
private static native void nativeOnFakeBluetoothGattClose(long nativeBluetoothTestAndroid); void onFakeBluetoothGattClose(long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattDiscoverServices. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattDiscoverServices.
private static native void nativeOnFakeBluetoothGattDiscoverServices( void onFakeBluetoothGattDiscoverServices(long nativeBluetoothTestAndroid);
long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattSetCharacteristicNotification. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattSetCharacteristicNotification.
private static native void nativeOnFakeBluetoothGattSetCharacteristicNotification( void onFakeBluetoothGattSetCharacteristicNotification(long nativeBluetoothTestAndroid);
long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattReadCharacteristic. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattReadCharacteristic.
private static native void nativeOnFakeBluetoothGattReadCharacteristic( void onFakeBluetoothGattReadCharacteristic(long nativeBluetoothTestAndroid);
long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattWriteCharacteristic. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattWriteCharacteristic.
private static native void nativeOnFakeBluetoothGattWriteCharacteristic( void onFakeBluetoothGattWriteCharacteristic(long nativeBluetoothTestAndroid, byte[] value);
long nativeBluetoothTestAndroid, byte[] value);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattReadDescriptor. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattReadDescriptor.
private static native void nativeOnFakeBluetoothGattReadDescriptor( void onFakeBluetoothGattReadDescriptor(long nativeBluetoothTestAndroid);
long nativeBluetoothTestAndroid);
// Binds to BluetoothTestAndroid::OnFakeBluetoothGattWriteDescriptor. // Binds to BluetoothTestAndroid::OnFakeBluetoothGattWriteDescriptor.
private static native void nativeOnFakeBluetoothGattWriteDescriptor( void onFakeBluetoothGattWriteDescriptor(long nativeBluetoothTestAndroid, byte[] value);
long nativeBluetoothTestAndroid, byte[] value); }
} }

@ -70,8 +70,8 @@ android_library("system_impl_java") {
# Targets should also depend on :test_support for the native side. # Targets should also depend on :test_support for the native side.
android_library("test_support_java") { android_library("test_support_java") {
testonly = true testonly = true
sources = [ "javatests/src/org/chromium/mojo/MojoTestRule.java" ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ "javatests/src/org/chromium/mojo/MojoTestRule.java" ]
deps = [ deps = [
"//base:base_java", "//base:base_java",
"//base:jni_java", "//base:jni_java",

@ -34,27 +34,20 @@ static void JNI_MojoTestRule_InitCore(JNIEnv* env) {
mojo::core::Init(); mojo::core::Init();
} }
static void JNI_MojoTestRule_Init(JNIEnv* env, static void JNI_MojoTestRule_Init(JNIEnv* env) {
const JavaParamRef<jobject>& jcaller) {
base::InitAndroidTestMessageLoop(); base::InitAndroidTestMessageLoop();
} }
static jlong JNI_MojoTestRule_SetupTestEnvironment( static jlong JNI_MojoTestRule_SetupTestEnvironment(JNIEnv* env) {
JNIEnv* env,
const JavaParamRef<jobject>& jcaller) {
return reinterpret_cast<intptr_t>(new TestEnvironment()); return reinterpret_cast<intptr_t>(new TestEnvironment());
} }
static void JNI_MojoTestRule_TearDownTestEnvironment( static void JNI_MojoTestRule_TearDownTestEnvironment(JNIEnv* env,
JNIEnv* env, jlong test_environment) {
const JavaParamRef<jobject>& jcaller,
jlong test_environment) {
delete reinterpret_cast<TestEnvironment*>(test_environment); delete reinterpret_cast<TestEnvironment*>(test_environment);
} }
static void JNI_MojoTestRule_RunLoop(JNIEnv* env, static void JNI_MojoTestRule_RunLoop(JNIEnv* env, jlong timeout_ms) {
const JavaParamRef<jobject>& jcaller,
jlong timeout_ms) {
base::RunLoop run_loop; base::RunLoop run_loop;
if (timeout_ms) { if (timeout_ms) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(

@ -48,39 +48,35 @@ public class MojoTestRule extends ExternalResource {
MojoTestRuleJni.get().initCore(); MojoTestRuleJni.get().initCore();
sIsCoreInitialized = true; sIsCoreInitialized = true;
} }
nativeInit(); MojoTestRuleJni.get().init();
mTestEnvironmentPointer = nativeSetupTestEnvironment(); mTestEnvironmentPointer = MojoTestRuleJni.get().setupTestEnvironment();
} }
@Override @Override
protected void after() { protected void after() {
nativeTearDownTestEnvironment(mTestEnvironmentPointer); MojoTestRuleJni.get().tearDownTestEnvironment(mTestEnvironmentPointer);
} }
/** /**
* Runs the run loop for the given time. * Runs the run loop for the given time.
*/ */
public void runLoop(long timeoutMS) { public void runLoop(long timeoutMS) {
nativeRunLoop(timeoutMS); MojoTestRuleJni.get().runLoop(timeoutMS);
} }
/** /**
* Runs the run loop until no handle or task are immediately available. * Runs the run loop until no handle or task are immediately available.
*/ */
public void runLoopUntilIdle() { public void runLoopUntilIdle() {
nativeRunLoop(0); MojoTestRuleJni.get().runLoop(0);
} }
private native void nativeInit();
private native long nativeSetupTestEnvironment();
private native void nativeTearDownTestEnvironment(long testEnvironment);
private native void nativeRunLoop(long timeoutMS);
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void init();
long setupTestEnvironment();
void tearDownTestEnvironment(long testEnvironment);
void runLoop(long timeoutMS);
void initCore(); void initCore();
} }
} }

@ -92,6 +92,7 @@ android_library("net_java_test_support") {
android_library("net_java_test_support_provider") { android_library("net_java_test_support_provider") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ sources = [
"../test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticator.java", "../test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticator.java",
"../test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticatorService.java", "../test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticatorService.java",

@ -137,20 +137,15 @@ DummySpnegoAuthenticator::SecurityContextQuery::~SecurityContextQuery() =
default; default;
base::android::ScopedJavaLocalRef<jstring> base::android::ScopedJavaLocalRef<jstring>
DummySpnegoAuthenticator::SecurityContextQuery::GetTokenToReturn( DummySpnegoAuthenticator::SecurityContextQuery::GetTokenToReturn(JNIEnv* env) {
JNIEnv* env,
const JavaParamRef<jobject>& /*obj*/) {
return base::android::ConvertUTF8ToJavaString(env, output_token.c_str()); return base::android::ConvertUTF8ToJavaString(env, output_token.c_str());
} }
int DummySpnegoAuthenticator::SecurityContextQuery::GetResult( int DummySpnegoAuthenticator::SecurityContextQuery::GetResult(JNIEnv* /*env*/) {
JNIEnv* /*env*/,
const JavaParamRef<jobject>& /*obj*/) {
return response_code; return response_code;
} }
void DummySpnegoAuthenticator::SecurityContextQuery::CheckGetTokenArguments( void DummySpnegoAuthenticator::SecurityContextQuery::CheckGetTokenArguments(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& /*obj*/,
const JavaParamRef<jstring>& j_incoming_token) { const JavaParamRef<jstring>& j_incoming_token) {
std::string incoming_token = std::string incoming_token =
base::android::ConvertJavaStringToUTF8(env, j_incoming_token); base::android::ConvertJavaStringToUTF8(env, j_incoming_token);
@ -187,9 +182,7 @@ void DummySpnegoAuthenticator::ExpectSecurityContext(
base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this)); base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this));
} }
long DummySpnegoAuthenticator::GetNextQuery( long DummySpnegoAuthenticator::GetNextQuery(JNIEnv* /*env*/) {
JNIEnv* /*env*/,
const JavaParamRef<jobject>& /* obj */) {
CheckQueueNotEmpty(); CheckQueueNotEmpty();
current_query_ = expected_security_queries_.front(); current_query_ = expected_security_queries_.front();
expected_security_queries_.pop_front(); expected_security_queries_.pop_front();

@ -93,17 +93,14 @@ class DummySpnegoAuthenticator {
std::string output_token; std::string output_token;
// Java callable members // Java callable members
base::android::ScopedJavaLocalRef<jstring> GetTokenToReturn( base::android::ScopedJavaLocalRef<jstring> GetTokenToReturn(JNIEnv* env);
JNIEnv* env, int GetResult(JNIEnv* env);
const base::android::JavaParamRef<jobject>& obj);
int GetResult(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
// Called from Java to check the arguments passed to the GetToken. Has to // Called from Java to check the arguments passed to the GetToken. Has to
// be in C++ since these tests are driven by googletest, and can only report // be in C++ since these tests are driven by googletest, and can only report
// failures through the googletest C++ API. // failures through the googletest C++ API.
void CheckGetTokenArguments( void CheckGetTokenArguments(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& incoming_token); const base::android::JavaParamRef<jstring>& incoming_token);
}; };
@ -121,8 +118,7 @@ class DummySpnegoAuthenticator {
static void EnsureTestAccountExists(); static void EnsureTestAccountExists();
static void RemoveTestAccounts(); static void RemoveTestAccounts();
long GetNextQuery(JNIEnv* env, long GetNextQuery(JNIEnv* env);
const base::android::JavaParamRef<jobject>& obj);
private: private:
// Abandon the test if the query queue is empty. Has to be a void function to // Abandon the test if the query queue is empty. Has to be a void function to

@ -18,6 +18,7 @@ import org.chromium.base.ApplicationStatus;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeClassQualifiedName; import org.chromium.base.annotations.NativeClassQualifiedName;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.net.HttpNegotiateConstants; import org.chromium.net.HttpNegotiateConstants;
import java.io.IOException; import java.io.IOException;
@ -69,20 +70,22 @@ public class DummySpnegoAuthenticator extends AbstractAccountAuthenticator {
@Override @Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle options) { String authTokenType, Bundle options) {
long nativeQuery = nativeGetNextQuery(sNativeDummySpnegoAuthenticator); long nativeQuery =
DummySpnegoAuthenticatorJni.get().getNextQuery(sNativeDummySpnegoAuthenticator);
String incomingToken = options.getString(HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN); String incomingToken = options.getString(HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN);
nativeCheckGetTokenArguments(nativeQuery, incomingToken); DummySpnegoAuthenticatorJni.get().checkGetTokenArguments(nativeQuery, incomingToken);
Bundle result = new Bundle(); Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, nativeGetTokenToReturn(nativeQuery)); result.putString(AccountManager.KEY_AUTHTOKEN,
DummySpnegoAuthenticatorJni.get().getTokenToReturn(nativeQuery));
result.putInt(HttpNegotiateConstants.KEY_SPNEGO_RESULT, result.putInt(HttpNegotiateConstants.KEY_SPNEGO_RESULT,
decodeResult(nativeGetResult(nativeQuery))); decodeResult(DummySpnegoAuthenticatorJni.get().getResult(nativeQuery)));
return result; return result;
} }
/** /**
* @param nativeGetResult * @param DummySpnegoAuthenticatorJni.get().getResult
* @return * @return
*/ */
private int decodeResult(int gssApiResult) { private int decodeResult(int gssApiResult) {
@ -162,22 +165,25 @@ public class DummySpnegoAuthenticator extends AbstractAccountAuthenticator {
sNativeDummySpnegoAuthenticator = nativeDummySpnegoAuthenticator; sNativeDummySpnegoAuthenticator = nativeDummySpnegoAuthenticator;
} }
/** @NativeMethods
* Send the relevant decoded arguments of getAuthToken to C++ for checking by googletest checks interface Natives {
* If the checks fail then the C++ unit test using this authenticator will fail. /**
* * Send the relevant decoded arguments of getAuthToken to C++ for checking by googletest
* @param authTokenType * checks If the checks fail then the C++ unit test using this authenticator will fail.
* @param spn *
* @param incomingToken * @param authTokenType
*/ * @param spn
@NativeClassQualifiedName("DummySpnegoAuthenticator::SecurityContextQuery") * @param incomingToken
private native void nativeCheckGetTokenArguments(long nativeQuery, String incomingToken); */
@NativeClassQualifiedName("DummySpnegoAuthenticator::SecurityContextQuery")
void checkGetTokenArguments(long nativeQuery, String incomingToken);
@NativeClassQualifiedName("DummySpnegoAuthenticator::SecurityContextQuery") @NativeClassQualifiedName("DummySpnegoAuthenticator::SecurityContextQuery")
private native String nativeGetTokenToReturn(long nativeQuery); String getTokenToReturn(long nativeQuery);
@NativeClassQualifiedName("DummySpnegoAuthenticator::SecurityContextQuery") @NativeClassQualifiedName("DummySpnegoAuthenticator::SecurityContextQuery")
private native int nativeGetResult(long nativeQuery); int getResult(long nativeQuery);
private native long nativeGetNextQuery(long nativeDummySpnegoAuthenticator); long getNextQuery(long nativeDummySpnegoAuthenticator);
}
} }

@ -14,6 +14,7 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.test.util.UrlUtils; import org.chromium.base.test.util.UrlUtils;
@ -79,7 +80,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
@Override @Override
public Void call() { public Void call() {
if (mNativeEmbeddedTestServer == 0) { if (mNativeEmbeddedTestServer == 0) {
nativeInit(UrlUtils.getIsolatedTestRoot(), https); EmbeddedTestServerImplJni.get().init(
EmbeddedTestServerImpl.this, UrlUtils.getIsolatedTestRoot(), https);
} }
assert mNativeEmbeddedTestServer != 0; assert mNativeEmbeddedTestServer != 0;
return null; return null;
@ -102,7 +104,7 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
return runOnHandlerThread(new Callable<Boolean>() { return runOnHandlerThread(new Callable<Boolean>() {
@Override @Override
public Boolean call() { public Boolean call() {
return nativeStart(mNativeEmbeddedTestServer, port); return EmbeddedTestServerImplJni.get().start(mNativeEmbeddedTestServer, port);
} }
}); });
} }
@ -116,7 +118,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
return runOnHandlerThread(new Callable<String>() { return runOnHandlerThread(new Callable<String>() {
@Override @Override
public String call() { public String call() {
return nativeGetRootCertPemPath(mNativeEmbeddedTestServer); return EmbeddedTestServerImplJni.get().getRootCertPemPath(
mNativeEmbeddedTestServer);
} }
}); });
} }
@ -132,7 +135,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
runOnHandlerThread(new Callable<Void>() { runOnHandlerThread(new Callable<Void>() {
@Override @Override
public Void call() { public Void call() {
nativeAddDefaultHandlers(mNativeEmbeddedTestServer, directoryPath); EmbeddedTestServerImplJni.get().addDefaultHandlers(
mNativeEmbeddedTestServer, directoryPath);
return null; return null;
} }
}); });
@ -147,7 +151,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
runOnHandlerThread(new Callable<Void>() { runOnHandlerThread(new Callable<Void>() {
@Override @Override
public Void call() { public Void call() {
nativeSetSSLConfig(mNativeEmbeddedTestServer, serverCertificate); EmbeddedTestServerImplJni.get().setSSLConfig(
mNativeEmbeddedTestServer, serverCertificate);
return null; return null;
} }
}); });
@ -162,7 +167,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
runOnHandlerThread(new Callable<Void>() { runOnHandlerThread(new Callable<Void>() {
@Override @Override
public Void call() { public Void call() {
nativeRegisterRequestHandler(mNativeEmbeddedTestServer, handler); EmbeddedTestServerImplJni.get().registerRequestHandler(
mNativeEmbeddedTestServer, handler);
return null; return null;
} }
}); });
@ -177,7 +183,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
runOnHandlerThread(new Callable<Void>() { runOnHandlerThread(new Callable<Void>() {
@Override @Override
public Void call() { public Void call() {
nativeServeFilesFromDirectory(mNativeEmbeddedTestServer, directoryPath); EmbeddedTestServerImplJni.get().serveFilesFromDirectory(
mNativeEmbeddedTestServer, directoryPath);
return null; return null;
} }
}); });
@ -210,7 +217,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
return runOnHandlerThread(new Callable<String>() { return runOnHandlerThread(new Callable<String>() {
@Override @Override
public String call() { public String call() {
return nativeGetURL(mNativeEmbeddedTestServer, relativeUrl); return EmbeddedTestServerImplJni.get().getURL(
mNativeEmbeddedTestServer, relativeUrl);
} }
}); });
} }
@ -227,7 +235,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
return runOnHandlerThread(new Callable<String>() { return runOnHandlerThread(new Callable<String>() {
@Override @Override
public String call() { public String call() {
return nativeGetURLWithHostName(mNativeEmbeddedTestServer, hostName, relativeUrl); return EmbeddedTestServerImplJni.get().getURLWithHostName(
mNativeEmbeddedTestServer, hostName, relativeUrl);
} }
}); });
} }
@ -241,7 +250,8 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
return runOnHandlerThread(new Callable<Boolean>() { return runOnHandlerThread(new Callable<Boolean>() {
@Override @Override
public Boolean call() { public Boolean call() {
return nativeShutdownAndWaitUntilComplete(mNativeEmbeddedTestServer); return EmbeddedTestServerImplJni.get().shutdownAndWaitUntilComplete(
mNativeEmbeddedTestServer);
} }
}); });
} }
@ -253,7 +263,7 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
@Override @Override
public Void call() { public Void call() {
assert mNativeEmbeddedTestServer != 0; assert mNativeEmbeddedTestServer != 0;
nativeDestroy(mNativeEmbeddedTestServer); EmbeddedTestServerImplJni.get().destroy(mNativeEmbeddedTestServer);
assert mNativeEmbeddedTestServer == 0; assert mNativeEmbeddedTestServer == 0;
return null; return null;
} }
@ -309,20 +319,19 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
mNativeEmbeddedTestServer = 0; mNativeEmbeddedTestServer = 0;
} }
private native void nativeInit(String testDataDir, boolean https); @NativeMethods
private native void nativeDestroy(long nativeEmbeddedTestServerAndroid); interface Natives {
private native boolean nativeStart(long nativeEmbeddedTestServerAndroid, int port); void init(EmbeddedTestServerImpl obj, String testDataDir, boolean https);
private native String nativeGetRootCertPemPath(long nativeEmbeddedTestServerAndroid); void destroy(long nativeEmbeddedTestServerAndroid);
private native boolean nativeShutdownAndWaitUntilComplete(long nativeEmbeddedTestServerAndroid); boolean start(long nativeEmbeddedTestServerAndroid, int port);
private native void nativeAddDefaultHandlers( String getRootCertPemPath(long nativeEmbeddedTestServerAndroid);
long nativeEmbeddedTestServerAndroid, String directoryPath); boolean shutdownAndWaitUntilComplete(long nativeEmbeddedTestServerAndroid);
private native void nativeSetSSLConfig( void addDefaultHandlers(long nativeEmbeddedTestServerAndroid, String directoryPath);
long nativeEmbeddedTestServerAndroid, int serverCertificate); void setSSLConfig(long nativeEmbeddedTestServerAndroid, int serverCertificate);
private native void nativeRegisterRequestHandler( void registerRequestHandler(long nativeEmbeddedTestServerAndroid, long handler);
long nativeEmbeddedTestServerAndroid, long handler); String getURL(long nativeEmbeddedTestServerAndroid, String relativeUrl);
private native String nativeGetURL(long nativeEmbeddedTestServerAndroid, String relativeUrl); String getURLWithHostName(
private native String nativeGetURLWithHostName( long nativeEmbeddedTestServerAndroid, String hostName, String relativeUrl);
long nativeEmbeddedTestServerAndroid, String hostName, String relativeUrl); void serveFilesFromDirectory(long nativeEmbeddedTestServerAndroid, String directoryPath);
private native void nativeServeFilesFromDirectory( }
long nativeEmbeddedTestServerAndroid, String directoryPath);
} }

@ -59,28 +59,22 @@ EmbeddedTestServerAndroid::~EmbeddedTestServerAndroid() {
Java_EmbeddedTestServerImpl_clearNativePtr(env, weak_java_server_.get(env)); Java_EmbeddedTestServerImpl_clearNativePtr(env, weak_java_server_.get(env));
} }
jboolean EmbeddedTestServerAndroid::Start(JNIEnv* env, jboolean EmbeddedTestServerAndroid::Start(JNIEnv* env, jint port) {
const JavaParamRef<jobject>& jobj,
jint port) {
return test_server_.Start(static_cast<int>(port)); return test_server_.Start(static_cast<int>(port));
} }
ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetRootCertPemPath( ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetRootCertPemPath(
JNIEnv* env, JNIEnv* env) const {
const JavaParamRef<jobject>& jobj) const {
return base::android::ConvertUTF8ToJavaString( return base::android::ConvertUTF8ToJavaString(
env, test_server_.GetRootCertPemPath().value()); env, test_server_.GetRootCertPemPath().value());
} }
jboolean EmbeddedTestServerAndroid::ShutdownAndWaitUntilComplete( jboolean EmbeddedTestServerAndroid::ShutdownAndWaitUntilComplete(JNIEnv* env) {
JNIEnv* env,
const JavaParamRef<jobject>& jobj) {
return test_server_.ShutdownAndWaitUntilComplete(); return test_server_.ShutdownAndWaitUntilComplete();
} }
ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURL( ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURL(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& jobj,
const JavaParamRef<jstring>& jrelative_url) const { const JavaParamRef<jstring>& jrelative_url) const {
const GURL gurl(test_server_.GetURL( const GURL gurl(test_server_.GetURL(
base::android::ConvertJavaStringToUTF8(env, jrelative_url))); base::android::ConvertJavaStringToUTF8(env, jrelative_url)));
@ -89,7 +83,6 @@ ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURL(
ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURLWithHostName( ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURLWithHostName(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& jobj,
const JavaParamRef<jstring>& jhostname, const JavaParamRef<jstring>& jhostname,
const JavaParamRef<jstring>& jrelative_url) const { const JavaParamRef<jstring>& jrelative_url) const {
const GURL gurl(test_server_.GetURL( const GURL gurl(test_server_.GetURL(
@ -100,7 +93,6 @@ ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURLWithHostName(
void EmbeddedTestServerAndroid::AddDefaultHandlers( void EmbeddedTestServerAndroid::AddDefaultHandlers(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& jobj,
const JavaParamRef<jstring>& jdirectory_path) { const JavaParamRef<jstring>& jdirectory_path) {
const base::FilePath directory( const base::FilePath directory(
base::android::ConvertJavaStringToUTF8(env, jdirectory_path)); base::android::ConvertJavaStringToUTF8(env, jdirectory_path));
@ -108,7 +100,6 @@ void EmbeddedTestServerAndroid::AddDefaultHandlers(
} }
void EmbeddedTestServerAndroid::SetSSLConfig(JNIEnv* jenv, void EmbeddedTestServerAndroid::SetSSLConfig(JNIEnv* jenv,
const JavaParamRef<jobject>& jobj,
jint jserver_certificate) { jint jserver_certificate) {
test_server_.SetSSLConfig( test_server_.SetSSLConfig(
static_cast<EmbeddedTestServer::ServerCertificate>(jserver_certificate)); static_cast<EmbeddedTestServer::ServerCertificate>(jserver_certificate));
@ -117,17 +108,14 @@ void EmbeddedTestServerAndroid::SetSSLConfig(JNIEnv* jenv,
typedef std::unique_ptr<HttpResponse> (*HandleRequestPtr)( typedef std::unique_ptr<HttpResponse> (*HandleRequestPtr)(
const HttpRequest& request); const HttpRequest& request);
void EmbeddedTestServerAndroid::RegisterRequestHandler( void EmbeddedTestServerAndroid::RegisterRequestHandler(JNIEnv* env,
JNIEnv* env, jlong handler) {
const JavaParamRef<jobject>& jobj,
jlong handler) {
HandleRequestPtr handler_ptr = reinterpret_cast<HandleRequestPtr>(handler); HandleRequestPtr handler_ptr = reinterpret_cast<HandleRequestPtr>(handler);
test_server_.RegisterRequestHandler(base::BindRepeating(handler_ptr)); test_server_.RegisterRequestHandler(base::BindRepeating(handler_ptr));
} }
void EmbeddedTestServerAndroid::ServeFilesFromDirectory( void EmbeddedTestServerAndroid::ServeFilesFromDirectory(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& jobj,
const JavaParamRef<jstring>& jdirectory_path) { const JavaParamRef<jstring>& jdirectory_path) {
const base::FilePath directory( const base::FilePath directory(
base::android::ConvertJavaStringToUTF8(env, jdirectory_path)); base::android::ConvertJavaStringToUTF8(env, jdirectory_path));
@ -146,8 +134,7 @@ void EmbeddedTestServerAndroid::ReadFromSocket(const void* socket_id) {
env, weak_java_server_.get(env), reinterpret_cast<intptr_t>(socket_id)); env, weak_java_server_.get(env), reinterpret_cast<intptr_t>(socket_id));
} }
void EmbeddedTestServerAndroid::Destroy(JNIEnv* env, void EmbeddedTestServerAndroid::Destroy(JNIEnv* env) {
const JavaParamRef<jobject>& jobj) {
delete this; delete this;
} }

@ -30,47 +30,34 @@ class EmbeddedTestServerAndroid {
~EmbeddedTestServerAndroid(); ~EmbeddedTestServerAndroid();
void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); void Destroy(JNIEnv* env);
jboolean Start(JNIEnv* env, jboolean Start(JNIEnv* env, jint port);
const base::android::JavaParamRef<jobject>& jobj,
jint port);
base::android::ScopedJavaLocalRef<jstring> GetRootCertPemPath( base::android::ScopedJavaLocalRef<jstring> GetRootCertPemPath(
JNIEnv* jenv, JNIEnv* jenv) const;
const base::android::JavaParamRef<jobject>& jobj) const;
jboolean ShutdownAndWaitUntilComplete( jboolean ShutdownAndWaitUntilComplete(JNIEnv* env);
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jobj);
base::android::ScopedJavaLocalRef<jstring> GetURL( base::android::ScopedJavaLocalRef<jstring> GetURL(
JNIEnv* jenv, JNIEnv* jenv,
const base::android::JavaParamRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jrelative_url) const; const base::android::JavaParamRef<jstring>& jrelative_url) const;
base::android::ScopedJavaLocalRef<jstring> GetURLWithHostName( base::android::ScopedJavaLocalRef<jstring> GetURLWithHostName(
JNIEnv* jenv, JNIEnv* jenv,
const base::android::JavaParamRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jhostname, const base::android::JavaParamRef<jstring>& jhostname,
const base::android::JavaParamRef<jstring>& jrelative_url) const; const base::android::JavaParamRef<jstring>& jrelative_url) const;
void AddDefaultHandlers( void AddDefaultHandlers(
JNIEnv* jenv, JNIEnv* jenv,
const base::android::JavaParamRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jdirectory_path); const base::android::JavaParamRef<jstring>& jdirectory_path);
void SetSSLConfig(JNIEnv* jenv, void SetSSLConfig(JNIEnv* jenv, jint jserver_certificate);
const base::android::JavaParamRef<jobject>& jobj,
jint jserver_certificate);
void RegisterRequestHandler(JNIEnv* jenv, void RegisterRequestHandler(JNIEnv* jenv, jlong handler);
const base::android::JavaParamRef<jobject>& jobj,
jlong handler);
void ServeFilesFromDirectory( void ServeFilesFromDirectory(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& jobj,
const base::android::JavaParamRef<jstring>& jdirectory_path); const base::android::JavaParamRef<jstring>& jdirectory_path);
private: private:

@ -45,12 +45,14 @@ source_set("native_test_native_code") {
android_library("native_main_runner_java") { android_library("native_main_runner_java") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ "java/src/org/chromium/native_test/MainRunner.java" ] sources = [ "java/src/org/chromium/native_test/MainRunner.java" ]
deps = [ "//base:jni_java" ] deps = [ "//base:jni_java" ]
} }
android_library("native_test_java") { android_library("native_test_java") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
deps = [ deps = [
":native_main_runner_java", ":native_main_runner_java",
"//base:base_java", "//base:base_java",
@ -61,7 +63,6 @@ android_library("native_test_java") {
"//testing/android/reporter:reporter_java", "//testing/android/reporter:reporter_java",
"//third_party/androidx:androidx_fragment_fragment_java", "//third_party/androidx:androidx_fragment_fragment_java",
] ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ sources = [
"java/src/org/chromium/native_test/NativeBrowserTest.java", "java/src/org/chromium/native_test/NativeBrowserTest.java",
"java/src/org/chromium/native_test/NativeBrowserTestActivity.java", "java/src/org/chromium/native_test/NativeBrowserTestActivity.java",

@ -5,6 +5,7 @@
package org.chromium.native_test; package org.chromium.native_test;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/** /**
* This class provides a way to run the native main method. * This class provides a way to run the native main method.
@ -20,7 +21,11 @@ public final class MainRunner {
// Maps the file descriptors and executes the main method with the passed in command line. // Maps the file descriptors and executes the main method with the passed in command line.
public static int runMain(String[] commandLine) { public static int runMain(String[] commandLine) {
return nativeRunMain(commandLine); return MainRunnerJni.get().runMain(commandLine);
}
@NativeMethods
interface Natives {
int runMain(String[] commandLine);
} }
private static native int nativeRunMain(String[] commandLine);
} }

@ -16,6 +16,7 @@ import android.system.Os;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.test.util.UrlUtils; import org.chromium.base.test.util.UrlUtils;
import org.chromium.build.gtest_apk.NativeTestIntent; import org.chromium.build.gtest_apk.NativeTestIntent;
import org.chromium.test.reporter.TestStatusReporter; import org.chromium.test.reporter.TestStatusReporter;
@ -173,8 +174,8 @@ public class NativeTest {
} }
private void runTests(Activity activity) { private void runTests(Activity activity) {
nativeRunTests(mCommandLineFlags.toString(), mCommandLineFilePath, mStdoutFilePath, NativeTestJni.get().runTests(mCommandLineFlags.toString(), mCommandLineFilePath,
activity.getApplicationContext(), UrlUtils.getIsolatedTestRoot()); mStdoutFilePath, activity.getApplicationContext(), UrlUtils.getIsolatedTestRoot());
activity.finish(); activity.finish();
mReporter.testRunFinished(Process.myPid()); mReporter.testRunFinished(Process.myPid());
} }
@ -186,6 +187,9 @@ public class NativeTest {
Log.e(TAG, "[ RUNNER_FAILED ] could not load native library"); Log.e(TAG, "[ RUNNER_FAILED ] could not load native library");
} }
private native void nativeRunTests(String commandLineFlags, String commandLineFilePath, @NativeMethods
String stdoutFilePath, Context appContext, String testDataDir); interface Natives {
void runTests(String commandLineFlags, String commandLineFilePath, String stdoutFilePath,
Context appContext, String testDataDir);
}
} }

@ -77,7 +77,6 @@ void AndroidLog(int priority, const char* format, ...) {
static void JNI_NativeTest_RunTests( static void JNI_NativeTest_RunTests(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& jcommand_line_flags, const JavaParamRef<jstring>& jcommand_line_flags,
const JavaParamRef<jstring>& jcommand_line_file_path, const JavaParamRef<jstring>& jcommand_line_file_path,
const JavaParamRef<jstring>& jstdout_file_path, const JavaParamRef<jstring>& jstdout_file_path,

@ -303,6 +303,7 @@ if (is_android) {
android_library("android_test_helper_java") { android_library("android_test_helper_java") {
testonly = true testonly = true
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ sources = [
"android/javatests/src/org/chromium/url/GURLJavaTestHelper.java", "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java",
"android/javatests/src/org/chromium/url/OriginJavaTestHelper.java", "android/javatests/src/org/chromium/url/OriginJavaTestHelper.java",

@ -6,6 +6,7 @@ package org.chromium.url;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/** /**
* Helpers for GURLJavaTest that need to call into native code. * Helpers for GURLJavaTest that need to call into native code.
@ -17,6 +18,17 @@ public class GURLJavaTestHelper {
return new GURL(uri); return new GURL(uri);
} }
public static native void nativeInitializeICU(); public static void nativeInitializeICU() {
public static native void nativeTestGURLEquivalence(); GURLJavaTestHelperJni.get().initializeICU();
}
public static void nativeTestGURLEquivalence() {
GURLJavaTestHelperJni.get().testGURLEquivalence();
}
@NativeMethods
interface Natives {
void initializeICU();
void testGURLEquivalence();
}
} }

@ -32,7 +32,7 @@ public class OriginJavaTest {
@SmallTest @SmallTest
@Test @Test
public void testOriginEquivalence() { public void testOriginEquivalence() {
OriginJavaTestHelper.nativeTestOriginEquivalence(); OriginJavaTestHelper.testOriginEquivalence();
} }
@SmallTest @SmallTest

@ -5,11 +5,19 @@
package org.chromium.url; package org.chromium.url;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/** /**
* Helpers for OriginJavaTest that need to call into native code. * Helpers for OriginJavaTest that need to call into native code.
*/ */
@JNINamespace("url") @JNINamespace("url")
public class OriginJavaTestHelper { public class OriginJavaTestHelper {
public static native void nativeTestOriginEquivalence(); public static void testOriginEquivalence() {
OriginJavaTestHelperJni.get().testOriginEquivalence();
}
@NativeMethods
interface Natives {
void testOriginEquivalence();
}
} }