vts_treble_no_hidl check vintf instead of hwservicemanager

hwservicemanager only gives us a list of registered HAL services. This
does not account for lazy HAL services.

We now check libvintf to see which HIDL HAL services are declared on the
device which will also count the lazy HAL services.

Test: atest vts_treble_no_hidl
Bug: 330505311
Bug: 330554480
Change-Id: Ibce039214db4ee1c664b4b015c95cdfe720ded4a
diff --git a/treble/vintf/VtsNoHidl.cpp b/treble/vintf/VtsNoHidl.cpp
index 9cb2a0a..128ff51 100644
--- a/treble/vintf/VtsNoHidl.cpp
+++ b/treble/vintf/VtsNoHidl.cpp
@@ -19,6 +19,7 @@
 #include <android/hidl/manager/1.0/IServiceManager.h>
 #include <gmock/gmock.h>
 #include <hidl/ServiceManagement.h>
+#include <vintf/VintfObject.h>
 
 #define __ANDROID_VENDOR_API_24Q2__ 202404
 
@@ -36,6 +37,20 @@
 // 14 and later.
 class VintfNoHidlTest : public ::testing::Test {};
 
+static std::set<std::string> allHidlManifestInterfaces() {
+  std::set<std::string> ret;
+  auto setInserter = [&](const vintf::ManifestInstance& i) -> bool {
+    if (i.format() != vintf::HalFormat::HIDL) {
+      return true;
+    }
+    ret.insert(i.getFqInstance().getFqNameString());
+    return true;
+  };
+  vintf::VintfObject::GetDeviceHalManifest()->forEachInstance(setInserter);
+  vintf::VintfObject::GetFrameworkHalManifest()->forEachInstance(setInserter);
+  return ret;
+}
+
 // @VsrTest = VSR-3.2-001.001|VSR-3.2-001.002
 TEST_F(VintfNoHidlTest, NoHidl) {
   int apiLevel = android::base::GetIntProperty("ro.vendor.api_level", 0);
@@ -44,43 +59,43 @@
     return;
   }
   int maxNumberOfHidlHals = 0;
+  std::set<std::string> halInterfaces;
   if (apiLevel == __ANDROID_API_U__) {
     maxNumberOfHidlHals = kMaxNumberOfHidlHalsU;
+    sp<hidl::manager::V1_0::IServiceManager> sm =
+        ::android::hardware::defaultServiceManager();
+    ASSERT_NE(sm, nullptr);
+    hardware::Return<void> ret =
+        sm->list([&halInterfaces](const auto& interfaces) {
+          for (const auto& interface : interfaces) {
+            std::vector<std::string> splitInterface =
+                android::base::Split(interface, "@");
+            ASSERT_GE(splitInterface.size(), 1);
+            // We only care about packages, since HIDL HALs typically need to
+            // include all of the older minor versions as well as the version
+            // they are implementing and we don't want to count those
+            halInterfaces.insert(splitInterface[0]);
+          }
+        });
   } else if (apiLevel == __ANDROID_VENDOR_API_24Q2__) {
     maxNumberOfHidlHals = kMaxNumberOfHidlHalsV;
+    halInterfaces = allHidlManifestInterfaces();
   } else {
     // TODO(232439834) We can remove this once kMaxNumberOfHidlHalsV is 0.
     GTEST_FAIL() << "Unexpected Android vendor API level (" << apiLevel
                  << "). Must be either " << __ANDROID_API_U__ << " or "
                  << __ANDROID_VENDOR_API_24Q2__;
   }
-  sp<hidl::manager::V1_0::IServiceManager> sm =
-      ::android::hardware::defaultServiceManager();
-  ASSERT_NE(sm, nullptr);
-  hardware::Return<void> ret = sm->list([&maxNumberOfHidlHals](
-                                            const auto& interfaces) {
-    std::set<std::string> packages;
-    for (const auto& interface : interfaces) {
-      std::vector<std::string> splitInterface =
-          android::base::Split(interface, "@");
-      ASSERT_GE(splitInterface.size(), 1);
-      // We only care about packages, since HIDL HALs typically need to
-      // include all of the older minor versions as well as the version they
-      // are implementing
-      packages.insert(splitInterface[0]);
+  if (halInterfaces.size() > maxNumberOfHidlHals) {
+    ADD_FAILURE() << "There are " << halInterfaces.size()
+                  << " HIDL interfaces served on the device. "
+                  << "These must be converted to AIDL as part of HIDL's "
+                     "deprecation processes.";
+    for (const auto& interface : halInterfaces) {
+      ADD_FAILURE() << interface << " registered as a HIDL interface "
+                    << "but must be in AIDL";
     }
-    if (packages.size() > maxNumberOfHidlHals) {
-      ADD_FAILURE() << "There are " << packages.size()
-                    << " HIDL interfaces served on the device. "
-                    << "These must be converted to AIDL as part of HIDL's "
-                       "deprecation processes.";
-      for (const auto& package : packages) {
-        ADD_FAILURE() << package << " registered as a HIDL interface "
-                      << "but must be in AIDL";
-      }
-    }
-  });
-  ASSERT_TRUE(ret.isOk());
+  }
 }
 
 }  // namespace testing