diff options
author | jbudorick <jbudorick@chromium.org> | 2015-12-21 17:21:35 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-22 01:22:18 +0000 |
commit | ccffb980ce90524aabe801ccde23ad2484b571b8 (patch) | |
tree | d7c15b007bb0228b29e3070a101bd2aaf177f8a9 | |
parent | 47b2227948bbc711d043f9884f7de8c0ea547e06 (diff) | |
download | chromium_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}
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, |