Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.net; | 5 package org.chromium.net; |
| 6 | 6 |
| 7 import android.os.ConditionVariable; | 7 import android.os.ConditionVariable; |
| 8 import android.os.Handler; | |
| 9 import android.os.Looper; | |
| 8 | 10 |
| 11 import org.json.JSONException; | |
| 12 import org.json.JSONObject; | |
| 13 | |
| 14 import org.chromium.base.annotations.CalledByNative; | |
| 9 import org.chromium.base.annotations.JNINamespace; | 15 import org.chromium.base.annotations.JNINamespace; |
| 10 import org.chromium.net.impl.CronetUrlRequest; | 16 import org.chromium.net.impl.CronetUrlRequest; |
| 11 import org.json.JSONException; | 17 |
| 12 import org.json.JSONObject; | 18 import java.nio.ByteBuffer; |
| 19 import java.util.concurrent.Executor; | |
| 13 | 20 |
| 14 /** | 21 /** |
| 15 * Utilities for Cronet testing | 22 * Utilities for Cronet testing |
| 16 */ | 23 */ |
| 17 @JNINamespace("cronet") | 24 @JNINamespace("cronet") |
| 18 public class CronetTestUtil { | 25 public class CronetTestUtil { |
| 19 private static final ConditionVariable sHostResolverBlock = new ConditionVar iable(); | 26 private static final ConditionVariable sHostResolverBlock = new ConditionVar iable(); |
| 27 private static CronetEngine sCronetEngineWithPreparedNetworkThread; | |
|
kapishnikov
2016/10/20 17:25:46
It would be great if we can avoid 'static' here.
pauljensen
2016/10/24 18:52:53
Done.
| |
| 20 | 28 |
| 21 static final String SDCH_FAKE_HOST = "fake.sdch.domain"; | 29 static final String SDCH_FAKE_HOST = "fake.sdch.domain"; |
| 22 // QUIC test domain must match the certificate used | 30 // QUIC test domain must match the certificate used |
| 23 // (quic_test.example.com.crt and quic_test.example.com.key.pkcs8), and | 31 // (quic_test.example.com.crt and quic_test.example.com.key.pkcs8), and |
| 24 // the file served ( | 32 // the file served ( |
| 25 // components/cronet/android/test/assets/test/quic_data/simple.txt). | 33 // components/cronet/android/test/assets/test/quic_data/simple.txt). |
| 26 static final String QUIC_FAKE_HOST = "test.example.com"; | 34 static final String QUIC_FAKE_HOST = "test.example.com"; |
| 27 private static final String[] TEST_DOMAINS = {SDCH_FAKE_HOST, QUIC_FAKE_HOST }; | 35 private static final String[] TEST_DOMAINS = {SDCH_FAKE_HOST, QUIC_FAKE_HOST }; |
| 28 private static final String LOOPBACK_ADDRESS = "127.0.0.1"; | 36 private static final String LOOPBACK_ADDRESS = "127.0.0.1"; |
| 29 | 37 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 51 */ | 59 */ |
| 52 public static JSONObject generateHostResolverRules(String destination) throw s JSONException { | 60 public static JSONObject generateHostResolverRules(String destination) throw s JSONException { |
| 53 StringBuilder rules = new StringBuilder(); | 61 StringBuilder rules = new StringBuilder(); |
| 54 for (String domain : TEST_DOMAINS) { | 62 for (String domain : TEST_DOMAINS) { |
| 55 rules.append("MAP " + domain + " " + destination + ","); | 63 rules.append("MAP " + domain + " " + destination + ","); |
| 56 } | 64 } |
| 57 return new JSONObject().put("host_resolver_rules", rules); | 65 return new JSONObject().put("host_resolver_rules", rules); |
| 58 } | 66 } |
| 59 | 67 |
| 60 /** | 68 /** |
| 69 * Run {@code r} on {@code engine}'s network thread. | |
| 70 */ | |
| 71 public static void postToNetworkThread(final CronetEngine engine, final Runn able r) { | |
| 72 // This method works by creating a UrlRequest with {@code engine} and us ing a | |
| 73 // direct-executor to execute on {@code engine}'s network thread. The U rlRequest | |
| 74 // goes to a bogus URL which immediately triggers {@link UrlRequest#Call back#onFailed}. | |
| 75 | |
| 76 // UrlRequests cannot be created on the network thread (see DCHECK in | |
| 77 // CronetURLRequestAdapter()), so this method must first post over to th e main thread, | |
| 78 // in case it was called on the network thread. | |
| 79 new Handler(Looper.getMainLooper()).post(new Runnable() { | |
| 80 @Override | |
| 81 public void run() { | |
| 82 Executor directExecutor = new Executor() { | |
| 83 @Override | |
| 84 public void execute(Runnable runable) { | |
| 85 runable.run(); | |
| 86 } | |
| 87 }; | |
| 88 UrlRequest.Callback callback = new UrlRequest.Callback() { | |
| 89 @Override | |
| 90 public void onRedirectReceived(UrlRequest request, UrlRespon seInfo responseInfo, | |
| 91 String newLocationUrl) {} | |
| 92 | |
| 93 @Override | |
| 94 public void onResponseStarted( | |
| 95 UrlRequest request, UrlResponseInfo responseInfo) {} | |
| 96 | |
| 97 @Override | |
| 98 public void onReadCompleted(UrlRequest request, UrlResponseI nfo responseInfo, | |
| 99 ByteBuffer byteBuffer) {} | |
| 100 | |
| 101 @Override | |
| 102 public void onSucceeded(UrlRequest request, UrlResponseInfo responseInfo) {} | |
| 103 | |
| 104 @Override | |
| 105 public void onFailed(UrlRequest request, UrlResponseInfo res ponseInfo, | |
| 106 UrlRequestException error) { | |
| 107 r.run(); | |
| 108 } | |
| 109 }; | |
| 110 // Bogus empty URL will trigger onFailed() immediately. | |
| 111 new UrlRequest.Builder("", callback, directExecutor, engine).bui ld().start(); | |
| 112 } | |
| 113 }); | |
| 114 } | |
| 115 | |
| 116 /** | |
| 117 * Prepare {@code cronetEngine}'s network thread so libcronet_test code can run on it. | |
| 118 */ | |
| 119 public static void prepareNetworkThreadForTesting(final CronetEngine cronetE ngine) { | |
| 120 sCronetEngineWithPreparedNetworkThread = cronetEngine; | |
| 121 final ConditionVariable initDone = new ConditionVariable(); | |
| 122 postToNetworkThread(cronetEngine, new Runnable() { | |
| 123 @Override | |
| 124 public void run() { | |
| 125 nativePrepareNetworkThreadForTesting(); | |
| 126 initDone.open(); | |
| 127 } | |
| 128 }); | |
| 129 // Don't return until network thread is prepared. Some test call | |
| 130 // {@code cronetEngine.shutdown} immediatly after calling this function, which will fail | |
| 131 // if postToNetworkThread() isn't finished running a UrlRequest with {@c ode cronetEngine}. | |
| 132 initDone.block(); | |
| 133 } | |
| 134 | |
| 135 /** | |
| 136 * Get pointer to SingleThreadTaskRunner created by {@link #prepareNetworkTh readForTesting}. | |
| 137 */ | |
| 138 public static long getNativeSingleThreadTaskRunner() { | |
| 139 return nativeGetNativeSingleThreadTaskRunner(); | |
| 140 } | |
| 141 | |
| 142 /** | |
| 143 * Clean up preparation performed by {@link #prepareNetworkThreadForTesting} . | |
| 144 */ | |
| 145 public static void cleanupNetorkThreadForTesting() { | |
| 146 final ConditionVariable cleanupDone = new ConditionVariable(); | |
| 147 postToNetworkThread(sCronetEngineWithPreparedNetworkThread, new Runnable () { | |
| 148 @Override | |
| 149 public void run() { | |
| 150 nativeCleanupNetorkThreadForTesting(); | |
| 151 cleanupDone.open(); | |
| 152 } | |
| 153 }); | |
| 154 // Don't return until network thread is cleaned up. Some test call | |
| 155 // {@code cronetEngine.shutdown} immediatly after calling this function, which will fail | |
| 156 // if postToNetworkThread() isn't finished running a UrlRequest with {@c ode cronetEngine}. | |
| 157 cleanupDone.block(); | |
| 158 } | |
| 159 | |
| 160 /** | |
| 161 * Execute base::Closure pointed to by {@code closure} on network thread. | |
| 162 */ | |
| 163 @CalledByNative | |
| 164 private static void postClosureToNetworkThread(final long closure) { | |
| 165 CronetTestUtil.postToNetworkThread(sCronetEngineWithPreparedNetworkThrea d, new Runnable() { | |
| 166 @Override | |
| 167 public void run() { | |
| 168 nativeRunClosure(closure); | |
| 169 } | |
| 170 }); | |
| 171 } | |
| 172 | |
| 173 /** | |
| 61 * Returns the value of load flags in |urlRequest|. | 174 * Returns the value of load flags in |urlRequest|. |
| 62 * @param urlRequest is the UrlRequest object of interest. | 175 * @param urlRequest is the UrlRequest object of interest. |
| 63 */ | 176 */ |
| 64 public static int getLoadFlags(UrlRequest urlRequest) { | 177 public static int getLoadFlags(UrlRequest urlRequest) { |
| 65 return nativeGetLoadFlags(((CronetUrlRequest) urlRequest).getUrlRequestA dapterForTesting()); | 178 return nativeGetLoadFlags(((CronetUrlRequest) urlRequest).getUrlRequestF orTesting()); |
| 66 } | 179 } |
| 67 | 180 |
| 68 private static native int nativeGetLoadFlags(long urlRequest); | 181 private static native int nativeGetLoadFlags(long urlRequest); |
| 182 | |
| 183 private static native void nativePrepareNetworkThreadForTesting(); | |
|
kapishnikov
2016/10/20 17:25:46
A static method with no context. This limits us to
| |
| 184 private static native long nativeGetNativeSingleThreadTaskRunner(); | |
| 185 private static native void nativeCleanupNetorkThreadForTesting(); | |
| 186 private static native void nativeRunClosure(long closure); | |
| 69 } | 187 } |
| OLD | NEW |