OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.net.test; |
| 6 |
| 7 import android.os.Handler; |
| 8 import android.os.HandlerThread; |
| 9 |
| 10 import org.chromium.base.Log; |
| 11 import org.chromium.base.annotations.CalledByNative; |
| 12 import org.chromium.base.annotations.JNINamespace; |
| 13 import org.chromium.base.test.library_loader.TestLibraryLoader; |
| 14 |
| 15 import java.util.concurrent.Callable; |
| 16 import java.util.concurrent.ExecutionException; |
| 17 import java.util.concurrent.FutureTask; |
| 18 import java.util.concurrent.atomic.AtomicInteger; |
| 19 |
| 20 /** |
| 21 * Java bindings for running a net::test_server::EmbeddedTestServer. |
| 22 * |
| 23 * This should not be used directly. Use {@link EmbeddedTestServer} instead. |
| 24 */ |
| 25 @JNINamespace("net::test_server") |
| 26 public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub { |
| 27 private static final String TAG = "cr_TestServer"; |
| 28 |
| 29 private static AtomicInteger sCount = new AtomicInteger(); |
| 30 |
| 31 private Handler mHandler; |
| 32 private HandlerThread mHandlerThread; |
| 33 private long mNativeEmbeddedTestServer; |
| 34 |
| 35 /** Create an uninitialized EmbeddedTestServer. */ |
| 36 public EmbeddedTestServerImpl() {} |
| 37 |
| 38 private <V> V runOnHandlerThread(Callable<V> c) { |
| 39 FutureTask<V> t = new FutureTask<V>(c); |
| 40 mHandler.post(t); |
| 41 try { |
| 42 return t.get(); |
| 43 } catch (ExecutionException e) { |
| 44 Log.e(TAG, "Exception raised from native EmbeddedTestServer", e); |
| 45 } catch (InterruptedException e) { |
| 46 Log.e(TAG, "Interrupted while waiting for native EmbeddedTestServer"
, e); |
| 47 } |
| 48 return null; |
| 49 } |
| 50 |
| 51 /** Initialize the native EmbeddedTestServer object. */ |
| 52 @Override |
| 53 public void initializeNative() { |
| 54 TestLibraryLoader.loadLibraries(); |
| 55 |
| 56 mHandlerThread = new HandlerThread("EmbeddedTestServer" + sCount.getAndI
ncrement()); |
| 57 mHandlerThread.start(); |
| 58 mHandler = new Handler(mHandlerThread.getLooper()); |
| 59 |
| 60 runOnHandlerThread(new Callable<Void>() { |
| 61 @Override |
| 62 public Void call() { |
| 63 if (mNativeEmbeddedTestServer == 0) nativeInit(); |
| 64 assert mNativeEmbeddedTestServer != 0; |
| 65 return null; |
| 66 } |
| 67 }); |
| 68 } |
| 69 |
| 70 /** Starts the server. |
| 71 * |
| 72 * Note that this should be called after handlers are set up, including any
relevant calls |
| 73 * serveFilesFromDirectory. |
| 74 * |
| 75 * @return Whether the server was successfully started. |
| 76 */ |
| 77 @Override |
| 78 public boolean start() { |
| 79 return runOnHandlerThread(new Callable<Boolean>() { |
| 80 @Override |
| 81 public Boolean call() { |
| 82 return nativeStart(mNativeEmbeddedTestServer); |
| 83 } |
| 84 }); |
| 85 } |
| 86 |
| 87 /** Serve files from the provided directory. |
| 88 * |
| 89 * @param directoryPath The path of the directory from which files should b
e served. |
| 90 */ |
| 91 @Override |
| 92 public void serveFilesFromDirectory(final String directoryPath) { |
| 93 runOnHandlerThread(new Callable<Void>() { |
| 94 @Override |
| 95 public Void call() { |
| 96 nativeServeFilesFromDirectory(mNativeEmbeddedTestServer, directo
ryPath); |
| 97 return null; |
| 98 } |
| 99 }); |
| 100 } |
| 101 |
| 102 /** Get the full URL for the given relative URL. |
| 103 * |
| 104 * @param relativeUrl The relative URL for which a full URL should be retur
ned. |
| 105 * @return The URL as a String. |
| 106 */ |
| 107 @Override |
| 108 public String getURL(final String relativeUrl) { |
| 109 return runOnHandlerThread(new Callable<String>() { |
| 110 @Override |
| 111 public String call() { |
| 112 return nativeGetURL(mNativeEmbeddedTestServer, relativeUrl); |
| 113 } |
| 114 }); |
| 115 } |
| 116 |
| 117 /** Shut down the server. |
| 118 * |
| 119 * @return Whether the server was successfully shut down. |
| 120 */ |
| 121 @Override |
| 122 public boolean shutdownAndWaitUntilComplete() { |
| 123 return runOnHandlerThread(new Callable<Boolean>() { |
| 124 @Override |
| 125 public Boolean call() { |
| 126 return nativeShutdownAndWaitUntilComplete(mNativeEmbeddedTestSer
ver); |
| 127 } |
| 128 }); |
| 129 } |
| 130 |
| 131 /** Destroy the native EmbeddedTestServer object. */ |
| 132 @Override |
| 133 public void destroy() { |
| 134 runOnHandlerThread(new Callable<Void>() { |
| 135 @Override |
| 136 public Void call() { |
| 137 assert mNativeEmbeddedTestServer != 0; |
| 138 nativeDestroy(mNativeEmbeddedTestServer); |
| 139 assert mNativeEmbeddedTestServer == 0; |
| 140 return null; |
| 141 } |
| 142 }); |
| 143 |
| 144 mHandlerThread.quitSafely(); |
| 145 try { |
| 146 mHandlerThread.join(); |
| 147 } catch (InterruptedException e) { |
| 148 } |
| 149 } |
| 150 |
| 151 @CalledByNative |
| 152 private void setNativePtr(long nativePtr) { |
| 153 assert mNativeEmbeddedTestServer == 0; |
| 154 mNativeEmbeddedTestServer = nativePtr; |
| 155 } |
| 156 |
| 157 @CalledByNative |
| 158 private void clearNativePtr() { |
| 159 assert mNativeEmbeddedTestServer != 0; |
| 160 mNativeEmbeddedTestServer = 0; |
| 161 } |
| 162 |
| 163 private native void nativeInit(); |
| 164 private native void nativeDestroy(long nativeEmbeddedTestServerAndroid); |
| 165 private native boolean nativeStart(long nativeEmbeddedTestServerAndroid); |
| 166 private native boolean nativeShutdownAndWaitUntilComplete(long nativeEmbedde
dTestServerAndroid); |
| 167 private native String nativeGetURL(long nativeEmbeddedTestServerAndroid, Str
ing relativeUrl); |
| 168 private native void nativeServeFilesFromDirectory( |
| 169 long nativeEmbeddedTestServerAndroid, String directoryPath); |
| 170 } |
OLD | NEW |