summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpauljensen <pauljensen@chromium.org>2016-02-01 09:23:11 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-01 17:24:02 +0000
commit3721400b7fd14c4d9579c7d99eb936c59622d707 (patch)
treea66756ff15985ca1d3aee236eb2090b6a9f94b62
parent05b9291386bda6bec5e50b24f9f5e10c953ff64f (diff)
downloadchromium_src-3721400b7fd14c4d9579c7d99eb936c59622d707.zip
chromium_src-3721400b7fd14c4d9579c7d99eb936c59622d707.tar.gz
chromium_src-3721400b7fd14c4d9579c7d99eb936c59622d707.tar.bz2
[Cronet] Get Cronet performance test running again
1. Enable HTTPS for QUIC a. Insert a MockCertVerifier to pretend our cert is in root store b. Insert HostResolver rules to pretend test.example.com resolves to the the IP address of the USB reverse-tether interface c. Switch from using libcronet.so to libcronet_test.so as it contains several utilities we need (e.g. MockCertVerifier). This required making a Cronet testing Java target. d. Pass private key and cert to quic_server e. Copy cert to device 2. Call PathUtils.setPrivateDataDirectorySuffix() to avoid crash 3. Modify proguard options to avoid crbug.com/488192 4. Make Telemetry happy again a. Put basic header in config file b. Specify default_chrome_root 5. Avoid Theme.NoDisplay as it fails with Android Marshmallow Review URL: https://codereview.chromium.org/1536433002 Cr-Commit-Position: refs/heads/master@{#372684}
-rw-r--r--components/cronet.gypi28
-rw-r--r--components/cronet/android/BUILD.gn66
-rw-r--r--components/cronet/android/test/cronet_test_jni.cc2
-rw-r--r--components/cronet/android/test/cronet_test_util.cc86
-rw-r--r--components/cronet/android/test/cronet_test_util.h21
-rw-r--r--components/cronet/android/test/javaperftests/AndroidManifest.xml5
-rw-r--r--components/cronet/android/test/javaperftests/proguard.cfg4
-rwxr-xr-xcomponents/cronet/android/test/javaperftests/run.py31
-rw-r--r--components/cronet/android/test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java39
-rw-r--r--components/cronet/android/test/javatests/src/org/chromium/net/CronetTestBase.java10
-rw-r--r--components/cronet/android/test/native_test_server.cc55
-rw-r--r--components/cronet/android/test/quic_test_server.cc6
-rw-r--r--components/cronet/android/test/src/org/chromium/net/CronetTestUtil.java45
-rw-r--r--components/cronet/android/test/src/org/chromium/net/NativeTestServer.java24
-rw-r--r--components/cronet/android/test/src_dummy/org/chromium/net/test/dummy/Dummy.java11
15 files changed, 320 insertions, 113 deletions
diff --git a/components/cronet.gypi b/components/cronet.gypi
index 1dd1a64..a324fcf 100644
--- a/components/cronet.gypi
+++ b/components/cronet.gypi
@@ -368,6 +368,8 @@
'cronet/android/test/network_change_notifier_util.h',
'cronet/android/test/cronet_url_request_context_config_test.cc',
'cronet/android/test/cronet_url_request_context_config_test.h',
+ 'cronet/android/test/cronet_test_util.cc',
+ 'cronet/android/test/cronet_test_util.h',
],
'dependencies': [
'cronet_tests_jni_headers',
@@ -392,17 +394,38 @@
'includes': [ 'cronet/cronet_static.gypi' ],
},
{
+ 'target_name': 'cronet_test_support',
+ 'type': 'none',
+ 'dependencies': [
+ 'cronet_java',
+ '../net/net.gyp:net_java_test_support',
+ '../third_party/netty-tcnative/netty-tcnative.gyp:netty-tcnative',
+ '../third_party/netty4/netty.gyp:netty_all',
+ ],
+ 'variables': {
+ 'java_in_dir': 'cronet/android/test',
+ 'additional_src_dirs': [ 'cronet/android/test/javatests/src' ],
+ 'run_findbugs': 1,
+ },
+ 'includes': [ '../build/java.gypi' ],
+ },
+ {
'target_name': 'cronet_test_apk',
'type': 'none',
'dependencies': [
'cronet_java',
+ 'cronet_test_support',
'../net/net.gyp:net_java_test_support',
'../third_party/netty-tcnative/netty-tcnative.gyp:netty-tcnative',
'../third_party/netty4/netty.gyp:netty_all',
],
'variables': {
'apk_name': 'CronetTest',
+ # There isn't an easy way to have a java_apk target without any Java
+ # so we'll borrow the trick from the net_test_support_apk target of
+ # pointing it at placeholder Java via java_in_dir_suffix.
'java_in_dir': 'cronet/android/test',
+ 'java_in_dir_suffix': '/src_dummy',
'resource_dir': 'cronet/android/test/res',
'asset_location': 'cronet/android/test/assets',
'native_lib_target': 'libcronet_tests',
@@ -458,15 +481,16 @@
'dependencies': [
'cronet_java',
'cronet_api',
+ 'cronet_test_support',
],
'variables': {
'apk_name': 'CronetPerfTest',
'java_in_dir': 'cronet/android/test/javaperftests',
- 'is_test_apk': 1,
- 'native_lib_target': 'libcronet',
+ 'native_lib_target': 'libcronet_tests',
'proguard_enabled': 'true',
'proguard_flags_paths': [
'cronet/android/proguard.cfg',
+ 'cronet/android/test/javaperftests/proguard.cfg',
],
'run_findbugs': 1,
},
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index b6102e4..d9c252e 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -371,6 +371,8 @@ shared_library("cronet_tests") {
testonly = true
sources = [
"test/cronet_test_jni.cc",
+ "test/cronet_test_util.cc",
+ "test/cronet_test_util.h",
"test/cronet_url_request_context_config_test.cc",
"test/cronet_url_request_context_config_test.h",
"test/mock_cert_verifier.cc",
@@ -435,6 +437,8 @@ android_library("cronet_test_apk_java") {
"//net/android:net_java_test_support",
]
+ run_findbugs = true
+
if (cronet_enable_bidirectional_stream) {
java_files += [
"test/src/org/chromium/net/Http2TestHandler.java",
@@ -503,10 +507,8 @@ android_apk("cronet_test_apk") {
run_findbugs = true
}
-instrumentation_test_apk("cronet_test_instrumentation_apk") {
- apk_name = "CronetTestInstrumentation"
- apk_under_test = ":cronet_test_apk"
- android_manifest = "test/javatests/AndroidManifest.xml"
+android_library("cronet_javatests") {
+ testonly = true
java_files = [
"test/javatests/src/org/chromium/net/ChromiumUrlRequestTest.java",
@@ -560,6 +562,62 @@ instrumentation_test_apk("cronet_test_instrumentation_apk") {
}
}
+instrumentation_test_apk("cronet_test_instrumentation_apk") {
+ apk_name = "CronetTestInstrumentation"
+ apk_under_test = ":cronet_test_apk"
+ android_manifest = "test/javatests/AndroidManifest.xml"
+
+ deps = [
+ ":cronet_api",
+ ":cronet_java",
+ ":cronet_javatests",
+ ":cronet_test_apk_java",
+ "//base:base_java",
+ "//base:base_java_test_support",
+ "//net/android:net_java",
+ "//net/android:net_java_test_support",
+ ]
+
+ run_findbugs = true
+}
+
+android_library("cronet_perf_test_apk_java") {
+ testonly = true
+ java_files =
+ [ "test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java" ]
+
+ deps = [
+ ":cronet_api",
+ ":cronet_java",
+ ":cronet_javatests",
+ ":cronet_test_apk_java",
+ "//base:base_java",
+ ]
+
+ run_findbugs = true
+}
+
+android_apk("cronet_perf_test_apk") {
+ testonly = true
+ apk_name = "CronetPerfTest"
+ android_manifest = "test/javaperftests/AndroidManifest.xml"
+ native_libs = [ "libcronet_tests.so" ]
+
+ deps = [
+ ":cronet_perf_test_apk_java",
+ ":cronet_test_apk_java",
+ ":cronet_tests",
+ "//base:base_java",
+ ]
+
+ run_findbugs = true
+ proguard_enabled = true
+ proguard_configs = [
+ "proguard.cfg",
+ "test/javaperftests/proguard.cfg",
+ ]
+}
+
test("cronet_unittests") {
sources = [
"//components/cronet/histogram_manager_unittest.cc",
diff --git a/components/cronet/android/test/cronet_test_jni.cc b/components/cronet/android/test/cronet_test_jni.cc
index 6f0cd54..b3b650b 100644
--- a/components/cronet/android/test/cronet_test_jni.cc
+++ b/components/cronet/android/test/cronet_test_jni.cc
@@ -9,6 +9,7 @@
#include "base/android/jni_registrar.h"
#include "base/macros.h"
#include "components/cronet/android/cronet_library_loader.h"
+#include "cronet_test_util.h"
#include "cronet_url_request_context_config_test.h"
#include "mock_cert_verifier.h"
#include "mock_url_request_job_factory.h"
@@ -31,6 +32,7 @@ const base::android::RegistrationMethod kCronetTestsRegisteredMethods[] = {
cronet::TestUploadDataStreamHandlerRegisterJni},
{"CronetUrlRequestContextConfigTest",
cronet::RegisterCronetUrlRequestContextConfigTest},
+ {"CronetTestUtil", cronet::RegisterCronetTestUtil},
};
} // namespace
diff --git a/components/cronet/android/test/cronet_test_util.cc b/components/cronet/android/test/cronet_test_util.cc
new file mode 100644
index 0000000..07089a0
--- /dev/null
+++ b/components/cronet/android/test/cronet_test_util.cc
@@ -0,0 +1,86 @@
+// Copyright 2016 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 "components/cronet/android/test/cronet_test_util.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "components/cronet/android/cronet_url_request_context_adapter.h"
+#include "components/cronet/android/test/native_test_server.h"
+#include "components/cronet/android/url_request_context_adapter.h"
+#include "jni/CronetTestUtil_jni.h"
+#include "net/dns/host_resolver_impl.h"
+#include "net/dns/mock_host_resolver.h"
+
+namespace cronet {
+
+const char kFakeSdchDomain[] = "fake.sdch.domain";
+// This must match the certificate used
+// (quic_test.example.com.crt and quic_test.example.com.key.pkcs8), and
+// the file served (
+// components/cronet/android/test/assets/test/quic_data/simple.txt).
+const char kFakeQuicDomain[] = "test.example.com";
+
+namespace {
+
+// Install host resolver rules to map fake domains to |destination|, usually an
+// IP address.
+void RegisterHostResolverProcHelper(net::URLRequestContext* url_request_context,
+ const std::string& destination) {
+ net::HostResolverImpl* resolver =
+ static_cast<net::HostResolverImpl*>(url_request_context->host_resolver());
+ scoped_refptr<net::RuleBasedHostResolverProc> proc =
+ new net::RuleBasedHostResolverProc(NULL);
+ proc->AddRule(kFakeSdchDomain, destination);
+ proc->AddRule(kFakeQuicDomain, destination);
+ resolver->set_proc_params_for_test(
+ net::HostResolverImpl::ProcTaskParams(proc.get(), 1u));
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_CronetTestUtil_onHostResolverProcRegistered(env);
+}
+
+void RegisterHostResolverProcOnNetworkThread(
+ CronetURLRequestContextAdapter* context_adapter,
+ const std::string& destination) {
+ RegisterHostResolverProcHelper(context_adapter->GetURLRequestContext(),
+ destination);
+}
+
+// TODO(xunjieli): Delete this once legacy API is removed.
+void RegisterHostResolverProcOnNetworkThreadLegacyAPI(
+ URLRequestContextAdapter* context_adapter,
+ const std::string& destination) {
+ RegisterHostResolverProcHelper(context_adapter->GetURLRequestContext(),
+ destination);
+}
+
+} // namespace
+
+void RegisterHostResolverProc(JNIEnv* env,
+ const JavaParamRef<jclass>& jcaller,
+ jlong jadapter,
+ jboolean jlegacy_api,
+ const JavaParamRef<jstring>& jdestination) {
+ std::string destination(
+ base::android::ConvertJavaStringToUTF8(env, jdestination));
+ if (jlegacy_api == JNI_TRUE) {
+ URLRequestContextAdapter* context_adapter =
+ reinterpret_cast<URLRequestContextAdapter*>(jadapter);
+ context_adapter->PostTaskToNetworkThread(
+ FROM_HERE, base::Bind(&RegisterHostResolverProcOnNetworkThreadLegacyAPI,
+ base::Unretained(context_adapter), destination));
+ } else {
+ CronetURLRequestContextAdapter* context_adapter =
+ reinterpret_cast<CronetURLRequestContextAdapter*>(jadapter);
+ context_adapter->PostTaskToNetworkThread(
+ FROM_HERE, base::Bind(&RegisterHostResolverProcOnNetworkThread,
+ base::Unretained(context_adapter), destination));
+ }
+}
+
+bool RegisterCronetTestUtil(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace cronet
diff --git a/components/cronet/android/test/cronet_test_util.h b/components/cronet/android/test/cronet_test_util.h
new file mode 100644
index 0000000..3d7cc10
--- /dev/null
+++ b/components/cronet/android/test/cronet_test_util.h
@@ -0,0 +1,21 @@
+// Copyright 2016 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.
+
+#ifndef COMPONENTS_CRONET_ANDROID_TEST_CRONET_TEST_UTIL_H_
+#define COMPONENTS_CRONET_ANDROID_TEST_CRONET_TEST_UTIL_H_
+
+#include <jni.h>
+
+namespace cronet {
+
+// Host used in NativeTestServer for SDCH requests.
+extern const char kFakeSdchDomain[];
+// Host used in QuicTestServer.
+extern const char kFakeQuicDomain[];
+
+bool RegisterCronetTestUtil(JNIEnv* env);
+
+} // namespace cronet
+
+#endif // COMPONENTS_CRONET_ANDROID_TEST_CRONET_TEST_UTIL_H_
diff --git a/components/cronet/android/test/javaperftests/AndroidManifest.xml b/components/cronet/android/test/javaperftests/AndroidManifest.xml
index 8856ac6..166e3e2 100644
--- a/components/cronet/android/test/javaperftests/AndroidManifest.xml
+++ b/components/cronet/android/test/javaperftests/AndroidManifest.xml
@@ -6,8 +6,11 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application>
+ <!-- Used to use Theme.NoDisplay but this is no longer the recommended
+ way and crashes in Android Marshmallow.
+ https://plus.google.com/105051985738280261832/posts/LjnRzJKWPGW -->
<activity android:name="CronetPerfTestActivity"
- android:theme="@android:style/Theme.NoDisplay">
+ android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
diff --git a/components/cronet/android/test/javaperftests/proguard.cfg b/components/cronet/android/test/javaperftests/proguard.cfg
new file mode 100644
index 0000000..b89cdaf
--- /dev/null
+++ b/components/cronet/android/test/javaperftests/proguard.cfg
@@ -0,0 +1,4 @@
+# TODO(pauljensen): Remove when crbug.com/488192 is fixed.
+-dontwarn org.apache.http.**
+# Javaperftest doesn't use Netty so ignore warnings.
+-dontwarn io.netty.**
diff --git a/components/cronet/android/test/javaperftests/run.py b/components/cronet/android/test/javaperftests/run.py
index ae1014a..5e914fc 100755
--- a/components/cronet/android/test/javaperftests/run.py
+++ b/components/cronet/android/test/javaperftests/run.py
@@ -66,6 +66,12 @@ BUILD_TYPE = 'Release'
BUILD_DIR = os.path.join(REPOSITORY_ROOT, 'out', BUILD_TYPE)
QUIC_SERVER = os.path.join(BUILD_DIR, 'quic_server')
QUIC_CLIENT = os.path.join(BUILD_DIR, 'quic_client')
+CERT_PATH = os.path.join('net', 'data', 'ssl', 'certificates')
+QUIC_CERT_DIR = os.path.join(REPOSITORY_ROOT, CERT_PATH)
+QUIC_CERT_HOST = 'test.example.com'
+QUIC_CERT_FILENAME = 'quic_%s.crt' % QUIC_CERT_HOST
+QUIC_CERT = os.path.join(QUIC_CERT_DIR, QUIC_CERT_FILENAME)
+QUIC_KEY = os.path.join(QUIC_CERT_DIR, 'quic_%s.key.pkcs8' % QUIC_CERT_HOST)
APP_APK = os.path.join(BUILD_DIR, 'apks', 'CronetPerfTest.apk')
APP_PACKAGE = 'org.chromium.net'
APP_ACTIVITY = '.CronetPerfTestActivity'
@@ -98,6 +104,8 @@ BENCHMARK_CONFIG = {
'QUIC_PORT': 9001,
# Maximum read/write buffer size to use.
'MAX_BUFFER_SIZE': 16384,
+ 'HOST': QUIC_CERT_HOST,
+ 'QUIC_CERT_FILE': QUIC_CERT_FILENAME,
}
# Add benchmark config to global state for easy access.
globals().update(BENCHMARK_CONFIG)
@@ -130,7 +138,7 @@ class CronetPerfTestAndroidStory(android.AndroidStory):
self._device = device
device.RunShellCommand('rm %s' % DONE_FILE)
config = BENCHMARK_CONFIG
- config['HOST'] = GetServersHost(device)
+ config['HOST_IP'] = GetServersHost(device)
start_intent = intent.Intent(
package=APP_PACKAGE,
activity=APP_ACTIVITY,
@@ -210,19 +218,23 @@ class QuicServer:
self._process = pexpect.spawn(QUIC_SERVER,
['--quic_in_memory_cache_dir=%s' %
self._quic_server_doc_root,
+ '--certificate_file=%s' % QUIC_CERT,
+ '--key_file=%s' % QUIC_KEY,
'--port=%d' % QUIC_PORT])
assert self._process != None
# Wait for quic_server to start serving.
waited_s = 0
- while subprocess.call([QUIC_CLIENT,
- '--host=%s' % GetServersHost(device),
- '--port=%d' % QUIC_PORT,
- 'http://%s:%d/%s' % (GetServersHost(device),
- QUIC_PORT, SMALL_RESOURCE)],
+ while subprocess.call(['lsof', '-i', 'udp:%d' % QUIC_PORT, '-p',
+ '%d' % self._process.pid],
stdout=open(os.devnull, 'w')) != 0:
sleep(0.1)
waited_s += 0.1
assert waited_s < 5, "quic_server failed to start after %fs" % waited_s
+ # Push certificate to device.
+ cert = open(QUIC_CERT, 'r').read()
+ device_cert_path = os.path.join(device.GetExternalStoragePath(), CERT_PATH)
+ device.RunShellCommand('mkdir -p %s' % device_cert_path)
+ device.WriteFile(os.path.join(device_cert_path, QUIC_CERT_FILENAME), cert)
def ShutdownQuicServer(self):
if self._process:
@@ -261,7 +273,7 @@ def GenerateQuicTestResources(device):
os.rename(os.path.join(quic_server_doc_root,
"%s:%d" % (GetServersHost(device), HTTP_PORT)),
os.path.join(quic_server_doc_root,
- "%s:%d" % (GetServersHost(device), QUIC_PORT)))
+ "%s:%d" % (QUIC_CERT_HOST, QUIC_PORT)))
return quic_server_doc_root
@@ -310,10 +322,13 @@ def main():
# Chromium checkout in Telemetry.
perf_config_file = os.path.join(REPOSITORY_ROOT, 'tools', 'perf', 'core',
'binary_dependencies.json')
+ with open(perf_config_file, "w") as config_file:
+ config_file.write('{"config_type": "BaseConfig"}')
runner_config = benchmark_runner.ProjectConfig(
top_level_dir=top_level_dir,
benchmark_dirs=[top_level_dir],
- client_config=perf_config_file)
+ client_config=perf_config_file,
+ default_chrome_root=REPOSITORY_ROOT)
sys.argv.insert(1, 'run')
sys.argv.insert(2, 'run.CronetPerfTestBenchmark')
sys.argv.insert(3, '--android-rndis')
diff --git a/components/cronet/android/test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java b/components/cronet/android/test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java
index 775974e..8000aeb 100644
--- a/components/cronet/android/test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java
+++ b/components/cronet/android/test/javaperftests/src/org/chromium/net/CronetPerfTestActivity.java
@@ -11,6 +11,8 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Debug;
+import org.chromium.base.PathUtils;
+
import org.json.JSONException;
import org.json.JSONObject;
@@ -38,6 +40,7 @@ import java.util.concurrent.TimeUnit;
* Runs networking benchmarks and saves results to a file.
*/
public class CronetPerfTestActivity extends Activity {
+ private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "cronet_perf_test";
// Benchmark configuration passed down from host via Intent data.
// Call getConfig*(key) to extract individual configuration values.
private Uri mConfig;
@@ -160,31 +163,49 @@ public class CronetPerfTestActivity extends Activity {
default:
throw new IllegalArgumentException("Unknown size: " + size);
}
+ final String scheme;
+ final String host;
final int port;
switch (protocol) {
case HTTP:
+ scheme = "http";
+ host = getConfigString("HOST_IP");
port = getConfigInt("HTTP_PORT");
break;
case QUIC:
+ scheme = "https";
+ host = getConfigString("HOST");
port = getConfigInt("QUIC_PORT");
break;
default:
throw new IllegalArgumentException("Unknown protocol: " + protocol);
}
try {
- mUrl = new URL("http", getConfigString("HOST"), port, resource);
+ mUrl = new URL(scheme, host, port, resource);
} catch (MalformedURLException e) {
- throw new IllegalArgumentException("Bad URL: " + getConfigString("HOST") + ":"
- + port + "/" + resource);
+ throw new IllegalArgumentException(
+ "Bad URL: " + host + ":" + port + "/" + resource);
}
final CronetEngine.Builder cronetEngineBuilder =
new CronetEngine.Builder(CronetPerfTestActivity.this);
+ cronetEngineBuilder.setLibraryName("cronet_tests");
if (mProtocol == Protocol.QUIC) {
cronetEngineBuilder.enableQUIC(true);
- cronetEngineBuilder.addQuicHint(getConfigString("HOST"), getConfigInt("QUIC_PORT"),
- getConfigInt("QUIC_PORT"));
+ cronetEngineBuilder.addQuicHint(host, port, port);
+ cronetEngineBuilder.setMockCertVerifierForTesting(
+ MockCertVerifier.createMockCertVerifier(
+ new String[] {getConfigString("QUIC_CERT_FILE")}));
+ }
+
+ try {
+ JSONObject quicParams = new JSONObject().put("host_whitelist", host);
+ JSONObject experimentalOptions = new JSONObject().put("QUIC", quicParams);
+ cronetEngineBuilder.setExperimentalOptions(experimentalOptions.toString());
+ } catch (JSONException e) {
+ throw new IllegalStateException("JSON failed: " + e);
}
mCronetEngine = cronetEngineBuilder.build();
+ CronetTestUtil.registerHostResolverProc(mCronetEngine, getConfigString("HOST_IP"));
mName = buildBenchmarkName(mode, direction, protocol, concurrency, mIterations);
mConcurrency = concurrency;
mResults = results;
@@ -383,6 +404,7 @@ public class CronetPerfTestActivity extends Activity {
private class Callback extends UrlRequest.Callback {
private final ByteBuffer mBuffer;
private final Runnable mCompletionCallback;
+ private int mBytesReceived;
Callback(ByteBuffer buffer, Runnable completionCallback) {
mBuffer = buffer;
@@ -404,12 +426,18 @@ public class CronetPerfTestActivity extends Activity {
@Override
public void onReadCompleted(
UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) {
+ mBytesReceived += byteBuffer.position();
mBuffer.clear();
request.readNew(mBuffer);
}
@Override
public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
+ if (info.getHttpStatusCode() != 200 || mBytesReceived != mLength) {
+ System.out.println("Failed: response code: " + info.getHttpStatusCode()
+ + " bytes: " + mBytesReceived);
+ mFailed = true;
+ }
mCompletionCallback.run();
}
@@ -582,6 +610,7 @@ public class CronetPerfTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, this);
mConfig = getIntent().getData();
// Execute benchmarks on another thread to avoid networking on main thread.
new BenchmarkTask().execute();
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestBase.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestBase.java
index 28aafd3..f0d6e48 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestBase.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetTestBase.java
@@ -20,6 +20,7 @@ import java.net.URL;
*/
public class CronetTestBase extends AndroidTestCase {
private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "cronet_test";
+ private static final String LOOPBACK_ADDRESS = "127.0.0.1";
private CronetTestFramework mCronetTestFramework;
// {@code true} when test is being run against system HttpURLConnection implementation.
@@ -163,16 +164,11 @@ public class CronetTestBase extends AndroidTestCase {
* @param isLegacyAPI true if the test should use the legacy API.
*/
protected void registerHostResolver(CronetTestFramework framework, boolean isLegacyAPI) {
- long urlRequestContextAdapter;
if (isLegacyAPI) {
- urlRequestContextAdapter = ((ChromiumUrlRequestFactory) framework.mRequestFactory)
- .getRequestContext()
- .getUrlRequestContextAdapter();
+ CronetTestUtil.registerHostResolverProc(framework.mRequestFactory, LOOPBACK_ADDRESS);
} else {
- urlRequestContextAdapter = ((CronetUrlRequestContext) framework.mCronetEngine)
- .getUrlRequestContextAdapter();
+ CronetTestUtil.registerHostResolverProc(framework.mCronetEngine, LOOPBACK_ADDRESS);
}
- NativeTestServer.registerHostResolverProc(urlRequestContextAdapter, isLegacyAPI);
}
void assertResponseEquals(UrlResponseInfo expected, UrlResponseInfo actual) {
diff --git a/components/cronet/android/test/native_test_server.cc b/components/cronet/android/test/native_test_server.cc
index e042a6a..610f8ae 100644
--- a/components/cronet/android/test/native_test_server.cc
+++ b/components/cronet/android/test/native_test_server.cc
@@ -18,13 +18,10 @@
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
-#include "components/cronet/android/cronet_url_request_context_adapter.h"
-#include "components/cronet/android/url_request_context_adapter.h"
+#include "components/cronet/android/test/cronet_test_util.h"
#include "jni/NativeTestServer_jni.h"
#include "net/base/host_port_pair.h"
#include "net/base/url_util.h"
-#include "net/dns/host_resolver_impl.h"
-#include "net/dns/mock_host_resolver.h"
#include "net/http/http_status_code.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
@@ -40,12 +37,6 @@ const char kEchoHeaderPath[] = "/echo_header";
const char kEchoAllHeadersPath[] = "/echo_all_headers";
const char kEchoMethodPath[] = "/echo_method";
const char kRedirectToEchoBodyPath[] = "/redirect_to_echo_body";
-const char kFakeSdchDomain[] = "fake.sdch.domain";
-// Host used in QuicTestServer. This must match the certificate used
-// (quic_test.example.com.crt and quic_test.example.com.key.pkcs8), and
-// the file served (
-// components/cronet/android/test/assets/test/quic_data/simple.txt).
-const char kFakeQuicDomain[] = "test.example.com";
// Path that advertises the dictionary passed in query params if client
// supports Sdch encoding. E.g. /sdch/index?q=LeQxM80O will make the server
// responds with "Get-Dictionary: /sdch/dict/LeQxM80O".
@@ -169,31 +160,6 @@ scoped_ptr<net::test_server::HttpResponse> SdchRequestHandler(
return scoped_ptr<net::test_server::BasicHttpResponse>();
}
-void RegisterHostResolverProcHelper(
- net::URLRequestContext* url_request_context) {
- net::HostResolverImpl* resolver =
- static_cast<net::HostResolverImpl*>(url_request_context->host_resolver());
- scoped_refptr<net::RuleBasedHostResolverProc> proc =
- new net::RuleBasedHostResolverProc(NULL);
- proc->AddRule(kFakeSdchDomain, "127.0.0.1");
- proc->AddRule(kFakeQuicDomain, "127.0.0.1");
- resolver->set_proc_params_for_test(
- net::HostResolverImpl::ProcTaskParams(proc.get(), 1u));
- JNIEnv* env = base::android::AttachCurrentThread();
- Java_NativeTestServer_onHostResolverProcRegistered(env);
-}
-
-void RegisterHostResolverProcOnNetworkThread(
- CronetURLRequestContextAdapter* context_adapter) {
- RegisterHostResolverProcHelper(context_adapter->GetURLRequestContext());
-}
-
-// TODO(xunjieli): Delete this once legacy API is removed.
-void RegisterHostResolverProcOnNetworkThreadLegacyAPI(
- URLRequestContextAdapter* context_adapter) {
- RegisterHostResolverProcHelper(context_adapter->GetURLRequestContext());
-}
-
} // namespace
jboolean StartNativeTestServer(JNIEnv* env,
@@ -215,25 +181,6 @@ jboolean StartNativeTestServer(JNIEnv* env,
return g_test_server->Start();
}
-void RegisterHostResolverProc(JNIEnv* env,
- const JavaParamRef<jclass>& jcaller,
- jlong jadapter,
- jboolean jlegacy_api) {
- if (jlegacy_api == JNI_TRUE) {
- URLRequestContextAdapter* context_adapter =
- reinterpret_cast<URLRequestContextAdapter*>(jadapter);
- context_adapter->PostTaskToNetworkThread(
- FROM_HERE, base::Bind(&RegisterHostResolverProcOnNetworkThreadLegacyAPI,
- base::Unretained(context_adapter)));
- } else {
- CronetURLRequestContextAdapter* context_adapter =
- reinterpret_cast<CronetURLRequestContextAdapter*>(jadapter);
- context_adapter->PostTaskToNetworkThread(
- FROM_HERE, base::Bind(&RegisterHostResolverProcOnNetworkThread,
- base::Unretained(context_adapter)));
- }
-}
-
void ShutdownNativeTestServer(JNIEnv* env,
const JavaParamRef<jclass>& jcaller) {
if (!g_test_server)
diff --git a/components/cronet/android/test/quic_test_server.cc b/components/cronet/android/test/quic_test_server.cc
index afc9c95..13c4b65 100644
--- a/components/cronet/android/test/quic_test_server.cc
+++ b/components/cronet/android/test/quic_test_server.cc
@@ -11,6 +11,7 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/threading/thread.h"
+#include "components/cronet/android/test/cronet_test_util.h"
#include "jni/QuicTestServer_jni.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_util.h"
@@ -23,7 +24,6 @@ namespace cronet {
namespace {
-static const char kServerHost[] = "test.example.com";
static const int kServerPort = 6121;
base::Thread* g_quic_server_thread = nullptr;
@@ -39,7 +39,7 @@ void StartOnServerThread(const base::FilePath& test_files_root) {
net::QuicInMemoryCache::GetInstance()->InitializeFromDirectory(
file_dir.value());
net::IPAddressNumber ip;
- net::ParseIPLiteralToNumber(kServerHost, &ip);
+ net::ParseIPLiteralToNumber(kFakeQuicDomain, &ip);
net::QuicConfig config;
// Set up server certs.
@@ -98,7 +98,7 @@ void ShutdownQuicTestServer(JNIEnv* env,
ScopedJavaLocalRef<jstring> GetServerHost(
JNIEnv* env,
const JavaParamRef<jclass>& /*jcaller*/) {
- return base::android::ConvertUTF8ToJavaString(env, kServerHost);
+ return base::android::ConvertUTF8ToJavaString(env, kFakeQuicDomain);
}
int GetServerPort(JNIEnv* env, const JavaParamRef<jclass>& /*jcaller*/) {
diff --git a/components/cronet/android/test/src/org/chromium/net/CronetTestUtil.java b/components/cronet/android/test/src/org/chromium/net/CronetTestUtil.java
index 745d10a..14b1bc9 100644
--- a/components/cronet/android/test/src/org/chromium/net/CronetTestUtil.java
+++ b/components/cronet/android/test/src/org/chromium/net/CronetTestUtil.java
@@ -4,6 +4,9 @@
package org.chromium.net;
+import android.os.ConditionVariable;
+
+import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
/**
@@ -11,13 +14,45 @@ import org.chromium.base.annotations.JNINamespace;
*/
@JNINamespace("cronet")
public class CronetTestUtil {
+ private static final ConditionVariable sHostResolverBlock = new ConditionVariable();
+
+ /**
+ * Registers customized DNS mapping for testing host names used by test servers, namely:
+ * <ul>
+ * <li>{@link QuicTestServer#getServerHost}</li>
+ * <li>{@link NativeTestServer#getSdchURL}</li>'s host
+ * </ul>
+ * @param cronetEngine {@link CronetEngine} that this mapping should apply to.
+ * @param destination host to map to (e.g. 127.0.0.1)
+ */
+ public static void registerHostResolverProc(CronetEngine cronetEngine, String destination) {
+ long contextAdapter =
+ ((CronetUrlRequestContext) cronetEngine).getUrlRequestContextAdapter();
+ nativeRegisterHostResolverProc(contextAdapter, false, destination);
+ sHostResolverBlock.block();
+ sHostResolverBlock.close();
+ }
+
/**
- * Start QUIC server on local host.
- * @return non-zero QUIC server port number on success or 0 if failed.
+ * Registers customized DNS mapping for testing host names used by test servers.
+ * @param requestFactory {@link HttpUrlRequestFactory} that this mapping should apply to.
+ * @param destination host to map to (e.g. 127.0.0.1)
*/
- public static int startQuicServer() {
- return nativeStartQuicServer();
+ public static void registerHostResolverProc(
+ HttpUrlRequestFactory requestFactory, String destination) {
+ long contextAdapter = ((ChromiumUrlRequestFactory) requestFactory)
+ .getRequestContext()
+ .getUrlRequestContextAdapter();
+ nativeRegisterHostResolverProc(contextAdapter, true, destination);
+ sHostResolverBlock.block();
+ sHostResolverBlock.close();
+ }
+
+ @CalledByNative
+ private static void onHostResolverProcRegistered() {
+ sHostResolverBlock.open();
}
- private static native int nativeStartQuicServer();
+ private static native void nativeRegisterHostResolverProc(
+ long contextAdapter, boolean isLegacyAPI, String destination);
}
diff --git a/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java b/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java
index c6f3efe..0b09daf 100644
--- a/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java
+++ b/components/cronet/android/test/src/org/chromium/net/NativeTestServer.java
@@ -5,9 +5,7 @@
package org.chromium.net;
import android.content.Context;
-import android.os.ConditionVariable;
-import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
/**
@@ -16,8 +14,6 @@ import org.chromium.base.annotations.JNINamespace;
*/
@JNINamespace("cronet")
public final class NativeTestServer {
- private static final ConditionVariable sHostResolverBlock = new ConditionVariable();
-
// This variable contains the response body of a request to getSuccessURL().
public static final String SUCCESS_BODY = "this is a text file\n";
@@ -31,19 +27,6 @@ public final class NativeTestServer {
nativeShutdownNativeTestServer();
}
- /**
- * Registers customized DNS mapping for {@link NativeTestServer}.
- * @param contextAdapter native context adapter object that this
- * mapping should apply to.
- * @param isLegacyAPI {@code true} if this context adapter is a part of the
- * old API.
- */
- public static void registerHostResolverProc(long contextAdapter, boolean isLegacyAPI) {
- nativeRegisterHostResolverProc(contextAdapter, isLegacyAPI);
- sHostResolverBlock.block();
- sHostResolverBlock.close();
- }
-
public static String getEchoBodyURL() {
return nativeGetEchoBodyURL();
}
@@ -99,15 +82,8 @@ public final class NativeTestServer {
return nativeIsDataReductionProxySupported();
}
- @CalledByNative
- private static void onHostResolverProcRegistered() {
- sHostResolverBlock.open();
- }
-
private static native boolean nativeStartNativeTestServer(String filePath);
private static native void nativeShutdownNativeTestServer();
- private static native void nativeRegisterHostResolverProc(
- long contextAdapter, boolean isLegacyAPI);
private static native String nativeGetEchoBodyURL();
private static native String nativeGetEchoHeaderURL(String header);
private static native String nativeGetEchoAllHeadersURL();
diff --git a/components/cronet/android/test/src_dummy/org/chromium/net/test/dummy/Dummy.java b/components/cronet/android/test/src_dummy/org/chromium/net/test/dummy/Dummy.java
new file mode 100644
index 0000000..2ae73cd
--- /dev/null
+++ b/components/cronet/android/test/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 {}