summaryrefslogtreecommitdiff
path: root/tests/test_document.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_document.cpp')
-rw-r--r--tests/test_document.cpp104
1 files changed, 93 insertions, 11 deletions
diff --git a/tests/test_document.cpp b/tests/test_document.cpp
index 9860737..b702a07 100644
--- a/tests/test_document.cpp
+++ b/tests/test_document.cpp
@@ -109,12 +109,26 @@ TEST(document_load_stream_error)
std::ifstream fs("filedoesnotexist");
CHECK(doc.load(fs).status == status_io_error);
+}
+
+TEST(document_load_stream_out_of_memory)
+{
+ pugi::xml_document doc;
std::istringstream iss("<node/>");
test_runner::_memory_fail_threshold = 1;
CHECK_ALLOC_FAIL(CHECK(doc.load(iss).status == status_out_of_memory));
}
+TEST(document_load_stream_wide_out_of_memory)
+{
+ pugi::xml_document doc;
+
+ std::basic_istringstream<wchar_t> iss(L"<node/>");
+ test_runner::_memory_fail_threshold = 1;
+ CHECK_ALLOC_FAIL(CHECK(doc.load(iss).status == status_out_of_memory));
+}
+
TEST(document_load_stream_empty)
{
std::istringstream iss;
@@ -186,11 +200,6 @@ public:
{
this->setg(begin, begin, end);
}
-
- typename std::basic_streambuf<T>::int_type underflow() PUGIXML_OVERRIDE
- {
- return this->gptr() == this->egptr() ? std::basic_streambuf<T>::traits_type::eof() : std::basic_streambuf<T>::traits_type::to_int_type(*this->gptr());
- }
};
TEST(document_load_stream_nonseekable)
@@ -242,21 +251,77 @@ TEST(document_load_stream_nonseekable_out_of_memory)
CHECK_ALLOC_FAIL(CHECK(doc.load(in).status == status_out_of_memory));
}
+TEST(document_load_stream_wide_nonseekable_out_of_memory)
+{
+ wchar_t contents[] = L"<node />";
+ char_array_buffer<wchar_t> buffer(contents, contents + sizeof(contents) / sizeof(contents[0]));
+ std::basic_istream<wchar_t> in(&buffer);
+
+ test_runner::_memory_fail_threshold = 1;
+
+ pugi::xml_document doc;
+ CHECK_ALLOC_FAIL(CHECK(doc.load(in).status == status_out_of_memory));
+}
+
TEST(document_load_stream_nonseekable_out_of_memory_large)
{
- std::basic_string<pugi::char_t> str;
- str += STR("<node>");
- for (int i = 0; i < 10000; ++i) str += STR("<node />");
- str += STR("</node>");
+ std::basic_string<char> str;
+ str += "<node>";
+ for (int i = 0; i < 10000; ++i) str += "<node />";
+ str += "</node>";
- char_array_buffer<pugi::char_t> buffer(&str[0], &str[0] + str.length());
- std::basic_istream<pugi::char_t> in(&buffer);
+ char_array_buffer<char> buffer(&str[0], &str[0] + str.length());
+ std::basic_istream<char> in(&buffer);
test_runner::_memory_fail_threshold = 10000 * 8 * 3 / 2;
pugi::xml_document doc;
CHECK_ALLOC_FAIL(CHECK(doc.load(in).status == status_out_of_memory));
}
+
+TEST(document_load_stream_wide_nonseekable_out_of_memory_large)
+{
+ std::basic_string<wchar_t> str;
+ str += L"<node>";
+ for (int i = 0; i < 10000; ++i) str += L"<node />";
+ str += L"</node>";
+
+ char_array_buffer<wchar_t> buffer(&str[0], &str[0] + str.length());
+ std::basic_istream<wchar_t> in(&buffer);
+
+ test_runner::_memory_fail_threshold = 10000 * 8 * 3 / 2;
+
+ pugi::xml_document doc;
+ CHECK_ALLOC_FAIL(CHECK(doc.load(in).status == status_out_of_memory));
+}
+
+template <typename T> class seek_fail_buffer: public std::basic_streambuf<T>
+{
+public:
+ typename std::basic_streambuf<T>::pos_type seekoff(typename std::basic_streambuf<T>::off_type, std::ios_base::seekdir, std::ios_base::openmode) PUGIXML_OVERRIDE
+ {
+ // pretend that our buffer is seekable (this is called by tellg); actual seeks will fail
+ return 0;
+ }
+};
+
+TEST(document_load_stream_seekable_fail_seek)
+{
+ seek_fail_buffer<char> buffer;
+ std::basic_istream<char> in(&buffer);
+
+ pugi::xml_document doc;
+ CHECK(doc.load(in).status == status_io_error);
+}
+
+TEST(document_load_stream_wide_seekable_fail_seek)
+{
+ seek_fail_buffer<wchar_t> buffer;
+ std::basic_istream<wchar_t> in(&buffer);
+
+ pugi::xml_document doc;
+ CHECK(doc.load(in).status == status_io_error);
+}
#endif
TEST(document_load_string)
@@ -383,6 +448,23 @@ TEST(document_load_file_wide_out_of_memory)
CHECK(result.status == status_out_of_memory || result.status == status_file_not_found);
}
+#if defined(__linux__) || defined(__APPLE__)
+TEST(document_load_file_special_folder)
+{
+ xml_document doc;
+ xml_parse_result result = doc.load_file(".");
+ // status_out_of_memory is somewhat counter-intuitive but on Linux ftell returns LONG_MAX for directories
+ CHECK(result.status == status_file_not_found || result.status == status_io_error || result.status == status_out_of_memory);
+}
+
+TEST(document_load_file_special_device)
+{
+ xml_document doc;
+ xml_parse_result result = doc.load_file("/dev/tty");
+ CHECK(result.status == status_file_not_found || result.status == status_io_error);
+}
+#endif
+
TEST_XML(document_save, "<node/>")
{
xml_writer_string writer;