Addressing API council comments on NetworkStatsManager.

Callbacks
 - DataUsageCallback renamed to UsageCallback
 - DataUsagePolicy removed; passing in params directly to register method
 - making it an abstract class
 - passing in (networkType, subscriberId) that reached its threshold
 - renaming onLimitReached to onThresholdReached to match existing naming
 - only monitor single network,subscriberId
 - no monitoring of specific uids; using device or user wide instead

Tags
 - only owner uid can read its tags
 - exposing only TAG_NONE to match service side

BUG: 27530098

Change-Id: I2b2664da71806868a1e937d2bf4d1f234637509b
This commit is contained in:
Antonio Cansado
2016-03-30 11:37:18 -07:00
parent 06ea4b0cf1
commit 13726d128a
2 changed files with 43 additions and 346 deletions

View File

@@ -56,7 +56,7 @@ import com.android.server.net.NetworkStatsServiceTest.IdleableHandlerThread;
import com.android.server.net.NetworkStatsServiceTest.LatchedHandler; import com.android.server.net.NetworkStatsServiceTest.LatchedHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Objects;
import java.util.List; import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
@@ -91,7 +91,6 @@ public class NetworkStatsObserversTest extends TestCase {
private static final long BASE_BYTES = 7 * MB_IN_BYTES; private static final long BASE_BYTES = 7 * MB_IN_BYTES;
private static final int INVALID_TYPE = -1; private static final int INVALID_TYPE = -1;
private static final int[] NO_UIDS = null;
private static final VpnInfo[] VPN_INFO = new VpnInfo[0]; private static final VpnInfo[] VPN_INFO = new VpnInfo[0];
private long mElapsedRealtime; private long mElapsedRealtime;
@@ -134,112 +133,60 @@ public class NetworkStatsObserversTest extends TestCase {
public void testRegister_thresholdTooLow_setsDefaultThreshold() throws Exception { public void testRegister_thresholdTooLow_setsDefaultThreshold() throws Exception {
long thresholdTooLowBytes = 1L; long thresholdTooLowBytes = 1L;
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, thresholdTooLowBytes); DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdTooLowBytes);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateWifi, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
} }
public void testRegister_highThreshold_accepted() throws Exception { public void testRegister_highThreshold_accepted() throws Exception {
long highThresholdBytes = 2 * THRESHOLD_BYTES; long highThresholdBytes = 2 * THRESHOLD_BYTES;
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, highThresholdBytes); DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, highThresholdBytes);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateWifi, request.template));
assertNull(request.uids);
assertEquals(highThresholdBytes, request.thresholdInBytes); assertEquals(highThresholdBytes, request.thresholdInBytes);
} }
public void testRegister_twoRequests_twoIds() throws Exception { public void testRegister_twoRequests_twoIds() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, THRESHOLD_BYTES);
DataUsageRequest request1 = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request1 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request1.requestId > 0); assertTrue(request1.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request1.templates)); assertTrue(Objects.equals(sTemplateWifi, request1.template));
assertNull(request1.uids);
assertEquals(THRESHOLD_BYTES, request1.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request1.thresholdInBytes);
DataUsageRequest request2 = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request2 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request2.requestId > request1.requestId); assertTrue(request2.requestId > request1.requestId);
assertTrue(Arrays.deepEquals(templates, request2.templates)); assertTrue(Objects.equals(sTemplateWifi, request2.template));
assertNull(request2.uids);
assertEquals(THRESHOLD_BYTES, request2.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request2.thresholdInBytes);
} }
public void testRegister_defaultAccess_otherUids_securityException() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
int[] uids = new int[] { UID_RED, UID_BLUE, UID_GREEN };
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
try {
mStatsObservers.register(inputRequest, mMessenger, mockBinder, UID_RED,
NetworkStatsAccess.Level.DEFAULT);
fail("Should have denied access");
} catch (SecurityException expected) {}
}
public void testRegister_userAccess_otherUidsSameUser()
throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
int[] uids = new int[] { UID_RED, UID_BLUE, UID_GREEN };
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_RED, NetworkStatsAccess.Level.USER);
assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates));
assertTrue(Arrays.equals(uids, request.uids));
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
}
public void testRegister_defaultAccess_sameUid() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
int[] uids = new int[] { UID_RED };
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_RED, NetworkStatsAccess.Level.DEFAULT);
assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates));
assertTrue(Arrays.equals(uids, request.uids));
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
}
public void testUnregister_unknownRequest_noop() throws Exception { public void testUnregister_unknownRequest_noop() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
DataUsageRequest unknownRequest = new DataUsageRequest( DataUsageRequest unknownRequest = new DataUsageRequest(
123456 /* id */, templates, NO_UIDS, THRESHOLD_BYTES); 123456 /* id */, sTemplateWifi, THRESHOLD_BYTES);
mStatsObservers.unregister(unknownRequest, UID_RED); mStatsObservers.unregister(unknownRequest, UID_RED);
} }
public void testUnregister_knownRequest_releasesCaller() throws Exception { public void testUnregister_knownRequest_releasesCaller() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt()); Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
@@ -250,15 +197,13 @@ public class NetworkStatsObserversTest extends TestCase {
} }
public void testUnregister_knownRequest_invalidUid_doesNotUnregister() throws Exception { public void testUnregister_knownRequest_invalidUid_doesNotUnregister() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_RED, NetworkStatsAccess.Level.DEVICE); UID_RED, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt()); Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
@@ -269,15 +214,13 @@ public class NetworkStatsObserversTest extends TestCase {
} }
public void testUpdateStats_initialSample_doesNotNotify() throws Exception { public void testUpdateStats_initialSample_doesNotNotify() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -301,15 +244,13 @@ public class NetworkStatsObserversTest extends TestCase {
} }
public void testUpdateStats_belowThreshold_doesNotNotify() throws Exception { public void testUpdateStats_belowThreshold_doesNotNotify() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -339,16 +280,14 @@ public class NetworkStatsObserversTest extends TestCase {
assertEquals(INVALID_TYPE, mHandler.mLastMessageType); assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
} }
public void testUpdateStats_aboveThresholdNetwork_notifies() throws Exception { public void testUpdateStats_deviceAccess_notifies() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE); Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -378,104 +317,14 @@ public class NetworkStatsObserversTest extends TestCase {
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType); assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
} }
public void testUpdateStats_aboveThresholdMultipleNetwork_notifies() throws Exception { public void testUpdateStats_defaultAccess_notifiesSameUid() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_RED, NetworkStatsAccess.Level.DEVICESUMMARY);
assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet1 = new NetworkIdentitySet();
identSet1.add(new NetworkIdentity(
TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
mActiveIfaces.put(TEST_IFACE, identSet1);
NetworkIdentitySet identSet2 = new NetworkIdentitySet();
identSet2.add(new NetworkIdentity(
TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
IMSI_2, null /* networkId */, false /* roaming */, true /* metered */));
mActiveIfaces.put(TEST_IFACE2, identSet2);
// Baseline
NetworkStats xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */)
.addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L)
.addIfaceValues(TEST_IFACE2, BASE_BYTES + 1234L, 18L, BASE_BYTES, 12L);
NetworkStats uidSnapshot = null;
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
// Delta - traffic on IMSI2
xtSnapshot = new NetworkStats(TEST_START + MINUTE_IN_MILLIS, 1 /* initialSize */)
.addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L)
.addIfaceValues(TEST_IFACE2, BASE_BYTES + THRESHOLD_BYTES, 22L,
BASE_BYTES + THRESHOLD_BYTES, 24L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
waitForObserverToIdle();
assertTrue(mCv.block(WAIT_TIMEOUT));
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
}
public void testUpdateStats_aboveThresholdUid_notifies() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
int[] uids = new int[] { UID_RED, UID_BLUE, UID_GREEN };
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates));
assertTrue(Arrays.equals(uids,request.uids));
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet();
identSet.add(new NetworkIdentity(
TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
mActiveUidIfaces.put(TEST_IFACE, identSet);
// Baseline
NetworkStats xtSnapshot = null;
NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
// Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
waitForObserverToIdle();
assertTrue(mCv.block(WAIT_TIMEOUT));
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
}
public void testUpdateStats_defaultAccess_noUid_notifiesSameUid() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_RED, NetworkStatsAccess.Level.DEFAULT); UID_RED, NetworkStatsAccess.Level.DEFAULT);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -494,7 +343,7 @@ public class NetworkStatsObserversTest extends TestCase {
VPN_INFO, TEST_START); VPN_INFO, TEST_START);
// Delta // Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats( mStatsObservers.updateStats(
@@ -506,16 +355,14 @@ public class NetworkStatsObserversTest extends TestCase {
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType); assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
} }
public void testUpdateStats_defaultAccess_noUid_usageOtherUid_doesNotNotify() throws Exception { public void testUpdateStats_defaultAccess_usageOtherUid_doesNotNotify() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_BLUE, NetworkStatsAccess.Level.DEFAULT); UID_BLUE, NetworkStatsAccess.Level.DEFAULT);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -534,7 +381,7 @@ public class NetworkStatsObserversTest extends TestCase {
VPN_INFO, TEST_START); VPN_INFO, TEST_START);
// Delta // Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats( mStatsObservers.updateStats(
@@ -547,15 +394,13 @@ public class NetworkStatsObserversTest extends TestCase {
} }
public void testUpdateStats_userAccess_usageSameUser_notifies() throws Exception { public void testUpdateStats_userAccess_usageSameUser_notifies() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_BLUE, NetworkStatsAccess.Level.USER); UID_BLUE, NetworkStatsAccess.Level.USER);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -574,7 +419,7 @@ public class NetworkStatsObserversTest extends TestCase {
VPN_INFO, TEST_START); VPN_INFO, TEST_START);
// Delta // Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats( mStatsObservers.updateStats(
@@ -587,15 +432,13 @@ public class NetworkStatsObserversTest extends TestCase {
} }
public void testUpdateStats_userAccess_usageAnotherUser_doesNotNotify() throws Exception { public void testUpdateStats_userAccess_usageAnotherUser_doesNotNotify() throws Exception {
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES); DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder, DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
UID_RED, NetworkStatsAccess.Level.USER); UID_RED, NetworkStatsAccess.Level.USER);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateImsi1, request.template));
assertNull(request.uids);
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes); assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
NetworkIdentitySet identSet = new NetworkIdentitySet(); NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -614,7 +457,7 @@ public class NetworkStatsObserversTest extends TestCase {
VPN_INFO, TEST_START); VPN_INFO, TEST_START);
// Delta // Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
.addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO, .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats( mStatsObservers.updateStats(

View File

@@ -100,7 +100,7 @@ import org.easymock.EasyMock;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Objects;
import java.util.List; import java.util.List;
/** /**
@@ -887,7 +887,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
} }
public void testRegisterDataUsageCallback_network() throws Exception { public void testRegisterUsageCallback() throws Exception {
// 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.
expectCurrentTime(); expectCurrentTime();
@@ -907,9 +907,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
String callingPackage = "the.calling.package"; String callingPackage = "the.calling.package";
long thresholdInBytes = 1L; // very small; should be overriden by framework long thresholdInBytes = 1L; // very small; should be overriden by framework
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
DataUsageRequest inputRequest = new DataUsageRequest( DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, null /* uids */, thresholdInBytes); DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdInBytes);
// Create a messenger that waits for callback activity // Create a messenger that waits for callback activity
ConditionVariable cv = new ConditionVariable(false); ConditionVariable cv = new ConditionVariable(false);
@@ -931,11 +930,10 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
// Register and verify request and that binder was called // Register and verify request and that binder was called
DataUsageRequest request = DataUsageRequest request =
mService.registerDataUsageCallback(callingPackage, inputRequest, mService.registerUsageCallback(callingPackage, inputRequest,
messenger, mockBinder); messenger, mockBinder);
assertTrue(request.requestId > 0); assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates)); assertTrue(Objects.equals(sTemplateWifi, request.template));
assertNull(request.uids);
long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
assertEquals(minThresholdInBytes, request.thresholdInBytes); assertEquals(minThresholdInBytes, request.thresholdInBytes);
@@ -997,7 +995,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
EasyMock.replay(mockBinder); EasyMock.replay(mockBinder);
// Unregister request // Unregister request
mService.unregisterDataUsageRequest(request); mService.unregisterUsageRequest(request);
// Wait for the caller to ack receipt of CALLBACK_RELEASED // Wait for the caller to ack receipt of CALLBACK_RELEASED
assertTrue(cv.block(WAIT_TIMEOUT)); assertTrue(cv.block(WAIT_TIMEOUT));
@@ -1007,157 +1005,13 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
EasyMock.verify(mockBinder); EasyMock.verify(mockBinder);
} }
public void testRegisterDataUsageCallback_uids() throws Exception { public void testUnregisterUsageCallback_unknown_noop() throws Exception {
// pretend that network comes online
expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectNetworkStatsPoll();
expectBandwidthControlCheck();
replay();
mService.forceUpdateIfaces();
verifyAndReset();
String callingPackage = "the.calling.package"; String callingPackage = "the.calling.package";
long thresholdInBytes = 10 * 1024 * 1024; // 10 MB long thresholdInBytes = 10 * 1024 * 1024; // 10 MB
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
int[] uids = new int[] { UID_RED };
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, templates, uids, thresholdInBytes);
// Create a messenger that waits for callback activity
ConditionVariable cv = new ConditionVariable(false);
cv.close();
LatchedHandler latchedHandler = new LatchedHandler(Looper.getMainLooper(), cv);
Messenger messenger = new Messenger(latchedHandler);
// Allow binder to connect
IBinder mockBinder = createMock(IBinder.class);
mockBinder.linkToDeath((IBinder.DeathRecipient) anyObject(), anyInt());
EasyMock.replay(mockBinder);
// Force poll
expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
expectNetworkStatsPoll();
replay();
// Register and verify request and that binder was called
DataUsageRequest request =
mService.registerDataUsageCallback(callingPackage, inputRequest,
messenger, mockBinder);
assertTrue(request.requestId > 0);
assertTrue(Arrays.deepEquals(templates, request.templates));
assertTrue(Arrays.equals(uids, request.uids));
assertEquals(thresholdInBytes, request.thresholdInBytes);
// Wait for service to handle internal MSG_REGISTER_DATA_USAGE_LISTENER
mHandler.sendMessage(mHandler.obtainMessage(-1));
mHandlerThread.waitForIdle(WAIT_TIMEOUT);
verifyAndReset();
// Make sure that the caller binder gets connected
EasyMock.verify(mockBinder);
EasyMock.reset(mockBinder);
// modify some number on mobile interface, and trigger poll event
// not enough traffic to call data usage callback
incrementCurrentTime(HOUR_IN_MILLIS);
expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
128L, 2L, 0L)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
1L, 0L));
expectNetworkStatsPoll();
replay();
forcePollAndWaitForIdle();
// verify service recorded history
assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
// verify entire history present
NetworkStats stats = mSession.getSummaryForAllUid(
sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(2, stats.size());
assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L,
128L, 2L, 0);
assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L,
1L, 0);
verifyAndReset();
// make sure callback has not being called
assertEquals(INVALID_TYPE, latchedHandler.mLastMessageType);
// and bump forward again, with counters going higher. this is
// important, since it will trigger the data usage callback
incrementCurrentTime(DAY_IN_MILLIS);
expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
128000000L, 2L, 128000000L, 2L, 0L)
.addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO,
64000000L, 1L, 64000000L, 1L, 0L));
expectNetworkStatsPoll();
replay();
forcePollAndWaitForIdle();
// verify service recorded history
assertUidTotal(sTemplateImsi1, UID_RED, 128000000L, 2L, 128000000L, 2L, 0);
// verify entire history present
stats = mSession.getSummaryForAllUid(
sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(2, stats.size());
assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES,
128000000L, 2L, 128000000L, 2L, 0);
assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES,
64000000L, 1L, 64000000L, 1L, 0);
verifyAndReset();
// Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED
assertTrue(cv.block(WAIT_TIMEOUT));
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.mLastMessageType);
cv.close();
// Allow binder to disconnect
expect(mockBinder.unlinkToDeath((IBinder.DeathRecipient) anyObject(), anyInt()))
.andReturn(true);
EasyMock.replay(mockBinder);
// Unregister request
mService.unregisterDataUsageRequest(request);
// Wait for the caller to ack receipt of CALLBACK_RELEASED
assertTrue(cv.block(WAIT_TIMEOUT));
assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.mLastMessageType);
// Make sure that the caller binder gets disconnected
EasyMock.verify(mockBinder);
}
public void testUnregisterDataUsageCallback_unknown_noop() throws Exception {
String callingPackage = "the.calling.package";
long thresholdInBytes = 10 * 1024 * 1024; // 10 MB
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
DataUsageRequest unknownRequest = new DataUsageRequest( DataUsageRequest unknownRequest = new DataUsageRequest(
2, templates, null /* uids */, thresholdInBytes); 2 /* requestId */, sTemplateImsi1, thresholdInBytes);
mService.unregisterDataUsageRequest(unknownRequest); mService.unregisterUsageRequest(unknownRequest);
} }
private static File getBaseDir(File statsDir) { private static File getBaseDir(File statsDir) {