From ddecb662463020661858f3219d405dce1dd116eb Mon Sep 17 00:00:00 2001 From: Junyu Lai Date: Tue, 17 Aug 2021 08:44:36 +0000 Subject: [PATCH] Include suspended network when getAllNetworkStateSnapshots Suspended network should be considered as temporary shortage of connectivity of a connected network. Thus, it should not be excluded from network state snapshots and causes data usage to stop accounting or iptables rules to be removed on the interface of the suspended network. This change also address the naming confusion of default networks parameter of expectNotifyNetworkStatus. Test: atest ConnectivityServiceTest#testGetAllNetworkStateSnapshots Bug: 196079981 Change-Id: I8096356f9a472fb1c1246fbdf3fd5f981387fb1c --- .../android/server/ConnectivityService.java | 4 +-- .../server/ConnectivityServiceTest.java | 31 +++++++++++-------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 47bde72f5a..ec890a5fa1 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -2311,9 +2311,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final ArrayList result = new ArrayList<>(); for (Network network : getAllNetworks()) { final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); - // TODO: Consider include SUSPENDED networks, which should be considered as - // temporary shortage of connectivity of a connected network. - if (nai != null && nai.networkInfo.isConnected()) { + if (nai != null && nai.everConnected) { // TODO (b/73321673) : NetworkStateSnapshot contains a copy of the // NetworkCapabilities, which may contain UIDs of apps to which the // network applies. Should the UIDs be cleared so as not to leak or diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 2370b8d6ce..6fbfefdab8 100644 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -6106,16 +6106,16 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(networkCallback); } - private void expectNotifyNetworkStatus(List networks, String defaultIface, + private void expectNotifyNetworkStatus(List defaultNetworks, String defaultIface, Integer vpnUid, String vpnIfname, List underlyingIfaces) throws Exception { - ArgumentCaptor> networksCaptor = ArgumentCaptor.forClass(List.class); + ArgumentCaptor> defaultNetworksCaptor = ArgumentCaptor.forClass(List.class); ArgumentCaptor> vpnInfosCaptor = ArgumentCaptor.forClass(List.class); - verify(mStatsManager, atLeastOnce()).notifyNetworkStatus(networksCaptor.capture(), + verify(mStatsManager, atLeastOnce()).notifyNetworkStatus(defaultNetworksCaptor.capture(), any(List.class), eq(defaultIface), vpnInfosCaptor.capture()); - assertSameElements(networks, networksCaptor.getValue()); + assertSameElements(defaultNetworks, defaultNetworksCaptor.getValue()); List infos = vpnInfosCaptor.getValue(); if (vpnUid != null) { @@ -6131,8 +6131,8 @@ public class ConnectivityServiceTest { } private void expectNotifyNetworkStatus( - List networks, String defaultIface) throws Exception { - expectNotifyNetworkStatus(networks, defaultIface, null, null, List.of()); + List defaultNetworks, String defaultIface) throws Exception { + expectNotifyNetworkStatus(defaultNetworks, defaultIface, null, null, List.of()); } @Test @@ -12840,21 +12840,26 @@ public class ConnectivityServiceTest { assertLength(2, snapshots); assertContainsAll(snapshots, cellSnapshot, wifiSnapshot); - // Set cellular as suspended, verify the snapshots will not contain suspended networks. - // TODO: Consider include SUSPENDED networks, which should be considered as - // temporary shortage of connectivity of a connected network. + // Set cellular as suspended, verify the snapshots will contain suspended networks. mCellNetworkAgent.suspend(); waitForIdle(); + final NetworkCapabilities cellSuspendedNc = + mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()); + assertFalse(cellSuspendedNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + final NetworkStateSnapshot cellSuspendedSnapshot = new NetworkStateSnapshot( + mCellNetworkAgent.getNetwork(), cellSuspendedNc, cellLp, + null, ConnectivityManager.TYPE_MOBILE); snapshots = mCm.getAllNetworkStateSnapshots(); - assertLength(1, snapshots); - assertEquals(wifiSnapshot, snapshots.get(0)); + assertLength(2, snapshots); + assertContainsAll(snapshots, cellSuspendedSnapshot, wifiSnapshot); - // Disconnect wifi, verify the snapshots contain nothing. + // Disconnect wifi, verify the snapshots contain only cellular. mWiFiNetworkAgent.disconnect(); waitForIdle(); snapshots = mCm.getAllNetworkStateSnapshots(); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - assertLength(0, snapshots); + assertLength(1, snapshots); + assertEquals(cellSuspendedSnapshot, snapshots.get(0)); mCellNetworkAgent.resume(); waitForIdle();