mirror of
https://github.com/zeux/pugixml.git
synced 2024-12-26 21:04:25 +08:00
094a0c8ebe
This makes sure all .reserve calls failure paths are covered. These tests don't explicitly test if reserve is present on all paths - this is much harder to test since not all modifications require reserve to be called, so we'll have to rely on a combination of automated testing and sanity checking for this. Also add more parsing out of memory coverage tests.
111 lines
2.9 KiB
C++
111 lines
2.9 KiB
C++
#ifdef PUGIXML_COMPACT
|
|
#include "common.hpp"
|
|
|
|
static void overflow_hash_table(xml_document& doc)
|
|
{
|
|
xml_node n = doc.child(STR("n"));
|
|
|
|
// compact encoding assumes next_sibling is a forward-only pointer so we can allocate hash entries by reordering nodes
|
|
// we allocate enough hash entries to be exactly on the edge of rehash threshold
|
|
for (int i = 0; i < 8; ++i)
|
|
CHECK(n.prepend_child(node_element));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_string, "<n/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!n.set_name(STR("name"))));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_attribute, "<n a='v'/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
xml_attribute a = n.attribute(STR("a"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!n.append_attribute(STR(""))));
|
|
CHECK_ALLOC_FAIL(CHECK(!n.prepend_attribute(STR(""))));
|
|
CHECK_ALLOC_FAIL(CHECK(!n.insert_attribute_after(STR(""), a)));
|
|
CHECK_ALLOC_FAIL(CHECK(!n.insert_attribute_before(STR(""), a)));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_attribute_copy, "<n a='v'/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
xml_attribute a = n.attribute(STR("a"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!n.append_copy(a)));
|
|
CHECK_ALLOC_FAIL(CHECK(!n.prepend_copy(a)));
|
|
CHECK_ALLOC_FAIL(CHECK(!n.insert_copy_after(a, a)));
|
|
CHECK_ALLOC_FAIL(CHECK(!n.insert_copy_before(a, a)));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_node, "<n/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.append_child(node_element)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.prepend_child(node_element)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.insert_child_after(node_element, n)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.insert_child_before(node_element, n)));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_node_copy, "<n/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.append_copy(n)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.prepend_copy(n)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.insert_copy_after(n, n)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.insert_copy_before(n, n)));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_node_move, "<n/><ne/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
xml_node ne = doc.child(STR("ne"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.append_move(n)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.prepend_move(n)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.insert_move_after(n, ne)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.insert_move_before(n, ne)));
|
|
}
|
|
|
|
TEST_XML(compact_out_of_memory_remove, "<n a='v'/>")
|
|
{
|
|
test_runner::_memory_fail_threshold = 1;
|
|
|
|
overflow_hash_table(doc);
|
|
|
|
xml_node n = doc.child(STR("n"));
|
|
xml_attribute a = n.attribute(STR("a"));
|
|
|
|
CHECK_ALLOC_FAIL(CHECK(!n.remove_attribute(a)));
|
|
CHECK_ALLOC_FAIL(CHECK(!doc.remove_child(n)));
|
|
}
|
|
#endif
|