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 java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
import java.util.List;
|
||||
|
||||
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 int INVALID_TYPE = -1;
|
||||
|
||||
private static final int[] NO_UIDS = null;
|
||||
private static final VpnInfo[] VPN_INFO = new VpnInfo[0];
|
||||
|
||||
private long mElapsedRealtime;
|
||||
@@ -134,112 +133,60 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
|
||||
public void testRegister_thresholdTooLow_setsDefaultThreshold() throws Exception {
|
||||
long thresholdTooLowBytes = 1L;
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateWifi, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
}
|
||||
|
||||
public void testRegister_highThreshold_accepted() throws Exception {
|
||||
long highThresholdBytes = 2 * THRESHOLD_BYTES;
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateWifi, request.template));
|
||||
assertEquals(highThresholdBytes, request.thresholdInBytes);
|
||||
}
|
||||
|
||||
public void testRegister_twoRequests_twoIds() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request1.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request1.templates));
|
||||
assertNull(request1.uids);
|
||||
assertTrue(Objects.equals(sTemplateWifi, request1.template));
|
||||
assertEquals(THRESHOLD_BYTES, request1.thresholdInBytes);
|
||||
|
||||
DataUsageRequest request2 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request2.requestId > request1.requestId);
|
||||
assertTrue(Arrays.deepEquals(templates, request2.templates));
|
||||
assertNull(request2.uids);
|
||||
assertTrue(Objects.equals(sTemplateWifi, request2.template));
|
||||
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 {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
|
||||
DataUsageRequest unknownRequest = new DataUsageRequest(
|
||||
123456 /* id */, templates, NO_UIDS, THRESHOLD_BYTES);
|
||||
123456 /* id */, sTemplateWifi, THRESHOLD_BYTES);
|
||||
|
||||
mStatsObservers.unregister(unknownRequest, UID_RED);
|
||||
}
|
||||
|
||||
public void testUnregister_knownRequest_releasesCaller() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
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 {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
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.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
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 {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -301,15 +244,13 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testUpdateStats_belowThreshold_doesNotNotify() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -339,16 +280,14 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
|
||||
}
|
||||
|
||||
public void testUpdateStats_aboveThresholdNetwork_notifies() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
public void testUpdateStats_deviceAccess_notifies() throws Exception {
|
||||
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,
|
||||
Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -378,104 +317,14 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
|
||||
}
|
||||
|
||||
public void testUpdateStats_aboveThresholdMultipleNetwork_notifies() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
|
||||
public void testUpdateStats_defaultAccess_notifiesSameUid() throws Exception {
|
||||
DataUsageRequest inputRequest = new DataUsageRequest(
|
||||
DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, 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_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
|
||||
|
||||
DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
|
||||
UID_RED, NetworkStatsAccess.Level.DEFAULT);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -494,7 +343,7 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
VPN_INFO, TEST_START);
|
||||
|
||||
// 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,
|
||||
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
|
||||
mStatsObservers.updateStats(
|
||||
@@ -506,16 +355,14 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
|
||||
}
|
||||
|
||||
public void testUpdateStats_defaultAccess_noUid_usageOtherUid_doesNotNotify() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
public void testUpdateStats_defaultAccess_usageOtherUid_doesNotNotify() throws Exception {
|
||||
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_BLUE, NetworkStatsAccess.Level.DEFAULT);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -534,7 +381,7 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
VPN_INFO, TEST_START);
|
||||
|
||||
// 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,
|
||||
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
|
||||
mStatsObservers.updateStats(
|
||||
@@ -547,15 +394,13 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testUpdateStats_userAccess_usageSameUser_notifies() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
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_BLUE, NetworkStatsAccess.Level.USER);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -574,7 +419,7 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
VPN_INFO, TEST_START);
|
||||
|
||||
// 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,
|
||||
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
|
||||
mStatsObservers.updateStats(
|
||||
@@ -587,15 +432,13 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testUpdateStats_userAccess_usageAnotherUser_doesNotNotify() throws Exception {
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
|
||||
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.USER);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateImsi1, request.template));
|
||||
assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
|
||||
|
||||
NetworkIdentitySet identSet = new NetworkIdentitySet();
|
||||
@@ -614,7 +457,7 @@ public class NetworkStatsObserversTest extends TestCase {
|
||||
VPN_INFO, TEST_START);
|
||||
|
||||
// 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,
|
||||
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
|
||||
mStatsObservers.updateStats(
|
||||
|
||||
@@ -100,7 +100,7 @@ import org.easymock.EasyMock;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
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
|
||||
// network state, and poll any existing interfaces before updating.
|
||||
expectCurrentTime();
|
||||
@@ -907,9 +907,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
||||
|
||||
String callingPackage = "the.calling.package";
|
||||
long thresholdInBytes = 1L; // very small; should be overriden by framework
|
||||
NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
|
||||
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
|
||||
ConditionVariable cv = new ConditionVariable(false);
|
||||
@@ -931,11 +930,10 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
||||
|
||||
// Register and verify request and that binder was called
|
||||
DataUsageRequest request =
|
||||
mService.registerDataUsageCallback(callingPackage, inputRequest,
|
||||
mService.registerUsageCallback(callingPackage, inputRequest,
|
||||
messenger, mockBinder);
|
||||
assertTrue(request.requestId > 0);
|
||||
assertTrue(Arrays.deepEquals(templates, request.templates));
|
||||
assertNull(request.uids);
|
||||
assertTrue(Objects.equals(sTemplateWifi, request.template));
|
||||
long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
|
||||
assertEquals(minThresholdInBytes, request.thresholdInBytes);
|
||||
|
||||
@@ -997,7 +995,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
||||
EasyMock.replay(mockBinder);
|
||||
|
||||
// Unregister request
|
||||
mService.unregisterDataUsageRequest(request);
|
||||
mService.unregisterUsageRequest(request);
|
||||
|
||||
// Wait for the caller to ack receipt of CALLBACK_RELEASED
|
||||
assertTrue(cv.block(WAIT_TIMEOUT));
|
||||
@@ -1007,157 +1005,13 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
|
||||
EasyMock.verify(mockBinder);
|
||||
}
|
||||
|
||||
public void testRegisterDataUsageCallback_uids() 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();
|
||||
|
||||
public void testUnregisterUsageCallback_unknown_noop() throws Exception {
|
||||
String callingPackage = "the.calling.package";
|
||||
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(
|
||||
2, templates, null /* uids */, thresholdInBytes);
|
||||
2 /* requestId */, sTemplateImsi1, thresholdInBytes);
|
||||
|
||||
mService.unregisterDataUsageRequest(unknownRequest);
|
||||
mService.unregisterUsageRequest(unknownRequest);
|
||||
}
|
||||
|
||||
private static File getBaseDir(File statsDir) {
|
||||
|
||||
Reference in New Issue
Block a user