Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit decbf9f6 authored by junyulai's avatar junyulai
Browse files

Add test for increment operation count on non-default network

Currently, when the caller increment operation count, the count
will be blamed on the active default network even though the
traffic is all generated on other networks. This is kind
of weird. But in order to change the behavior, extend test
coverage first.

Test: atest com.android.server.net.NetworkStatsServiceTest#testOperationCount_nondefault_traffic
Bug: 174123988

Change-Id: Ia5b5aa3601de15bb9ee5a29f6d184d122f1c5352
parent 7dabd134
Loading
Loading
Loading
Loading
+51 −6
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.net.ConnectivityManager.TYPE_VPN;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIMAX;
import static android.net.ConnectivityManager.TYPE_WIMAX;
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.INTERFACES_ALL;
import static android.net.NetworkStats.INTERFACES_ALL;
@@ -917,7 +918,8 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
    public void testMetered() throws Exception {
    public void testMetered() throws Exception {
        // pretend that network comes online
        // pretend that network comes online
        expectDefaultSettings();
        expectDefaultSettings();
        NetworkState[] states = new NetworkState[] {buildWifiState(true /* isMetered */)};
        NetworkState[] states =
                new NetworkState[] {buildWifiState(true /* isMetered */, TEST_IFACE)};
        expectNetworkStatsSummary(buildEmptyStats());
        expectNetworkStatsSummary(buildEmptyStats());
        expectNetworkStatsUidDetail(buildEmptyStats());
        expectNetworkStatsUidDetail(buildEmptyStats());


@@ -1146,7 +1148,8 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
    public void testStatsProviderUpdateStats() throws Exception {
    public void testStatsProviderUpdateStats() throws Exception {
        // Pretend that network comes online.
        // Pretend that network comes online.
        expectDefaultSettings();
        expectDefaultSettings();
        final NetworkState[] states = new NetworkState[]{buildWifiState(true /* isMetered */)};
        final NetworkState[] states =
                new NetworkState[]{buildWifiState(true /* isMetered */, TEST_IFACE)};
        expectNetworkStatsSummary(buildEmptyStats());
        expectNetworkStatsSummary(buildEmptyStats());
        expectNetworkStatsUidDetail(buildEmptyStats());
        expectNetworkStatsUidDetail(buildEmptyStats());


@@ -1206,7 +1209,8 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
    public void testStatsProviderSetAlert() throws Exception {
    public void testStatsProviderSetAlert() throws Exception {
        // Pretend that network comes online.
        // Pretend that network comes online.
        expectDefaultSettings();
        expectDefaultSettings();
        NetworkState[] states = new NetworkState[]{buildWifiState(true /* isMetered */)};
        NetworkState[] states =
                new NetworkState[]{buildWifiState(true /* isMetered */, TEST_IFACE)};
        mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states), new VpnInfo[0]);
        mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states), new VpnInfo[0]);


        // Register custom provider and retrieve callback.
        // Register custom provider and retrieve callback.
@@ -1319,6 +1323,47 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
        assertUidTotal(templateAll, UID_RED, 22L + 35L, 26L + 29L, 19L + 7L, 5L + 11L, 1);
        assertUidTotal(templateAll, UID_RED, 22L + 35L, 26L + 29L, 19L + 7L, 5L + 11L, 1);
    }
    }


    @Test
    public void testOperationCount_nonDefault_traffic() throws Exception {
        // Pretend mobile network comes online, but wifi is the default network.
        expectDefaultSettings();
        NetworkState[] states = new NetworkState[]{
                buildWifiState(true /*isMetered*/, TEST_IFACE2), buildMobile3gState(IMSI_1)};
        expectNetworkStatsUidDetail(buildEmptyStats());
        mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states), new VpnInfo[0]);

        // Create some traffic on mobile network.
        incrementCurrentTime(HOUR_IN_MILLIS);
        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 4)
                .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
                        DEFAULT_NETWORK_NO, 2L, 1L, 3L, 4L, 0L)
                .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
                        DEFAULT_NETWORK_YES, 1L, 3L, 2L, 1L, 0L)
                .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 5L, 4L, 1L, 4L, 0L));
        // Increment operation count, which must have a specific tag.
        mService.incrementOperationCount(UID_RED, 0xF00D, 2);
        forcePollAndWaitForIdle();

        // Verify mobile summary is not changed by the operation count.
        final NetworkTemplate templateMobile =
                buildTemplateMobileWithRatType(null, NETWORK_TYPE_ALL);
        final NetworkStats statsMobile = mSession.getSummaryForAllUid(
                templateMobile, Long.MIN_VALUE, Long.MAX_VALUE, true);
        assertValues(statsMobile, IFACE_ALL, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
                DEFAULT_NETWORK_ALL, 3L, 4L, 5L, 5L, 0);
        assertValues(statsMobile, IFACE_ALL, UID_RED, SET_ALL, 0xF00D, METERED_ALL, ROAMING_ALL,
                DEFAULT_NETWORK_ALL, 5L, 4L, 1L, 4L, 0);

        // Verify the operation count is blamed onto the default network.
        // TODO: Blame onto the default network is not very reasonable. Consider blame onto the
        //  network that generates the traffic.
        final NetworkTemplate templateWifi = buildTemplateWifiWildcard();
        final NetworkStats statsWifi = mSession.getSummaryForAllUid(
                templateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
        assertValues(statsWifi, IFACE_ALL, UID_RED, SET_ALL, 0xF00D, METERED_ALL, ROAMING_ALL,
                DEFAULT_NETWORK_ALL, 0L, 0L, 0L, 0L, 2);
    }

    private static File getBaseDir(File statsDir) {
    private static File getBaseDir(File statsDir) {
        File baseDir = new File(statsDir, "netstats");
        File baseDir = new File(statsDir, "netstats");
        baseDir.mkdirs();
        baseDir.mkdirs();
@@ -1446,14 +1491,14 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest {
    }
    }


    private static NetworkState buildWifiState() {
    private static NetworkState buildWifiState() {
        return buildWifiState(false);
        return buildWifiState(false, TEST_IFACE);
    }
    }


    private static NetworkState buildWifiState(boolean isMetered) {
    private static NetworkState buildWifiState(boolean isMetered, @NonNull String iface) {
        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
        info.setDetailedState(DetailedState.CONNECTED, null, null);
        info.setDetailedState(DetailedState.CONNECTED, null, null);
        final LinkProperties prop = new LinkProperties();
        final LinkProperties prop = new LinkProperties();
        prop.setInterfaceName(TEST_IFACE);
        prop.setInterfaceName(iface);
        final NetworkCapabilities capabilities = new NetworkCapabilities();
        final NetworkCapabilities capabilities = new NetworkCapabilities();
        capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !isMetered);
        capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !isMetered);
        capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
        capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);