]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2750] Test multiple occurrences of node fusion in a single step upwards in the forest
authorMukund Sivaraman <muks@isc.org>
Fri, 30 Aug 2013 01:43:54 +0000 (07:13 +0530)
committerMukund Sivaraman <muks@isc.org>
Fri, 30 Aug 2013 01:43:54 +0000 (07:13 +0530)
src/lib/datasrc/tests/memory/domaintree_unittest.cc

index 617806874cc16a184c074b05440f862bf519d09b..61308acb496faf5ed3536bf719c1598f49d6f6dc 100644 (file)
@@ -621,6 +621,99 @@ TEST_F(DomainTreeTest, nodeFusionWithData) {
     EXPECT_EQ(Name("w.y"), cdtnode->getName());
 }
 
+TEST_F(DomainTreeTest, nodeFusionMultiple) {
+    // Test that node fusion occurs up the tree multiple times when
+    // conditions permit.
+
+    /* Original tree:
+     *             .
+     *             |
+     *             b
+     *           /   \
+     *          a    d.e.f
+     *              /  |   \
+     *             c   |    g.h
+     *                 |     |
+     *                w.y    i
+     *              /  |  \   \
+     *             x   |   z   k
+     *                 |   |
+     *                 p   j
+     *               /   \
+     *              o     q
+     *
+     */
+
+    // Set data (some value 42) in the "d.e.f" node
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("d.e.f"), &dtnode));
+    EXPECT_EQ(static_cast<int*>(NULL),
+              dtnode->setData(new int(42)));
+
+    // Now, delete "x" and "z" nodes.
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("x.d.e.f"), &dtnode));
+    dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("z.d.e.f"), &dtnode));
+    dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+    /* Deleting 'x' and 'z' should not cause "w.y" to be fused with
+     * "d.e.f" because "d.e.f" is not empty (has data) in this case.
+     *             .
+     *             |
+     *             b
+     *           /   \
+     *          a    d.e.f
+     *              /  |   \
+     *             c   |    g.h
+     *                 |     |
+     *                w.y    i
+     *                 |      \
+     *                 |       k
+     *                 |
+     *                 p
+     *               /   \
+     *              o     q
+     *
+     */
+
+    // Check that "w.y" did not get fused with "d.e.f"
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("d.e.f"), &cdtnode));
+    EXPECT_EQ(Name("d.e.f"), cdtnode->getName());
+
+    // Now, clear the data on "d.e.f". (Ideally, this itself should
+    // cause fusion of "d.e.f" and "w.y" to occur, but we only do fusion
+    // during deletion in our DomainTree implementation.)
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("d.e.f"), &dtnode));
+    delete dtnode->setData(NULL);
+
+    // Check that "p" exists independently.
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("p.w.y.d.e.f"), &cdtnode));
+    EXPECT_EQ(Name("p"), cdtnode->getName());
+
+    // Now, delete "o" and "q" nodes.
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("o.w.y.d.e.f"), &dtnode));
+    dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("q.w.y.d.e.f"), &dtnode));
+    dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+    // The deletion of "o" and "q" should cause "p" to fuse with "w.y"
+    // to form "p.w.y". Then, as "d.e.f" is now empty and conditions
+    // permit, for a second time up the forest, "p.w.y" is fused with
+    // "d.e.f" to form "p.w.y.d.e.f".
+    EXPECT_EQ(TestDomainTree::EXACTMATCH,
+              dtree_expose_empty_node.find(Name("p.w.y.d.e.f"), &cdtnode));
+    EXPECT_EQ(Name("p.w.y.d.e.f"), cdtnode->getName());
+}
+
 TEST_F(DomainTreeTest, DISABLED_remove1) {
     ofstream o1("d1.dot");
     dtree_expose_empty_node.dumpDot(o1);