fmq_unit_tests: Detect leaked FDs more efficiently am: 8676f1dbd6

Original change: https://android-review.googlesource.com/c/platform/system/libfmq/+/3108669

Change-Id: Ie01aedc09d0640caaf897b917fa2a114ff6f8148
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/tests/fmq_unit_tests.cpp b/tests/fmq_unit_tests.cpp
index 622fcfb..7abe74d 100644
--- a/tests/fmq_unit_tests.cpp
+++ b/tests/fmq_unit_tests.cpp
@@ -25,6 +25,7 @@
 #include <sys/resource.h>
 #include <atomic>
 #include <cstdlib>
+#include <filesystem>
 #include <sstream>
 #include <thread>
 
@@ -374,20 +375,26 @@
     close(ashmemFd);
 }
 
-// If this test fails and we do leak FDs, the next test will cause a crash
+long numFds() {
+    return std::distance(std::filesystem::directory_iterator("/proc/self/fd"),
+                         std::filesystem::directory_iterator{});
+}
+
 TEST_F(AidlOnlyBadQueueConfig, LookForLeakedFds) {
+    // create/destroy a large number of queues that if we were leaking FDs
+    // we could detect it by looking at the number of FDs opened by the this
+    // test process.
+    constexpr uint32_t kNumQueues = 100;
     const size_t kPageSize = getpagesize();
     size_t numElementsInQueue = SIZE_MAX / sizeof(uint32_t) - kPageSize - 1;
-    struct rlimit rlim;
-    ASSERT_EQ(getrlimit(RLIMIT_NOFILE, &rlim), 0);
-    for (int i = 0; i <= rlim.rlim_cur + 1; i++) {
+    long numFdsBefore = numFds();
+    for (int i = 0; i < kNumQueues; i++) {
         android::AidlMessageQueue<uint32_t, SynchronizedReadWrite> fmq(numElementsInQueue);
         ASSERT_FALSE(fmq.isValid());
     }
-    // try to get another FD
-    int fd = ashmem_create_region("test", 100);
-    ASSERT_NE(fd, -1);
-    close(fd);
+    long numFdsAfter = numFds();
+    EXPECT_LT(numFdsAfter, kNumQueues);
+    EXPECT_EQ(numFdsAfter, numFdsBefore);
 }
 
 TEST_F(Hidl2AidlOperation, ConvertDescriptorsSync) {