HalManifest check against CompatibilityMatrix
Add test for framework compatibility matrix check against
device hal manifest.
Bug: 36126928 VINTF: create tests for HalManifest::checkIncompatibility
Test: libvintf_test
Change-Id: I8ebf3a2891aa0f8f24c68930499047652309e36c
diff --git a/test/main.cpp b/test/main.cpp
index e6517b1..2cf7f45 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -71,6 +71,9 @@
const ManifestHal *getAnyHal(HalManifest &vm, const std::string &name) {
return vm.getAnyHal(name);
}
+ MatrixHal *getAnyHal(CompatibilityMatrix &cm, const std::string &name) {
+ return cm.getAnyHal(name);
+ }
ConstMultiMapValueIterable<std::string, ManifestHal> getHals(HalManifest &vm) {
return vm.getHals();
}
@@ -621,6 +624,114 @@
}
}
+TEST_F(LibVintfTest, Compat) {
+ std::string manifestXml =
+ "<manifest version=\"1.0\" type=\"device\">\n"
+ " <hal format=\"hidl\">\n"
+ " <name>android.hardware.camera</name>\n"
+ " <transport>hwbinder</transport>\n"
+ " <version>3.5</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>hwbinder</transport>\n"
+ " <version>1.0</version>\n"
+ " <version>2.0</version>\n"
+ " <interface>\n"
+ " <name>INfc</name>\n"
+ " <instance>nfc_nci</instance>\n"
+ " </interface>\n"
+ " </hal>\n"
+ " <hal format=\"hidl\">\n"
+ " <name>android.hardware.nfc</name>\n"
+ " <transport>hwbinder</transport>\n"
+ " <version>2.0</version>\n"
+ " <interface>\n"
+ " <name>INfc</name>\n"
+ " <instance>default</instance>\n"
+ " </interface>\n"
+ " </hal>\n"
+ " <sepolicy>\n"
+ " <version>25.5</version>\n"
+ " </sepolicy>\n"
+ "</manifest>\n";
+
+ std::string matrixXml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <hal format=\"hidl\" optional=\"false\">\n"
+ " <name>android.hardware.camera</name>\n"
+ " <version>2.0-5</version>\n"
+ " <version>3.4-16</version>\n"
+ " </hal>\n"
+ " <hal format=\"hidl\" optional=\"false\">\n"
+ " <name>android.hardware.nfc</name>\n"
+ " <version>1.0</version>\n"
+ " <version>2.0</version>\n"
+ " </hal>\n"
+ " <hal format=\"hidl\" optional=\"true\">\n"
+ " <name>android.hardware.foo</name>\n"
+ " <version>1.0</version>\n"
+ " </hal>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " <sepolicy-version>25.5</sepolicy-version>\n"
+ " <sepolicy-version>26.0-3</sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb>\n"
+ " <vbmeta-version>2.1</vbmeta-version>\n"
+ " </avb>\n"
+ "</compatibility-matrix>\n";
+
+ HalManifest manifest;
+ CompatibilityMatrix matrix;
+ std::string error;
+ EXPECT_TRUE(gHalManifestConverter(&manifest, manifestXml));
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
+ EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
+
+ // some smaller test cases
+ matrixXml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <hal format=\"hidl\" optional=\"false\">\n"
+ " <name>android.hardware.camera</name>\n"
+ " <version>3.4</version>\n"
+ " </hal>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " <sepolicy-version>25.5</sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+ matrix = {};
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
+ EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
+ MatrixHal *camera = getAnyHal(matrix, "android.hardware.camera");
+ EXPECT_NE(camera, nullptr);
+ camera->versionRanges[0] = {3, 5};
+ EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
+ camera->versionRanges[0] = {3, 6};
+ EXPECT_FALSE(manifest.checkCompatibility(matrix));
+
+ // reset it
+ matrix = {};
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&matrix, matrixXml));
+ set(matrix, Sepolicy{30, {{26, 0}}});
+ EXPECT_FALSE(manifest.checkCompatibility(matrix));
+ set(matrix, Sepolicy{30, {{25, 6}}});
+ EXPECT_FALSE(manifest.checkCompatibility(matrix));
+ set(matrix, Sepolicy{30, {{25, 4}}});
+ EXPECT_TRUE(manifest.checkCompatibility(matrix, &error)) << error;
+}
+
} // namespace vintf
} // namespace android