Add device/fwk compatibility matrix to VintfObject.

For framework compatibility matrix, <sepolicy> sections
is injected in build time.

Test: libvintf_test
Test: adb shell vintf; matrices exist, compatible = true
Bug: 37321309
Bug: 36814503
Change-Id: I997b93456a261f0cdb85997ae88f4ac5a5f36ff3
Merged-In: I997b93456a261f0cdb85997ae88f4ac5a5f36ff3
diff --git a/main.cpp b/main.cpp
index 25a8cc6..0437a64 100644
--- a/main.cpp
+++ b/main.cpp
@@ -19,18 +19,59 @@
 #include <vintf/parse_string.h>
 #include <vintf/VintfObject.h>
 
+// A convenience binary to dump information available through libvintf.
 int main(int, char **) {
     using namespace ::android::vintf;
 
+    std::cout << "======== Device HAL Manifest =========" << std::endl;
+
     const HalManifest *vm = VintfObject::GetDeviceHalManifest();
     if (vm != nullptr)
         std::cout << gHalManifestConverter(*vm);
 
+    std::cout << "======== Framework HAL Manifest =========" << std::endl;
+
     const HalManifest *fm = VintfObject::GetFrameworkHalManifest();
     if (fm != nullptr)
         std::cout << gHalManifestConverter(*fm);
 
-    std::cout << std::endl;
+    std::cout << "======== Device Compatibility Matrix =========" << std::endl;
+
+    const CompatibilityMatrix *vcm = VintfObject::GetDeviceCompatibilityMatrix();
+    if (vcm != nullptr)
+        std::cout << gCompatibilityMatrixConverter(*vcm);
+
+    std::cout << "======== Framework Compatibility Matrix =========" << std::endl;
+
+    const CompatibilityMatrix *fcm = VintfObject::GetFrameworkCompatibilityMatrix();
+    if (fcm != nullptr)
+        std::cout << gCompatibilityMatrixConverter(*fcm);
+
+    std::cout << "======== Compatibility check =========" << std::endl;
+    std::cout << "Device HAL Manifest? " << (vm != nullptr) << std::endl
+              << "Device Compatibility Matrix? " << (vcm != nullptr) << std::endl
+              << "Framework HAL Manifest? " << (fm != nullptr) << std::endl
+              << "Framework Compatibility Matrix? " << (fcm != nullptr) << std::endl;
+    std::string error;
+    if (vm && fcm) {
+        bool compatible = vm->checkCompatibility(*fcm, &error);
+        std::cout << "Device HAL Manifest <==> Framework Compatibility Matrix? "
+                  << compatible;
+        if (!compatible)
+            std::cout << ", " << error;
+        std::cout << std::endl;
+    }
+    if (fm && vcm) {
+        bool compatible = fm->checkCompatibility(*vcm, &error);
+        std::cout << "Framework HAL Manifest <==> Device Compatibility Matrix? "
+                  << compatible;
+        if (!compatible)
+            std::cout << ", " << error;
+        std::cout << std::endl;
+    }
+
+    std::cout << "======== Runtime Info =========" << std::endl;
+
     const RuntimeInfo *ki = VintfObject::GetRuntimeInfo();
     if (ki != nullptr)
         std::cout << dump(*ki);