diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/autotest-appveyor.ps1 | 2 | ||||
| -rw-r--r-- | tests/test_dom_modify.cpp | 19 | ||||
| -rw-r--r-- | tests/test_memory.cpp | 45 | 
3 files changed, 44 insertions, 22 deletions
| diff --git a/tests/autotest-appveyor.ps1 b/tests/autotest-appveyor.ps1 index 8b7a24c..6b88766 100644 --- a/tests/autotest-appveyor.ps1 +++ b/tests/autotest-appveyor.ps1 @@ -21,7 +21,7 @@ foreach ($vs in 9,10,11,12)  		Invoke-CmdScript "C:\Program Files (x86)\Microsoft Visual Studio $vs.0\VC\vcvarsall.bat" $arch  		if (! $?) { throw "Error setting up VS$vs $arch" } -		foreach ($defines in "standard", "PUGIXML_WCHAR_MODE") +		foreach ($defines in "standard", "PUGIXML_WCHAR_MODE", "PUGIXML_COMPACT")  		{  			$target = "tests_vs${vs}_${arch}_${defines}"  			$deflist = if ($defines -eq "standard") { "" } else { "/D$defines" } diff --git a/tests/test_dom_modify.cpp b/tests/test_dom_modify.cpp index f2877ff..54bbee4 100644 --- a/tests/test_dom_modify.cpp +++ b/tests/test_dom_modify.cpp @@ -1116,6 +1116,11 @@ TEST(dom_node_append_buffer_out_of_memory_nodes)  	test_runner::_memory_fail_threshold = 32768 + 128 + data.length() * sizeof(char_t) + 32; +#ifdef PUGIXML_COMPACT +	// ... and some space for hash table +	test_runner::_memory_fail_threshold += 2048; +#endif +  	xml_document doc;  	CHECK_ALLOC_FAIL(CHECK(doc.append_buffer(data.c_str(), data.length() * sizeof(char_t), parse_fragment).status == status_out_of_memory)); @@ -1132,9 +1137,9 @@ TEST(dom_node_append_buffer_out_of_memory_nodes)  TEST(dom_node_append_buffer_out_of_memory_name)  { -	test_runner::_memory_fail_threshold = 32768 + 128; +	test_runner::_memory_fail_threshold = 32768 + 4096; -	char data[128] = {0}; +	char data[4096] = {0};  	xml_document doc;  	CHECK(doc.append_child(STR("root"))); @@ -1378,6 +1383,11 @@ TEST(dom_node_copy_copyless)  	// the document is parsed in-place so there should only be 1 page worth of allocations  	test_runner::_memory_fail_threshold = 32768 + 128; +#ifdef PUGIXML_COMPACT +	// ... and some space for hash table +	test_runner::_memory_fail_threshold += 2048; +#endif +  	xml_document doc;  	CHECK(doc.load_buffer_inplace(&datacopy[0], datacopy.size() * sizeof(char_t), parse_full)); @@ -1455,6 +1465,11 @@ TEST(dom_node_copy_attribute_copyless)  	// the document is parsed in-place so there should only be 1 page worth of allocations  	test_runner::_memory_fail_threshold = 32768 + 128; +#ifdef PUGIXML_COMPACT +	// ... and some space for hash table +	test_runner::_memory_fail_threshold += 2048; +#endif +  	xml_document doc;  	CHECK(doc.load_buffer_inplace(&datacopy[0], datacopy.size() * sizeof(char_t), parse_full)); diff --git a/tests/test_memory.cpp b/tests/test_memory.cpp index bd80ca1..5edfd65 100644 --- a/tests/test_memory.cpp +++ b/tests/test_memory.cpp @@ -1,30 +1,37 @@  #include "common.hpp"  #include "writer_string.hpp" +#include "allocator.hpp"  #include <string>  namespace  { -	int allocate_count = 0; -	int deallocate_count = 0; +	int page_allocs = 0; +	int page_deallocs = 0; + +	bool is_page(size_t size) +	{ +		return size >= 8192; +	}  	void* allocate(size_t size)  	{ -		++allocate_count; -		return new char[size]; +		void* ptr = memory_allocate(size); +		page_allocs += is_page(memory_size(ptr)); +		return ptr;  	}  	void deallocate(void* ptr)  	{ -		++deallocate_count; -		delete[] reinterpret_cast<char*>(ptr); +		page_deallocs += is_page(memory_size(ptr)); +		memory_deallocate(ptr);  	}  }  TEST(memory_custom_memory_management)  { -	allocate_count = deallocate_count = 0; +	page_allocs = page_deallocs = 0;  	// remember old functions  	allocation_function old_allocate = get_memory_allocation_function(); @@ -37,30 +44,30 @@ TEST(memory_custom_memory_management)  		// parse document  		xml_document doc; -		CHECK(allocate_count == 0 && deallocate_count == 0); +		CHECK(page_allocs == 0 && page_deallocs == 0);  		CHECK(doc.load_string(STR("<node />"))); -		CHECK(allocate_count == 2 && deallocate_count == 0); +		CHECK(page_allocs == 1 && page_deallocs == 0);  		// modify document (no new page)  		CHECK(doc.first_child().set_name(STR("foobars"))); -		CHECK(allocate_count == 2 && deallocate_count == 0); +		CHECK(page_allocs == 1 && page_deallocs == 0);  		// modify document (new page)  		std::basic_string<pugi::char_t> s(65536, 'x');  		CHECK(doc.first_child().set_name(s.c_str())); -		CHECK(allocate_count == 3 && deallocate_count == 0); +		CHECK(page_allocs == 2 && page_deallocs == 0);  		// modify document (new page, old one should die)  		s += s;  		CHECK(doc.first_child().set_name(s.c_str())); -		CHECK(allocate_count == 4 && deallocate_count == 1); +		CHECK(page_allocs == 3 && page_deallocs == 1);  	} -	CHECK(allocate_count == 4 && deallocate_count == 4); +	CHECK(page_allocs == 3 && page_deallocs == 3);  	// restore old functions  	set_memory_management_functions(old_allocate, old_deallocate); @@ -68,7 +75,7 @@ TEST(memory_custom_memory_management)  TEST(memory_large_allocations)  { -	allocate_count = deallocate_count = 0; +	page_allocs = page_deallocs = 0;  	// remember old functions  	allocation_function old_allocate = get_memory_allocation_function(); @@ -80,7 +87,7 @@ TEST(memory_large_allocations)  	{  		xml_document doc; -		CHECK(allocate_count == 0 && deallocate_count == 0); +		CHECK(page_allocs == 0 && page_deallocs == 0);  		// initial fill  		for (size_t i = 0; i < 128; ++i) @@ -90,7 +97,7 @@ TEST(memory_large_allocations)  			CHECK(doc.append_child(node_pcdata).set_value(s.c_str()));  		} -		CHECK(allocate_count > 0 && deallocate_count == 0); +		CHECK(page_allocs > 0 && page_deallocs == 0);  		// grow-prune loop  		while (doc.first_child()) @@ -116,15 +123,15 @@ TEST(memory_large_allocations)  			}  		} -		CHECK(allocate_count == deallocate_count + 1); // only one live page left (it waits for new allocations) +		CHECK(page_allocs == page_deallocs + 1); // only one live page left (it waits for new allocations)  		char buffer;  		CHECK(doc.load_buffer_inplace(&buffer, 0, parse_fragment, get_native_encoding())); -		CHECK(allocate_count == deallocate_count); // no live pages left +		CHECK(page_allocs == page_deallocs); // no live pages left  	} -	CHECK(allocate_count == deallocate_count); // everything is freed +	CHECK(page_allocs == page_deallocs); // everything is freed  	// restore old functions  	set_memory_management_functions(old_allocate, old_deallocate); | 
