Add manifest.hal.interface entry

that looks like follows:

<interface>
    <name>IBluetooth</name>
    <instance>legacy/0</instance>
    <instance>default</instance>
</interface>

If an entry doesn't exist it is default to "default" instance.

HalManfiest.getInstances and hasInstance is the API
to query these elements.

Test: libvintf_test
Bug: 35219444
Change-Id: Ic4402152c6d44c2c57c7ef1ba6ab6194ad7842f2
diff --git a/test/main.cpp b/test/main.cpp
index 32149e3..f3c7161 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -73,14 +73,21 @@
             .name = "android.hardware.camera",
             .versions = {Version(2, 0)},
             .impl = HalImplementation{ImplLevel::SOC, "msm8892"},
-            .transport = Transport::HWBINDER
+            .transport = Transport::HWBINDER,
+            .interfaces = {
+                {"ICamera", {"ICamera", {"legacy/0", "default"}}},
+                {"IBetterCamera", {"IBetterCamera", {"camera"}}}
+            }
         });
         vm.add(ManifestHal{
             .format = HalFormat::HIDL,
             .name = "android.hardware.nfc",
             .versions = {Version(1, 0)},
             .impl = HalImplementation{ImplLevel::GENERIC, "generic"},
-            .transport = Transport::PASSTHROUGH
+            .transport = Transport::PASSTHROUGH,
+            .interfaces = {
+                {"INfc", {"INfc", {"default"}}}
+            }
         });
 
         return vm;
@@ -131,16 +138,52 @@
         "        <transport>hwbinder</transport>\n"
         "        <impl level=\"soc\">msm8892</impl>\n"
         "        <version>2.0</version>\n"
+        "        <interface>\n"
+        "            <name>IBetterCamera</name>\n"
+        "            <instance>camera</instance>\n"
+        "        </interface>\n"
+        "        <interface>\n"
+        "            <name>ICamera</name>\n"
+        "            <instance>default</instance>\n"
+        "            <instance>legacy/0</instance>\n"
+        "        </interface>\n"
         "    </hal>\n"
         "    <hal format=\"hidl\">\n"
         "        <name>android.hardware.nfc</name>\n"
         "        <transport>passthrough</transport>\n"
         "        <impl level=\"generic\">generic</impl>\n"
         "        <version>1.0</version>\n"
+        "        <interface>\n"
+        "            <name>INfc</name>\n"
+        "            <instance>default</instance>\n"
+        "        </interface>\n"
         "    </hal>\n"
         "</manifest>\n");
 }
 
+TEST_F(LibVintfTest, HalManifestInstances) {
+    HalManifest vm = testHalManifest();
+    EXPECT_EQ(vm.getInstances("android.hardware.camera", "ICamera"),
+            std::set<std::string>({"default", "legacy/0"}));
+    EXPECT_EQ(vm.getInstances("android.hardware.camera", "IBetterCamera"),
+            std::set<std::string>({"camera"}));
+    EXPECT_EQ(vm.getInstances("android.hardware.camera", "INotExist"),
+            std::set<std::string>({"default"}));
+    EXPECT_EQ(vm.getInstances("android.hardware.nfc", "INfc"),
+            std::set<std::string>({"default"}));
+
+    EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "default"));
+    EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "ICamera", "legacy/0"));
+    EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "camera"));
+    EXPECT_TRUE(vm.hasInstance("android.hardware.camera", "INotExist", "default"));
+    EXPECT_TRUE(vm.hasInstance("android.hardware.nfc", "INfc", "default"));
+
+    EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "ICamera", "notexist"));
+    EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "IBetterCamera", "default"));
+    EXPECT_FALSE(vm.hasInstance("android.hardware.camera", "INotExist", "notexist"));
+    EXPECT_FALSE(vm.hasInstance("android.hardware.nfc", "INfc", "notexist"));
+}
+
 TEST_F(LibVintfTest, VersionConverter) {
     Version v(3, 6);
     std::string xml = gVersionConverter(v);