From f9888898e3d9b59b2c6a89b78b945ef009ed8bb4 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Mon, 7 Feb 2022 12:26:46 +0100 Subject: [PATCH] Add tests for deleteKernelTagData Test: atest NetworkStatsServiceTest Change-Id: I6db6b79314868271f877acf2a0b21699cbf02df5 --- .../server/net/NetworkStatsServiceTest.java | 86 +++++++++++++++++-- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java index 34bcf3f0fe..6e7472be23 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java @@ -65,6 +65,7 @@ import static com.android.net.module.util.NetworkStatsUtils.SUBSCRIBER_ID_MATCH_ import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; @@ -77,6 +78,7 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -108,6 +110,7 @@ import android.os.IBinder; import android.os.PowerManager; import android.os.SimpleClock; import android.provider.Settings; +import android.system.ErrnoException; import android.telephony.TelephonyManager; import androidx.annotation.Nullable; @@ -125,6 +128,7 @@ import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config; import com.android.testutils.DevSdkIgnoreRule; import com.android.testutils.DevSdkIgnoreRunner; import com.android.testutils.HandlerUtils; +import com.android.testutils.TestBpfMap; import com.android.testutils.TestableNetworkStatsProviderBinder; import libcore.testing.io.TestIoUtils; @@ -143,6 +147,7 @@ import java.time.Clock; import java.time.ZoneOffset; import java.util.Objects; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; /** * Tests for {@link NetworkStatsService}. @@ -197,11 +202,16 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { private HandlerThread mHandlerThread; @Mock private LocationPermissionChecker mLocationPermissionChecker; - private @Mock IBpfMap mUidCounterSetMap; - private @Mock IBpfMap mCookieTagMap; - private @Mock IBpfMap mStatsMapA; - private @Mock IBpfMap mStatsMapB; - private @Mock IBpfMap mAppUidStatsMap; + private TestBpfMap mUidCounterSetMap = spy(new TestBpfMap<>(U32.class, U8.class)); + + private TestBpfMap mCookieTagMap = new TestBpfMap<>( + CookieTagMapKey.class, CookieTagMapValue.class); + private TestBpfMap mStatsMapA = new TestBpfMap<>(StatsMapKey.class, + StatsMapValue.class); + private TestBpfMap mStatsMapB = new TestBpfMap<>(StatsMapKey.class, + StatsMapValue.class); + private TestBpfMap mAppUidStatsMap = new TestBpfMap<>( + UidStatsMapKey.class, StatsMapValue.class); private NetworkStatsService mService; private INetworkStatsSession mSession; @@ -1921,4 +1931,70 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { private void waitForIdle() { HandlerUtils.waitForIdle(mHandlerThread, WAIT_TIMEOUT); } + + private boolean cookieTagMapContainsUid(int uid) throws ErrnoException { + final AtomicBoolean found = new AtomicBoolean(); + mCookieTagMap.forEach((k, v) -> { + if (v.uid == uid) { + found.set(true); + } + }); + return found.get(); + } + + private static boolean statsMapContainsUid( + TestBpfMap map, int uid) throws ErrnoException { + final AtomicBoolean found = new AtomicBoolean(); + map.forEach((k, v) -> { + if (k.uid == uid) { + found.set(true); + } + }); + return found.get(); + } + + private void initBpfMapsWithTagData(int uid) throws ErrnoException { + // key needs to be unique, use some offset from uid. + mCookieTagMap.insertEntry(new CookieTagMapKey(1000 + uid), new CookieTagMapValue(uid, 1)); + mCookieTagMap.insertEntry(new CookieTagMapKey(2000 + uid), new CookieTagMapValue(uid, 2)); + + mStatsMapA.insertEntry(new StatsMapKey(uid, 1, 0, 10), new StatsMapValue(5, 5000, 3, 3000)); + mStatsMapA.insertEntry(new StatsMapKey(uid, 2, 0, 10), new StatsMapValue(5, 5000, 3, 3000)); + + mStatsMapB.insertEntry(new StatsMapKey(uid, 1, 0, 10), new StatsMapValue(0, 0, 0, 0)); + + mAppUidStatsMap.insertEntry(new UidStatsMapKey(uid), new StatsMapValue(10, 10000, 6, 6000)); + + mUidCounterSetMap.insertEntry(new U32(uid), new U8((short) 1)); + + assertTrue(cookieTagMapContainsUid(uid)); + assertTrue(statsMapContainsUid(mStatsMapA, uid)); + assertTrue(statsMapContainsUid(mStatsMapB, uid)); + assertTrue(mAppUidStatsMap.containsKey(new UidStatsMapKey(uid))); + assertTrue(mUidCounterSetMap.containsKey(new U32(uid))); + } + + @Test + public void testRemovingUidRemovesTagDataForUid() throws ErrnoException { + initBpfMapsWithTagData(UID_BLUE); + initBpfMapsWithTagData(UID_RED); + + final Intent intent = new Intent(ACTION_UID_REMOVED); + intent.putExtra(EXTRA_UID, UID_BLUE); + mServiceContext.sendBroadcast(intent); + + // assert that all UID_BLUE related tag data has been removed from the maps. + assertFalse(cookieTagMapContainsUid(UID_BLUE)); + assertFalse(statsMapContainsUid(mStatsMapA, UID_BLUE)); + assertFalse(statsMapContainsUid(mStatsMapB, UID_BLUE)); + assertFalse(mAppUidStatsMap.containsKey(new UidStatsMapKey(UID_BLUE))); + assertFalse(mUidCounterSetMap.containsKey(new U32(UID_BLUE))); + + // assert that UID_RED related tag data is still in the maps. + assertTrue(cookieTagMapContainsUid(UID_RED)); + assertTrue(statsMapContainsUid(mStatsMapA, UID_RED)); + assertTrue(statsMapContainsUid(mStatsMapB, UID_RED)); + assertTrue(mAppUidStatsMap.containsKey(new UidStatsMapKey(UID_RED))); + assertTrue(mUidCounterSetMap.containsKey(new U32(UID_RED))); + } }