Fix the unit test for stats swap

after merging uid stats map and tagStatsMap to one map and implementing
the stats swap mechanism. The trafficController unit test needs to be
slighty modified to correctly reflect the behavior change of
trafficController. Also, dup the fake map fd for mock controller so
the fake map object and the mock controller map object no longer share
the same fd underneath. It fixes the double close problem in the
unit test.

Bug: 130280727
Test: netd_unit_test
Change-Id: I5534d2fd783da3b38d26359c9d62b2427a1725da
diff --git a/server/TrafficControllerTest.cpp b/server/TrafficControllerTest.cpp
index 258d53d..e2a1327 100644
--- a/server/TrafficControllerTest.cpp
+++ b/server/TrafficControllerTest.cpp
@@ -55,6 +55,8 @@
 constexpr uint32_t TEST_COUNTERSET = 1;
 constexpr uint32_t DEFAULT_COUNTERSET = 0;
 
+#define ASSERT_VALID(x) ASSERT_TRUE((x).isValid())
+
 class TrafficControllerTest : public ::testing::Test {
   protected:
     TrafficControllerTest() {}
@@ -62,8 +64,7 @@
     BpfMap<uint64_t, UidTag> mFakeCookieTagMap;
     BpfMap<uint32_t, uint8_t> mFakeUidCounterSetMap;
     BpfMap<uint32_t, StatsValue> mFakeAppUidStatsMap;
-    BpfMap<StatsKey, StatsValue> mFakeUidStatsMap;
-    BpfMap<StatsKey, StatsValue> mFakeTagStatsMap;
+    BpfMap<StatsKey, StatsValue> mFakeStatsMapA;
     BpfMap<uint32_t, uint8_t> mFakeConfigurationMap;
     BpfMap<uint32_t, UidOwnerValue> mFakeUidOwnerMap;
     BpfMap<uint32_t, uint8_t> mFakeUidPermissionMap;
@@ -75,48 +76,56 @@
 
         mFakeCookieTagMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(uint64_t),
                                           sizeof(struct UidTag), TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeCookieTagMap.isValid());
+        ASSERT_VALID(mFakeCookieTagMap);
 
         mFakeUidCounterSetMap.reset(
             createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeUidCounterSetMap.isValid());
+        ASSERT_VALID(mFakeUidCounterSetMap);
 
         mFakeAppUidStatsMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t),
                                             sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeAppUidStatsMap.isValid());
+        ASSERT_VALID(mFakeAppUidStatsMap);
 
-        mFakeUidStatsMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey),
-                                         sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeUidStatsMap.isValid());
-
-        mFakeTagStatsMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey),
-                                         sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeTagStatsMap.isValid());
+        mFakeStatsMapA.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(struct StatsKey),
+                                       sizeof(struct StatsValue), TEST_MAP_SIZE, 0));
+        ASSERT_VALID(mFakeStatsMapA);
 
         mFakeConfigurationMap.reset(
                 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), 1, 0));
-        ASSERT_TRUE(mFakeConfigurationMap.isValid());
+        ASSERT_VALID(mFakeConfigurationMap);
 
         mFakeUidOwnerMap.reset(createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(UidOwnerValue),
                                          TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeUidOwnerMap.isValid());
+        ASSERT_VALID(mFakeUidOwnerMap);
         mFakeUidPermissionMap.reset(
                 createMap(BPF_MAP_TYPE_HASH, sizeof(uint32_t), sizeof(uint8_t), TEST_MAP_SIZE, 0));
-        ASSERT_TRUE(mFakeUidPermissionMap.isValid());
+        ASSERT_VALID(mFakeUidPermissionMap);
 
