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> {};