summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortbansal <tbansal@chromium.org>2015-09-14 10:35:01 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-14 17:36:16 +0000
commit59a1ddc1dd3af5e4f30e50a8c959da5e9ce5efa2 (patch)
tree3a0ba897c9adf53413f3fd1666ed3d9a7697b469
parentf76ae11f25dc0056cea63e15c16039fdbd5f3470 (diff)
downloadchromium_src-59a1ddc1dd3af5e4f30e50a8c959da5e9ce5efa2.zip
chromium_src-59a1ddc1dd3af5e4f30e50a8c959da5e9ce5efa2.tar.gz
chromium_src-59a1ddc1dd3af5e4f30e50a8c959da5e9ce5efa2.tar.bz2
Expose TrafficStats API to native code
This change exposes TrafficStats API to native code. Also, provides a pure virtual class that will be used on non Android platforms. Right now, only one API from TrafficStats is exposed. More APIs will be exposed in forthcoming changes. BUG=521646 Review URL: https://codereview.chromium.org/1286233003 Cr-Commit-Position: refs/heads/master@{#348646}
-rw-r--r--net/BUILD.gn1
-rw-r--r--net/android/BUILD.gn2
-rw-r--r--net/android/java/src/org/chromium/net/AndroidTrafficStats.java29
-rw-r--r--net/android/net_jni_registrar.cc2
-rw-r--r--net/android/traffic_stats.cc36
-rw-r--r--net/android/traffic_stats.h37
-rw-r--r--net/android/traffic_stats_unittest.cc44
-rw-r--r--net/net.gyp10
-rw-r--r--net/net.gypi3
9 files changed, 164 insertions, 0 deletions
diff --git a/net/BUILD.gn b/net/BUILD.gn
index d08afb1..7b68ade 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1200,6 +1200,7 @@ if (is_android) {
"android/java/src/org/chromium/net/AndroidKeyStore.java",
"android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
"android/java/src/org/chromium/net/AndroidPrivateKey.java",
+ "android/java/src/org/chromium/net/AndroidTrafficStats.java",
"android/java/src/org/chromium/net/GURLUtils.java",
"android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
"android/java/src/org/chromium/net/NetStringUtil.java",
diff --git a/net/android/BUILD.gn b/net/android/BUILD.gn
index c891da7..0003962 100644
--- a/net/android/BUILD.gn
+++ b/net/android/BUILD.gn
@@ -70,6 +70,7 @@ java_cpp_enum("net_android_java_enums_srcjar") {
"../base/network_change_notifier.h",
"cert_verify_result_android.h",
"keystore.h",
+ "traffic_stats.cc",
]
outputs = [
"org/chromium/net/CertificateMimeType.java",
@@ -77,6 +78,7 @@ java_cpp_enum("net_android_java_enums_srcjar") {
"org/chromium/net/ConnectionSubtype.java",
"org/chromium/net/ConnectionType.java",
"org/chromium/net/PrivateKeyType.java",
+ "org/chromium/net/TrafficStatsError.java",
]
}
diff --git a/net/android/java/src/org/chromium/net/AndroidTrafficStats.java b/net/android/java/src/org/chromium/net/AndroidTrafficStats.java
new file mode 100644
index 0000000..059e399
--- /dev/null
+++ b/net/android/java/src/org/chromium/net/AndroidTrafficStats.java
@@ -0,0 +1,29 @@
+// 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;
+
+import android.net.TrafficStats;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+
+/**
+ * This class interacts with TrafficStats API provided by Android.
+ */
+@JNINamespace("net::android::traffic_stats")
+public class AndroidTrafficStats {
+ private AndroidTrafficStats() {}
+
+ /**
+ * @return Number of bytes transmitted since device boot. Counts packets across all network
+ * interfaces, and always increases monotonically since device boot. Statistics are
+ * measured at the network layer, so they include both TCP and UDP usage.
+ */
+ @CalledByNative
+ private static long getTotalTxBytes() {
+ long bytes = TrafficStats.getTotalTxBytes();
+ return bytes != TrafficStats.UNSUPPORTED ? bytes : TrafficStatsError.ERROR_NOT_SUPPORTED;
+ }
+}
diff --git a/net/android/net_jni_registrar.cc b/net/android/net_jni_registrar.cc
index dec74ec..baf43be 100644
--- a/net/android/net_jni_registrar.cc
+++ b/net/android/net_jni_registrar.cc
@@ -12,6 +12,7 @@
#include "net/android/keystore.h"
#include "net/android/network_change_notifier_android.h"
#include "net/android/network_library.h"
+#include "net/android/traffic_stats.h"
#include "net/cert/x509_util_android.h"
#include "net/proxy/proxy_config_service_android.h"
@@ -27,6 +28,7 @@ static base::android::RegistrationMethod kNetRegisteredMethods[] = {
{"AndroidPrivateKey", RegisterAndroidPrivateKey},
{"AndroidKeyStore", RegisterKeyStore},
{"AndroidNetworkLibrary", RegisterNetworkLibrary},
+ {"AndroidTrafficStats", traffic_stats::Register},
{"GURLUtils", RegisterGURLUtils},
{"HttpAuthNegotiateAndroid", HttpAuthNegotiateAndroid::Register},
{"NetworkChangeNotifierAndroid", NetworkChangeNotifierAndroid::Register},
diff --git a/net/android/traffic_stats.cc b/net/android/traffic_stats.cc
new file mode 100644
index 0000000..6ae5953
--- /dev/null
+++ b/net/android/traffic_stats.cc
@@ -0,0 +1,36 @@
+// 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.
+
+#include "net/android/traffic_stats.h"
+
+#include "jni/AndroidTrafficStats_jni.h"
+
+namespace net {
+
+namespace android {
+
+namespace traffic_stats {
+
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
+enum TrafficStatsError {
+ // Value returned by AndroidTrafficStats APIs when a valid value is
+ // unavailable.
+ ERROR_NOT_SUPPORTED = 0,
+};
+
+bool GetTotalTxBytes(int64_t* bytes) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ *bytes = Java_AndroidTrafficStats_getTotalTxBytes(env);
+ return *bytes != ERROR_NOT_SUPPORTED;
+}
+
+bool Register(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace traffic_stats
+
+} // namespace android
+
+} // namespace net
diff --git a/net/android/traffic_stats.h b/net/android/traffic_stats.h
new file mode 100644
index 0000000..3434d89
--- /dev/null
+++ b/net/android/traffic_stats.h
@@ -0,0 +1,37 @@
+// 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.
+
+#ifndef NET_ANDROID_TRAFFIC_STATS_H_
+#define NET_ANDROID_TRAFFIC_STATS_H_
+
+// This file provides functions that interact with TrafficStats APIs that are
+// provided on Android.
+
+#include <jni.h>
+#include <stdint.h>
+
+#include "net/base/net_export.h"
+
+namespace net {
+
+namespace android {
+
+namespace traffic_stats {
+
+// Returns true if the number of bytes transmitted since device boot is
+// available and sets |*bytes| to that value. Counts packets across all network
+// interfaces, and always increases monotonically since device boot.
+// Statistics are measured at the network layer, so they include both TCP and
+// UDP usage. |bytes| must not be nullptr.
+NET_EXPORT bool GetTotalTxBytes(int64_t* bytes);
+
+bool Register(JNIEnv* env);
+
+} // namespace traffic_stats
+
+} // namespace android
+
+} // namespace net
+
+#endif // NET_ANDROID_TRAFFIC_STATS_H_
diff --git a/net/android/traffic_stats_unittest.cc b/net/android/traffic_stats_unittest.cc
new file mode 100644
index 0000000..ad5198f
--- /dev/null
+++ b/net/android/traffic_stats_unittest.cc
@@ -0,0 +1,44 @@
+// 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.
+
+#include "net/android/traffic_stats.h"
+
+#include "base/run_loop.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace net {
+
+namespace {
+
+TEST(TrafficStatsAndroidTest, BasicsTest) {
+ test_server::EmbeddedTestServer embedded_test_server;
+ embedded_test_server.ServeFilesFromDirectory(
+ base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
+ ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady());
+
+ int64_t bytes_before_request = -1;
+ EXPECT_TRUE(android::traffic_stats::GetTotalTxBytes(&bytes_before_request));
+ EXPECT_GE(bytes_before_request, 0);
+
+ TestDelegate test_delegate;
+ TestURLRequestContext context(false);
+
+ scoped_ptr<URLRequest> request(
+ context.CreateRequest(embedded_test_server.GetURL("/echo.html"),
+ DEFAULT_PRIORITY, &test_delegate));
+ request->Start();
+ base::RunLoop().Run();
+
+ // Bytes should increase because of the network traffic.
+ int64_t bytes_after_request;
+ EXPECT_TRUE(android::traffic_stats::GetTotalTxBytes(&bytes_after_request));
+ DCHECK_GT(bytes_after_request, bytes_before_request);
+}
+
+} // namespace
+
+} // namespace net
diff --git a/net/net.gyp b/net/net.gyp
index 5895a93..cd23f61 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -1352,6 +1352,7 @@
'android/java/src/org/chromium/net/AndroidKeyStore.java',
'android/java/src/org/chromium/net/AndroidNetworkLibrary.java',
'android/java/src/org/chromium/net/AndroidPrivateKey.java',
+ 'android/java/src/org/chromium/net/AndroidTrafficStats.java',
'android/java/src/org/chromium/net/GURLUtils.java',
'android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java',
'android/java/src/org/chromium/net/NetStringUtil.java',
@@ -1391,6 +1392,7 @@
'net_errors_java',
'private_key_types_java',
'remote_android_keystore_aidl',
+ 'traffic_stats_error_java',
],
'includes': [ '../build/java.gypi' ],
},
@@ -1489,6 +1491,14 @@
'includes': [ '../build/android/java_cpp_enum.gypi' ],
},
{
+ 'target_name': 'traffic_stats_error_java',
+ 'type': 'none',
+ 'variables': {
+ 'source_file': 'android/traffic_stats.cc',
+ },
+ 'includes': [ '../build/android/java_cpp_enum.gypi' ],
+ },
+ {
'target_name': 'net_unittests_apk',
'type': 'none',
'dependencies': [
diff --git a/net/net.gypi b/net/net.gypi
index 6bef5cb..3ad550a 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -413,6 +413,8 @@
'android/network_change_notifier_factory_android.h',
'android/network_library.cc',
'android/network_library.h',
+ 'android/traffic_stats.cc',
+ 'android/traffic_stats.h',
'base/address_tracker_linux.cc',
'base/address_tracker_linux.h',
'base/backoff_entry.cc',
@@ -1244,6 +1246,7 @@
'android/http_auth_negotiate_android_unittest.cc',
'android/keystore_unittest.cc',
'android/network_change_notifier_android_unittest.cc',
+ 'android/traffic_stats_unittest.cc',
'base/address_list_unittest.cc',
'base/address_tracker_linux_unittest.cc',
'base/backoff_entry_serializer_unittest.cc',