diff options
author | mef@chromium.org <mef@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-09 16:57:25 +0000 |
---|---|---|
committer | mef@chromium.org <mef@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-09 16:57:25 +0000 |
commit | 9afe891c242142d242e6deea640ac4c0311ce5ae (patch) | |
tree | a4629106914a9fc1b3b9b6e1465dbce83925f0ed | |
parent | ce26acdfff80515fb38c5675be1c3550cb6b5098 (diff) | |
download | chromium_src-9afe891c242142d242e6deea640ac4c0311ce5ae.zip chromium_src-9afe891c242142d242e6deea640ac4c0311ce5ae.tar.gz chromium_src-9afe891c242142d242e6deea640ac4c0311ce5ae.tar.bz2 |
Save net internals event log into a file using UrlRequestContext methods startNetLogToFile and stopNetLog.
Initialize and get net statistics using UrlRequestContext methods InitializeStatistics and GetStatisticsJSON.
BUG=354143
Review URL: https://codereview.chromium.org/219193015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262718 0039d316-1c4b-4281-b951-d872f2087c98
7 files changed, 159 insertions, 9 deletions
diff --git a/net/cronet/android/java/src/org/chromium/net/UrlRequestContext.java b/net/cronet/android/java/src/org/chromium/net/UrlRequestContext.java index 0dcfa85..102b5a1 100644 --- a/net/cronet/android/java/src/org/chromium/net/UrlRequestContext.java +++ b/net/cronet/android/java/src/org/chromium/net/UrlRequestContext.java @@ -49,6 +49,40 @@ public class UrlRequestContext { return nativeGetVersion(); } + /** + * Initializes statistics recorder. + */ + public void initializeStatistics() { + nativeInitializeStatistics(); + } + + /** + * Gets current statistics recorded since |initializeStatistics| with + * |filter| as a substring as JSON text (an empty |filter| will include all + * registered histograms). + */ + public String getStatisticsJSON(String filter) { + return nativeGetStatisticsJSON(filter); + } + + /** + * Starts NetLog logging to a file named |fileName| in the + * application temporary directory. |fileName| must not be empty. Log level + * is LOG_ALL_BUT_BYTES. If the file exists it is truncated before starting. + * If actively logging the call is ignored. + */ + public void startNetLogToFile(String fileName) { + nativeStartNetLogToFile(mUrlRequestContextPeer, fileName); + } + + /** + * Stops NetLog logging and flushes file to disk. If a logging session is + * not in progress this call is ignored. + */ + public void stopNetLog() { + nativeStopNetLog(mUrlRequestContextPeer); + } + @CalledByNative private void initNetworkThread() { Thread.currentThread().setName("ChromiumNet"); @@ -75,4 +109,13 @@ public class UrlRequestContext { private native void nativeReleaseRequestContextPeer( long urlRequestContextPeer); + + private native void nativeInitializeStatistics(); + + private native String nativeGetStatisticsJSON(String filter); + + private native void nativeStartNetLogToFile(long urlRequestContextPeer, + String fileName); + + private native void nativeStopNetLog(long urlRequestContextPeer); } diff --git a/net/cronet/android/org_chromium_net_UrlRequestContext.cc b/net/cronet/android/org_chromium_net_UrlRequestContext.cc index e58d891..4dc1d38 100644 --- a/net/cronet/android/org_chromium_net_UrlRequestContext.cc +++ b/net/cronet/android/org_chromium_net_UrlRequestContext.cc @@ -5,8 +5,10 @@ #include "base/android/base_jni_registrar.h" #include "base/android/jni_android.h" #include "base/android/jni_registrar.h" +#include "base/android/jni_string.h" #include "base/at_exit.h" #include "base/i18n/icu_util.h" +#include "base/metrics/statistics_recorder.h" #include "jni/UrlRequestContext_jni.h" #include "net/android/net_jni_registrar.h" #include "net/cronet/android/org_chromium_net_UrlRequest.h" @@ -130,4 +132,37 @@ static void ReleaseRequestContextPeer(JNIEnv* env, peer->Release(); } +// Starts recording statistics. +static void InitializeStatistics(JNIEnv* env, jobject jcaller) { + base::StatisticsRecorder::Initialize(); +} + +// Gets current statistics with |filter| as a substring as JSON text (an empty +// |filter| will include all registered histograms). +static jstring GetStatisticsJSON(JNIEnv* env, jobject jcaller, jstring filter) { + std::string query = base::android::ConvertJavaStringToUTF8(env, filter); + std::string json = base::StatisticsRecorder::ToJSON(query); + return base::android::ConvertUTF8ToJavaString(env, json).Release(); +} + +// Starts recording NetLog into file with |fileName|. +static void StartNetLogToFile(JNIEnv* env, + jobject jcaller, + jlong urlRequestContextPeer, + jstring fileName) { + URLRequestContextPeer* peer = + reinterpret_cast<URLRequestContextPeer*>(urlRequestContextPeer); + std::string file_name = base::android::ConvertJavaStringToUTF8(env, fileName); + peer->StartNetLogToFile(file_name); +} + +// Stops recording NetLog. +static void StopNetLog(JNIEnv* env, + jobject jcaller, + jlong urlRequestContextPeer) { + URLRequestContextPeer* peer = + reinterpret_cast<URLRequestContextPeer*>(urlRequestContextPeer); + peer->StopNetLog(); +} + } // namespace net diff --git a/net/cronet/android/sample/AndroidManifest.xml b/net/cronet/android/sample/AndroidManifest.xml index d8f793a..dfde44c 100644 --- a/net/cronet/android/sample/AndroidManifest.xml +++ b/net/cronet/android/sample/AndroidManifest.xml @@ -25,4 +25,5 @@ <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </manifest> diff --git a/net/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleUrlTest.java b/net/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleUrlTest.java index 2a66ff3..0c18708 100644 --- a/net/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleUrlTest.java +++ b/net/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleUrlTest.java @@ -8,6 +8,8 @@ import android.test.suitebuilder.annotation.SmallTest; import org.chromium.base.test.util.Feature; +import java.io.File; + /** * Example test that just starts the cronet sample. */ @@ -63,4 +65,25 @@ public class CronetSampleUrlTest extends CronetSampleTestBase { assertEquals(URL, activity.getUrl()); assertEquals(200, activity.getHttpStatusCode()); } + + @SmallTest + @Feature({"Cronet"}) + public void testNetLog() throws Exception { + CronetSampleActivity activity = launchCronetSampleWithUrl( + "127.0.0.1:8000"); + + // Make sure the activity was created as expected. + assertNotNull(activity); + + waitForActiveShellToBeDoneLoading(); + File file = File.createTempFile("cronet", "json"); + activity.mRequestContext.startNetLogToFile(file.getPath()); + activity.startWithURL_UrlRequest(URL); + Thread.sleep(5000); + activity.mRequestContext.stopNetLog(); + assertTrue(file.exists()); + assertTrue(file.length() != 0); + assertTrue(file.delete()); + assertTrue(!file.exists()); + } } diff --git a/net/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java b/net/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java index fd78131..4d15f41 100644 --- a/net/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java +++ b/net/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java @@ -190,7 +190,7 @@ public class CronetSampleActivity extends Activity { request.start(); } - private void startWithURL_UrlRequest(String url) { + public void startWithURL_UrlRequest(String url) { Log.i(TAG, "Cronet started: " + url); mUrl = url; mLoading = true; @@ -214,4 +214,12 @@ public class CronetSampleActivity extends Activity { public int getHttpStatusCode() { return mHttpStatusCode; } + + public void startNetLog() { + mRequestContext.startNetLogToFile("/sdcard/cronet_sample_netlog.json"); + } + + public void stopNetLog() { + mRequestContext.stopNetLog(); + } } diff --git a/net/cronet/android/url_request_context_peer.cc b/net/cronet/android/url_request_context_peer.cc index e367632..4aec153 100644 --- a/net/cronet/android/url_request_context_peer.cc +++ b/net/cronet/android/url_request_context_peer.cc @@ -4,7 +4,9 @@ #include "net/cronet/android/url_request_context_peer.h" +#include "base/file_util.h" #include "net/base/net_errors.h" +#include "net/base/net_log_logger.h" #include "net/cert/cert_verifier.h" #include "net/http/http_auth_handler_factory.h" #include "net/http/http_network_layer.h" @@ -149,6 +151,7 @@ void URLRequestContextPeer::InitializeURLRequestContext() { storage->set_network_delegate(network_delegate); storage->set_host_resolver(net::HostResolver::CreateDefaultResolver(NULL)); + storage->set_net_log(new net::NetLog); net::ProxyConfigService* proxy_config_service = new net::ProxyConfigServiceFixed(net::ProxyConfig()); @@ -190,21 +193,26 @@ void URLRequestContextPeer::InitializeURLRequestContext() { new net::URLRequestJobFactoryImpl; storage->set_job_factory(job_factory); - context_.reset(context); - if (VLOG_IS_ON(2)) { - context_->set_net_log(new net::NetLog); - netlog_observer_.reset(new NetLogObserver(logging_level_)); - context_->net_log()->AddThreadSafeObserver(netlog_observer_.get(), - net::NetLog::LOG_ALL_BUT_BYTES); + net_log_observer_.reset(new NetLogObserver(logging_level_)); + context->net_log()->AddThreadSafeObserver(net_log_observer_.get(), + net::NetLog::LOG_ALL_BUT_BYTES); } + context_.reset(context); + net::HttpStreamFactory::EnableNpnSpdy31(); delegate_->OnContextInitialized(this); } -URLRequestContextPeer::~URLRequestContextPeer() {} +URLRequestContextPeer::~URLRequestContextPeer() { + if (net_log_observer_) { + context_->net_log()->RemoveThreadSafeObserver(net_log_observer_.get()); + net_log_observer_.reset(); + } + StopNetLog(); +} const std::string& URLRequestContextPeer::GetUserAgent(const GURL& url) const { return user_agent_; @@ -222,6 +230,28 @@ URLRequestContextPeer::GetNetworkTaskRunner() const { return network_thread_->message_loop_proxy(); } +void URLRequestContextPeer::StartNetLogToFile(const std::string& file_name) { + // Do nothing if already logging to a file. + if (net_log_logger_) + return; + + base::FilePath file_path(file_name); + FILE* file = base::OpenFile(file_path, "w"); + if (!file) + return; + + scoped_ptr<base::Value> constants(net::NetLogLogger::GetConstants()); + net_log_logger_.reset(new net::NetLogLogger(file, *constants)); + net_log_logger_->StartObserving(context_->net_log()); +} + +void URLRequestContextPeer::StopNetLog() { + if (net_log_logger_) { + net_log_logger_->StopObserving(); + net_log_logger_.reset(); + } +} + void NetLogObserver::OnAddEntry(const net::NetLog::Entry& entry) { if (VLOG_IS_ON(2)) { VLOG(2) << "Net log entry: type=" << entry.type() diff --git a/net/cronet/android/url_request_context_peer.h b/net/cronet/android/url_request_context_peer.h index ef715c3..bb2ab9c 100644 --- a/net/cronet/android/url_request_context_peer.h +++ b/net/cronet/android/url_request_context_peer.h @@ -5,6 +5,8 @@ #ifndef NET_CRONET_ANDROID_URL_REQUEST_CONTEXT_PEER_H_ #define NET_CRONET_ANDROID_URL_REQUEST_CONTEXT_PEER_H_ +#include <string> + #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -15,6 +17,10 @@ #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" +namespace net { +class NetLogLogger; +} // namespace net + // Implementation of the Chromium NetLog observer interface. class NetLogObserver : public net::NetLog::ThreadSafeObserver { public: @@ -61,6 +67,9 @@ class URLRequestContextPeer : public net::URLRequestContextGetter { virtual scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() const OVERRIDE; + void StartNetLogToFile(const std::string& file_name); + void StopNetLog(); + private: scoped_refptr<URLRequestContextPeerDelegate> delegate_; scoped_ptr<net::URLRequestContext> context_; @@ -69,7 +78,8 @@ class URLRequestContextPeer : public net::URLRequestContextGetter { std::string user_agent_; base::Thread* network_thread_; scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; - scoped_ptr<NetLogObserver> netlog_observer_; + scoped_ptr<NetLogObserver> net_log_observer_; + scoped_ptr<net::NetLogLogger> net_log_logger_; virtual ~URLRequestContextPeer(); |