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
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package android.net;
|
package android.net;
|
||||||
|
|
||||||
|
import static android.net.NetworkStats.SET_DEFAULT;
|
||||||
import static android.net.NetworkStats.TAG_NONE;
|
import static android.net.NetworkStats.TAG_NONE;
|
||||||
|
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
@@ -31,14 +32,14 @@ public class NetworkStatsTest extends TestCase {
|
|||||||
|
|
||||||
public void testFindIndex() throws Exception {
|
public void testFindIndex() throws Exception {
|
||||||
final NetworkStats stats = new NetworkStats(TEST_START, 3)
|
final NetworkStats stats = new NetworkStats(TEST_START, 3)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1024L, 8L, 0L, 0L, 10)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 10)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 0L, 0L, 1024L, 8L, 11)
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 11)
|
||||||
.addValues(TEST_IFACE, 102, TAG_NONE, 1024L, 8L, 1024L, 8L, 12);
|
.addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 12);
|
||||||
|
|
||||||
assertEquals(2, stats.findIndex(TEST_IFACE, 102, TAG_NONE));
|
assertEquals(2, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE));
|
||||||
assertEquals(2, stats.findIndex(TEST_IFACE, 102, TAG_NONE));
|
assertEquals(2, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE));
|
||||||
assertEquals(0, stats.findIndex(TEST_IFACE, 100, TAG_NONE));
|
assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE));
|
||||||
assertEquals(-1, stats.findIndex(TEST_IFACE, 6, TAG_NONE));
|
assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAddEntryGrow() throws Exception {
|
public void testAddEntryGrow() throws Exception {
|
||||||
@@ -47,98 +48,99 @@ public class NetworkStatsTest extends TestCase {
|
|||||||
assertEquals(0, stats.size());
|
assertEquals(0, stats.size());
|
||||||
assertEquals(2, stats.internalSize());
|
assertEquals(2, stats.internalSize());
|
||||||
|
|
||||||
stats.addValues(TEST_IFACE, TEST_UID, TAG_NONE, 1L, 1L, 2L, 2L, 3);
|
stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 1L, 1L, 2L, 2L, 3);
|
||||||
stats.addValues(TEST_IFACE, TEST_UID, TAG_NONE, 2L, 2L, 2L, 2L, 4);
|
stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 2L, 2L, 2L, 2L, 4);
|
||||||
|
|
||||||
assertEquals(2, stats.size());
|
assertEquals(2, stats.size());
|
||||||
assertEquals(2, stats.internalSize());
|
assertEquals(2, stats.internalSize());
|
||||||
|
|
||||||
stats.addValues(TEST_IFACE, TEST_UID, TAG_NONE, 3L, 30L, 4L, 40L, 7);
|
stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 3L, 30L, 4L, 40L, 7);
|
||||||
stats.addValues(TEST_IFACE, TEST_UID, TAG_NONE, 4L, 40L, 4L, 40L, 8);
|
stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 4L, 40L, 4L, 40L, 8);
|
||||||
stats.addValues(TEST_IFACE, TEST_UID, TAG_NONE, 5L, 50L, 5L, 50L, 10);
|
stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 5L, 50L, 5L, 50L, 10);
|
||||||
|
|
||||||
assertEquals(5, stats.size());
|
assertEquals(5, stats.size());
|
||||||
assertTrue(stats.internalSize() >= 5);
|
assertTrue(stats.internalSize() >= 5);
|
||||||
|
|
||||||
assertValues(stats, 0, TEST_IFACE, TEST_UID, TAG_NONE, 1L, 1L, 2L, 2L, 3);
|
assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 1L, 1L, 2L, 2L, 3);
|
||||||
assertValues(stats, 1, TEST_IFACE, TEST_UID, TAG_NONE, 2L, 2L, 2L, 2L, 4);
|
assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 2L, 2L, 2L, 2L, 4);
|
||||||
assertValues(stats, 2, TEST_IFACE, TEST_UID, TAG_NONE, 3L, 30L, 4L, 40L, 7);
|
assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 3L, 30L, 4L, 40L, 7);
|
||||||
assertValues(stats, 3, TEST_IFACE, TEST_UID, TAG_NONE, 4L, 40L, 4L, 40L, 8);
|
assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 4L, 40L, 4L, 40L, 8);
|
||||||
assertValues(stats, 4, TEST_IFACE, TEST_UID, TAG_NONE, 5L, 50L, 5L, 50L, 10);
|
assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, 5L, 50L, 5L, 50L, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCombineExisting() throws Exception {
|
public void testCombineExisting() throws Exception {
|
||||||
final NetworkStats stats = new NetworkStats(TEST_START, 10);
|
final NetworkStats stats = new NetworkStats(TEST_START, 10);
|
||||||
|
|
||||||
stats.addValues(TEST_IFACE, 1001, TAG_NONE, 512L, 4L, 256L, 2L, 10);
|
stats.addValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 10);
|
||||||
stats.addValues(TEST_IFACE, 1001, 0xff, 128L, 1L, 128L, 1L, 2);
|
stats.addValues(TEST_IFACE, 1001, SET_DEFAULT, 0xff, 128L, 1L, 128L, 1L, 2);
|
||||||
stats.combineValues(TEST_IFACE, 1001, TAG_NONE, -128L, -1L, -128L, -1L, -1);
|
stats.combineValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, -128L, -1L, -128L, -1L, -1);
|
||||||
|
|
||||||
assertValues(stats, 0, TEST_IFACE, 1001, TAG_NONE, 384L, 3L, 128L, 1L, 9);
|
assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, 384L, 3L, 128L, 1L, 9);
|
||||||
assertValues(stats, 1, TEST_IFACE, 1001, 0xff, 128L, 1L, 128L, 1L, 2);
|
assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, 128L, 1L, 128L, 1L, 2);
|
||||||
|
|
||||||
// now try combining that should create row
|
// now try combining that should create row
|
||||||
stats.combineValues(TEST_IFACE, 5005, TAG_NONE, 128L, 1L, 128L, 1L, 3);
|
stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
|
||||||
assertValues(stats, 2, TEST_IFACE, 5005, TAG_NONE, 128L, 1L, 128L, 1L, 3);
|
assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
|
||||||
stats.combineValues(TEST_IFACE, 5005, TAG_NONE, 128L, 1L, 128L, 1L, 3);
|
stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
|
||||||
assertValues(stats, 2, TEST_IFACE, 5005, TAG_NONE, 256L, 2L, 256L, 2L, 6);
|
assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 256L, 2L, 256L, 2L, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testSubtractIdenticalData() throws Exception {
|
public void testSubtractIdenticalData() throws Exception {
|
||||||
final NetworkStats before = new NetworkStats(TEST_START, 2)
|
final NetworkStats before = new NetworkStats(TEST_START, 2)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
||||||
|
|
||||||
final NetworkStats after = new NetworkStats(TEST_START, 2)
|
final NetworkStats after = new NetworkStats(TEST_START, 2)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
||||||
|
|
||||||
final NetworkStats result = after.subtract(before);
|
final NetworkStats result = after.subtract(before);
|
||||||
|
|
||||||
// identical data should result in zero delta
|
// identical data should result in zero delta
|
||||||
assertValues(result, 0, TEST_IFACE, 100, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
||||||
assertValues(result, 1, TEST_IFACE, 101, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testSubtractIdenticalRows() throws Exception {
|
public void testSubtractIdenticalRows() throws Exception {
|
||||||
final NetworkStats before = new NetworkStats(TEST_START, 2)
|
final NetworkStats before = new NetworkStats(TEST_START, 2)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
||||||
|
|
||||||
final NetworkStats after = new NetworkStats(TEST_START, 2)
|
final NetworkStats after = new NetworkStats(TEST_START, 2)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1025L, 9L, 2L, 1L, 15)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1025L, 9L, 2L, 1L, 15)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 3L, 1L, 1028L, 9L, 20);
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 3L, 1L, 1028L, 9L, 20);
|
||||||
|
|
||||||
final NetworkStats result = after.subtract(before);
|
final NetworkStats result = after.subtract(before);
|
||||||
|
|
||||||
// expect delta between measurements
|
// expect delta between measurements
|
||||||
assertValues(result, 0, TEST_IFACE, 100, TAG_NONE, 1L, 1L, 2L, 1L, 4);
|
assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1L, 1L, 2L, 1L, 4);
|
||||||
assertValues(result, 1, TEST_IFACE, 101, TAG_NONE, 3L, 1L, 4L, 1L, 8);
|
assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 3L, 1L, 4L, 1L, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testSubtractNewRows() throws Exception {
|
public void testSubtractNewRows() throws Exception {
|
||||||
final NetworkStats before = new NetworkStats(TEST_START, 2)
|
final NetworkStats before = new NetworkStats(TEST_START, 2)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
|
||||||
|
|
||||||
final NetworkStats after = new NetworkStats(TEST_START, 3)
|
final NetworkStats after = new NetworkStats(TEST_START, 3)
|
||||||
.addValues(TEST_IFACE, 100, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
.addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
|
||||||
.addValues(TEST_IFACE, 101, TAG_NONE, 0L, 0L, 1024L, 8L, 12)
|
.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12)
|
||||||
.addValues(TEST_IFACE, 102, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
|
.addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
|
||||||
|
|
||||||
final NetworkStats result = after.subtract(before);
|
final NetworkStats result = after.subtract(before);
|
||||||
|
|
||||||
// its okay to have new rows
|
// its okay to have new rows
|
||||||
assertValues(result, 0, TEST_IFACE, 100, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
||||||
assertValues(result, 1, TEST_IFACE, 101, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 0L, 0L, 0);
|
||||||
assertValues(result, 2, TEST_IFACE, 102, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
|
assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void assertValues(NetworkStats stats, int index, String iface, int uid, int tag,
|
private static void assertValues(NetworkStats stats, int index, String iface, int uid, int set,
|
||||||
long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) {
|
int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) {
|
||||||
final NetworkStats.Entry entry = stats.getValues(index, null);
|
final NetworkStats.Entry entry = stats.getValues(index, null);
|
||||||
assertEquals(iface, entry.iface);
|
assertEquals(iface, entry.iface);
|
||||||
assertEquals(uid, entry.uid);
|
assertEquals(uid, entry.uid);
|
||||||
|
assertEquals(set, entry.set);
|
||||||
assertEquals(tag, entry.tag);
|
assertEquals(tag, entry.tag);
|
||||||
assertEquals(rxBytes, entry.rxBytes);
|
assertEquals(rxBytes, entry.rxBytes);
|
||||||
assertEquals(rxPackets, entry.rxPackets);
|
assertEquals(rxPackets, entry.rxPackets);
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server;
|
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.TAG_NONE;
|
||||||
import static android.net.NetworkStats.UID_ALL;
|
import static android.net.NetworkStats.UID_ALL;
|
||||||
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
|
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
|
||||||
@@ -27,7 +29,6 @@ import android.test.AndroidTestCase;
|
|||||||
import android.test.suitebuilder.annotation.LargeTest;
|
import android.test.suitebuilder.annotation.LargeTest;
|
||||||
|
|
||||||
import com.android.frameworks.servicestests.R;
|
import com.android.frameworks.servicestests.R;
|
||||||
import com.google.common.io.Files;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@@ -74,11 +75,11 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
final NetworkStats stats = mService.getNetworkStatsDetail();
|
final NetworkStats stats = mService.getNetworkStatsDetail();
|
||||||
assertEquals(31, stats.size());
|
assertEquals(31, stats.size());
|
||||||
assertStatsEntry(stats, "wlan0", 0, 0, 14615L, 4270L);
|
assertStatsEntry(stats, "wlan0", 0, SET_DEFAULT, 0, 14615L, 4270L);
|
||||||
assertStatsEntry(stats, "wlan0", 10004, 0, 333821L, 53558L);
|
assertStatsEntry(stats, "wlan0", 10004, SET_DEFAULT, 0, 333821L, 53558L);
|
||||||
assertStatsEntry(stats, "wlan0", 10004, 1947740890, 18725L, 1066L);
|
assertStatsEntry(stats, "wlan0", 10004, SET_DEFAULT, 1947740890, 18725L, 1066L);
|
||||||
assertStatsEntry(stats, "rmnet0", 10037, 0, 31184994L, 684122L);
|
assertStatsEntry(stats, "rmnet0", 10037, SET_DEFAULT, 0, 31184994L, 684122L);
|
||||||
assertStatsEntry(stats, "rmnet0", 10037, 1947740890, 28507378L, 437004L);
|
assertStatsEntry(stats, "rmnet0", 10037, SET_DEFAULT, 1947740890, 28507378L, 437004L);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNetworkStatsDetailExtended() throws Exception {
|
public void testNetworkStatsDetailExtended() throws Exception {
|
||||||
@@ -86,8 +87,8 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
final NetworkStats stats = mService.getNetworkStatsDetail();
|
final NetworkStats stats = mService.getNetworkStatsDetail();
|
||||||
assertEquals(2, stats.size());
|
assertEquals(2, stats.size());
|
||||||
assertStatsEntry(stats, "test0", 1000, 0, 1024L, 2048L);
|
assertStatsEntry(stats, "test0", 1000, SET_DEFAULT, 0, 1024L, 2048L);
|
||||||
assertStatsEntry(stats, "test0", 1000, 0xF00D, 512L, 512L);
|
assertStatsEntry(stats, "test0", 1000, SET_DEFAULT, 0xF00D, 512L, 512L);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNetworkStatsSummary() throws Exception {
|
public void testNetworkStatsSummary() throws Exception {
|
||||||
@@ -95,12 +96,12 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
final NetworkStats stats = mService.getNetworkStatsSummary();
|
final NetworkStats stats = mService.getNetworkStatsSummary();
|
||||||
assertEquals(6, stats.size());
|
assertEquals(6, stats.size());
|
||||||
assertStatsEntry(stats, "lo", UID_ALL, TAG_NONE, 8308L, 8308L);
|
assertStatsEntry(stats, "lo", UID_ALL, SET_DEFAULT, TAG_NONE, 8308L, 8308L);
|
||||||
assertStatsEntry(stats, "rmnet0", UID_ALL, TAG_NONE, 1507570L, 489339L);
|
assertStatsEntry(stats, "rmnet0", UID_ALL, SET_DEFAULT, TAG_NONE, 1507570L, 489339L);
|
||||||
assertStatsEntry(stats, "ifb0", UID_ALL, TAG_NONE, 52454L, 0L);
|
assertStatsEntry(stats, "ifb0", UID_ALL, SET_DEFAULT, TAG_NONE, 52454L, 0L);
|
||||||
assertStatsEntry(stats, "ifb1", UID_ALL, TAG_NONE, 52454L, 0L);
|
assertStatsEntry(stats, "ifb1", UID_ALL, SET_DEFAULT, TAG_NONE, 52454L, 0L);
|
||||||
assertStatsEntry(stats, "sit0", UID_ALL, TAG_NONE, 0L, 0L);
|
assertStatsEntry(stats, "sit0", UID_ALL, SET_DEFAULT, TAG_NONE, 0L, 0L);
|
||||||
assertStatsEntry(stats, "ip6tnl0", UID_ALL, TAG_NONE, 0L, 0L);
|
assertStatsEntry(stats, "ip6tnl0", UID_ALL, SET_DEFAULT, TAG_NONE, 0L, 0L);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNetworkStatsSummaryDown() throws Exception {
|
public void testNetworkStatsSummaryDown() throws Exception {
|
||||||
@@ -112,8 +113,8 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
final NetworkStats stats = mService.getNetworkStatsSummary();
|
final NetworkStats stats = mService.getNetworkStatsSummary();
|
||||||
assertEquals(7, stats.size());
|
assertEquals(7, stats.size());
|
||||||
assertStatsEntry(stats, "rmnet0", UID_ALL, TAG_NONE, 1507570L, 489339L);
|
assertStatsEntry(stats, "rmnet0", UID_ALL, SET_DEFAULT, TAG_NONE, 1507570L, 489339L);
|
||||||
assertStatsEntry(stats, "wlan0", UID_ALL, TAG_NONE, 1024L, 2048L);
|
assertStatsEntry(stats, "wlan0", UID_ALL, SET_DEFAULT, TAG_NONE, 1024L, 2048L);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testKernelTags() throws Exception {
|
public void testKernelTags() throws Exception {
|
||||||
@@ -130,6 +131,15 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
|
|||||||
assertEquals(2147483136, kernelToTag("0x7FFFFE0000000000"));
|
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
|
* Copy a {@link Resources#openRawResource(int)} into {@link File} for
|
||||||
* testing purposes.
|
* testing purposes.
|
||||||
@@ -159,12 +169,22 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void assertStatsEntry(
|
private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set,
|
||||||
NetworkStats stats, String iface, int uid, int tag, long rxBytes, long txBytes) {
|
int tag, long rxBytes, long txBytes) {
|
||||||
final int i = stats.findIndex(iface, uid, tag);
|
final int i = stats.findIndex(iface, uid, set, tag);
|
||||||
final NetworkStats.Entry entry = stats.getValues(i, null);
|
final NetworkStats.Entry entry = stats.getValues(i, null);
|
||||||
assertEquals(rxBytes, entry.rxBytes);
|
assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
|
||||||
assertEquals(txBytes, entry.txBytes);
|
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("unexpected rxBytes", rxBytes, entry.rxBytes);
|
||||||
|
assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
|
||||||
|
assertEquals("unexpected txBytes", txBytes, entry.txBytes);
|
||||||
|
assertEquals("unexpected txPackets", txPackets, entry.txPackets);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ import static android.net.ConnectivityManager.TYPE_MOBILE;
|
|||||||
import static android.net.ConnectivityManager.TYPE_WIFI;
|
import static android.net.ConnectivityManager.TYPE_WIFI;
|
||||||
import static android.net.ConnectivityManager.TYPE_WIMAX;
|
import static android.net.ConnectivityManager.TYPE_WIMAX;
|
||||||
import static android.net.NetworkStats.IFACE_ALL;
|
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.TAG_NONE;
|
||||||
import static android.net.NetworkStats.UID_ALL;
|
import static android.net.NetworkStats.UID_ALL;
|
||||||
import static android.net.NetworkStatsHistory.FIELD_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.MINUTE_IN_MILLIS;
|
||||||
import static android.text.format.DateUtils.WEEK_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.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.anyLong;
|
||||||
import static org.easymock.EasyMock.createMock;
|
import static org.easymock.EasyMock.createMock;
|
||||||
import static org.easymock.EasyMock.eq;
|
import static org.easymock.EasyMock.eq;
|
||||||
@@ -68,6 +68,9 @@ import com.android.server.net.NetworkStatsService.NetworkStatsSettings;
|
|||||||
import org.easymock.EasyMock;
|
import org.easymock.EasyMock;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
import libcore.io.IoUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link NetworkStatsService}.
|
* 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_BLUE = 1002;
|
||||||
private static final int UID_GREEN = 1003;
|
private static final int UID_GREEN = 1003;
|
||||||
|
|
||||||
|
private long mElapsedRealtime;
|
||||||
|
|
||||||
private BroadcastInterceptingContext mServiceContext;
|
private BroadcastInterceptingContext mServiceContext;
|
||||||
private File mStatsDir;
|
private File mStatsDir;
|
||||||
|
|
||||||
@@ -107,6 +112,9 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
mServiceContext = new BroadcastInterceptingContext(getContext());
|
mServiceContext = new BroadcastInterceptingContext(getContext());
|
||||||
mStatsDir = getContext().getFilesDir();
|
mStatsDir = getContext().getFilesDir();
|
||||||
|
if (mStatsDir.exists()) {
|
||||||
|
IoUtils.deleteContents(mStatsDir);
|
||||||
|
}
|
||||||
|
|
||||||
mNetManager = createMock(INetworkManagementService.class);
|
mNetManager = createMock(INetworkManagementService.class);
|
||||||
mAlarmManager = createMock(IAlarmManager.class);
|
mAlarmManager = createMock(IAlarmManager.class);
|
||||||
@@ -118,11 +126,17 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings);
|
mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings);
|
||||||
mService.bindConnectivityManager(mConnManager);
|
mService.bindConnectivityManager(mConnManager);
|
||||||
|
|
||||||
|
mElapsedRealtime = 0L;
|
||||||
|
|
||||||
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectSystemReady();
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
final Future<?> firstPoll = expectSystemReady();
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mService.systemReady();
|
mService.systemReady();
|
||||||
|
firstPoll.get();
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -148,14 +162,12 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testNetworkStatsWifi() throws Exception {
|
public void testNetworkStatsWifi() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
|
|
||||||
// pretend that wifi network comes online; service should ask about full
|
// pretend that wifi network comes online; service should ask about full
|
||||||
// network state, and poll any existing interfaces before updating.
|
// network state, and poll any existing interfaces before updating.
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildWifiState());
|
expectNetworkState(buildWifiState());
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
@@ -164,16 +176,13 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// modify some number on wifi, and trigger poll event
|
// modify some number on wifi, and trigger poll event
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 1024L, 1L, 2048L, 2L));
|
.addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
|
||||||
expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
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
|
// and bump forward again, with counters going higher. this is
|
||||||
// important, since polling should correctly subtract last snapshot.
|
// important, since polling should correctly subtract last snapshot.
|
||||||
elapsedRealtime += DAY_IN_MILLIS;
|
incrementCurrentTime(DAY_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 4096L, 4L, 8192L, 8L));
|
.addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
|
||||||
expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
@@ -201,15 +210,14 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testStatsRebootPersist() throws Exception {
|
public void testStatsRebootPersist() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
assertStatsFilesExist(false);
|
assertStatsFilesExist(false);
|
||||||
|
|
||||||
// pretend that wifi network comes online; service should ask about full
|
// pretend that wifi network comes online; service should ask about full
|
||||||
// network state, and poll any existing interfaces before updating.
|
// network state, and poll any existing interfaces before updating.
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildWifiState());
|
expectNetworkState(buildWifiState());
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
@@ -218,29 +226,33 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// modify some number on wifi, and trigger poll event
|
// modify some number on wifi, and trigger poll event
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 1024L, 8L, 2048L, 16L));
|
.addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 2)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
|
||||||
.addValues(TEST_IFACE, UID_RED, TAG_NONE, 512L, 4L, 256L, 2L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 128L, 1L, 128L, 1L));
|
.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.incrementOperationCount(UID_RED, TAG_NONE, 20);
|
mService.setUidForeground(UID_RED, false);
|
||||||
mService.incrementOperationCount(UID_BLUE, TAG_NONE, 10);
|
mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
|
||||||
|
mService.setUidForeground(UID_RED, true);
|
||||||
|
mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
|
|
||||||
// verify service recorded history
|
// verify service recorded history
|
||||||
assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
|
assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_RED, 512L, 4L, 256L, 2L, 20);
|
assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
|
||||||
assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 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();
|
verifyAndReset();
|
||||||
|
|
||||||
// graceful shutdown system, which should trigger persist of stats, and
|
// graceful shutdown system, which should trigger persist of stats, and
|
||||||
@@ -257,47 +269,49 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
assertStatsFilesExist(true);
|
assertStatsFilesExist(true);
|
||||||
|
|
||||||
// boot through serviceReady() again
|
// boot through serviceReady() again
|
||||||
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectSystemReady();
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
final Future<?> firstPoll = expectSystemReady();
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mService.systemReady();
|
mService.systemReady();
|
||||||
|
firstPoll.get();
|
||||||
|
|
||||||
// after systemReady(), we should have historical stats loaded again
|
// after systemReady(), we should have historical stats loaded again
|
||||||
assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
|
assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_RED, 512L, 4L, 256L, 2L, 20);
|
assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
|
||||||
assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 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();
|
verifyAndReset();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStatsBucketResize() throws Exception {
|
public void testStatsBucketResize() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
NetworkStatsHistory history = null;
|
NetworkStatsHistory history = null;
|
||||||
|
|
||||||
assertStatsFilesExist(false);
|
assertStatsFilesExist(false);
|
||||||
|
|
||||||
// pretend that wifi network comes online; service should ask about full
|
// pretend that wifi network comes online; service should ask about full
|
||||||
// network state, and poll any existing interfaces before updating.
|
// network state, and poll any existing interfaces before updating.
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
|
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
|
||||||
expectNetworkState(buildWifiState());
|
expectNetworkState(buildWifiState());
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// modify some number on wifi, and trigger poll event
|
// modify some number on wifi, and trigger poll event
|
||||||
elapsedRealtime += 2 * HOUR_IN_MILLIS;
|
incrementCurrentTime(2 * HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
|
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 512L, 4L, 512L, 4L));
|
.addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
|
||||||
expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
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
|
// now change bucket duration setting and trigger another poll with
|
||||||
// exact same values, which should resize existing buckets.
|
// exact same values, which should resize existing buckets.
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
|
expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
@@ -329,35 +343,28 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testUidStatsAcrossNetworks() throws Exception {
|
public void testUidStatsAcrossNetworks() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
|
|
||||||
// pretend first mobile network comes online
|
// pretend first mobile network comes online
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildMobile3gState(IMSI_1));
|
expectNetworkState(buildMobile3gState(IMSI_1));
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// create some traffic on first network
|
// create some traffic on first network
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 2048L, 16L, 512L, 4L));
|
.addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 3)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
|
||||||
.addValues(TEST_IFACE, UID_RED, TAG_NONE, 1536L, 12L, 512L, 4L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_RED, 0xF00D, 512L, 4L, 512L, 4L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 512L, 4L, 0L, 0L));
|
.addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
|
||||||
|
|
||||||
mService.incrementOperationCount(UID_RED, TAG_NONE, 15);
|
|
||||||
mService.incrementOperationCount(UID_RED, 0xF00D, 10);
|
mService.incrementOperationCount(UID_RED, 0xF00D, 10);
|
||||||
mService.incrementOperationCount(UID_BLUE, TAG_NONE, 5);
|
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
@@ -365,18 +372,18 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
// verify service recorded history
|
// verify service recorded history
|
||||||
assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
|
assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
|
||||||
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
|
||||||
assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 15);
|
assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
|
||||||
assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 5);
|
assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// now switch networks; this also tests that we're okay with interfaces
|
// now switch networks; this also tests that we're okay with interfaces
|
||||||
// disappearing, to verify we don't count backwards.
|
// disappearing, to verify we don't count backwards.
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildMobile3gState(IMSI_2));
|
expectNetworkState(buildMobile3gState(IMSI_2));
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
@@ -384,23 +391,24 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// create traffic on second network
|
// create traffic on second network
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 128L, 1L, 1024L, 8L));
|
.addIfaceValues(TEST_IFACE, 128L, 1L, 1024L, 8L));
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 128L, 1L, 1024L, 8L));
|
.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();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
|
|
||||||
// verify original history still intact
|
// verify original history still intact
|
||||||
assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
|
assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
|
||||||
assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 15);
|
assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
|
||||||
assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 5);
|
assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
|
||||||
|
|
||||||
// and verify new history also recorded under different template, which
|
// and verify new history also recorded under different template, which
|
||||||
// verifies that we didn't cross the streams.
|
// verifies that we didn't cross the streams.
|
||||||
@@ -412,35 +420,29 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testUidRemovedIsMoved() throws Exception {
|
public void testUidRemovedIsMoved() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
|
|
||||||
// pretend that network comes online
|
// pretend that network comes online
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildWifiState());
|
expectNetworkState(buildWifiState());
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// create some traffic
|
// create some traffic
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_ALL, TAG_NONE, 4128L, 258L, 544L, 34L));
|
.addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_RED, TAG_NONE, 16L, 1L, 16L, 1L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 4096L, 258L, 512L, 32L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_GREEN, TAG_NONE, 16L, 1L, 16L, 1L));
|
.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_RED, 0xFAAD, 10);
|
||||||
mService.incrementOperationCount(UID_BLUE, TAG_NONE, 15);
|
|
||||||
mService.incrementOperationCount(UID_GREEN, TAG_NONE, 5);
|
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
@@ -448,8 +450,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
// verify service recorded history
|
// verify service recorded history
|
||||||
assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
|
assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
|
assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
|
||||||
assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 15);
|
assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 5);
|
assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// now pretend two UIDs are uninstalled, which should migrate stats to
|
// 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);
|
assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
|
assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_BLUE, 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_GREEN, 16L, 1L, 16L, 1L, 0);
|
||||||
assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 25);
|
assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testUid3g4gCombinedByTemplate() throws Exception {
|
public void testUid3g4gCombinedByTemplate() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
|
|
||||||
// pretend that network comes online
|
// pretend that network comes online
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildMobile3gState(IMSI_1));
|
expectNetworkState(buildMobile3gState(IMSI_1));
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// create some traffic
|
// create some traffic
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_RED, TAG_NONE, 1024L, 8L, 1024L, 8L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_RED, 0xF00D, 512L, 4L, 512L, 4L));
|
.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);
|
mService.incrementOperationCount(UID_RED, 0xF00D, 5);
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
|
|
||||||
// verify service recorded history
|
// verify service recorded history
|
||||||
assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 10);
|
assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// now switch over to 4g network
|
// now switch over to 4g network
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildMobile4gState());
|
expectNetworkState(buildMobile4gState());
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsUidDetail(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
@@ -522,92 +518,64 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// create traffic on second network
|
// create traffic on second network
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_RED, TAG_NONE, 512L, 4L, 256L, 2L));
|
.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();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
|
|
||||||
// verify that ALL_MOBILE template combines both
|
// 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();
|
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 {
|
public void testSummaryForAllUid() throws Exception {
|
||||||
long elapsedRealtime = 0;
|
|
||||||
|
|
||||||
// pretend that network comes online
|
// pretend that network comes online
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkState(buildWifiState());
|
expectNetworkState(buildWifiState());
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// bootstrap with full polling event to prime stats
|
|
||||||
performBootstrapPoll(TEST_START, elapsedRealtime);
|
|
||||||
|
|
||||||
// create some traffic for two apps
|
// create some traffic for two apps
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_RED, TAG_NONE, 50L, 5L, 50L, 5L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_RED, 0xF00D, 10L, 1L, 10L, 1L)
|
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
|
||||||
.addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 1024L, 8L, 512L, 4L));
|
.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_RED, 0xF00D, 1);
|
||||||
mService.incrementOperationCount(UID_BLUE, TAG_NONE, 10);
|
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
|
|
||||||
// verify service recorded history
|
// verify service recorded history
|
||||||
assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 5);
|
assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
|
||||||
assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 10);
|
assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
|
||||||
verifyAndReset();
|
verifyAndReset();
|
||||||
|
|
||||||
// now create more traffic in next hour, but only for one app
|
// now create more traffic in next hour, but only for one app
|
||||||
elapsedRealtime += HOUR_IN_MILLIS;
|
incrementCurrentTime(HOUR_IN_MILLIS);
|
||||||
expectTime(TEST_START + elapsedRealtime);
|
expectCurrentTime();
|
||||||
expectDefaultSettings();
|
expectDefaultSettings();
|
||||||
expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
|
expectNetworkStatsSummary(buildEmptyStats());
|
||||||
expectNetworkStatsUidDetail(new NetworkStats(elapsedRealtime, 1)
|
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
|
||||||
.addValues(TEST_IFACE, UID_BLUE, TAG_NONE, 2048L, 16L, 1024L, 8L));
|
.addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
|
||||||
|
|
||||||
mService.incrementOperationCount(UID_BLUE, TAG_NONE, 15);
|
|
||||||
|
|
||||||
replay();
|
replay();
|
||||||
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
|
||||||
@@ -616,16 +584,77 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
NetworkStats stats = mService.getSummaryForAllUid(
|
NetworkStats stats = mService.getSummaryForAllUid(
|
||||||
sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
|
sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
|
||||||
assertEquals(3, stats.size());
|
assertEquals(3, stats.size());
|
||||||
assertValues(stats, 0, IFACE_ALL, UID_RED, TAG_NONE, 50L, 5L, 50L, 5L, 5);
|
assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 1);
|
||||||
assertValues(stats, 1, IFACE_ALL, UID_RED, 0xF00D, 10L, 1L, 10L, 1L, 1);
|
assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 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_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0);
|
||||||
|
|
||||||
// now verify that recent history only contains one uid
|
// now verify that recent history only contains one uid
|
||||||
final long currentTime = TEST_START + elapsedRealtime;
|
final long currentTime = currentTimeMillis();
|
||||||
stats = mService.getSummaryForAllUid(
|
stats = mService.getSummaryForAllUid(
|
||||||
sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
|
sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
|
||||||
assertEquals(1, stats.size());
|
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();
|
verifyAndReset();
|
||||||
}
|
}
|
||||||
@@ -639,19 +668,27 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
|
private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
|
||||||
long txBytes, long txPackets, int operations) {
|
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(
|
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,
|
assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
|
||||||
txPackets, operations);
|
txPackets, operations);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void expectSystemReady() throws Exception {
|
private Future<?> expectSystemReady() throws Exception {
|
||||||
mAlarmManager.remove(isA(PendingIntent.class));
|
mAlarmManager.remove(isA(PendingIntent.class));
|
||||||
expectLastCall().anyTimes();
|
expectLastCall().anyTimes();
|
||||||
|
|
||||||
mAlarmManager.setInexactRepeating(
|
mAlarmManager.setInexactRepeating(
|
||||||
eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class));
|
eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class));
|
||||||
expectLastCall().atLeastOnce();
|
expectLastCall().atLeastOnce();
|
||||||
|
|
||||||
|
return mServiceContext.nextBroadcastIntent(
|
||||||
|
NetworkStatsService.ACTION_NETWORK_STATS_UPDATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void expectNetworkState(NetworkState... state) throws Exception {
|
private void expectNetworkState(NetworkState... state) throws Exception {
|
||||||
@@ -682,25 +719,14 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
|
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.forceRefresh()).andReturn(false).anyTimes();
|
||||||
expect(mTime.hasCache()).andReturn(true).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.getCacheAge()).andReturn(0L).anyTimes();
|
||||||
expect(mTime.getCacheCertainty()).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) {
|
private void assertStatsFilesExist(boolean exist) {
|
||||||
final File networkFile = new File(mStatsDir, "netstats.bin");
|
final File networkFile = new File(mStatsDir, "netstats.bin");
|
||||||
final File uidFile = new File(mStatsDir, "netstats_uid.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,
|
private static void assertValues(NetworkStats stats, String iface, int uid, int set,
|
||||||
long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) {
|
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);
|
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 rxBytes", rxBytes, entry.rxBytes);
|
||||||
assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
|
assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
|
||||||
assertEquals("unexpected txBytes", txBytes, entry.txBytes);
|
assertEquals("unexpected txBytes", txBytes, entry.txBytes);
|
||||||
@@ -761,8 +785,24 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
|||||||
return new NetworkState(info, prop, null);
|
return new NetworkState(info, prop, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static NetworkStats buildEmptyStats(long elapsedRealtime) {
|
private NetworkStats buildEmptyStats() {
|
||||||
return new NetworkStats(elapsedRealtime, 0);
|
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() {
|
private void replay() {
|
||||||
|
|||||||
Reference in New Issue
Block a user