X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/716e748b2fe86beba88b390f4e6c81d2e268035a..9cc4ab8522ec1978be193ae11b71e5623d78a14d:/tests/archive/archivetest.cpp diff --git a/tests/archive/archivetest.cpp b/tests/archive/archivetest.cpp index 379950a5d5..1d8853945a 100644 --- a/tests/archive/archivetest.cpp +++ b/tests/archive/archivetest.cpp @@ -216,6 +216,8 @@ void TestInputStream::Rewind() m_wbacksize = 0; m_wbackcur = 0; } + + Reset(); } void TestInputStream::SetData(TestOutputStream& out) @@ -224,7 +226,6 @@ void TestInputStream::SetData(TestOutputStream& out) m_options = out.GetOptions(); out.GetData(m_data, m_size); Rewind(); - Reset(); } wxFileOffset TestInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) @@ -268,10 +269,12 @@ size_t TestInputStream::OnSysRead(void *buffer, size_t 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; } @@ -1168,6 +1171,91 @@ void ArchiveTestCase::OnSetNotifier(EntryT& entry) } +/////////////////////////////////////////////////////////////////////////////// +// An additional case to check that reading corrupt archives doesn't crash + +class CorruptionTestCase : public CppUnit::TestCase +{ +public: + CorruptionTestCase(std::string name, + wxArchiveClassFactory *factory, + int options) + : CppUnit::TestCase(TestId::MakeId() + name), + m_factory(factory), + m_options(options) + { } + +protected: + // the entry point for the test + void runTest(); + + void CreateArchive(wxOutputStream& out); + void ExtractArchive(wxInputStream& in); + + auto_ptr m_factory; // factory to make classes + int m_options; // test options +}; + +void CorruptionTestCase::runTest() +{ + TestOutputStream out(m_options); + CreateArchive(out); + TestInputStream in(out, 0); + wxFileOffset len = in.GetLength(); + + // try flipping one byte in the archive + int pos; + for (pos = 0; pos < len; pos++) { + char n = in[pos]; + in[pos] = ~n; + ExtractArchive(in); + in.Rewind(); + in[pos] = n; + } + + // try zeroing one byte in the archive + for (pos = 0; pos < len; pos++) { + char n = in[pos]; + in[pos] = 0; + ExtractArchive(in); + in.Rewind(); + in[pos] = n; + } + + // try chopping the archive off + for (int size = 1; size <= len; size++) { + in.Chop(size); + ExtractArchive(in); + in.Rewind(); + } +} + +void CorruptionTestCase::CreateArchive(wxOutputStream& out) +{ + auto_ptr arc(m_factory->NewStream(out)); + + arc->PutNextDirEntry(_T("dir")); + arc->PutNextEntry(_T("file")); + arc->Write(_T("foo"), 3); +} + +void CorruptionTestCase::ExtractArchive(wxInputStream& in) +{ + auto_ptr arc(m_factory->NewStream(in)); + auto_ptr entry(arc->GetNextEntry()); + + while (entry.get() != NULL) { + char buf[1024]; + + while (arc->IsOk()) + arc->Read(buf, sizeof(buf)); + + auto_ptr next(arc->GetNextEntry()); + entry = next; + } +} + + /////////////////////////////////////////////////////////////////////////////// // Make the ids @@ -1177,7 +1265,7 @@ int TestId::m_seed = 6219; string TestId::MakeId() { m_seed = (m_seed * 171) % 30269; - return wxString::Format(_T("%-6d"), m_seed).mb_str(); + return string(wxString::Format(_T("%-6d"), m_seed).mb_str()); } @@ -1240,6 +1328,23 @@ ArchiveTestSuite *ArchiveTestSuite::makeSuite() addTest(test); } + for (int options = 0; options <= PipeIn; options += PipeIn) + { + wxObject *pObj = wxCreateDynamicObject(m_name + _T("ClassFactory")); + wxArchiveClassFactory *factory; + factory = wxDynamicCast(pObj, wxArchiveClassFactory); + + if (factory) { + string descr(m_name.mb_str()); + descr = "CorruptionTestCase (" + descr + ")"; + + if (options) + descr += " (PipeIn)"; + + addTest(new CorruptionTestCase(descr, factory, options)); + } + } + return this; } @@ -1290,7 +1395,7 @@ string ArchiveTestSuite::Description(const wxString& type, descr << optstr; - return (const char*)descr.mb_str(); + return string(descr.mb_str()); } @@ -1304,4 +1409,9 @@ template class ArchiveTestCase; template class ArchiveTestCase; #endif +#if wxUSE_TARSTREAM +#include "wx/tarstrm.h" +template class ArchiveTestCase; +#endif + #endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS