summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjbudorick <jbudorick@chromium.org>2015-12-21 17:21:35 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-22 01:22:18 +0000
commitccffb980ce90524aabe801ccde23ad2484b571b8 (patch)
treed7c15b007bb0228b29e3070a101bd2aaf177f8a9
parent47b2227948bbc711d043f9884f7de8c0ea547e06 (diff)
downloadchromium_src-ccffb980ce90524aabe801ccde23ad2484b571b8.zip
chromium_src-ccffb980ce90524aabe801ccde23ad2484b571b8.tar.gz
chromium_src-ccffb980ce90524aabe801ccde23ad2484b571b8.tar.bz2
[Android] Add ChromiumNetTestSupport.apk for the java EmbeddedTestServer. (RELAND)
This is a reland of https://codereview.chromium.org/1465383003/ BUG=488195 Review URL: https://codereview.chromium.org/1523383002 Cr-Commit-Position: refs/heads/master@{#366507}
-rw-r--r--build/android/pylib/instrumentation/instrumentation_test_instance.py9
-rw-r--r--build/android/pylib/local/device/local_device_instrumentation_test_run.py2
-rw-r--r--build/android/pylib/remote/device/remote_device_instrumentation_test_run.py1
-rw-r--r--net/BUILD.gn2
-rw-r--r--net/android/BUILD.gn53
-rw-r--r--net/net.gyp73
-rw-r--r--net/test/android/javatests/AndroidManifest.xml27
-rw-r--r--net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java199
-rw-r--r--net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java186
-rw-r--r--net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerService.java19
-rw-r--r--net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerImpl.aidl41
-rw-r--r--net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerInterface.aidl5
-rw-r--r--net/test/android/javatests/src_dummy/org/chromium/net/test/dummy/Dummy.java11
-rw-r--r--net/test/android/net_test_entry_point.cc14
-rw-r--r--net/test/android/net_test_jni_onload.cc2
-rw-r--r--net/test/embedded_test_server/android/embedded_test_server_android.cc9
16 files changed, 593 insertions, 60 deletions
diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance.py b/build/android/pylib/instrumentation/instrumentation_test_instance.py
index b13fdb2..84b130d 100644
--- a/build/android/pylib/instrumentation/instrumentation_test_instance.py
+++ b/build/android/pylib/instrumentation/instrumentation_test_instance.py
@@ -33,9 +33,6 @@ _DEFAULT_ANNOTATIONS = [
'EnormousTest', 'IntegrationTest']
_EXCLUDE_UNLESS_REQUESTED_ANNOTATIONS = [
'DisabledTest', 'FlakyTest']
-_EXTRA_ENABLE_HTTP_SERVER = (
- 'org.chromium.chrome.test.ChromeInstrumentationTestRunner.'
- + 'EnableTestHttpServer')
_EXTRA_DRIVER_TEST_LIST = (
'org.chromium.test.driver.OnDeviceInstrumentationDriver.TestList')
_EXTRA_DRIVER_TEST_LIST_FILE = (
@@ -598,12 +595,6 @@ class InstrumentationTestInstance(test_instance.TestInstance):
new_tests.append(parameterized_t)
return tests + new_tests
- @staticmethod
- def GetHttpServerEnvironmentVars():
- return {
- _EXTRA_ENABLE_HTTP_SERVER: None,
- }
-
def GetDriverEnvironmentVars(
self, test_list=None, test_list_file_path=None):
env = {
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index 1efe510..ef78c89 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -137,7 +137,7 @@ class LocalDeviceInstrumentationTestRun(
#override
def _RunTest(self, device, test):
- extras = self._test_instance.GetHttpServerEnvironmentVars()
+ extras = {}
flags = None
test_timeout_scale = None
diff --git a/build/android/pylib/remote/device/remote_device_instrumentation_test_run.py b/build/android/pylib/remote/device/remote_device_instrumentation_test_run.py
index 8858b06..ee018579 100644
--- a/build/android/pylib/remote/device/remote_device_instrumentation_test_run.py
+++ b/build/android/pylib/remote/device/remote_device_instrumentation_test_run.py
@@ -40,7 +40,6 @@ class RemoteDeviceInstrumentationTestRun(
env_vars = self._test_instance.GetDriverEnvironmentVars(
test_list_file_path=test_list_file.name)
- env_vars.update(self._test_instance.GetHttpServerEnvironmentVars())
logging.debug('extras:')
for k, v in env_vars.iteritems():
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 8ca7cdf..df60546 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1212,7 +1212,7 @@ if (is_android) {
sources = [
"android/javatests/src/org/chromium/net/AndroidKeyStoreTestUtil.java",
"test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticator.java",
- "test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java",
+ "test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java",
]
jni_package = "net/test"
}
diff --git a/net/android/BUILD.gn b/net/android/BUILD.gn
index 483aed8..a1c23f4 100644
--- a/net/android/BUILD.gn
+++ b/net/android/BUILD.gn
@@ -16,14 +16,64 @@ android_library("net_java") {
]
}
+android_aidl("embedded_test_server_aidl") {
+ interface_file = "../test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerInterface.aidl"
+ sources = [
+ "../test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerImpl.aidl",
+ ]
+}
+
android_library("net_java_test_support") {
+ testonly = true
DEPRECATED_java_in_dir = "../test/android/javatests/src"
deps = [
":net_java",
"//base:base_java",
+ "//base:base_java_test_support",
"//third_party/android_tools:legacy_http_javalib",
]
- srcjar_deps = [ ":net_java_test_support_enums_srcjar" ]
+ srcjar_deps = [
+ ":embedded_test_server_aidl",
+ ":net_java_test_support_enums_srcjar",
+ ]
+}
+
+source_set("java_test_native_support") {
+ testonly = true
+ sources = [
+ "../test/android/net_test_entry_point.cc",
+ "../test/android/net_test_jni_onload.cc",
+ "../test/android/net_test_jni_onload.h",
+ "../test/embedded_test_server/android/embedded_test_server_android.cc",
+ "../test/embedded_test_server/android/embedded_test_server_android.h",
+ ]
+
+ deps = [
+ "//net:test_support",
+ ]
+ public_deps = [
+ "//net:net_test_jni_headers",
+ ]
+}
+
+shared_library("net_java_test_native_support") {
+ testonly = true
+ deps = [
+ ":java_test_native_support",
+ "//net:test_support",
+ ]
+}
+
+android_apk("net_test_support_apk") {
+ testonly = true
+ deps = [
+ ":net_java_test_native_support",
+ ":net_java_test_support",
+ "//base:base_java",
+ ]
+ android_manifest = "../test/android/javatests/AndroidManifest.xml"
+ apk_name = "ChromiumNetTestSupport"
+ native_libs = [ "libnet_java_test_native_support.so" ]
}
android_resources("net_unittests_apk_resources") {
@@ -32,6 +82,7 @@ android_resources("net_unittests_apk_resources") {
}
android_library("net_javatests") {
+ testonly = true
DEPRECATED_java_in_dir = "javatests/src"
deps = [
":net_java",
diff --git a/net/net.gyp b/net/net.gyp
index f9d69bc..be61c80 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -639,8 +639,6 @@
'net_test_jni_headers',
],
'sources': [
- 'test/android/net_test_jni_onload.cc',
- 'test/android/net_test_jni_onload.h',
'test/embedded_test_server/android/embedded_test_server_android.cc',
'test/embedded_test_server/android/embedded_test_server_android.h',
'test/spawned_test_server/remote_test_server.cc',
@@ -1383,7 +1381,7 @@
'type': 'none',
'sources': [
'android/javatests/src/org/chromium/net/AndroidKeyStoreTestUtil.java',
- 'test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java',
+ 'test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java',
'test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticator.java',
],
'variables': {
@@ -1410,6 +1408,17 @@
'includes': [ '../build/java.gypi' ],
},
{
+ 'target_name': 'embedded_test_server_aidl',
+ 'type': 'none',
+ 'variables': {
+ 'aidl_interface_file': '../net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerInterface.aidl',
+ },
+ 'sources': [
+ '../net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerImpl.aidl',
+ ],
+ 'includes': [ '../build/java_aidl.gypi' ],
+ },
+ {
'target_name': 'net_java_test_support',
'type': 'none',
'variables': {
@@ -1418,15 +1427,71 @@
'chromium_code': 0,
},
'dependencies': [
+ 'embedded_test_server_aidl',
'net_java',
- 'net_test_support',
'url_request_failed_job_java',
'../base/base.gyp:base_java',
+ '../base/base.gyp:base_java_test_support',
'../third_party/android_tools/android_tools.gyp:legacy_http_javalib',
],
'includes': [ '../build/java.gypi' ],
},
{
+ 'target_name': 'libnet_java_test_support',
+ 'type': 'shared_library',
+ 'dependencies': [
+ 'net_test_support',
+ '../base/base.gyp:base',
+ ],
+ 'sources': [
+ 'test/android/net_test_entry_point.cc',
+ 'test/android/net_test_jni_onload.cc',
+ 'test/android/net_test_jni_onload.h',
+ ],
+ },
+ {
+ 'target_name': 'net_test_support_apk',
+ 'type': 'none',
+ 'dependencies': [
+ 'net_java_test_support',
+ ],
+ 'variables': {
+ 'android_manifest_path': 'test/android/javatests/AndroidManifest.xml',
+ 'apk_name': 'ChromiumNetTestSupport',
+ 'is_test_apk': 1,
+ 'java_in_dir': 'test/android/javatests',
+ 'java_in_dir_suffix': '/src_dummy',
+ 'native_lib_target': 'libnet_java_test_support',
+ },
+ 'includes': [
+ '../build/java_apk.gypi',
+ ],
+ },
+ {
+ # Targets that need the net test support APK should depend on this
+ # target. It ensures that the APK is built without passing the
+ # classpath on to dependent targets.
+ 'target_name': 'require_net_test_support_apk',
+ 'type': 'none',
+ 'actions': [
+ {
+ 'action_name': 'require_ChromiumNetTestSupport',
+ 'variables': {
+ 'required_file': '<(PRODUCT_DIR)/net_test_support_apk/ChromiumNetTestSupport.apk.required',
+ },
+ 'inputs': [
+ '<(PRODUCT_DIR)/apks/ChromiumNetTestSupport.apk',
+ ],
+ 'outputs': [
+ '<(required_file)',
+ ],
+ 'action': [
+ 'python', '../build/android/gyp/touch.py', '<(required_file)',
+ ],
+ },
+ ],
+ },
+ {
'target_name': 'url_request_failed_job_java',
'type': 'none',
'variables': {
diff --git a/net/test/android/javatests/AndroidManifest.xml b/net/test/android/javatests/AndroidManifest.xml
new file mode 100644
index 0000000..c2a2652
--- /dev/null
+++ b/net/test/android/javatests/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 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 name must be unique. -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="org.chromium.net.test.support">
+
+ <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
+
+ <application android:label="ChromiumNetTestSupport">
+
+ <uses-library android:name="android.test.runner" />
+
+ <service android:name="org.chromium.net.test.EmbeddedTestServerService"
+ android:exported="true"
+ tools:ignore="ExportedService">
+ <intent-filter android:action="org.chromium.net.test.EMBEDDED_TEST_SERVER_SERVICE" />
+ </service>
+
+ </application>
+
+</manifest>
diff --git a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java
index 9f974ce..06ed7e2 100644
--- a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java
+++ b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java
@@ -4,13 +4,18 @@
package org.chromium.net.test;
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import org.chromium.base.Log;
import java.io.File;
-/**
- * Java bindings for the native embedded test server.
+/** A simple file server for java tests.
*
* An example use:
* EmbeddedTestServer s = new EmbeddedTestServer();
@@ -21,21 +26,81 @@ import java.io.File;
* }
*
* // serve requests...
+ * s.getURL("/foo/bar.txt");
*
* s.shutdownAndWait();
* s.destroy();
+ *
+ * Note that this runs net::test_server::EmbeddedTestServer in a service in a separate APK.
*/
-@JNINamespace("net::test_server")
public class EmbeddedTestServer {
- private long mNativeEmbeddedTestServer;
+ private static final String TAG = "cr_TestServer";
+
+ private static final String EMBEDDED_TEST_SERVER_SERVICE =
+ "org.chromium.net.test.EMBEDDED_TEST_SERVER_SERVICE";
+ private static final long SERVICE_CONNECTION_WAIT_INTERVAL_MS = 5000;
+
+ private IEmbeddedTestServerImpl mImpl;
+ private ServiceConnection mConn = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ synchronized (mImplMonitor) {
+ mImpl = IEmbeddedTestServerImpl.Stub.asInterface(service);
+ mImplMonitor.notify();
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ synchronized (mImplMonitor) {
+ mImpl = null;
+ mImplMonitor.notify();
+ }
+ }
+ };
+
+ private final Object mImplMonitor = new Object();
- /** Create an uninitialized EmbeddedTestServer. */
- public EmbeddedTestServer() {}
+ /**
+ * Exception class raised on failure in the EmbeddedTestServer.
+ */
+ public static final class EmbeddedTestServerFailure extends Error {
+ public EmbeddedTestServerFailure(String errorDesc) {
+ super(errorDesc);
+ }
+
+ public EmbeddedTestServerFailure(String errorDesc, Throwable cause) {
+ super(errorDesc, cause);
+ }
+ }
- /** Initialize the native EmbeddedTestServer object. */
- public void initializeNative() {
- if (mNativeEmbeddedTestServer == 0) nativeInit();
- assert mNativeEmbeddedTestServer != 0;
+ public void initializeNative(Context context) throws InterruptedException {
+ Intent intent = new Intent(EMBEDDED_TEST_SERVER_SERVICE);
+ intent.setClassName(
+ "org.chromium.net.test.support", "org.chromium.net.test.EmbeddedTestServerService");
+ if (!context.bindService(intent, mConn, Context.BIND_AUTO_CREATE)) {
+ throw new EmbeddedTestServerFailure(
+ "Unable to bind to the EmbeddedTestServer service.");
+ }
+ synchronized (mImplMonitor) {
+ Log.i(TAG, "Waiting for EmbeddedTestServer service connection.");
+ while (mImpl == null) {
+ mImplMonitor.wait(SERVICE_CONNECTION_WAIT_INTERVAL_MS);
+ Log.i(TAG, "Still waiting for EmbeddedTestServer service connection.");
+ }
+ Log.i(TAG, "EmbeddedTestServer service connected.");
+ boolean initialized = false;
+ try {
+ initialized = mImpl.initializeNative();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to initialize native server.", e);
+ initialized = false;
+ }
+
+ if (!initialized) {
+ throw new EmbeddedTestServerFailure("Failed to initialize native server.");
+ }
+ }
}
/** Serve files from the provided directory.
@@ -43,7 +108,7 @@ public class EmbeddedTestServer {
* @param directory The directory from which files should be served.
*/
public void serveFilesFromDirectory(File directory) {
- nativeServeFilesFromDirectory(mNativeEmbeddedTestServer, directory.getPath());
+ serveFilesFromDirectory(directory.getPath());
}
/** Serve files from the provided directory.
@@ -51,7 +116,21 @@ public class EmbeddedTestServer {
* @param directoryPath The path of the directory from which files should be served.
*/
public void serveFilesFromDirectory(String directoryPath) {
- nativeServeFilesFromDirectory(mNativeEmbeddedTestServer, directoryPath);
+ try {
+ synchronized (mImplMonitor) {
+ checkServiceLocked();
+ mImpl.serveFilesFromDirectory(directoryPath);
+ }
+ } catch (RemoteException e) {
+ throw new EmbeddedTestServerFailure(
+ "Failed to start serving files from " + directoryPath + ": " + e.toString());
+ }
+ }
+
+ private void checkServiceLocked() {
+ if (mImpl == null) {
+ throw new EmbeddedTestServerFailure("Service disconnected.");
+ }
}
/** Starts the server.
@@ -62,7 +141,35 @@ public class EmbeddedTestServer {
* @return Whether the server was successfully initialized.
*/
public boolean start() {
- return nativeStart(mNativeEmbeddedTestServer);
+ try {
+ synchronized (mImplMonitor) {
+ checkServiceLocked();
+ return mImpl.start();
+ }
+ } catch (RemoteException e) {
+ throw new EmbeddedTestServerFailure("Failed to start server.", e);
+ }
+ }
+
+ /** Create and initialize a server that serves files from the provided directory.
+ *
+ * This handles native object initialization, server configuration, and server initialization.
+ * On returning, the server is ready for use.
+ *
+ * @param context The context in which the server is being started.
+ * @param directory The directory from which files should be served.
+ * @return The created server.
+ */
+ public static EmbeddedTestServer createAndStartFileServer(Context context, File directory)
+ throws InterruptedException {
+ EmbeddedTestServer server = new EmbeddedTestServer();
+ server.initializeNative(context);
+ server.serveFilesFromDirectory(directory);
+ if (!server.start()) {
+ throw new EmbeddedTestServerFailure(
+ "Failed to start serving files from " + directory.getPath());
+ }
+ return server;
}
/** Get the full URL for the given relative URL.
@@ -71,7 +178,14 @@ public class EmbeddedTestServer {
* @return The URL as a String.
*/
public String getURL(String relativeUrl) {
- return nativeGetURL(mNativeEmbeddedTestServer, relativeUrl);
+ try {
+ synchronized (mImplMonitor) {
+ checkServiceLocked();
+ return mImpl.getURL(relativeUrl);
+ }
+ } catch (RemoteException e) {
+ throw new EmbeddedTestServerFailure("Failed to get URL for " + relativeUrl, e);
+ }
}
/** Shutdown the server.
@@ -79,33 +193,40 @@ public class EmbeddedTestServer {
* @return Whether the server was successfully shut down.
*/
public boolean shutdownAndWaitUntilComplete() {
- return nativeShutdownAndWaitUntilComplete(mNativeEmbeddedTestServer);
+ try {
+ synchronized (mImplMonitor) {
+ checkServiceLocked();
+ return mImpl.shutdownAndWaitUntilComplete();
+ }
+ } catch (RemoteException e) {
+ throw new EmbeddedTestServerFailure("Failed to shut down.", e);
+ }
}
/** Destroy the native EmbeddedTestServer object. */
- public void destroy() {
- assert mNativeEmbeddedTestServer != 0;
- nativeDestroy(mNativeEmbeddedTestServer);
- assert mNativeEmbeddedTestServer == 0;
+ public void destroy(Context context) {
+ try {
+ synchronized (mImplMonitor) {
+ checkServiceLocked();
+ mImpl.destroy();
+ }
+ } catch (RemoteException e) {
+ throw new EmbeddedTestServerFailure("Failed to destroy native server.", e);
+ } finally {
+ context.unbindService(mConn);
+ }
}
- @CalledByNative
- private void setNativePtr(long nativePtr) {
- assert mNativeEmbeddedTestServer == 0;
- mNativeEmbeddedTestServer = nativePtr;
- }
-
- @CalledByNative
- private void clearNativePtr() {
- assert mNativeEmbeddedTestServer != 0;
- mNativeEmbeddedTestServer = 0;
+ /** Stop and destroy the provided server.
+ *
+ * This handles stopping the server and destroying the native object.
+ *
+ * @param server The server to stop and destroy.
+ */
+ public static void stopAndDestroyServer(EmbeddedTestServer server, Context context) {
+ if (!server.shutdownAndWaitUntilComplete()) {
+ throw new EmbeddedTestServerFailure("Failed to stop server.");
+ }
+ server.destroy(context);
}
-
- private native void nativeInit();
- private native void nativeDestroy(long nativeEmbeddedTestServerAndroid);
- private native boolean nativeStart(long nativeEmbeddedTestServerAndroid);
- private native boolean nativeShutdownAndWaitUntilComplete(long nativeEmbeddedTestServerAndroid);
- private native String nativeGetURL(long nativeEmbeddedTestServerAndroid, String relativeUrl);
- private native void nativeServeFilesFromDirectory(
- long nativeEmbeddedTestServerAndroid, String directoryPath);
}
diff --git a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java
new file mode 100644
index 0000000..553f68f
--- /dev/null
+++ b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java
@@ -0,0 +1,186 @@
+// Copyright 2015 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.net.test;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+
+import org.chromium.base.Log;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.library_loader.LibraryProcessType;
+import org.chromium.base.library_loader.ProcessInitException;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Java bindings for running a net::test_server::EmbeddedTestServer.
+ *
+ * This should not be used directly. Use {@link EmbeddedTestServer} instead.
+ */
+@JNINamespace("net::test_server")
+public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub {
+ private static final String TAG = "cr_TestServer";
+
+ private static AtomicInteger sCount = new AtomicInteger();
+
+ private final Context mContext;
+ private Handler mHandler;
+ private HandlerThread mHandlerThread;
+ private long mNativeEmbeddedTestServer;
+
+ /** Create an uninitialized EmbeddedTestServer. */
+ public EmbeddedTestServerImpl(Context context) {
+ mContext = context;
+ }
+
+ private <V> V runOnHandlerThread(Callable<V> c) {
+ FutureTask<V> t = new FutureTask<V>(c);
+ mHandler.post(t);
+ try {
+ return t.get();
+ } catch (ExecutionException e) {
+ Log.e(TAG, "Exception raised from native EmbeddedTestServer", e);
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Interrupted while waiting for native EmbeddedTestServer", e);
+ }
+ return null;
+ }
+
+ /** Initialize the native EmbeddedTestServer object.
+ *
+ * @return Whether the native object was successfully initialized.
+ */
+ @Override
+ public boolean initializeNative() {
+ try {
+ LibraryLoader libraryLoader = LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER);
+ libraryLoader.ensureInitialized(mContext);
+ } catch (ProcessInitException e) {
+ Log.e(TAG, "Failed to load native libraries.", e);
+ return false;
+ }
+
+ mHandlerThread = new HandlerThread("EmbeddedTestServer" + sCount.getAndIncrement());
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+
+ runOnHandlerThread(new Callable<Void>() {
+ @Override
+ public Void call() {
+ if (mNativeEmbeddedTestServer == 0) nativeInit();
+ assert mNativeEmbeddedTestServer != 0;
+ return null;
+ }
+ });
+ return true;
+ }
+
+ /** Starts the server.
+ *
+ * Note that this should be called after handlers are set up, including any relevant calls
+ * serveFilesFromDirectory.
+ *
+ * @return Whether the server was successfully started.
+ */
+ @Override
+ public boolean start() {
+ return runOnHandlerThread(new Callable<Boolean>() {
+ @Override
+ public Boolean call() {
+ return nativeStart(mNativeEmbeddedTestServer);
+ }
+ });
+ }
+
+ /** Serve files from the provided directory.
+ *
+ * @param directoryPath The path of the directory from which files should be served.
+ */
+ @Override
+ public void serveFilesFromDirectory(final String directoryPath) {
+ runOnHandlerThread(new Callable<Void>() {
+ @Override
+ public Void call() {
+ nativeServeFilesFromDirectory(mNativeEmbeddedTestServer, directoryPath);
+ return null;
+ }
+ });
+ }
+
+ /** Get the full URL for the given relative URL.
+ *
+ * @param relativeUrl The relative URL for which a full URL should be returned.
+ * @return The URL as a String.
+ */
+ @Override
+ public String getURL(final String relativeUrl) {
+ return runOnHandlerThread(new Callable<String>() {
+ @Override
+ public String call() {
+ return nativeGetURL(mNativeEmbeddedTestServer, relativeUrl);
+ }
+ });
+ }
+
+ /** Shut down the server.
+ *
+ * @return Whether the server was successfully shut down.
+ */
+ @Override
+ public boolean shutdownAndWaitUntilComplete() {
+ return runOnHandlerThread(new Callable<Boolean>() {
+ @Override
+ public Boolean call() {
+ return nativeShutdownAndWaitUntilComplete(mNativeEmbeddedTestServer);
+ }
+ });
+ }
+
+ /** Destroy the native EmbeddedTestServer object. */
+ @Override
+ public void destroy() {
+ runOnHandlerThread(new Callable<Void>() {
+ @Override
+ public Void call() {
+ assert mNativeEmbeddedTestServer != 0;
+ nativeDestroy(mNativeEmbeddedTestServer);
+ assert mNativeEmbeddedTestServer == 0;
+ return null;
+ }
+ });
+
+ mHandlerThread.quitSafely();
+ try {
+ mHandlerThread.join();
+ } catch (InterruptedException e) {
+ }
+ }
+
+ @CalledByNative
+ private void setNativePtr(long nativePtr) {
+ assert mNativeEmbeddedTestServer == 0;
+ mNativeEmbeddedTestServer = nativePtr;
+ }
+
+ @CalledByNative
+ private void clearNativePtr() {
+ assert mNativeEmbeddedTestServer != 0;
+ mNativeEmbeddedTestServer = 0;
+ }
+
+ private native void nativeInit();
+ private native void nativeDestroy(long nativeEmbeddedTestServerAndroid);
+ private native boolean nativeStart(long nativeEmbeddedTestServerAndroid);
+ private native boolean nativeShutdownAndWaitUntilComplete(long nativeEmbeddedTestServerAndroid);
+ private native String nativeGetURL(long nativeEmbeddedTestServerAndroid, String relativeUrl);
+ private native void nativeServeFilesFromDirectory(
+ long nativeEmbeddedTestServerAndroid, String directoryPath);
+}
diff --git a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerService.java b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerService.java
new file mode 100644
index 0000000..1390b8c
--- /dev/null
+++ b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerService.java
@@ -0,0 +1,19 @@
+// Copyright 2015 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.net.test;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+/**
+ * A {@link android.app.Service} that creates a new {@link EmbeddedTestServer} when bound.
+ */
+public class EmbeddedTestServerService extends Service {
+ @Override
+ public IBinder onBind(Intent intent) {
+ return new EmbeddedTestServerImpl(this);
+ }
+}
diff --git a/net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerImpl.aidl b/net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerImpl.aidl
new file mode 100644
index 0000000..898b7f5
--- /dev/null
+++ b/net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerImpl.aidl
@@ -0,0 +1,41 @@
+// Copyright 2015 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.net.test;
+
+interface IEmbeddedTestServerImpl {
+
+ /** Initialize the native object. */
+ boolean initializeNative();
+
+ /** Start the server.
+ *
+ * @return Whether the server was successfully started.
+ */
+ boolean start();
+
+ /** Serve files from the provided directory.
+ *
+ * @param directoryPath The path of the directory from which files should be served.
+ */
+ void serveFilesFromDirectory(String directoryPath);
+
+ /** Get the full URL for the given relative URL.
+ *
+ * @param relativeUrl The relative URL for which a full URL should be returned.
+ * @return The URL as a String.
+ */
+ String getURL(String relativeUrl);
+
+ /** Shut down the server.
+ *
+ * @return Whether the server was successfully shut down.
+ */
+ boolean shutdownAndWaitUntilComplete();
+
+ /** Destroy the native object. */
+ void destroy();
+
+}
+
diff --git a/net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerInterface.aidl b/net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerInterface.aidl
new file mode 100644
index 0000000..df0c3d1
--- /dev/null
+++ b/net/test/android/javatests/src/org/chromium/net/test/IEmbeddedTestServerInterface.aidl
@@ -0,0 +1,5 @@
+// Copyright 2015 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.
+
+interface org.chromium.net.test.IEmbedddedTestServerImpl;
diff --git a/net/test/android/javatests/src_dummy/org/chromium/net/test/dummy/Dummy.java b/net/test/android/javatests/src_dummy/org/chromium/net/test/dummy/Dummy.java
new file mode 100644
index 0000000..2ae73cd
--- /dev/null
+++ b/net/test/android/javatests/src_dummy/org/chromium/net/test/dummy/Dummy.java
@@ -0,0 +1,11 @@
+// Copyright 2015 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.net.test.dummy;
+
+/**
+ * Does nothing.
+ * TODO(newt): Delete after the switch to GN. This is only used in GYP.
+ */
+class Dummy {}
diff --git a/net/test/android/net_test_entry_point.cc b/net/test/android/net_test_entry_point.cc
new file mode 100644
index 0000000..c7a2dde
--- /dev/null
+++ b/net/test/android/net_test_entry_point.cc
@@ -0,0 +1,14 @@
+// Copyright 2015 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.
+
+#include "base/android/jni_android.h"
+#include "net/test/android/net_test_jni_onload.h"
+
+// This is called by the VM when the shared library is first loaded.
+JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
+ if (!net::test::OnJNIOnLoadRegisterJNI(vm) || !net::test::OnJNIOnLoadInit()) {
+ return -1;
+ }
+ return JNI_VERSION_1_4;
+}
diff --git a/net/test/android/net_test_jni_onload.cc b/net/test/android/net_test_jni_onload.cc
index ac54b1f..6f3db27 100644
--- a/net/test/android/net_test_jni_onload.cc
+++ b/net/test/android/net_test_jni_onload.cc
@@ -5,6 +5,7 @@
#include "net/test/android/net_test_jni_onload.h"
#include "base/android/base_jni_onload.h"
+#include "base/android/base_jni_registrar.h"
#include "base/bind.h"
#include "net/test/embedded_test_server/android/embedded_test_server_android.h"
@@ -27,6 +28,7 @@ bool Init() {
bool OnJNIOnLoadRegisterJNI(JavaVM* vm) {
std::vector<base::android::RegisterCallback> register_callbacks;
register_callbacks.push_back(base::Bind(&RegisterJNI));
+ register_callbacks.push_back(base::Bind(&base::android::RegisterJni));
return base::android::OnJNIOnLoadRegisterJNI(vm, register_callbacks);
}
diff --git a/net/test/embedded_test_server/android/embedded_test_server_android.cc b/net/test/embedded_test_server/android/embedded_test_server_android.cc
index 5e6d3fe..0f53545 100644
--- a/net/test/embedded_test_server/android/embedded_test_server_android.cc
+++ b/net/test/embedded_test_server/android/embedded_test_server_android.cc
@@ -9,20 +9,21 @@
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/trace_event/trace_event.h"
-#include "net/test/jni/EmbeddedTestServer_jni.h"
+#include "net/test/jni/EmbeddedTestServerImpl_jni.h"
namespace net {
namespace test_server {
EmbeddedTestServerAndroid::EmbeddedTestServerAndroid(JNIEnv* env, jobject jobj)
: weak_java_server_(env, jobj), test_server_() {
- Java_EmbeddedTestServer_setNativePtr(env, jobj,
- reinterpret_cast<intptr_t>(this));
+ Java_EmbeddedTestServerImpl_setNativePtr(env, jobj,
+ reinterpret_cast<intptr_t>(this));
}
EmbeddedTestServerAndroid::~EmbeddedTestServerAndroid() {
JNIEnv* env = base::android::AttachCurrentThread();
- Java_EmbeddedTestServer_clearNativePtr(env, weak_java_server_.get(env).obj());
+ Java_EmbeddedTestServerImpl_clearNativePtr(env,
+ weak_java_server_.get(env).obj());
}
jboolean EmbeddedTestServerAndroid::Start(JNIEnv* env,