Implement FCM Version in matrices / manifests.

"level" is an attribute on compatibility matrices / manifests
to specify the FCM Version they declare / implement. Value can
be "legacy" or a positive number, or empty (for old files).

Test: libvintf_test
Test: Built manifests / matrices has not changed (because
      value is "unspecified").

Bug: 69854976 device manfiest must specify FCM Version
Bug: 69636193 all matrices should be installed to system image
Bug: 64720381 deprecation schedule

Change-Id: I15d34343fae4ad79d86bd50e9de8c4f6ac09fdfd
Merged-In: I15d34343fae4ad79d86bd50e9de8c4f6ac09fdfd
diff --git a/test/main.cpp b/test/main.cpp
index 8ec02a8..b8a25a2 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -2047,6 +2047,43 @@
 
 INSTANTIATE_TEST_CASE_P(KernelConfigParser, KernelConfigParserInvalidTest, ::testing::Bool());
 
+TEST_F(LibVintfTest, MatrixLevel) {
+    CompatibilityMatrix cm;
+    std::string xml;
+
+    xml = "<compatibility-matrix version=\"1.0\" type=\"framework\"/>";
+    EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+        << gCompatibilityMatrixConverter.lastError();
+    EXPECT_EQ(Level::UNSPECIFIED, cm.level());
+
+    xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"legacy\"/>";
+    EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+        << gCompatibilityMatrixConverter.lastError();
+    EXPECT_EQ(Level::LEGACY, cm.level());
+
+    xml = "<compatibility-matrix version=\"1.0\" type=\"framework\" level=\"1\"/>";
+    EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+        << gCompatibilityMatrixConverter.lastError();
+    EXPECT_EQ(1u, cm.level());
+}
+
+TEST_F(LibVintfTest, ManifestLevel) {
+    HalManifest manifest;
+    std::string xml;
+
+    xml = "<manifest version=\"1.0\" type=\"device\"/>";
+    EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
+    EXPECT_EQ(Level::UNSPECIFIED, manifest.level());
+
+    xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"legacy\"/>";
+    EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
+    EXPECT_EQ(Level::LEGACY, manifest.level());
+
+    xml = "<manifest version=\"1.0\" type=\"device\" target-level=\"1\"/>";
+    EXPECT_TRUE(gHalManifestConverter(&manifest, xml)) << gHalManifestConverter.lastError();
+    EXPECT_EQ(1u, manifest.level());
+}
+
 } // namespace vintf
 } // namespace android