Add HalInterface to compatibility matrix

Test: libvintf_test
Test: vintf_object_test

Bug: 38395193
Change-Id: I6dfc21bbfb63b575558405e441f3926ff3813eb8
Merged-In: I6dfc21bbfb63b575558405e441f3926ff3813eb8
diff --git a/test/main.cpp b/test/main.cpp
index fce4d6d..9bdaead 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -84,6 +84,16 @@
     bool isValid(const ManifestHal &mh) {
         return mh.isValid();
     }
+
+    std::map<std::string, HalInterface> testHalInterfaces() {
+        HalInterface intf;
+        intf.name = "IFoo";
+        intf.instances.insert("default");
+        std::map<std::string, HalInterface> map;
+        map[intf.name] = intf;
+        return map;
+    }
+
     HalManifest testDeviceManifest() {
         HalManifest vm;
         vm.mType = SchemaType::DEVICE;
@@ -296,16 +306,32 @@
     EXPECT_EQ(v, v2);
 }
 
+static bool insert(std::map<std::string, HalInterface>* map, HalInterface&& intf) {
+    std::string name{intf.name};
+    return map->emplace(std::move(name), std::move(intf)).second;
+}
+
 TEST_F(LibVintfTest, MatrixHalConverter) {
     MatrixHal mh{HalFormat::NATIVE, "android.hardware.camera",
             {{VersionRange(1,2,3), VersionRange(4,5,6)}},
-            false /* optional */};
+            false /* optional */, {}};
+    EXPECT_TRUE(insert(&mh.interfaces, {"IBetterCamera", {"default", "great"}}));
+    EXPECT_TRUE(insert(&mh.interfaces, {"ICamera", {"default"}}));
     std::string xml = gMatrixHalConverter(mh);
     EXPECT_EQ(xml,
         "<hal format=\"native\" optional=\"false\">\n"
         "    <name>android.hardware.camera</name>\n"
         "    <version>1.2-3</version>\n"
         "    <version>4.5-6</version>\n"
+        "    <interface>\n"
+        "        <name>IBetterCamera</name>\n"
+        "        <instance>default</instance>\n"
+        "        <instance>great</instance>\n"
+        "    </interface>\n"
+        "    <interface>\n"
+        "        <name>ICamera</name>\n"
+        "        <instance>default</instance>\n"
+        "    </interface>\n"
         "</hal>\n");
     MatrixHal mh2;
     EXPECT_TRUE(gMatrixHalConverter(&mh2, xml));
@@ -396,14 +422,14 @@
             "<value type=\"int\">18446744073709551616</value>\n"));
 }
 
-TEST_F(LibVintfTest, CompatibilityMatrixCoverter) {
+TEST_F(LibVintfTest, CompatibilityMatrixConverter) {
     CompatibilityMatrix cm;
     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.camera",
             {{VersionRange(1,2,3), VersionRange(4,5,6)}},
-            false /* optional */}));
+            false /* optional */, testHalInterfaces()}));
     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hardware.nfc",
             {{VersionRange(4,5,6), VersionRange(10,11,12)}},
-            true /* optional */}));
+            true /* optional */, testHalInterfaces()}));
     EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(3, 18, 22),
             {KernelConfig{"CONFIG_FOO", Tristate::YES}, KernelConfig{"CONFIG_BAR", "stringvalue"}}}));
     EXPECT_TRUE(add(cm, MatrixKernel{KernelVersion(4, 4, 1),
@@ -417,11 +443,19 @@
             "        <name>android.hardware.camera</name>\n"
             "        <version>1.2-3</version>\n"
             "        <version>4.5-6</version>\n"
+            "        <interface>\n"
+            "            <name>IFoo</name>\n"
+            "            <instance>default</instance>\n"
+            "        </interface>\n"
             "    </hal>\n"
             "    <hal format=\"native\" optional=\"true\">\n"
             "        <name>android.hardware.nfc</name>\n"
             "        <version>4.5-6</version>\n"
             "        <version>10.11-12</version>\n"
+            "        <interface>\n"
+            "            <name>IFoo</name>\n"
+            "            <instance>default</instance>\n"
+            "        </interface>\n"
             "    </hal>\n"
             "    <kernel version=\"3.18.22\">\n"
             "        <config>\n"
@@ -461,7 +495,7 @@
     CompatibilityMatrix cm;
     EXPECT_TRUE(add(cm, MatrixHal{HalFormat::NATIVE, "android.hidl.manager",
             {{VersionRange(1,0)}},
-            false /* optional */}));
+            false /* optional */, testHalInterfaces()}));
     set(cm, SchemaType::DEVICE);
     set(cm, VndkVersionRange{25,0,1,5}, {"libjpeg.so", "libbase.so"});
     std::string xml = gCompatibilityMatrixConverter(cm);
@@ -470,6 +504,10 @@
         "    <hal format=\"native\" optional=\"false\">\n"
         "        <name>android.hidl.manager</name>\n"
         "        <version>1.0</version>\n"
+        "        <interface>\n"
+        "            <name>IFoo</name>\n"
+        "            <instance>default</instance>\n"
+        "        </interface>\n"
         "    </hal>\n"
         "    <vndk>\n"
         "        <version>25.0.1-5</version>\n"