From: Mukund Sivaraman Date: Fri, 30 Aug 2013 01:43:54 +0000 (+0530) Subject: [2750] Test multiple occurrences of node fusion in a single step upwards in the forest X-Git-Tag: bind10-1.2.0beta1-release~193^2~4^2~50 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=65d3cd24fbee716e9e331a9f4541e34341e5e15b;p=thirdparty%2Fkea.git [2750] Test multiple occurrences of node fusion in a single step upwards in the forest --- diff --git a/src/lib/datasrc/tests/memory/domaintree_unittest.cc b/src/lib/datasrc/tests/memory/domaintree_unittest.cc index 617806874c..61308acb49 100644 --- a/src/lib/datasrc/tests/memory/domaintree_unittest.cc +++ b/src/lib/datasrc/tests/memory/domaintree_unittest.cc @@ -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(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);