-        mTc.mCookieTagMap.reset(mFakeCookieTagMap.getMap());
-        mTc.mUidCounterSetMap.reset(mFakeUidCounterSetMap.getMap());
-        mTc.mAppUidStatsMap.reset(mFakeAppUidStatsMap.getMap());
-        mTc.mStatsMapA.reset(mFakeUidStatsMap.getMap());
-        mTc.mStatsMapB.reset(mFakeTagStatsMap.getMap());
-        mTc.mConfigurationMap.reset(mFakeConfigurationMap.getMap());
-        ASSERT_TRUE(isOk(mFakeConfigurationMap.writeValue(CURRENT_STATS_MAP_CONFIGURATION_KEY,
+        mTc.mCookieTagMap.reset(dupFd(mFakeCookieTagMap.getMap()));
+        ASSERT_VALID(mTc.mCookieTagMap);
+        mTc.mUidCounterSetMap.reset(dupFd(mFakeUidCounterSetMap.getMap()));
+        ASSERT_VALID(mTc.mUidCounterSetMap);
+        mTc.mAppUidStatsMap.reset(dupFd(mFakeAppUidStatsMap.getMap()));
+        ASSERT_VALID(mTc.mAppUidStatsMap);
+        mTc.mStatsMapA.reset(dupFd(mFakeStatsMapA.getMap()));
+        ASSERT_VALID(mTc.mStatsMapA);
+        mTc.mConfigurationMap.reset(dupFd(mFakeConfigurationMap.getMap()));
+        ASSERT_VALID(mTc.mConfigurationMap);
+
+        // Always write to stats map A by default.
+        ASSERT_TRUE(isOk(mTc.mConfigurationMap.writeValue(CURRENT_STATS_MAP_CONFIGURATION_KEY,
                                                           SELECT_MAP_A, BPF_ANY)));
-        mTc.mUidOwnerMap.reset(mFakeUidOwnerMap.getMap());
-        mTc.mUidPermissionMap.reset(mFakeUidPermissionMap.getMap());
+        mTc.mUidOwnerMap.reset(dupFd(mFakeUidOwnerMap.getMap()));
+        ASSERT_VALID(mTc.mUidOwnerMap);
+        mTc.mUidPermissionMap.reset(dupFd(mFakeUidPermissionMap.getMap()));
+        ASSERT_VALID(mTc.mUidPermissionMap);
         mTc.mPrivilegedUser.clear();
     }
 
+    int dupFd(const android::base::unique_fd& mapFd) {
+        return fcntl(mapFd.get(), F_DUPFD_CLOEXEC, 0);
+    }
+
     int setUpSocketAndTag(int protocol, uint64_t* cookie, uint32_t tag, uid_t uid,
                           uid_t callingUid) {
         int sock = socket(protocol, SOCK_STREAM | SOCK_CLOEXEC, 0);
@@ -143,9 +152,9 @@
         StatsValue statsMapValue = {.rxPackets = 1, .rxBytes = 100};
         uint8_t counterSet = TEST_COUNTERSET;
         EXPECT_TRUE(isOk(mFakeUidCounterSetMap.writeValue(uid, counterSet, BPF_ANY)));
-        EXPECT_TRUE(isOk(mFakeTagStatsMap.writeValue(*key, statsMapValue, BPF_ANY)));
+        EXPECT_TRUE(isOk(mFakeStatsMapA.writeValue(*key, statsMapValue, BPF_ANY)));
         key->tag = 0;
-        EXPECT_TRUE(isOk(mFakeUidStatsMap.writeValue(*key, statsMapValue, BPF_ANY)));
+        EXPECT_TRUE(isOk(mFakeStatsMapA.writeValue(*key, statsMapValue, BPF_ANY)));
         EXPECT_TRUE(isOk(mFakeAppUidStatsMap.writeValue(uid, statsMapValue, BPF_ANY)));
         // put tag information back to statsKey
         key->tag = tag;
@@ -267,12 +276,12 @@
         StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid);
         EXPECT_TRUE(isOk(counterSetResult));
         EXPECT_EQ(TEST_COUNTERSET, counterSetResult.value());
-        StatusOr<StatsValue> statsMapResult = mFakeTagStatsMap.readValue(tagStatsMapKey);
+        StatusOr<StatsValue> statsMapResult = mFakeStatsMapA.readValue(tagStatsMapKey);
         EXPECT_TRUE(isOk(statsMapResult));
         EXPECT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
         EXPECT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
         tagStatsMapKey.tag = 0;
-        statsMapResult = mFakeUidStatsMap.readValue(tagStatsMapKey);
+        statsMapResult = mFakeStatsMapA.readValue(tagStatsMapKey);
         EXPECT_TRUE(isOk(statsMapResult));
         EXPECT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
         EXPECT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
@@ -440,9 +449,9 @@
     StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid);
     ASSERT_TRUE(isOk(counterSetResult));
     ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
-    ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey)));
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey)));
     tagStatsMapKey.tag = 0;
