From 521384bd21b6321368b4094677d482698fe5c5a5 Mon Sep 17 00:00:00 2001
From: "arseny.kapoulkine"
 <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>
Date: Tue, 14 Sep 2010 05:29:16 +0000
Subject: tests: Added XPath out of memory tests

git-svn-id: http://pugixml.googlecode.com/svn/trunk@728 99668b35-9821-0410-8761-19e4c4f06640
---
 tests/test_xpath.cpp     | 95 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/test_xpath_api.cpp | 58 +++++++++++++++++++++++++++++
 2 files changed, 153 insertions(+)

(limited to 'tests')

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
-- 
cgit v1.2.3