summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2011-11-14 23:37:17 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-11-14 23:37:17 -0800
commitd968670d8369e5d92ba9b7a45b3804d692a05a4e (patch)
tree56e57ab8760dcb42dbaaae128b8cc57c63e65c1e /services
parentb3b66af2b5b4ccca1f507290ab6f138a3cbffc3e (diff)
parent7ee8658453fe4efe04781bea9a14368e1d5ff41f (diff)
downloadframeworks_base-d968670d8369e5d92ba9b7a45b3804d692a05a4e.zip
frameworks_base-d968670d8369e5d92ba9b7a45b3804d692a05a4e.tar.gz
frameworks_base-d968670d8369e5d92ba9b7a45b3804d692a05a4e.tar.bz2
Merge "Conservatively trim data usage stats." into ics-mr1
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/net/NetworkStatsService.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java55
2 files changed, 39 insertions, 22 deletions
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index 6365525..28cb983 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -1243,7 +1243,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// trim any history beyond max
if (mTime.hasCache()) {
- final long currentTime = mTime.currentTimeMillis();
+ final long currentTime = Math.min(
+ System.currentTimeMillis(), mTime.currentTimeMillis());
final long maxHistory = mSettings.getNetworkMaxHistory();
for (NetworkStatsHistory history : input.values()) {
history.removeBucketsBefore(currentTime - maxHistory);
@@ -1287,7 +1288,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// trim any history beyond max
if (mTime.hasCache()) {
- final long currentTime = mTime.currentTimeMillis();
+ final long currentTime = Math.min(
+ System.currentTimeMillis(), mTime.currentTimeMillis());
final long maxUidHistory = mSettings.getUidMaxHistory();
final long maxTagHistory = mSettings.getTagMaxHistory();
for (UidStatsKey key : mUidStats.keySet()) {
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 368595f..0618374 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -80,7 +80,6 @@ import com.google.common.util.concurrent.AbstractFuture;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
-import org.easymock.IExpectationSetters;
import java.io.File;
import java.util.LinkedHashSet;
@@ -537,6 +536,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
.addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L);
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, TIME_MAR_10))
.andReturn(stats).atLeastOnce();
+ expectPolicyDataEnable(TYPE_WIFI, true);
// TODO: consider making strongly ordered mock
expectRemoveInterfaceQuota(TEST_IFACE);
@@ -580,7 +580,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
NetworkState[] state = null;
NetworkStats stats = null;
Future<Void> future;
- Capture<String> tag;
+ Future<String> tagFuture;
final long TIME_FEB_15 = 1171497600000L;
final long TIME_MAR_10 = 1173484800000L;
@@ -598,6 +598,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
.andReturn(stats).atLeastOnce();
+ expectPolicyDataEnable(TYPE_WIFI, true);
expectClearNotifications();
future = expectMeteredIfacesChanged();
@@ -620,6 +621,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
.andReturn(stats).atLeastOnce();
+ expectPolicyDataEnable(TYPE_WIFI, true);
expectRemoveInterfaceQuota(TEST_IFACE);
expectSetInterfaceQuota(TEST_IFACE, 2 * MB_IN_BYTES);
@@ -642,14 +644,15 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expectCurrentTime();
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
.andReturn(stats).atLeastOnce();
+ expectPolicyDataEnable(TYPE_WIFI, true);
expectForceUpdate();
expectClearNotifications();
- tag = expectEnqueueNotification();
+ tagFuture = expectEnqueueNotification();
replay();
mNetworkObserver.limitReached(null, TEST_IFACE);
- assertNotificationType(TYPE_WARNING, tag.getValue());
+ assertNotificationType(TYPE_WARNING, tagFuture.get());
verifyAndReset();
}
@@ -662,15 +665,15 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expectCurrentTime();
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
.andReturn(stats).atLeastOnce();
- expectPolicyDataEnable(TYPE_WIFI, false).atLeastOnce();
+ expectPolicyDataEnable(TYPE_WIFI, false);
expectForceUpdate();
expectClearNotifications();
- tag = expectEnqueueNotification();
+ tagFuture = expectEnqueueNotification();
replay();
mNetworkObserver.limitReached(null, TEST_IFACE);
- assertNotificationType(TYPE_LIMIT, tag.getValue());
+ assertNotificationType(TYPE_LIMIT, tagFuture.get());
verifyAndReset();
}
@@ -682,21 +685,20 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
.andReturn(stats).atLeastOnce();
- expectPolicyDataEnable(TYPE_WIFI, true).atLeastOnce();
+ expectPolicyDataEnable(TYPE_WIFI, true);
// snoozed interface still has high quota so background data is
// still restricted.
expectRemoveInterfaceQuota(TEST_IFACE);
expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE);
+ expectMeteredIfacesChanged(TEST_IFACE);
expectClearNotifications();
- tag = expectEnqueueNotification();
- future = expectMeteredIfacesChanged(TEST_IFACE);
+ tagFuture = expectEnqueueNotification();
replay();
mService.snoozePolicy(sTemplateWifi);
- future.get();
- assertNotificationType(TYPE_LIMIT_SNOOZED, tag.getValue());
+ assertNotificationType(TYPE_LIMIT_SNOOZED, tagFuture.get());
verifyAndReset();
}
}
@@ -737,9 +739,9 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
expectLastCall().anyTimes();
}
- private Capture<String> expectEnqueueNotification() throws Exception {
- final Capture<String> tag = new Capture<String>();
- mNotifManager.enqueueNotificationWithTag(isA(String.class), capture(tag), anyInt(),
+ private Future<String> expectEnqueueNotification() throws Exception {
+ final FutureCapture<String> tag = new FutureCapture<String>();
+ mNotifManager.enqueueNotificationWithTag(isA(String.class), capture(tag.capture), anyInt(),
isA(Notification.class), isA(int[].class));
return tag;
}
@@ -789,22 +791,25 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
return future;
}
- private <T> IExpectationSetters<T> expectPolicyDataEnable(int type, boolean enabled)
- throws Exception {
+ private Future<Void> expectPolicyDataEnable(int type, boolean enabled) throws Exception {
+ final FutureAnswer future = new FutureAnswer();
mConnManager.setPolicyDataEnable(type, enabled);
- return expectLastCall();
+ expectLastCall().andAnswer(future);
+ return future;
}
- private static class FutureAnswer extends AbstractFuture<Void> implements IAnswer<Void> {
+ private static class TestAbstractFuture<T> extends AbstractFuture<T> {
@Override
- public Void get() throws InterruptedException, ExecutionException {
+ public T get() throws InterruptedException, ExecutionException {
try {
return get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {
throw new RuntimeException(e);
}
}
+ }
+ private static class FutureAnswer extends TestAbstractFuture<Void> implements IAnswer<Void> {
@Override
public Void answer() {
set(null);
@@ -812,6 +817,16 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
}
}
+ private static class FutureCapture<T> extends TestAbstractFuture<T> {
+ public Capture<T> capture = new Capture<T>() {
+ @Override
+ public void setValue(T value) {
+ super.setValue(value);
+ set(value);
+ }
+ };
+ }
+
private static class IdleFuture extends AbstractFuture<Void> implements IdleHandler {
@Override
public Void get() throws InterruptedException, ExecutionException {