Merge "Filter ifaces for uid operations value before combine"

This commit is contained in:
Aaron Huang
2022-10-18 06:58:20 +00:00
committed by Gerrit Code Review
2 changed files with 63 additions and 27 deletions

View File

@@ -75,12 +75,14 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.mockito.AdditionalMatchers.aryEq;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -393,6 +395,10 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
verify(mNetd).registerUnsolicitedEventListener(alertObserver.capture());
mAlertObserver = alertObserver.getValue();
// Make augmentWithStackedInterfaces returns the interfaces that was passed to it.
doAnswer(inv -> ((String[]) inv.getArgument(0)).clone())
.when(mStatsFactory).augmentWithStackedInterfaces(any());
// Catch TetheringEventCallback during systemReady().
ArgumentCaptor<TetheringManager.TetheringEventCallback> tetheringEventCbCaptor =
ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
@@ -1239,45 +1245,73 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
@Test
public void testUidStatsForTransport() throws Exception {
// pretend that network comes online
// Setup both wifi and mobile networks, and set mobile network as the default interface.
mockDefaultSettings();
NetworkStateSnapshot[] states = new NetworkStateSnapshot[] {buildWifiState()};
mockNetworkStatsSummary(buildEmptyStats());
mockNetworkStatsUidDetail(buildEmptyStats());
mService.notifyNetworkStatus(NETWORKS_WIFI, states, getActiveIface(states),
final NetworkStateSnapshot mobileState = buildStateOfTransport(
NetworkCapabilities.TRANSPORT_CELLULAR, TYPE_MOBILE,
TEST_IFACE2, IMSI_1, null /* wifiNetworkKey */,
false /* isTemporarilyNotMetered */, false /* isRoaming */);
final NetworkStateSnapshot[] states = new NetworkStateSnapshot[] {
mobileState, buildWifiState()};
mService.notifyNetworkStatus(NETWORKS_MOBILE, states, getActiveIface(states),
new UnderlyingNetworkInfo[0]);
setMobileRatTypeAndWaitForIdle(TelephonyManager.NETWORK_TYPE_LTE);
NetworkStats.Entry entry1 = new NetworkStats.Entry(
// Mock traffic on wifi network.
final NetworkStats.Entry entry1 = new NetworkStats.Entry(
TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
DEFAULT_NETWORK_NO, 50L, 5L, 50L, 5L, 0L);
NetworkStats.Entry entry2 = new NetworkStats.Entry(
DEFAULT_NETWORK_NO, 50L, 5L, 50L, 5L, 1L);
final NetworkStats.Entry entry2 = new NetworkStats.Entry(
TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
DEFAULT_NETWORK_NO, 50L, 5L, 50L, 5L, 0L);
NetworkStats.Entry entry3 = new NetworkStats.Entry(
DEFAULT_NETWORK_NO, 50L, 5L, 50L, 5L, 1L);
final NetworkStats.Entry entry3 = new NetworkStats.Entry(
TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xBEEF, METERED_NO, ROAMING_NO,
DEFAULT_NETWORK_NO, 1024L, 8L, 512L, 4L, 0L);
DEFAULT_NETWORK_NO, 1024L, 8L, 512L, 4L, 2L);
final TetherStatsParcel[] emptyTetherStats = {};
// The interfaces that expect to be used to query the stats.
final String[] wifiIfaces = {TEST_IFACE};
incrementCurrentTime(HOUR_IN_MILLIS);
mockDefaultSettings();
mockNetworkStatsSummary(buildEmptyStats());
mockNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
.insertEntry(entry1)
.insertEntry(entry2)
.insertEntry(entry3));
.insertEntry(entry3), emptyTetherStats, wifiIfaces);
// getUidStatsForTransport (through getNetworkStatsUidDetail) adds all operation counts
// with active interface, and the interface here is mobile interface, so this test makes
// sure these operations are not surfaced in getUidStatsForTransport if the transport
// doesn't match them.
mService.incrementOperationCount(UID_RED, 0xF00D, 1);
final NetworkStats wifiStats = mService.getUidStatsForTransport(
NetworkCapabilities.TRANSPORT_WIFI);
NetworkStats stats = mService.getUidStatsForTransport(NetworkCapabilities.TRANSPORT_WIFI);
assertEquals(3, wifiStats.size());
// The iface field of the returned stats should be null because getUidStatsForTransport
// clears the interface fields before it returns the result.
assertValues(wifiStats, null /* iface */, UID_RED, SET_DEFAULT, TAG_NONE,
METERED_NO, ROAMING_NO, METERED_NO, 50L, 5L, 50L, 5L, 1L);
assertValues(wifiStats, null /* iface */, UID_RED, SET_DEFAULT, 0xF00D,
METERED_NO, ROAMING_NO, METERED_NO, 50L, 5L, 50L, 5L, 1L);
assertValues(wifiStats, null /* iface */, UID_BLUE, SET_DEFAULT, 0xBEEF,
METERED_NO, ROAMING_NO, METERED_NO, 1024L, 8L, 512L, 4L, 2L);
assertEquals(3, stats.size());
entry1.operations = 1;
entry1.iface = null;
assertEquals(entry1, stats.getValues(0, null));
entry2.operations = 1;
entry2.iface = null;
assertEquals(entry2, stats.getValues(1, null));
entry3.iface = null;
assertEquals(entry3, stats.getValues(2, null));
final String[] mobileIfaces = {TEST_IFACE2};
mockNetworkStatsUidDetail(buildEmptyStats(), emptyTetherStats, mobileIfaces);
final NetworkStats mobileStats = mService.getUidStatsForTransport(
NetworkCapabilities.TRANSPORT_CELLULAR);
assertEquals(2, mobileStats.size());
// Verify the operation count stats that caused by incrementOperationCount only appears
// on the mobile interface since incrementOperationCount attributes them onto the active
// interface.
assertValues(mobileStats, null /* iface */, UID_RED, SET_DEFAULT, 0xF00D,
METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 1);
assertValues(mobileStats, null /* iface */, UID_RED, SET_DEFAULT, TAG_NONE,
METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 1);
}
@Test
@@ -1468,7 +1502,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
{buildTetherStatsParcel(TEST_IFACE, 1408L, 10L, 256L, 1L, 0)};
mockNetworkStatsSummary(swIfaceStats);
mockNetworkStatsUidDetail(localUidStats, tetherStatsParcels);
mockNetworkStatsUidDetail(localUidStats, tetherStatsParcels, INTERFACES_ALL);
forcePollAndWaitForIdle();
// verify service recorded history
@@ -2235,13 +2269,14 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
private void mockNetworkStatsUidDetail(NetworkStats detail) throws Exception {
final TetherStatsParcel[] tetherStatsParcels = {};
mockNetworkStatsUidDetail(detail, tetherStatsParcels);
mockNetworkStatsUidDetail(detail, tetherStatsParcels, INTERFACES_ALL);
}
private void mockNetworkStatsUidDetail(NetworkStats detail,
TetherStatsParcel[] tetherStatsParcels) throws Exception {
TetherStatsParcel[] tetherStatsParcels, String[] ifaces) throws Exception {
doReturn(detail).when(mStatsFactory)
.readNetworkStatsDetail(UID_ALL, INTERFACES_ALL, TAG_ALL);
.readNetworkStatsDetail(eq(UID_ALL), aryEq(ifaces), eq(TAG_ALL));
// also include tethering details, since they are folded into UID
doReturn(tetherStatsParcels).when(mNetd).tetherGetStats();