2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 13:37:55 +00:00

[#2266] added unittests for mergeDiffAdd and mergeDiffDel

This commit is contained in:
Razvan Becheriu 2022-06-24 16:36:14 +03:00
parent 04eea382b7
commit 21171fcae9

View File

@ -1526,4 +1526,532 @@ TEST(Element, removeEmptyContainersRecursively) {
)"));
}
/// @brief Function which creates an imaginary configuration hierarchy used to
/// test mergeDiffAdd, mergeDiffDel and extend.
isc::data::HierarchyDescriptor createHierarchy() {
auto const& element_empty = [](ElementPtr& element) {
for (auto const& kv : element->mapValue()) {
auto const& key = kv.first;
if (key != "id") {
return (false);
}
}
return (true);
};
auto const& element_match = [](ElementPtr& left, ElementPtr& right) -> bool {
return (left->get("id")->intValue() == right->get("id")->intValue());
};
auto const& element_is_key = [](const std::string& key) -> bool {
return (key == "id");
};
isc::data::HierarchyDescriptor hierarchy = {
{ { "root", { element_match, element_empty, element_is_key } } },
{ { "elements", { element_match, element_empty, element_is_key } },
{ "elements-other", { element_match, element_empty, element_is_key } } }
};
return (hierarchy);
}
TEST(Element, mergeDiffAddBadParams) {
{
SCOPED_TRACE("root bad scalars");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(true);
ElementPtr right = Element::create("false");
ASSERT_THROW(mergeDiffAdd(left, right, hierarchy, ""), TypeError);
}
{
SCOPED_TRACE("map bad elements");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
left->set("elements", Element::createList());
right->set("elements", Element::createMap());
ASSERT_THROW(mergeDiffAdd(left, right, hierarchy, "root"), TypeError);
}
{
SCOPED_TRACE("list bad elements");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::createMap());
right_right->set("id", Element::create(0));
right_right->set("elements", Element::createList());
left->add(left_left);
right->add(right_right);
ASSERT_THROW(mergeDiffAdd(left, right, hierarchy, "root"), TypeError);
}
}
TEST(Element, mergeDiffAdd) {
{
SCOPED_TRACE("scalar bool");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(true);
ElementPtr right = Element::create(false);
EXPECT_NE(left->boolValue(), right->boolValue());
mergeDiffAdd(left, right, hierarchy, "");
EXPECT_EQ(left->boolValue(), right->boolValue());
EXPECT_EQ(left->str(), "false");
}
{
SCOPED_TRACE("scalar int");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(1);
ElementPtr right = Element::create(2);
EXPECT_NE(left->intValue(), right->intValue());
mergeDiffAdd(left, right, hierarchy, "");
EXPECT_EQ(left->intValue(), right->intValue());
EXPECT_EQ(left->str(), "2");
}
{
SCOPED_TRACE("scalar double");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(0.1);
ElementPtr right = Element::create(0.2);
EXPECT_NE(left->doubleValue(), right->doubleValue());
mergeDiffAdd(left, right, hierarchy, "");
EXPECT_EQ(left->doubleValue(), right->doubleValue());
EXPECT_EQ(left->str(), "0.2");
}
{
SCOPED_TRACE("scalar string");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create("left");
ElementPtr right = Element::create("right");
EXPECT_NE(left->stringValue(), right->stringValue());
mergeDiffAdd(left, right, hierarchy, "");
EXPECT_EQ(left->stringValue(), right->stringValue());
EXPECT_EQ(left->str(), "\"right\"");
}
{
SCOPED_TRACE("scalar in map");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
left->set("elements", Element::create("left"));
left->set("other-elements", Element::create("other"));
// scalar element which is updated
right->set("elements", Element::create("right"));
// scalar element which is added
right->set("new-elements", Element::create("new"));
EXPECT_NE(left->str(), right->str());
mergeDiffAdd(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "{ \"elements\": \"right\", \"new-elements\": \"new\", \"other-elements\": \"other\" }");
}
{
SCOPED_TRACE("scalar in list");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
left->add(Element::create("left"));
left->add(Element::create("other"));
left->add(Element::create("test"));
// scalar element which is added
right->add(Element::create("right"));
// scalar element which is added
right->add(Element::create("new"));
// scalar element which already exists but is still added
right->add(Element::create("test"));
EXPECT_NE(left->str(), right->str());
mergeDiffAdd(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "[ \"left\", \"other\", \"test\", \"right\", \"new\", \"test\" ]");
}
{
SCOPED_TRACE("scalar and list and map in map");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::create("left"));
left_left->set("other-elements", Element::create("other"));
// scalar element used as key
right_right->set("id", Element::create(0));
// scalar element which is updated
right_right->set("elements", Element::create("right"));
// scalar element which is added
right_right->set("new-elements", Element::create("new"));
ElementPtr left_other_left = Element::createMap();
ElementPtr right_other_right = Element::createMap();
left_other_left->set("id", Element::create(1));
left_other_left->set("elements", Element::create("other-left"));
// scalar element used as key
right_other_right->set("id", Element::create(2));
// scalar element which is added
right_other_right->set("elements", Element::create("other-right"));
left->set("elements", left_left);
left->set("left-other-elements", left_other_left);
// map element which is added
right->set("right-other-elements", right_other_right);
// map element which is updated
right->set("elements", right_right);
left_other_left = Element::createList();
right_other_right = Element::createList();
left_other_left->add(Element::create("left-other-left"));
left_other_left->add(Element::create("left-other-left-other"));
left_other_left->add(Element::create("other-other"));
// scalar element which is added
right_other_right->add(Element::create("right-other-right"));
// scalar element which is added
right_other_right->add(Element::create("right-other-right-other"));
// scalar element which already exists but is still added
right_other_right->add(Element::create("other-other"));
left->set("other", left_other_left);
// list element which is updated
right->set("other", right_other_right);
EXPECT_NE(left->str(), right->str());
mergeDiffAdd(left, right, hierarchy, "root");
EXPECT_EQ(left->str(), "{ \"elements\": { \"elements\": \"right\", \"id\": 0, \"new-elements\": \"new\", \"other-elements\": \"other\" }, "
"\"left-other-elements\": { \"elements\": \"other-left\", \"id\": 1 }, "
"\"other\": [ \"left-other-left\", \"left-other-left-other\", \"other-other\", \"right-other-right\", \"right-other-right-other\", \"other-other\" ], "
"\"right-other-elements\": { \"elements\": \"other-right\", \"id\": 2 } }");
}
{
SCOPED_TRACE("scalar and list and map in list");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::create("left"));
left_left->set("other-elements", Element::create("other"));
// scalar element used as key
right_right->set("id", Element::create(0));
// scalar element which is updated
right_right->set("elements", Element::create("right"));
// scalar element which is added
right_right->set("new-elements", Element::create("new"));
ElementPtr left_other_left = Element::createMap();
ElementPtr right_other_right = Element::createMap();
left_other_left->set("id", Element::create(1));
left_other_left->set("elements", Element::create("other-left"));
// scalar element used as key
right_other_right->set("id", Element::create(2));
// scalar element which is added
right_other_right->set("elements", Element::create("other-right"));
left->add(left_left);
left->add(left_other_left);
// map element which is added
right->add(right_other_right);
// map element which is updated
right->add(right_right);
left_other_left = Element::createList();
right_other_right = Element::createList();
left_other_left->add(Element::create("left-other-left"));
left_other_left->add(Element::create("left-other-left-other"));
left_other_left->add(Element::create("other-other"));
// scalar element which is added
right_other_right->add(Element::create("right-other-right"));
// scalar element which is added
right_other_right->add(Element::create("right-other-right-other"));
// scalar element which already exists but is still added
right_other_right->add(Element::create("other-other"));
left_left->set("other", left_other_left);
// list element which is updated
right_right->set("other", right_other_right);
EXPECT_NE(left->str(), right->str());
mergeDiffAdd(left, right, hierarchy, "root");
EXPECT_EQ(left->str(), "[ { \"elements\": \"right\", \"id\": 0, \"new-elements\": \"new\", "
"\"other\": [ \"left-other-left\", \"left-other-left-other\", \"other-other\", \"right-other-right\", \"right-other-right-other\", \"other-other\" ], "
"\"other-elements\": \"other\" }, "
"{ \"elements\": \"other-left\", \"id\": 1 }, "
"{ \"elements\": \"other-right\", \"id\": 2 } ]");
}
}
TEST(Element, mergeDiffDelBadParams) {
{
SCOPED_TRACE("root bad scalars");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(true);
ElementPtr right = Element::create("false");
ASSERT_THROW(mergeDiffDel(left, right, hierarchy, ""), TypeError);
}
{
SCOPED_TRACE("map bad elements");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
left->set("elements", Element::createList());
right->set("elements", Element::createMap());
ASSERT_THROW(mergeDiffDel(left, right, hierarchy, "root"), TypeError);
}
{
SCOPED_TRACE("list bad elements");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::createMap());
right_right->set("id", Element::create(0));
right_right->set("elements", Element::createList());
left->add(left_left);
right->add(right_right);
ASSERT_THROW(mergeDiffDel(left, right, hierarchy, "root"), TypeError);
}
}
TEST(Element, mergeDiffDel) {
{
SCOPED_TRACE("scalar bool");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(true);
ElementPtr right = Element::create(false);
EXPECT_NE(left->boolValue(), right->boolValue());
mergeDiffDel(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "null");
}
{
SCOPED_TRACE("scalar int");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(1);
ElementPtr right = Element::create(2);
EXPECT_NE(left->intValue(), right->intValue());
mergeDiffDel(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "null");
}
{
SCOPED_TRACE("scalar double");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(0.1);
ElementPtr right = Element::create(0.2);
EXPECT_NE(left->doubleValue(), right->doubleValue());
mergeDiffDel(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "null");
}
{
SCOPED_TRACE("scalar string");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create("left");
ElementPtr right = Element::create("right");
EXPECT_NE(left->stringValue(), right->stringValue());
mergeDiffDel(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "null");
}
{
SCOPED_TRACE("scalar in map");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
left->set("elements", Element::create("left"));
left->set("other-elements", Element::create("other"));
// scalar element which is removed
right->set("elements", Element::create("right"));
// scalar element which does not exist and does nothing
right->set("new-elements", Element::create("new"));
EXPECT_NE(left->str(), right->str());
mergeDiffDel(left, right, hierarchy, "root");
EXPECT_EQ(left->str(), "{ \"other-elements\": \"other\" }");
}
{
SCOPED_TRACE("scalar in list");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
left->add(Element::create("left"));
left->add(Element::create("other"));
left->add(Element::create("other-left"));
left->add(Element::create("new"));
// scalar element which does not exist and does nothing
right->add(Element::create("right"));
// scalar element which is removed
right->add(Element::create("other"));
// scalar element which does not exist and does nothing
right->add(Element::create("other-right"));
// scalar element which is removed
right->add(Element::create("new"));
EXPECT_NE(left->str(), right->str());
mergeDiffDel(left, right, hierarchy, "");
EXPECT_EQ(left->str(), "[ \"left\", \"other-left\" ]");
}
{
SCOPED_TRACE("scalar and list and map in map");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::create("left"));
left_left->set("other-elements", Element::create("other"));
// scalar element used as key
right_right->set("id", Element::create(0));
// scalar element which is removed
right_right->set("elements", Element::create("right"));
// scalar element which does not exist and does nothing
right_right->set("new-elements", Element::create("new"));
ElementPtr left_other_left = Element::createMap();
ElementPtr right_other_right = Element::createMap();
left_other_left->set("id", Element::create(1));
left_other_left->set("elements", Element::create("other-left"));
// scalar element used as key
right_other_right->set("id", Element::create(2));
// scalar element which does not exist and does nothing
right_other_right->set("elements", Element::create("other-right"));
left->set("elements", left_left);
left->set("left-other-elements", left_other_left);
// map element which does not exist and does nothing
right->set("right-other-elements", right_other_right);
// map element which is updated
right->set("elements", right_right);
left_other_left = Element::createList();
right_other_right = Element::createList();
left_other_left->add(Element::create("left-other-left"));
left_other_left->add(Element::create("other"));
left_other_left->add(Element::create("left-other-left-other"));
left_other_left->add(Element::create("new"));
// scalar element which does not exist and does nothing
right_other_right->add(Element::create("right-other-right"));
// scalar element which is removed
right_other_right->add(Element::create("other"));
// scalar element which does not exist and does nothing
right_other_right->add(Element::create("right-other-right-other"));
// scalar element which is removed
right_other_right->add(Element::create("new"));
left->set("other", left_other_left);
// list element which is updated
right->set("other", right_other_right);
left_left = Element::createMap();
right_right = Element::createMap();
left_left->set("id", Element::create(3));
left_left->set("elements", Element::create("new-left"));
left_left->set("other-elements", Element::create("new-other"));
left->set("elements-other", left_left);
// scalar element used as key
right_right->set("id", Element::create(3));
// map element which is not removed because it is contained in a map and
// the key can not be removed
right->set("elements-other", right_right);
EXPECT_NE(left->str(), right->str());
mergeDiffDel(left, right, hierarchy, "root");
EXPECT_EQ(left->str(), "{ \"elements\": { \"id\": 0, \"other-elements\": \"other\" }, "
"\"elements-other\": { \"elements\": \"new-left\", \"id\": 3, \"other-elements\": \"new-other\" }, "
"\"left-other-elements\": { \"elements\": \"other-left\", \"id\": 1 }, "
"\"other\": [ \"left-other-left\", \"left-other-left-other\" ] }");
}
{
SCOPED_TRACE("scalar and list and map in list");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::create("left"));
left_left->set("other-elements", Element::create("other"));
// scalar element used as key
right_right->set("id", Element::create(0));
// scalar element which is removed
right_right->set("elements", Element::create("right"));
// scalar element which does not exist and does nothing
right_right->set("new-elements", Element::create("new"));
ElementPtr left_other_left = Element::createMap();
ElementPtr right_other_right = Element::createMap();
left_other_left->set("id", Element::create(1));
left_other_left->set("elements", Element::create("other-left"));
// scalar element used as key
right_other_right->set("id", Element::create(2));
// scalar element which does not exist and does nothing
right_other_right->set("elements", Element::create("other-right"));
left->add(left_left);
left->add(left_other_left);
// map element which does not exist and does nothing
right->add(right_other_right);
// map element which is updated
right->add(right_right);
left_other_left = Element::createList();
right_other_right = Element::createList();
left_other_left->add(Element::create("left-other-left"));
left_other_left->add(Element::create("other"));
left_other_left->add(Element::create("left-other-left-other"));
left_other_left->add(Element::create("new"));
// scalar element which does not exist and does nothing
right_other_right->add(Element::create("right-other-right"));
// scalar element which is removed
right_other_right->add(Element::create("other"));
// scalar element which does not exist and does nothing
right_other_right->add(Element::create("right-other-right-other"));
// scalar element which is removed
right_other_right->add(Element::create("new"));
left_left->set("other", left_other_left);
// list element which is updated
right_right->set("other", right_other_right);
left_left = Element::createMap();
right_right = Element::createMap();
left_left->set("id", Element::create(3));
left_left->set("elements", Element::create("new-left"));
left_left->set("other-elements", Element::create("new-other"));
left->add(left_left);
// scalar element used as key
right_right->set("id", Element::create(3));
// map element which is removed by key
// the key can not be removed
right->add(right_right);
EXPECT_NE(left->str(), right->str());
mergeDiffDel(left, right, hierarchy, "root");
EXPECT_EQ(left->str(), "[ { \"id\": 0, \"other\": [ \"left-other-left\", \"left-other-left-other\" ], \"other-elements\": \"other\" }, "
"{ \"elements\": \"other-left\", \"id\": 1 } ]");
}
}
TEST(Element, extendBadParam) {
{
SCOPED_TRACE("root bad scalars");
isc::data::HierarchyDescriptor hierarchy;
ElementPtr left = Element::create(true);
ElementPtr right = Element::create("false");
ASSERT_THROW(extend("elements", "", left, right, hierarchy, ""), TypeError);
}
{
SCOPED_TRACE("map bad elements");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createMap();
ElementPtr right = Element::createMap();
left->set("elements", Element::createList());
right->set("elements", Element::createMap());
ASSERT_THROW(extend("elements", "", left, right, hierarchy, "root"), TypeError);
}
{
SCOPED_TRACE("list bad elements");
isc::data::HierarchyDescriptor hierarchy;
hierarchy = createHierarchy();
ElementPtr left = Element::createList();
ElementPtr right = Element::createList();
ElementPtr left_left = Element::createMap();
ElementPtr right_right = Element::createMap();
left_left->set("id", Element::create(0));
left_left->set("elements", Element::createMap());
right_right->set("id", Element::create(0));
right_right->set("elements", Element::createList());
left->add(left_left);
right->add(right_right);
ASSERT_THROW(extend("elements", "", left, right, hierarchy, "root"), TypeError);
}
}
TEST(Element, extend) {
}
} // namespace