diff options
| author | pauljensen <pauljensen@chromium.org> | 2016-02-01 09:23:11 -0800 |
|---|---|---|
| committer | Commit bot <commit-bot@chromium.org> | 2016-02-01 17:24:02 +0000 |
| commit | 3721400b7fd14c4d9579c7d99eb936c59622d707 (patch) | |
| tree | a66756ff15985ca1d3aee236eb2090b6a9f94b62 | |
| parent | 05b9291386bda6bec5e50b24f9f5e10c953ff64f (diff) | |
| download | chromium_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}
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 {} |
