diff options
author | Jeff Sharkey <jsharkey@android.com> | 2011-08-10 17:53:27 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2011-08-15 17:30:25 -0700 |
commit | b5d55e302d2253e4bfb233ea705caf258cdc4cb9 (patch) | |
tree | 7acd6751833ddeae0a6dbc97c8608cd986643018 /services/tests | |
parent | 11f4a48c54f3006778c874662ff04a4d9d157f25 (diff) | |
download | frameworks_base-b5d55e302d2253e4bfb233ea705caf258cdc4cb9.zip frameworks_base-b5d55e302d2253e4bfb233ea705caf258cdc4cb9.tar.gz frameworks_base-b5d55e302d2253e4bfb233ea705caf258cdc4cb9.tar.bz2 |
Foreground/background network stats using sets.
Teach NetworkStats about "counter sets" coming from kernel, and use
them to track usage in foreground/background. Add AID_NET_BW_ACCT to
system_server so it can control counter sets.
Move to composite key of NetworkIdentitySet, UID, set, and tag when
recording historical usage. Persisting still clusters by identity,
since that is heaviest object.
Request async stats poll during systemReady() to bootstrap later
delta calculations. Reset kernel counters when UID removed. Update
various tests.
Bug: 5105592, 5146067
Change-Id: Idabec9e3ffcaf212879821515602ecde0a03de8c
Diffstat (limited to 'services/tests')
6 files changed, 348 insertions, 237 deletions
diff --git a/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set b/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set new file mode 100644 index 0000000..3678b10 --- /dev/null +++ b/services/tests/servicestests/res/raw/xt_qtaguid_typical_with_set @@ -0,0 +1,13 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_packets rx_tcp_bytes rx_udp_packets rx_udp_bytes rx_other_packets rx_other_bytes tx_tcp_packets tx_tcp_bytes tx_udp_packets tx_udp_bytes tx_other_packets tx_other_bytes
+1 rmnet0 0x0 0 0 14855 82 2804 47 2000 45 12799 35 56 2 676 13 2128 34 0 0
+1 rmnet0 0x0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+2 rmnet0 0x0 1000 0 278102 253 10487 182 277342 243 760 10 0 0 9727 172 760 10 0 0
+2 rmnet0 0x0 1000 1 26033 30 1401 26 25881 28 152 2 0 0 1249 24 152 2 0 0
+3 rmnet0 0x0 10012 0 40524 272 134138 293 40524 272 0 0 0 0 134138 293 0 0 0 0
+3 rmnet0 0x0 10012 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+4 rmnet0 0x0 10034 0 15791 59 9905 69 15791 59 0 0 0 0 9905 69 0 0 0 0
+4 rmnet0 0x0 10034 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+5 rmnet0 0x0 10055 0 3602 29 7739 59 3602 29 0 0 0 0 7739 59 0 0 0 0
+5 rmnet0 0x0 10055 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+6 rmnet0 0x7fff000300000000 1000 0 483 4 1931 6 483 4 0 0 0 0 1931 6 0 0 0 0
+6 rmnet0 0x7fff000300000000 1000 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/services/tests/servicestests/src/com/android/server/BroadcastInterceptingContext.java b/services/tests/servicestests/src/com/android/server/BroadcastInterceptingContext.java index fe88793..f14569c 100644 --- a/services/tests/servicestests/src/com/android/server/BroadcastInterceptingContext.java +++ b/services/tests/servicestests/src/com/android/server/BroadcastInterceptingContext.java @@ -28,7 +28,10 @@ import com.google.common.util.concurrent.AbstractFuture; import java.util.Iterator; import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; /** * {@link ContextWrapper} that can attach listeners for upcoming @@ -62,6 +65,15 @@ public class BroadcastInterceptingContext extends ContextWrapper { return false; } } + + @Override + public Intent get() throws InterruptedException, ExecutionException { + try { + return get(5, TimeUnit.SECONDS); + } catch (TimeoutException e) { + throw new RuntimeException(e); + } + } } public BroadcastInterceptingContext(Context base) { @@ -126,6 +138,11 @@ public class BroadcastInterceptingContext extends ContextWrapper { } @Override + public void sendBroadcast(Intent intent, String receiverPermission) { + sendBroadcast(intent); + } + + @Override public void removeStickyBroadcast(Intent intent) { // ignored } diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java index f628977..5f35697 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkManagementServiceTest.java @@ -16,6 +16,8 @@ package com.android.server; +import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.SET_FOREGROUND; import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkStats.UID_ALL; import static com.android.server.NetworkManagementSocketTagger.kernelToTag; @@ -27,7 +29,6 @@ import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.LargeTest; import com.android.frameworks.servicestests.R; -import com.google.common.io.Files; import java.io.File; import java.io.FileOutputStream; @@ -74,11 +75,11 @@ public class NetworkManagementServiceTest extends AndroidTestCase { final NetworkStats stats = mService.getNetworkStatsDetail(); assertEquals(31, stats.size()); - assertStatsEntry(stats, "wlan0", 0, 0, 14615L, 4270L); - assertStatsEntry(stats, "wlan0", 10004, 0, 333821L, 53558L); - assertStatsEntry(stats, "wlan0", 10004, 1947740890, 18725L, 1066L); - assertStatsEntry(stats, "rmnet0", 10037, 0, 31184994L, 684122L); - assertStatsEntry(stats, "rmnet0", 10037, 1947740890, 28507378L, 437004L); + assertStatsEntry(stats, "wlan0", 0, SET_DEFAULT, 0, 14615L, 4270L); + assertStatsEntry(stats, "wlan0", 10004, SET_DEFAULT, 0, 333821L, 53558L); + assertStatsEntry(stats, "wlan0", 10004, SET_DEFAULT, 1947740890, 18725L, 1066L); + assertStatsEntry(stats, "rmnet0", 10037, SET_DEFAULT, 0, 31184994L, 684122L); + assertStatsEntry(stats, "rmnet0", 10037, SET_DEFAULT, 1947740890, 28507378L, 437004L); } public void testNetworkStatsDetailExtended() throws Exception { @@ -86,8 +87,8 @@ public class NetworkManagementServiceTest extends AndroidTestCase { final NetworkStats stats = mService.getNetworkStatsDetail(); assertEquals(2, stats.size()); - assertStatsEntry(stats, "test0", 1000, 0, 1024L, 2048L); - assertStatsEntry(stats, "test0", 1000, 0xF00D, 512L, 512L); + assertStatsEntry(stats, "test0", 1000, SET_DEFAULT, 0, 1024L, 2048L); + assertStatsEntry(stats, "test0", 1000, SET_DEFAULT, 0xF00D, 512L, 512L); } public void testNetworkStatsSummary() throws Exception { @@ -95,12 +96,12 @@ public class NetworkManagementServiceTest extends AndroidTestCase { final NetworkStats stats = mService.getNetworkStatsSummary(); assertEquals(6, stats.size()); - assertStatsEntry(stats, "lo", UID_ALL, TAG_NONE, 8308L, 8308L); - assertStatsEntry(stats, "rmnet0", UID_ALL, TAG_NONE, 1507570L, 489339L); - assertStatsEntry(stats, "ifb0", UID_ALL, TAG_NONE, 52454L, 0L); - assertStatsEntry(stats, "ifb1", UID_ALL, TAG_NONE, 52454L, 0L); - assertStatsEntry(stats, "sit0", UID_ALL, TAG_NONE, 0L, 0L); - assertStatsEntry(stats, "ip6tnl0", UID_ALL, TAG_NONE, 0L, 0L); + assertStatsEntry(stats, "lo", UID_ALL, SET_DEFAULT, TAG_NONE, 8308L, 8308L); + assertStatsEntry(stats, "rmnet0", UID_ALL, SET_DEFAULT, TAG_NONE, 1507570L, 489339L); + assertStatsEntry(stats, "ifb0", UID_ALL, SET_DEFAULT, TAG_NONE, 52454L, 0L); + assertStatsEntry(stats, "ifb1", UID_ALL, SET_DEFAULT, TAG_NONE, 52454L, 0L); + assertStatsEntry(stats, "sit0", UID_ALL, SET_DEFAULT, TAG_NONE, 0L, 0L); + assertStatsEntry(stats, "ip6tnl0", UID_ALL, SET_DEFAULT, TAG_NONE, 0L, 0L); } public void testNetworkStatsSummaryDown() throws Exception { @@ -112,8 +113,8 @@ public class NetworkManagementServiceTest extends AndroidTestCase { final NetworkStats stats = mService.getNetworkStatsSummary(); assertEquals(7, stats.size()); - assertStatsEntry(stats, "rmnet0", UID_ALL, TAG_NONE, 1507570L, 489339L); - assertStatsEntry(stats, "wlan0", UID_ALL, TAG_NONE, 1024L, 2048L); + assertStatsEntry(stats, "rmnet0", UID_ALL, SET_DEFAULT, TAG_NONE, 1507570L, 489339L); + assertStatsEntry(stats, "wlan0", UID_ALL, SET_DEFAULT, TAG_NONE, 1024L, 2048L); } public void testKernelTags() throws Exception { @@ -130,6 +131,15 @@ public class NetworkManagementServiceTest extends AndroidTestCase { assertEquals(2147483136, kernelToTag("0x7FFFFE0000000000")); } + public void testNetworkStatsWithSet() throws Exception { + stageFile(R.raw.xt_qtaguid_typical_with_set, new File(mTestProc, "net/xt_qtaguid/stats")); + + final NetworkStats stats = mService.getNetworkStatsDetail(); + assertEquals(12, stats.size()); + assertStatsEntry(stats, "rmnet0", 1000, SET_DEFAULT, 0, 278102L, 253L, 10487L, 182L); + assertStatsEntry(stats, "rmnet0", 1000, SET_FOREGROUND, 0, 26033L, 30L, 1401L, 26L); + } + /** * Copy a {@link Resources#openRawResource(int)} into {@link File} for * testing purposes. @@ -159,12 +169,22 @@ public class NetworkManagementServiceTest extends AndroidTestCase { } } - private static void assertStatsEntry( - NetworkStats stats, String iface, int uid, int tag, long rxBytes, long txBytes) { - final int i = stats.findIndex(iface, uid, tag); + private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, + int tag, long rxBytes, long txBytes) { + final int i = stats.findIndex(iface, uid, set, tag); + final NetworkStats.Entry entry = stats.getValues(i, null); + assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); + assertEquals("unexpected txBytes", txBytes, entry.txBytes); + } + + private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, + int tag, long rxBytes, long rxPackets, long txBytes, long txPackets) { + final int i = stats.findIndex(iface, uid, set, tag); final NetworkStats.Entry entry = stats.getValues(i, null); - assertEquals(rxBytes, entry.rxBytes); - assertEquals(txBytes, entry.txBytes); + assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); + assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); + assertEquals("unexpected txBytes", txBytes, entry.txBytes); + assertEquals("unexpected txPackets", txPackets, entry.txPackets); } } diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index 09f8ff3..845aa3f 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -29,8 +29,6 @@ import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import static android.net.NetworkPolicyManager.computeLastCycleBoundary; import static android.net.NetworkPolicyManager.computeNextCycleBoundary; -import static android.net.NetworkStats.TAG_NONE; -import static android.net.NetworkStats.UID_ALL; import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT; @@ -282,6 +280,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { Future<Void> future; expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, true); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); @@ -290,6 +289,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // push strict policy for foreground uid, verify ALLOW rule expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, true); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND); @@ -299,6 +299,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // now turn screen off and verify REJECT rule expect(mPowerManager.isScreenOn()).andReturn(false).atLeastOnce(); expectSetUidNetworkRules(UID_A, true); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_REJECT_METERED); replay(); mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_OFF)); @@ -308,6 +309,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // and turn screen back on, verify ALLOW rule restored expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce(); expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, true); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_ON)); @@ -319,6 +321,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { Future<Void> future; expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, true); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); @@ -327,6 +330,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_NONE should RULE_ALLOW in foreground expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, true); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mService.setUidPolicy(UID_A, POLICY_NONE); @@ -335,6 +339,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_NONE should RULE_ALLOW in background expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); @@ -347,6 +352,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_REJECT should RULE_ALLOW in background expectSetUidNetworkRules(UID_A, true); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_REJECT_METERED); replay(); mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND); @@ -355,6 +361,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_REJECT should RULE_ALLOW in foreground expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, true); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); @@ -363,6 +370,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_REJECT should RULE_REJECT in background expectSetUidNetworkRules(UID_A, true); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_REJECT_METERED); replay(); mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); @@ -375,6 +383,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_NONE should have RULE_ALLOW in background expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); @@ -384,6 +393,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // adding POLICY_REJECT should cause RULE_REJECT expectSetUidNetworkRules(UID_A, true); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_REJECT_METERED); replay(); mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND); @@ -392,6 +402,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // removing POLICY_REJECT should return us to RULE_ALLOW expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); mService.setUidPolicy(UID_A, POLICY_NONE); @@ -503,7 +514,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // pretend that 512 bytes total have happened stats = new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 256L, 2L, 256L, 2L, 11); + .addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L); expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, TIME_MAR_10)) .andReturn(stats).atLeastOnce(); @@ -527,6 +538,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // POLICY_REJECT should RULE_REJECT in background expectSetUidNetworkRules(UID_A, true); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_REJECT_METERED); replay(); mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND); @@ -535,6 +547,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { // uninstall should clear RULE_REJECT expectSetUidNetworkRules(UID_A, false); + expectSetUidForeground(UID_A, false); future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); replay(); final Intent intent = new Intent(ACTION_UID_REMOVED); @@ -579,7 +592,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { elapsedRealtime += MINUTE_IN_MILLIS; currentTime = TIME_MAR_10 + elapsedRealtime; stats = new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 0L, 0L, 0L, 0L, 0); + .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); state = new NetworkState[] { buildWifi() }; { @@ -606,7 +619,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { elapsedRealtime += MINUTE_IN_MILLIS; currentTime = TIME_MAR_10 + elapsedRealtime; stats = new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 1536L, 15L, 0L, 0L, 11); + .addIfaceValues(TEST_IFACE, 1536L, 15L, 0L, 0L); { expectTime(currentTime); @@ -627,7 +640,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { elapsedRealtime += MINUTE_IN_MILLIS; currentTime = TIME_MAR_10 + elapsedRealtime; stats = new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 5120L, 512L, 0L, 0L, 22); + .addIfaceValues(TEST_IFACE, 5120L, 512L, 0L, 0L); { expectTime(currentTime); @@ -738,6 +751,11 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { expectLastCall().atLeastOnce(); } + private void expectSetUidForeground(int uid, boolean uidForeground) throws Exception { + mStatsService.setUidForeground(uid, uidForeground); + expectLastCall().atLeastOnce(); + } + private Future<Void> expectRulesChanged(int uid, int policy) throws Exception { final FutureAnswer future = new FutureAnswer(); mPolicyListener.onUidRulesChanged(eq(uid), eq(policy)); diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java index 8eb9cc3..6138490 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java @@ -23,6 +23,9 @@ import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.net.ConnectivityManager.TYPE_WIMAX; import static android.net.NetworkStats.IFACE_ALL; +import static android.net.NetworkStats.SET_ALL; +import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.SET_FOREGROUND; import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkStats.UID_ALL; import static android.net.NetworkStatsHistory.FIELD_ALL; @@ -34,9 +37,6 @@ import static android.text.format.DateUtils.HOUR_IN_MILLIS; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static android.text.format.DateUtils.WEEK_IN_MILLIS; import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL; -import static com.android.server.net.NetworkStatsService.packUidAndTag; -import static com.android.server.net.NetworkStatsService.unpackTag; -import static com.android.server.net.NetworkStatsService.unpackUid; import static org.easymock.EasyMock.anyLong; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; @@ -68,6 +68,9 @@ import com.android.server.net.NetworkStatsService.NetworkStatsSettings; import org.easymock.EasyMock; import java.io.File; +import java.util.concurrent.Future; + +import libcore.io.IoUtils; /** * Tests for {@link NetworkStatsService}. @@ -90,6 +93,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase { private static final int UID_BLUE = 1002; private static final int UID_GREEN = 1003; + private long mElapsedRealtime; + private BroadcastInterceptingContext mServiceContext; private File mStatsDir; @@ -107,6 +112,9 @@ public class NetworkStatsServiceTest extends AndroidTestCase { mServiceContext = new BroadcastInterceptingContext(getContext()); mStatsDir = getContext().getFilesDir(); + if (mStatsDir.exists()) { + IoUtils.deleteContents(mStatsDir); + } mNetManager = createMock(INetworkManagementService.class); mAlarmManager = createMock(IAlarmManager.class); @@ -118,11 +126,17 @@ public class NetworkStatsServiceTest extends AndroidTestCase { mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings); mService.bindConnectivityManager(mConnManager); + mElapsedRealtime = 0L; + + expectCurrentTime(); expectDefaultSettings(); - expectSystemReady(); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(buildEmptyStats()); + final Future<?> firstPoll = expectSystemReady(); replay(); mService.systemReady(); + firstPoll.get(); verifyAndReset(); } @@ -148,14 +162,12 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } public void testNetworkStatsWifi() throws Exception { - long elapsedRealtime = 0; - // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildWifiState()); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); @@ -164,16 +176,13 @@ public class NetworkStatsServiceTest extends AndroidTestCase { assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // modify some number on wifi, and trigger poll event - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 1024L, 1L, 2048L, 2L)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L)); + expectNetworkStatsUidDetail(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -184,12 +193,12 @@ public class NetworkStatsServiceTest extends AndroidTestCase { // and bump forward again, with counters going higher. this is // important, since polling should correctly subtract last snapshot. - elapsedRealtime += DAY_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(DAY_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 4096L, 4L, 8192L, 8L)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L)); + expectNetworkStatsUidDetail(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -201,15 +210,14 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } public void testStatsRebootPersist() throws Exception { - long elapsedRealtime = 0; assertStatsFilesExist(false); // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildWifiState()); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); @@ -218,29 +226,33 @@ public class NetworkStatsServiceTest extends AndroidTestCase { assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // modify some number on wifi, and trigger poll event - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 1024L, 8L, 2048L, 16L)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 2) - .addValues(TEST_IFACE, UID_RED, TAG_NONE, 512L, 4L, 256L, 2L) - .addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 128L, 1L, 128L, 1L)); - - mService.incrementOperationCount(UID_RED, TAG_NONE, 20); - mService.incrementOperationCount(UID_BLUE, TAG_NONE, 10); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L)); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L)); + + mService.setUidForeground(UID_RED, false); + mService.incrementOperationCount(UID_RED, 0xFAAD, 4); + mService.setUidForeground(UID_RED, true); + mService.incrementOperationCount(UID_RED, 0xFAAD, 6); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); // verify service recorded history assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0); - assertUidTotal(sTemplateWifi, UID_RED, 512L, 4L, 256L, 2L, 20); - assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 10); + assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10); + assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4); + assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6); + assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0); verifyAndReset(); // graceful shutdown system, which should trigger persist of stats, and @@ -257,47 +269,49 @@ public class NetworkStatsServiceTest extends AndroidTestCase { assertStatsFilesExist(true); // boot through serviceReady() again + expectCurrentTime(); expectDefaultSettings(); - expectSystemReady(); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(buildEmptyStats()); + final Future<?> firstPoll = expectSystemReady(); replay(); mService.systemReady(); + firstPoll.get(); // after systemReady(), we should have historical stats loaded again assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0); - assertUidTotal(sTemplateWifi, UID_RED, 512L, 4L, 256L, 2L, 20); - assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 10); + assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10); + assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4); + assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6); + assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0); verifyAndReset(); } public void testStatsBucketResize() throws Exception { - long elapsedRealtime = 0; NetworkStatsHistory history = null; assertStatsFilesExist(false); // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); expectNetworkState(buildWifiState()); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // modify some number on wifi, and trigger poll event - elapsedRealtime += 2 * HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(2 * HOUR_IN_MILLIS); + expectCurrentTime(); expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 512L, 4L, 512L, 4L)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L)); + expectNetworkStatsUidDetail(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -311,10 +325,10 @@ public class NetworkStatsServiceTest extends AndroidTestCase { // now change bucket duration setting and trigger another poll with // exact same values, which should resize existing buckets. - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -329,35 +343,28 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } public void testUidStatsAcrossNetworks() throws Exception { - long elapsedRealtime = 0; - // pretend first mobile network comes online - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildMobile3gState(IMSI_1)); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // create some traffic on first network - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 2048L, 16L, 512L, 4L)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 3) - .addValues(TEST_IFACE, UID_RED, TAG_NONE, 1536L, 12L, 512L, 4L) - .addValues(TEST_IFACE, UID_RED, 0xF00D, 512L, 4L, 512L, 4L) - .addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 512L, 4L, 0L, 0L)); - - mService.incrementOperationCount(UID_RED, TAG_NONE, 15); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L)); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); + mService.incrementOperationCount(UID_RED, 0xF00D, 10); - mService.incrementOperationCount(UID_BLUE, TAG_NONE, 5); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -365,18 +372,18 @@ public class NetworkStatsServiceTest extends AndroidTestCase { // verify service recorded history assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0); assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); - assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 15); - assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 5); + assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10); + assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0); verifyAndReset(); // now switch networks; this also tests that we're okay with interfaces // disappearing, to verify we don't count backwards. - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildMobile3gState(IMSI_2)); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); @@ -384,23 +391,24 @@ public class NetworkStatsServiceTest extends AndroidTestCase { verifyAndReset(); // create traffic on second network - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 128L, 1L, 1024L, 8L)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 128L, 1L, 1024L, 8L)); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 128L, 1L, 1024L, 8L)); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 1024L, 8L, 0L) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L)); - mService.incrementOperationCount(UID_BLUE, TAG_NONE, 10); + mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); // verify original history still intact assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0); - assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 15); - assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 5); + assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10); + assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0); // and verify new history also recorded under different template, which // verifies that we didn't cross the streams. @@ -412,35 +420,29 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } public void testUidRemovedIsMoved() throws Exception { - long elapsedRealtime = 0; - // pretend that network comes online - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildWifiState()); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // create some traffic - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_ALL, TAG_NONE, 4128L, 258L, 544L, 34L)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_RED, TAG_NONE, 16L, 1L, 16L, 1L) - .addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 4096L, 258L, 512L, 32L) - .addValues(TEST_IFACE, UID_GREEN, TAG_NONE, 16L, 1L, 16L, 1L)); + expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L)); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L) + .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)); - mService.incrementOperationCount(UID_RED, TAG_NONE, 10); - mService.incrementOperationCount(UID_BLUE, TAG_NONE, 15); - mService.incrementOperationCount(UID_GREEN, TAG_NONE, 5); + mService.incrementOperationCount(UID_RED, 0xFAAD, 10); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -448,8 +450,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase { // verify service recorded history assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0); assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10); - assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 15); - assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 5); + assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0); + assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0); verifyAndReset(); // now pretend two UIDs are uninstalled, which should migrate stats to @@ -467,54 +469,48 @@ public class NetworkStatsServiceTest extends AndroidTestCase { assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0); assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0); assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0); - assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 5); - assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 25); + assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0); + assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10); verifyAndReset(); } public void testUid3g4gCombinedByTemplate() throws Exception { - long elapsedRealtime = 0; - // pretend that network comes online - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildMobile3gState(IMSI_1)); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // create some traffic - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_RED, TAG_NONE, 1024L, 8L, 1024L, 8L) - .addValues(TEST_IFACE, UID_RED, 0xF00D, 512L, 4L, 512L, 4L)); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); - mService.incrementOperationCount(UID_RED, TAG_NONE, 10); mService.incrementOperationCount(UID_RED, 0xF00D, 5); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); // verify service recorded history - assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 10); + assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5); verifyAndReset(); // now switch over to 4g network - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildMobile4gState()); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); @@ -522,92 +518,64 @@ public class NetworkStatsServiceTest extends AndroidTestCase { verifyAndReset(); // create traffic on second network - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_RED, TAG_NONE, 512L, 4L, 256L, 2L)); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L)); - mService.incrementOperationCount(UID_RED, TAG_NONE, 5); + mService.incrementOperationCount(UID_RED, 0xFAAD, 5); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); // verify that ALL_MOBILE template combines both - assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 15); + assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10); verifyAndReset(); } - - public void testPackedUidAndTag() throws Exception { - assertEquals(0x0000000000000000L, packUidAndTag(0, 0x0)); - assertEquals(0x000003E900000000L, packUidAndTag(1001, 0x0)); - assertEquals(0x000003E90000F00DL, packUidAndTag(1001, 0xF00D)); - - long packed; - packed = packUidAndTag(Integer.MAX_VALUE, Integer.MIN_VALUE); - assertEquals(Integer.MAX_VALUE, unpackUid(packed)); - assertEquals(Integer.MIN_VALUE, unpackTag(packed)); - - packed = packUidAndTag(Integer.MIN_VALUE, Integer.MAX_VALUE); - assertEquals(Integer.MIN_VALUE, unpackUid(packed)); - assertEquals(Integer.MAX_VALUE, unpackTag(packed)); - - packed = packUidAndTag(10005, 0xFFFFFFFF); - assertEquals(10005, unpackUid(packed)); - assertEquals(0xFFFFFFFF, unpackTag(packed)); - - } public void testSummaryForAllUid() throws Exception { - long elapsedRealtime = 0; - // pretend that network comes online - expectTime(TEST_START + elapsedRealtime); + expectCurrentTime(); expectDefaultSettings(); expectNetworkState(buildWifiState()); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); + expectNetworkStatsSummary(buildEmptyStats()); replay(); mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); verifyAndReset(); - // bootstrap with full polling event to prime stats - performBootstrapPoll(TEST_START, elapsedRealtime); - // create some traffic for two apps - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_RED, TAG_NONE, 50L, 5L, 50L, 5L) - .addValues(TEST_IFACE, UID_RED, 0xF00D, 10L, 1L, 10L, 1L) - .addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 1024L, 8L, 512L, 4L)); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L)); - mService.incrementOperationCount(UID_RED, TAG_NONE, 5); mService.incrementOperationCount(UID_RED, 0xF00D, 1); - mService.incrementOperationCount(UID_BLUE, TAG_NONE, 10); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); // verify service recorded history - assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 5); - assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 10); + assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1); + assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0); verifyAndReset(); // now create more traffic in next hour, but only for one app - elapsedRealtime += HOUR_IN_MILLIS; - expectTime(TEST_START + elapsedRealtime); + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1) - .addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 2048L, 16L, 1024L, 8L)); - - mService.incrementOperationCount(UID_BLUE, TAG_NONE, 15); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L)); replay(); mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); @@ -616,16 +584,77 @@ public class NetworkStatsServiceTest extends AndroidTestCase { NetworkStats stats = mService.getSummaryForAllUid( sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); assertEquals(3, stats.size()); - assertValues(stats, 0, IFACE_ALL, UID_RED, TAG_NONE, 50L, 5L, 50L, 5L, 5); - assertValues(stats, 1, IFACE_ALL, UID_RED, 0xF00D, 10L, 1L, 10L, 1L, 1); - assertValues(stats, 2, IFACE_ALL, UID_BLUE, TAG_NONE, 2048L, 16L, 1024L, 8L, 15); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 1); + assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0); // now verify that recent history only contains one uid - final long currentTime = TEST_START + elapsedRealtime; + final long currentTime = currentTimeMillis(); stats = mService.getSummaryForAllUid( sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true); assertEquals(1, stats.size()); - assertValues(stats, 0, IFACE_ALL, UID_BLUE, TAG_NONE, 1024L, 8L, 512L, 4L, 5); + assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0); + + verifyAndReset(); + } + + public void testForegroundBackground() throws Exception { + // pretend that network comes online + expectCurrentTime(); + expectDefaultSettings(); + expectNetworkState(buildWifiState()); + expectNetworkStatsSummary(buildEmptyStats()); + + replay(); + mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); + verifyAndReset(); + + // create some initial traffic + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); + expectDefaultSettings(); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)); + + mService.incrementOperationCount(UID_RED, 0xF00D, 1); + + replay(); + mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); + + // verify service recorded history + assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1); + verifyAndReset(); + + // now switch to foreground + incrementCurrentTime(HOUR_IN_MILLIS); + expectCurrentTime(); + expectDefaultSettings(); + expectNetworkStatsSummary(buildEmptyStats()); + expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L) + .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L)); + + mService.setUidForeground(UID_RED, true); + mService.incrementOperationCount(UID_RED, 0xFAAD, 1); + + replay(); + mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); + + // test that we combined correctly + assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2); + + // verify entire history present + final NetworkStats stats = mService.getSummaryForAllUid( + sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); + assertEquals(4, stats.size()); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 1); + assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 1); verifyAndReset(); } @@ -639,19 +668,27 @@ public class NetworkStatsServiceTest extends AndroidTestCase { private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) { + assertUidTotal(template, uid, SET_ALL, rxBytes, rxPackets, txBytes, txPackets, operations); + } + + private void assertUidTotal(NetworkTemplate template, int uid, int set, long rxBytes, + long rxPackets, long txBytes, long txPackets, int operations) { final NetworkStatsHistory history = mService.getHistoryForUid( - template, uid, TAG_NONE, FIELD_ALL); + template, uid, set, TAG_NONE, FIELD_ALL); assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes, txPackets, operations); } - private void expectSystemReady() throws Exception { + private Future<?> expectSystemReady() throws Exception { mAlarmManager.remove(isA(PendingIntent.class)); expectLastCall().anyTimes(); mAlarmManager.setInexactRepeating( eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class)); expectLastCall().atLeastOnce(); + + return mServiceContext.nextBroadcastIntent( + NetworkStatsService.ACTION_NETWORK_STATS_UPDATED); } private void expectNetworkState(NetworkState... state) throws Exception { @@ -682,25 +719,14 @@ public class NetworkStatsServiceTest extends AndroidTestCase { expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes(); } - private void expectTime(long currentTime) throws Exception { + private void expectCurrentTime() throws Exception { expect(mTime.forceRefresh()).andReturn(false).anyTimes(); expect(mTime.hasCache()).andReturn(true).anyTimes(); - expect(mTime.currentTimeMillis()).andReturn(currentTime).anyTimes(); + expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes(); expect(mTime.getCacheAge()).andReturn(0L).anyTimes(); expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes(); } - private void performBootstrapPoll(long testStart, long elapsedRealtime) throws Exception { - expectTime(testStart + elapsedRealtime); - expectDefaultSettings(); - expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime)); - expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime)); - - replay(); - mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); - verifyAndReset(); - } - private void assertStatsFilesExist(boolean exist) { final File networkFile = new File(mStatsDir, "netstats.bin"); final File uidFile = new File(mStatsDir, "netstats_uid.bin"); @@ -713,12 +739,10 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } } - private static void assertValues(NetworkStats stats, int i, String iface, int uid, int tag, - long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) { + private static void assertValues(NetworkStats stats, String iface, int uid, int set, + int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) { + final int i = stats.findIndex(iface, uid, set, tag); final NetworkStats.Entry entry = stats.getValues(i, null); - assertEquals("unexpected iface", iface, entry.iface); - assertEquals("unexpected uid", uid, entry.uid); - assertEquals("unexpected tag", tag, entry.tag); assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); assertEquals("unexpected txBytes", txBytes, entry.txBytes); @@ -761,8 +785,24 @@ public class NetworkStatsServiceTest extends AndroidTestCase { return new NetworkState(info, prop, null); } - private static NetworkStats buildEmptyStats(long elapsedRealtime) { - return new NetworkStats(elapsedRealtime, 0); + private NetworkStats buildEmptyStats() { + return new NetworkStats(getElapsedRealtime(), 0); + } + + private long getElapsedRealtime() { + return mElapsedRealtime; + } + + private long startTimeMillis() { + return TEST_START; + } + + private long currentTimeMillis() { + return startTimeMillis() + mElapsedRealtime; + } + + private void incrementCurrentTime(long duration) { + mElapsedRealtime += duration; } private void replay() { diff --git a/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java b/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java index c0870c7..6a9778e 100644 --- a/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ThrottleServiceTest.java @@ -16,6 +16,9 @@ package com.android.server; +import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.TAG_NONE; +import static android.net.NetworkStats.UID_ALL; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; @@ -289,7 +292,7 @@ public class ThrottleServiceTest extends AndroidTestCase { public void expectGetInterfaceCounter(long rx, long tx) throws Exception { // TODO: provide elapsedRealtime mock to match TimeAuthority final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); - stats.addValues(TEST_IFACE, NetworkStats.UID_ALL, NetworkStats.TAG_NONE, rx, 0L, tx, 0L, 0); + stats.addValues(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, rx, 0L, tx, 0L, 0); expect(mMockNMService.getNetworkStatsSummary()).andReturn(stats).atLeastOnce(); } |