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:
@@ -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(
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user