From f3e0f4249c648807693cbbf3bf370bc85ce55f45 Mon Sep 17 00:00:00 2001 From: Arseny Kapoulkine Date: Fri, 23 Jun 2017 08:44:52 -0700 Subject: tests: Add more stream coverage tests These new tests test that tellg() can fail when being called the second time, which leads to seekable implementation failing. --- tests/test_document.cpp | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/tests/test_document.cpp b/tests/test_document.cpp index ffe1e8b..ecbe6dc 100644 --- a/tests/test_document.cpp +++ b/tests/test_document.cpp @@ -337,14 +337,50 @@ TEST(document_load_stream_wide_seekable_fail_seek) CHECK(doc.load(in).status == status_io_error); } +template class tell_fail_buffer: public std::basic_streambuf +{ +public: + int seeks; + + tell_fail_buffer(): seeks(0) + { + } + + typename std::basic_streambuf::pos_type seekoff(typename std::basic_streambuf::off_type, std::ios_base::seekdir dir, std::ios_base::openmode) PUGIXML_OVERRIDE + { + seeks++; + + return seeks > 1 && dir == std::ios_base::cur ? -1 : 0; + } + + typename std::basic_streambuf::pos_type seekpos(typename std::basic_streambuf::pos_type, std::ios_base::openmode) PUGIXML_OVERRIDE + { + return 0; + } +}; + +TEST(document_load_stream_seekable_fail_tell) +{ + tell_fail_buffer buffer; + std::basic_istream in(&buffer); + + xml_document doc; + CHECK(doc.load(in).status == status_io_error); +} + +TEST(document_load_stream_wide_seekable_fail_tell) +{ + tell_fail_buffer buffer; + std::basic_istream in(&buffer); + + xml_document doc; + CHECK(doc.load(in).status == status_io_error); +} + #ifndef PUGIXML_NO_EXCEPTIONS template class read_fail_buffer: public std::basic_streambuf { public: - read_fail_buffer() - { - } - typename std::basic_streambuf::int_type underflow() PUGIXML_OVERRIDE { throw std::runtime_error("underflow failed"); -- cgit v1.2.3