diff options
| -rw-r--r-- | tests/test_xpath.cpp | 95 | ||||
| -rw-r--r-- | tests/test_xpath_api.cpp | 58 | 
2 files changed, 153 insertions, 0 deletions
| diff --git a/tests/test_xpath.cpp b/tests/test_xpath.cpp index 0f8149f..1c1629f 100644 --- a/tests/test_xpath.cpp +++ b/tests/test_xpath.cpp @@ -294,4 +294,99 @@ TEST(xpath_large_node_set)  	CHECK(ns.size() == 10001);  } + +TEST(xpath_out_of_memory_evaluate_concat) +{ +	test_runner::_memory_fail_threshold = 4096 * 2 * sizeof(char_t) + 4096 * 2; + +	std::basic_string<char_t> query = STR("concat(\"a\", \""); + +	query.resize(4196, 'a'); +	query += STR("\")"); + +	pugi::xpath_query q(query.c_str()); + +#ifdef PUGIXML_NO_EXCEPTIONS +	CHECK(q.evaluate_string(0, 0, xml_node()) == 1); +#else +	try +	{ +		q.evaluate_string(0, 0, xml_node()); + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} +#endif +} + +TEST(xpath_out_of_memory_evaluate_substring) +{ +	test_runner::_memory_fail_threshold = 4096 * 2 * sizeof(char_t) + 4096 * 2; + +	std::basic_string<char_t> query = STR("substring(\""); + +	query.resize(4196, 'a'); +	query += STR("\", 1, 4097)"); + +	pugi::xpath_query q(query.c_str()); + +#ifdef PUGIXML_NO_EXCEPTIONS +	CHECK(q.evaluate_string(0, 0, xml_node()) == 1); +#else +	try +	{ +		q.evaluate_string(0, 0, xml_node()); + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} +#endif +} + +TEST_XML(xpath_out_of_memory_evaluate_union, "<node><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/></node>") +{ +	test_runner::_memory_fail_threshold = 32768 + 4096 * 2; + +	pugi::xpath_query q(STR("a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a")); + +#ifdef PUGIXML_NO_EXCEPTIONS +	CHECK(q.evaluate_node_set(doc.child(STR("node"))).empty()); +#else +	try +	{ +		q.evaluate_node_set(doc.child(STR("node"))); + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} +#endif +} + +TEST_XML(xpath_out_of_memory_evaluate_predicate, "<node><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/><a/></node>") +{ +	test_runner::_memory_fail_threshold = 32768 + 4096 * 2; + +	pugi::xpath_query q(STR("//a[//a[//a[//a[//a[//a[//a[//a[//a[//a[//a[//a[//a[//a[true()]]]]]]]]]]]]]]")); + +#ifdef PUGIXML_NO_EXCEPTIONS +	CHECK(q.evaluate_node_set(doc).empty()); +#else +	try +	{ +		q.evaluate_node_set(doc); + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} +#endif +} +  #endif diff --git a/tests/test_xpath_api.cpp b/tests/test_xpath_api.cpp index df9b9a6..281e357 100644 --- a/tests/test_xpath_api.cpp +++ b/tests/test_xpath_api.cpp @@ -314,6 +314,64 @@ TEST(xpath_api_exception_what)  		CHECK(e.what()[0] != 0);  	}  } + +TEST(xpath_api_node_set_ctor_out_of_memory) +{ +	test_runner::_memory_fail_threshold = 1; + +	xpath_node data[2]; + +	try +	{ +		xpath_node_set ns(data, data + 2); + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} +} + +TEST(xpath_api_node_set_copy_ctor_out_of_memory) +{ +	xpath_node data[2]; +	xpath_node_set ns(data, data + 2); + +	test_runner::_memory_fail_threshold = 1; + +	try +	{ +		xpath_node_set copy = ns; + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} +} + +TEST_XML(xpath_api_node_set_assign_out_of_memory_preserve, "<node><a/><b/></node>") +{ +	xpath_node_set ns = doc.select_nodes(STR("node/*")); +	CHECK(ns.size() == 2); + +	xpath_node_set nsall = doc.select_nodes(STR("//*")); +	CHECK(nsall.size() == 3); + +	test_runner::_memory_fail_threshold = 1; + +	try +	{ +		ns = nsall; + +		CHECK_FORCE_FAIL("Expected out of memory exception"); +	} +	catch (const std::bad_alloc&) +	{ +	} + +	CHECK(ns.size() == 2 && ns[0] == doc.child(STR("node")).child(STR("a")) && ns[1] == doc.child(STR("node")).child(STR("b"))); +}  #endif  #endif | 
