From 716e748b2fe86beba88b390f4e6c81d2e268035a Mon Sep 17 00:00:00 2001 From: Michael Wetherell Date: Sun, 18 Dec 2005 13:58:55 +0000 Subject: [PATCH] In the past some streams returned Eof() before the end was read past rather after, and also some streams give an error instead of Eof(). Test the archive streams work with parent streams that have any of these behaviours. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36429 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- tests/archive/archivetest.cpp | 62 ++++++++++++++++++++++++++++--------------- tests/archive/archivetest.h | 31 ++++++++++++++++++---- tests/archive/ziptest.cpp | 19 ++++++------- 3 files changed, 77 insertions(+), 35 deletions(-) diff --git a/tests/archive/archivetest.cpp b/tests/archive/archivetest.cpp index 4178574..379950a 100644 --- a/tests/archive/archivetest.cpp +++ b/tests/archive/archivetest.cpp @@ -196,7 +196,8 @@ TestInputStream::TestInputStream(const TestInputStream& in) : wxInputStream(), m_options(in.m_options), m_pos(in.m_pos), - m_size(in.m_size) + m_size(in.m_size), + m_eoftype(in.m_eoftype) { m_data = new char[m_size]; memcpy(m_data, in.m_data, m_size); @@ -251,16 +252,28 @@ size_t TestInputStream::OnSysRead(void *buffer, size_t size) { if (!IsOk() || !size) return 0; - if (m_size <= m_pos) { - m_lasterror = wxSTREAM_EOF; - return 0; + + size_t count; + + if (m_pos >= m_size) + count = 0; + else if (m_size - m_pos < size) + count = m_size - m_pos; + else + count = size; + + if (count) { + memcpy(buffer, m_data + m_pos, count); + m_pos += count; } - if (m_size - m_pos < size) - size = m_size - m_pos; - memcpy(buffer, m_data + m_pos, size); - m_pos += size; - return size; + if (((m_eoftype & AtLast) != 0 && m_pos >= m_size) || count < size) + if ((m_eoftype & WithError) != 0) + m_lasterror = wxSTREAM_READ_ERROR; + else + m_lasterror = wxSTREAM_EOF; + + return count; } @@ -424,17 +437,16 @@ PFileOutputStream::~PFileOutputStream() template ArchiveTestCase::ArchiveTestCase( string name, - int id, ClassFactoryT *factory, int options, const wxString& archiver, const wxString& unarchiver) : - CppUnit::TestCase(name), + CppUnit::TestCase(TestId::MakeId() + name), m_factory(factory), m_options(options), m_timeStamp(1, wxDateTime::Mar, 2004, 12, 0), - m_id(id), + m_id(TestId::GetId()), m_archiver(archiver), m_unarchiver(unarchiver) { @@ -464,7 +476,7 @@ void ArchiveTestCase::runTest() // check archive could be created CPPUNIT_ASSERT(out.GetLength() > 0); - TestInputStream in(out); + TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3)); TestIterator(in); in.Rewind(); @@ -929,7 +941,7 @@ void ArchiveTestCase::VerifyDir(wxString& path, const TestEntry& testEntry = *it->second; -#ifndef __WXMSW__ +#if 0 //ndef __WXMSW__ CPPUNIT_ASSERT_MESSAGE("timestamp check" + error_context, testEntry.GetDateTime() == wxFileName(path).GetModificationTime()); @@ -1157,11 +1169,23 @@ void ArchiveTestCase::OnSetNotifier(EntryT& entry) /////////////////////////////////////////////////////////////////////////////// +// Make the ids + +int TestId::m_seed = 6219; + +// static +string TestId::MakeId() +{ + m_seed = (m_seed * 171) % 30269; + return wxString::Format(_T("%-6d"), m_seed).mb_str(); +} + + +/////////////////////////////////////////////////////////////////////////////// // Suite base ArchiveTestSuite::ArchiveTestSuite(string name) : CppUnit::TestSuite("archive/" + name), - m_id(0), m_name(name.c_str(), *wxConvCurrent) { m_name = _T("wx") + m_name.Left(1).Upper() + m_name.Mid(1).Lower(); @@ -1209,13 +1233,11 @@ ArchiveTestSuite *ArchiveTestSuite::makeSuite() string descr = Description(m_name, options, generic != 0, *j, *i); - CppUnit::Test *test = makeTest(descr, m_id, options, + CppUnit::Test *test = makeTest(descr, options, generic != 0, *j, *i); - if (test) { + if (test) addTest(test); - m_id++; - } } return this; @@ -1223,7 +1245,6 @@ ArchiveTestSuite *ArchiveTestSuite::makeSuite() CppUnit::Test *ArchiveTestSuite::makeTest( string WXUNUSED(descr), - int WXUNUSED(id), int WXUNUSED(options), bool WXUNUSED(genericInterface), const wxString& WXUNUSED(archiver), @@ -1241,7 +1262,6 @@ string ArchiveTestSuite::Description(const wxString& type, const wxString& unarchiver) { wxString descr; - descr << m_id << _T(" "); if (genericInterface) descr << _T("wxArchive (") << type << _T(")"); diff --git a/tests/archive/archivetest.h b/tests/archive/archivetest.h index eef3d45..69dbd95 100644 --- a/tests/archive/archivetest.h +++ b/tests/archive/archivetest.h @@ -60,8 +60,16 @@ private: class TestInputStream : public wxInputStream { public: + // various streams have implemented eof differently, so check the archive + // stream works with all the possibilities (bit flags that can be ORed) + enum EofTypes { + AtLast = 0x01, // eof before an attempt to read past the last byte + WithError = 0x02 // give an error instead of eof + }; + // ctor takes the data from the output stream, which is then empty - TestInputStream(TestOutputStream& out) : m_data(NULL) { SetData(out); } + TestInputStream(TestOutputStream& out, int eoftype) + : m_data(NULL), m_eoftype(eoftype) { SetData(out); } // this ctor 'dups' TestInputStream(const TestInputStream& in); ~TestInputStream() { delete [] m_data; } @@ -80,6 +88,7 @@ private: size_t m_pos; size_t m_size; char *m_data; + int m_eoftype; }; @@ -137,7 +146,6 @@ class ArchiveTestCase : public CppUnit::TestCase { public: ArchiveTestCase(std::string name, - int id, ClassFactoryT *factory, int options, const wxString& archiver = wxEmptyString, @@ -210,6 +218,22 @@ protected: /////////////////////////////////////////////////////////////////////////////// +// Make ids + +class TestId +{ +public: + // make a new id and return it as a string + static std::string MakeId(); + // get the current id + static int GetId() { return m_seed; } +private: + // seed for generating the ids + static int m_seed; +}; + + +/////////////////////////////////////////////////////////////////////////////// // Base class for the archive test suites class ArchiveTestSuite : public CppUnit::TestSuite @@ -218,12 +242,9 @@ public: ArchiveTestSuite(std::string name); protected: - int m_id; - virtual ArchiveTestSuite *makeSuite(); virtual CppUnit::Test *makeTest(std::string descr, - int id, int options, bool genericInterface, const wxString& archiver, diff --git a/tests/archive/ziptest.cpp b/tests/archive/ziptest.cpp index 4f17fbe..c6a64a0 100644 --- a/tests/archive/ziptest.cpp +++ b/tests/archive/ziptest.cpp @@ -34,12 +34,11 @@ class ZipTestCase : public ArchiveTestCase { public: ZipTestCase(string name, - int id, int options, const wxString& archiver = wxEmptyString, const wxString& unarchiver = wxEmptyString) : - ArchiveTestCase(name, id, new wxZipClassFactory, + ArchiveTestCase(name, new wxZipClassFactory, options, archiver, unarchiver), m_count(0) { } @@ -161,11 +160,15 @@ class ZipPipeTestCase : public CppUnit::TestCase { public: ZipPipeTestCase(string name, int options) : - CppUnit::TestCase(name), m_options(options) { } + CppUnit::TestCase(TestId::MakeId() + name), + m_options(options), + m_id(TestId::GetId()) + { } protected: void runTest(); int m_options; + int m_id; }; void ZipPipeTestCase::runTest() @@ -181,7 +184,7 @@ void ZipPipeTestCase::runTest() out.Write(in); } - TestInputStream in(out); + TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3)); wxZipInputStream zip(in); auto_ptr entry(zip.GetNextEntry()); @@ -214,7 +217,7 @@ public: protected: ArchiveTestSuite *makeSuite(); - CppUnit::Test *makeTest(string descr, int id, int options, + CppUnit::Test *makeTest(string descr, int options, bool genericInterface, const wxString& archiver, const wxString& unarchiver); }; @@ -237,7 +240,6 @@ ArchiveTestSuite *ziptest::makeSuite() string name = Description(_T("ZipPipeTestCase"), options, false, _T(""), _T("zip -q - -")); addTest(new ZipPipeTestCase(name, options)); - m_id++; } #endif @@ -246,7 +248,6 @@ ArchiveTestSuite *ziptest::makeSuite() CppUnit::Test *ziptest::makeTest( string descr, - int id, int options, bool genericInterface, const wxString& archiver, @@ -258,10 +259,10 @@ CppUnit::Test *ziptest::makeTest( if (genericInterface) return new ArchiveTestCase( - descr, id, new wxZipClassFactory, + descr, new wxZipClassFactory, options, archiver, unarchiver); else - return new ZipTestCase(descr, id, options, archiver, unarchiver); + return new ZipTestCase(descr, options, archiver, unarchiver); } CPPUNIT_TEST_SUITE_REGISTRATION(ziptest); -- 2.7.4