diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 813fcc0c5a716..e1095a47efeca 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn @@ -1126,6 +1126,7 @@ android_library("chrome_test_java") { "//third_party/android_deps:androidx_recyclerview_recyclerview_java", "//third_party/android_deps:androidx_test_runner_java", "//third_party/android_deps:androidx_viewpager_viewpager_java", + "//url:gurl_javatests", "//url:origin_java", # TODO (bjoyce): Remove recyclerview_v7 when espresso tests are migrated @@ -1894,6 +1895,7 @@ android_library("browser_java_test_support") { "//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:protobuf_lite_runtime_java", "//third_party/junit", + "//url:gurl_android_test_helper_java", ] } @@ -1916,6 +1918,7 @@ static_library("browser_test_support") { "//components/query_tiles/test:test_support", "//content/test:test_support", "//net:test_support", + "//url:gurl_android_test_helper", ] } diff --git a/url/BUILD.gn b/url/BUILD.gn index 06c29f169e091..b14a1dca7af67 100644 --- a/url/BUILD.gn +++ b/url/BUILD.gn @@ -222,15 +222,6 @@ test("url_unittests") { "//url/mojom:test_url_mojom_gurl", ] } - if (is_android) { - sources += [ "android/gurl_android_unittest.cc" ] - deps += [ - ":gurl_android", - ":gurl_java", - ":gurl_javatests", - ":native_j_unittests_jni_headers", - ] - } } test("url_perftests") { @@ -258,17 +249,42 @@ fuzzer_test("gurl_fuzzer") { } if (is_android) { - android_library("gurl_javatests") { + source_set("gurl_android_test_helper") { testonly = true - sources = [ - "android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java", + sources = [ "android/gurl_java_test_helper.cc" ] + deps = [ + ":gurl_android", + ":gurl_j_test_jni_headers", + ":url", + "//base/test:test_support", + "//testing/gtest", ] + } + + android_library("gurl_android_test_helper_java") { + testonly = true + sources = + [ "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java" ] deps = [ ":gurl_java", - ":gurl_jni_headers", "//base:base_java", "//base:base_java_test_support", "//base:jni_java", + ] + } + + android_library("gurl_javatests") { + testonly = true + sources = [ "android/javatests/src/org/chromium/url/GURLJavaTest.java" ] + deps = [ + ":gurl_android_test_helper_java", + ":gurl_java", + "//base:base_java", + "//base:base_java_test_support", + "//base:jni_java", + "//content/public/test/android:content_java_test_support", + "//third_party/android_deps:androidx_core_core_java", + "//third_party/android_deps:androidx_test_runner_java", "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/junit", @@ -279,10 +295,9 @@ if (is_android) { # See https://bugs.chromium.org/p/chromium/issues/detail?id=908819 for why we # can't put 'java' in the name here. - generate_jni("native_j_unittests_jni_headers") { + generate_jni("gurl_j_test_jni_headers") { testonly = true - sources = [ - "android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java", - ] + sources = + [ "android/javatests/src/org/chromium/url/GURLJavaTestHelper.java" ] } } diff --git a/url/android/gurl_android_unittest.cc b/url/android/gurl_java_test_helper.cc similarity index 76% rename from url/android/gurl_android_unittest.cc rename to url/android/gurl_java_test_helper.cc index fe2b7088e4e01..ba6409b3b312d 100644 --- a/url/android/gurl_android_unittest.cc +++ b/url/android/gurl_java_test_helper.cc @@ -6,29 +6,21 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" +#include "base/test/icu_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/android/gurl_android.h" #include "url/gurl.h" -#include "url/native_j_unittests_jni_headers/GURLJavaTest_jni.h" +#include "url/gurl_j_test_jni_headers/GURLJavaTestHelper_jni.h" using base::android::AttachCurrentThread; namespace url { -class GURLAndroidTest : public ::testing::Test { - public: - GURLAndroidTest() - : j_test_(Java_GURLJavaTest_Constructor(AttachCurrentThread())) {} +static void JNI_GURLJavaTestHelper_InitializeICU(JNIEnv* env) { + base::test::InitializeICUForTesting(); +} - const base::android::ScopedJavaGlobalRef<jobject>& j_test() { - return j_test_; - } - - private: - base::android::ScopedJavaGlobalRef<jobject> j_test_; -}; - -TEST_F(GURLAndroidTest, TestGURLEquivalence) { +static void JNI_GURLJavaTestHelper_TestGURLEquivalence(JNIEnv* env) { const char* cases[] = { // Common Standard URLs. "https://www.google.com", @@ -62,17 +54,14 @@ TEST_F(GURLAndroidTest, TestGURLEquivalence) { // Invalid URLs. "foobar", }; - JNIEnv* env = AttachCurrentThread(); for (const char* uri : cases) { GURL gurl(uri); base::android::ScopedJavaLocalRef<jobject> j_gurl = - Java_GURLJavaTest_createGURL( - env, j_test(), base::android::ConvertUTF8ToJavaString(env, uri)); + Java_GURLJavaTestHelper_createGURL( + env, base::android::ConvertUTF8ToJavaString(env, uri)); std::unique_ptr<GURL> gurl2 = GURLAndroid::ToNativeGURL(env, j_gurl); EXPECT_EQ(gurl, *gurl2); } } -JAVA_TESTS(GURLAndroidTest, j_test()) - } // namespace url diff --git a/url/android/javatests/DEPS b/url/android/javatests/DEPS new file mode 100644 index 0000000000000..aa93591311928 --- /dev/null +++ b/url/android/javatests/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+content/public/test/android", +] diff --git a/url/android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java b/url/android/javatests/src/org/chromium/url/GURLJavaTest.java similarity index 91% rename from url/android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java rename to url/android/javatests/src/org/chromium/url/GURLJavaTest.java index 0517ddf7edcb4..d29b1aca8ff74 100644 --- a/url/android/native_java_unittests/src/org/chromium/url/GURLJavaTest.java +++ b/url/android/javatests/src/org/chromium/url/GURLJavaTest.java @@ -7,12 +7,18 @@ package org.chromium.url; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doThrow; +import androidx.test.filters.SmallTest; + import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.CalledByNativeJavaTest; +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.Batch; +import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import java.net.URISyntaxException; @@ -21,18 +27,18 @@ import java.net.URISyntaxException; * the logic is tested there. This test is primarily to make sure everything is plumbed through * correctly. */ +@RunWith(BaseJUnit4ClassRunner.class) +@Batch(Batch.UNIT_TESTS) public class GURLJavaTest { @Mock GURL.Natives mGURLMocks; - @CalledByNative - private GURLJavaTest() { + @Before + public void setUp() { MockitoAnnotations.initMocks(this); - } - @CalledByNative - public GURL createGURL(String uri) { - return new GURL(uri); + NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess(); + GURLJavaTestHelper.nativeInitializeICU(); } private void deepAssertEquals(GURL expected, GURL actual) { @@ -51,8 +57,15 @@ public class GURLJavaTest { return Integer.toString(serialization.length()) + GURL.SERIALIZER_DELIMITER + serialization; } + @SmallTest + @Test + public void testGURLEquivalence() { + GURLJavaTestHelper.nativeTestGURLEquivalence(); + } + // Equivalent of GURLTest.Components - @CalledByNativeJavaTest + @SmallTest + @Test @SuppressWarnings(value = "AuthLeak") public void testComponents() { GURL empty = new GURL(""); @@ -85,7 +98,8 @@ public class GURLJavaTest { } // Equivalent of GURLTest.Empty - @CalledByNativeJavaTest + @SmallTest + @Test public void testEmpty() { GURLJni.TEST_HOOKS.setInstanceForTesting(mGURLMocks); doThrow(new RuntimeException("Should not need to parse empty URL")) @@ -107,7 +121,8 @@ public class GURLJavaTest { } // Test that GURL and URI return the correct Origin. - @CalledByNativeJavaTest + @SmallTest + @Test @SuppressWarnings(value = "AuthLeak") public void testOrigin() throws URISyntaxException { final String kExpectedOrigin1 = "http://google.com:21/"; @@ -122,12 +137,13 @@ public class GURLJavaTest { Assert.assertEquals(kExpectedOrigin1, origin.getSpec()); } - @CalledByNativeJavaTest + @SmallTest + @Test public void testWideInput() throws URISyntaxException { final String kExpectedSpec = "http://xn--1xa.com/"; GURL url = new GURL("http://\u03C0.com"); - Assert.assertEquals("http://xn--1xa.com/", url.getSpec()); + Assert.assertEquals(kExpectedSpec, url.getSpec()); Assert.assertEquals("http", url.getScheme()); Assert.assertEquals("", url.getUsername()); Assert.assertEquals("", url.getPassword()); @@ -138,7 +154,8 @@ public class GURLJavaTest { Assert.assertEquals("", url.getRef()); } - @CalledByNativeJavaTest + @SmallTest + @Test @SuppressWarnings(value = "AuthLeak") public void testSerialization() { GURL cases[] = { @@ -194,7 +211,8 @@ public class GURLJavaTest { * Tests that we re-parse the URL from the spec, which must always be the last token in the * serialization, if the serialization version differs. */ - @CalledByNativeJavaTest + @SmallTest + @Test public void testSerializationWithVersionSkew() { GURL url = new GURL("https://www.google.com"); String serialization = (GURL.SERIALIZER_VERSION + 1) @@ -208,7 +226,8 @@ public class GURLJavaTest { /** * Tests that fields that aren't visible to java code are correctly serialized. */ - @CalledByNativeJavaTest + @SmallTest + @Test public void testSerializationOfPrivateFields() { String serialization = GURL.SERIALIZER_VERSION + ",true," @@ -226,7 +245,8 @@ public class GURLJavaTest { /** * Tests serialized GURL truncated by storage. */ - @CalledByNativeJavaTest + @SmallTest + @Test public void testTruncatedDeserialization() { String serialization = "123,1,true,1,2,3,4,5,6,7,8,9,10"; serialization = serialization.replace(',', GURL.SERIALIZER_DELIMITER); @@ -237,7 +257,8 @@ public class GURLJavaTest { /** * Tests serialized GURL truncated by storage. */ - @CalledByNativeJavaTest + @SmallTest + @Test public void testCorruptedSerializations() { String serialization = new GURL("https://www.google.ca").serialize(); // Replace the scheme length (5) with an extra delimiter. diff --git a/url/android/javatests/src/org/chromium/url/GURLJavaTestHelper.java b/url/android/javatests/src/org/chromium/url/GURLJavaTestHelper.java new file mode 100644 index 0000000000000..3bd91a3941a68 --- /dev/null +++ b/url/android/javatests/src/org/chromium/url/GURLJavaTestHelper.java @@ -0,0 +1,22 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.url; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; + +/** + * Helpers for GURLJavaTest that need to call into native code. + */ +@JNINamespace("url") +public class GURLJavaTestHelper { + @CalledByNative + public static GURL createGURL(String uri) { + return new GURL(uri); + } + + public static native void nativeInitializeICU(); + public static native void nativeTestGURLEquivalence(); +}