Add tests for kernel config fragments in fwk comp mat.
Test: libvintf_test
Bug: 64124223
Change-Id: I04f3332c84ec9e9c025079f6f83e2573dab27a81
Merged-In: I04f3332c84ec9e9c025079f6f83e2573dab27a81
diff --git a/test/main.cpp b/test/main.cpp
index d8cfaf3..94a4d8e 100644
--- a/test/main.cpp
+++ b/test/main.cpp
@@ -100,6 +100,7 @@
bool isValid(const ManifestHal &mh) {
return mh.isValid();
}
+ std::vector<MatrixKernel>& getKernels(CompatibilityMatrix& cm) { return cm.framework.mKernels; }
std::map<std::string, HalInterface> testHalInterfaces() {
HalInterface intf;
@@ -709,6 +710,12 @@
}
{
+ MatrixKernel kernel(KernelVersion{3, 18, 60}, KernelConfigs(configs));
+ CompatibilityMatrix cm = testMatrix(std::move(kernel));
+ EXPECT_FALSE(ki.checkCompatibility(cm)) << "Kernel version shouldn't match";
+ }
+
+ {
MatrixKernel kernel(KernelVersion{3, 18, 22}, KernelConfigs(configs));
CompatibilityMatrix cm = testMatrix(std::move(kernel));
EXPECT_TRUE(ki.checkCompatibility(cm, &error)) << error;
@@ -1534,6 +1541,366 @@
#endif // LIBVINTF_HOST
}
+TEST_F(LibVintfTest, KernelConfigConditionTest) {
+ std::string xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARM</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_FOO</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " <sepolicy-version>25.0</sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb>\n"
+ " <vbmeta-version>2.1</vbmeta-version>\n"
+ " </avb>\n"
+ "</compatibility-matrix>\n";
+
+ CompatibilityMatrix cm;
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ const auto& kernels = getKernels(cm);
+ ASSERT_GE(kernels.size(), 2u);
+ ASSERT_TRUE(kernels[0].conditions().empty());
+ const auto& kernel = kernels[1];
+ const auto& cond = kernel.conditions();
+ ASSERT_FALSE(cond.empty());
+ EXPECT_EQ("CONFIG_ARM", cond.begin()->first);
+ EXPECT_EQ(KernelConfigTypedValue(Tristate::YES), cond.begin()->second);
+ EXPECT_FALSE(kernel.configs().empty());
+
+ EXPECT_EQ(xml, gCompatibilityMatrixConverter(cm));
+}
+
+TEST_F(LibVintfTest, KernelConfigConditionEmptyTest) {
+ std::string xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"4.4.0\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARM</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " </kernel>\n"
+ "</compatibility-matrix>\n";
+
+ CompatibilityMatrix cm;
+ EXPECT_FALSE(gCompatibilityMatrixConverter(&cm, xml))
+ << "Should not accept first kernel version with non-empty conditions";
+ EXPECT_EQ(
+ "First <kernel> for version 3.18 must have empty <conditions> "
+ "for backwards compatibility.",
+ gCompatibilityMatrixConverter.lastError());
+}
+
+TEST_F(LibVintfTest, KernelConfigConditionMatch) {
+ RuntimeInfo runtime = testRuntimeInfo();
+ std::string error;
+ std::string xml;
+ CompatibilityMatrix cm;
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">24</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">26</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
+ << "conditions met, so CONFIG_ARCH_MMAP_RND_BITS should not match";
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">n</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">26</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">24</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
+ " <value type=\"int\">0xdead000000000000</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_TRUE(runtime.checkCompatibility(cm, &error));
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">24</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
+ " <value type=\"int\">0xbeaf000000000000</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_FALSE(runtime.checkCompatibility(cm, &error))
+ << "conditions have 'and' relationship, so CONFIG_ILLEGAL_POINTER_VALUE should not match";
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\"/>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">26</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
+ " <value type=\"int\">0xbeaf000000000000</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <config>\n"
+ " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
+ " <value type=\"string\"/>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
+ " <value type=\"int\">0xdead000000000000</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">24</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
+ " <value type=\"string\">binder,hwbinder</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_TRUE(runtime.checkCompatibility(cm, &error)) << error;
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <config>\n"
+ " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
+ " <value type=\"string\"/>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
+ " <value type=\"int\">0xbeaf000000000000</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">24</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
+ " <value type=\"string\">binder,hwbinder</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used.";
+
+ xml =
+ "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <config>\n"
+ " <key>CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES</key>\n"
+ " <value type=\"string\"/>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_64BIT</key>\n"
+ " <value type=\"tristate\">y</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ILLEGAL_POINTER_VALUE</key>\n"
+ " <value type=\"int\">0xdead000000000000</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <kernel version=\"3.18.22\">\n"
+ " <conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ARCH_MMAP_RND_BITS</key>\n"
+ " <value type=\"int\">24</value>\n"
+ " </config>\n"
+ " </conditions>\n"
+ " <config>\n"
+ " <key>CONFIG_ANDROID_BINDER_DEVICES</key>\n"
+ " <value type=\"string\">binder</value>\n"
+ " </config>\n"
+ " </kernel>\n"
+ " <sepolicy>\n"
+ " <kernel-sepolicy-version>30</kernel-sepolicy-version>\n"
+ " </sepolicy>\n"
+ " <avb><vbmeta-version>2.1</vbmeta-version></avb>\n"
+ "</compatibility-matrix>\n";
+
+ EXPECT_TRUE(gCompatibilityMatrixConverter(&cm, xml))
+ << gCompatibilityMatrixConverter.lastError();
+ EXPECT_FALSE(runtime.checkCompatibility(cm, &error)) << "all fragments should be used";
+}
+
// Run KernelConfigParserInvalidTest on processComments = {true, false}
class KernelConfigParserInvalidTest : public ::testing::TestWithParam<bool> {};