diff options
Diffstat (limited to 'tests/test_document.cpp')
-rw-r--r-- | tests/test_document.cpp | 104 |
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; |