diff options
Diffstat (limited to 'net/android')
-rw-r--r-- | net/android/BUILD.gn | 2 | ||||
-rw-r--r-- | net/android/java/src/org/chromium/net/AndroidTrafficStats.java | 29 | ||||
-rw-r--r-- | net/android/net_jni_registrar.cc | 2 | ||||
-rw-r--r-- | net/android/traffic_stats.cc | 36 | ||||
-rw-r--r-- | net/android/traffic_stats.h | 37 | ||||
-rw-r--r-- | net/android/traffic_stats_unittest.cc | 44 |
6 files changed, 150 insertions, 0 deletions
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 |