Skip to content

Commit

Permalink
Expose TrafficStats API to native code
Browse files Browse the repository at this point in the history
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}
  • Loading branch information
tbansal authored and Commit bot committed Sep 14, 2015
1 parent f76ae11 commit 59a1ddc
Show file tree
Hide file tree
Showing 9 changed files with 164 additions and 0 deletions.
1 change: 1 addition & 0 deletions net/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 2 additions & 0 deletions net/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,15 @@ 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",
"org/chromium/net/CertVerifyStatusAndroid.java",
"org/chromium/net/ConnectionSubtype.java",
"org/chromium/net/ConnectionType.java",
"org/chromium/net/PrivateKeyType.java",
"org/chromium/net/TrafficStatsError.java",
]
}

Expand Down
29 changes: 29 additions & 0 deletions net/android/java/src/org/chromium/net/AndroidTrafficStats.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 2 additions & 0 deletions net/android/net_jni_registrar.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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},
Expand Down
36 changes: 36 additions & 0 deletions net/android/traffic_stats.cc
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions net/android/traffic_stats.h
Original file line number Diff line number Diff line change
@@ -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_
44 changes: 44 additions & 0 deletions net/android/traffic_stats_unittest.cc
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions net/net.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -1391,6 +1392,7 @@
'net_errors_java',
'private_key_types_java',
'remote_android_keystore_aidl',
'traffic_stats_error_java',
],
'includes': [ '../build/java.gypi' ],
},
Expand Down Expand Up @@ -1488,6 +1490,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',
Expand Down
3 changes: 3 additions & 0 deletions net/net.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down Expand Up @@ -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',
Expand Down

0 comments on commit 59a1ddc

Please sign in to comment.