-    StatusOr<StatsValue> statsMapResult = mFakeUidStatsMap.readValue(tagStatsMapKey);
+    StatusOr<StatsValue> statsMapResult = mFakeStatsMapA.readValue(tagStatsMapKey);
     ASSERT_TRUE(isOk(statsMapResult));
     ASSERT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
     ASSERT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
@@ -465,9 +474,9 @@
     ASSERT_EQ(0, mTc.deleteTagData(0, TEST_UID, callingUid));
     ASSERT_FALSE(isOk(mFakeCookieTagMap.readValue(cookie)));
     ASSERT_FALSE(isOk(mFakeUidCounterSetMap.readValue(uid)));
-    ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey)));
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey)));
     tagStatsMapKey.tag = 0;
-    ASSERT_FALSE(isOk(mFakeUidStatsMap.readValue(tagStatsMapKey)));
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey)));
     ASSERT_FALSE(isOk(mFakeAppUidStatsMap.readValue(TEST_UID)));
 }
 
@@ -494,8 +503,8 @@
     StatusOr<uint8_t> counterSetResult = mFakeUidCounterSetMap.readValue(uid);
     ASSERT_TRUE(isOk(counterSetResult));
     ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
-    ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey1)));
-    StatusOr<StatsValue> statsMapResult = mFakeTagStatsMap.readValue(tagStatsMapKey2);
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey1)));
+    StatusOr<StatsValue> statsMapResult = mFakeStatsMapA.readValue(tagStatsMapKey2);
     ASSERT_TRUE(isOk(statsMapResult));
     ASSERT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
     ASSERT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
@@ -524,12 +533,12 @@
     ASSERT_TRUE(isOk(counterSetResult));
     ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
     ASSERT_FALSE(isOk(mFakeUidCounterSetMap.readValue(uid2)));
-    ASSERT_FALSE(isOk(mFakeTagStatsMap.readValue(tagStatsMapKey2)));
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey2)));
     tagStatsMapKey2.tag = 0;
-    ASSERT_FALSE(isOk(mFakeUidStatsMap.readValue(tagStatsMapKey2)));
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey2)));
     ASSERT_FALSE(isOk(mFakeAppUidStatsMap.readValue(uid2)));
     tagStatsMapKey1.tag = 0;
-    StatusOr<StatsValue> statsMapResult = mFakeUidStatsMap.readValue(tagStatsMapKey1);
+    StatusOr<StatsValue> statsMapResult = mFakeStatsMapA.readValue(tagStatsMapKey1);
     ASSERT_TRUE(isOk(statsMapResult));
     ASSERT_EQ((uint64_t)1, statsMapResult.value().rxPackets);
     ASSERT_EQ((uint64_t)100, statsMapResult.value().rxBytes);
@@ -540,7 +549,7 @@
 
     // Delete the stats of the other uid.
     ASSERT_EQ(0, mTc.deleteTagData(0, uid1, callingUid));
-    ASSERT_FALSE(isOk(mFakeUidStatsMap.readValue(tagStatsMapKey1)));
+    ASSERT_FALSE(isOk(mFakeStatsMapA.readValue(tagStatsMapKey1)));
     ASSERT_FALSE(isOk(mFakeAppUidStatsMap.readValue(uid1)));
 }