summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormef@chromium.org <mef@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-09 16:57:25 +0000
committermef@chromium.org <mef@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-09 16:57:25 +0000
commit9afe891c242142d242e6deea640ac4c0311ce5ae (patch)
treea4629106914a9fc1b3b9b6e1465dbce83925f0ed
parentce26acdfff80515fb38c5675be1c3550cb6b5098 (diff)
downloadchromium_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
-rw-r--r--net/cronet/android/java/src/org/chromium/net/UrlRequestContext.java43
-rw-r--r--net/cronet/android/org_chromium_net_UrlRequestContext.cc35
-rw-r--r--net/cronet/android/sample/AndroidManifest.xml1
-rw-r--r--net/cronet/android/sample/javatests/src/org/chromium/cronet_sample_apk/CronetSampleUrlTest.java23
-rw-r--r--net/cronet/android/sample/src/org/chromium/cronet_sample_apk/CronetSampleActivity.java10
-rw-r--r--net/cronet/android/url_request_context_peer.cc44
-rw-r--r--net/cronet/android/url_request_context_peer.h12
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();