X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/95662a8379c192db4d8b4fcd9d404506ea302393..94e8d77cbb22041c133edaa00720dff0de45a68a:/tests/archive/archivetest.cpp diff --git a/tests/archive/archivetest.cpp b/tests/archive/archivetest.cpp index 5395d6c2f8..4178574e86 100644 --- a/tests/archive/archivetest.cpp +++ b/tests/archive/archivetest.cpp @@ -17,19 +17,15 @@ # include "wx/wx.h" #endif -#if wxUSE_STREAMS +#if wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS -#define WX_TEST_ARCHIVE_ITERATOR - -// This sample uses some advanced typedef syntax that messes -// up MSVC 6 - turn off its warning about it -#if defined _MSC_VER +// VC++ 6 warns that the list iterator's '->' operator will not work whenever +// std::list is used with a non-pointer, so switch it off. +#if defined _MSC_VER && _MSC_VER < 1300 #pragma warning (disable:4284) #endif -#include "wx/zipstrm.h" -#include "wx/mstream.h" -#include "wx/wfstream.h" +#include "archivetest.h" #include "wx/dir.h" #include #include @@ -46,7 +42,7 @@ using std::auto_ptr; (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) # define WXARC_MEMBER_TEMPLATES #endif -#if defined _MSC_VER && _MSC_VER >= 1310 +#if defined _MSC_VER && _MSC_VER >= 1310 && !defined __WIN64__ # define WXARC_MEMBER_TEMPLATES #endif #if defined __BORLANDC__ && __BORLANDC__ >= 0x530 @@ -66,82 +62,16 @@ using std::auto_ptr; #endif -/////////////////////////////////////////////////////////////////////////////// -// Bit flags for options for the tests - -enum Options -{ - PipeIn = 0x01, // input streams are non-seekable - PipeOut = 0x02, // output streams are non-seekable - Stub = 0x04, // the archive should be appended to a stub - AllOptions = 0x07 -}; - - -/////////////////////////////////////////////////////////////////////////////// -// These structs are passed as the template parameter of the test case to -// specify a set of classes to use in the test. This allows either the generic -// wxArchiveXXX interface to be exercised or the specific interface for a -// particular archive format e.g. wxZipXXX. - -struct ArchiveClasses -{ - typedef wxArchiveEntry EntryT; - typedef wxArchiveInputStream InputStreamT; - typedef wxArchiveOutputStream OutputStreamT; - typedef wxArchiveClassFactory ClassFactoryT; - typedef wxArchiveNotifier NotifierT; - typedef wxArchiveIter IterT; - typedef wxArchivePairIter PairIterT; -}; - -struct ZipClasses -{ - typedef wxZipEntry EntryT; - typedef wxZipInputStream InputStreamT; - typedef wxZipOutputStream OutputStreamT; - typedef wxZipClassFactory ClassFactoryT; - typedef wxZipNotifier NotifierT; - typedef wxZipIter IterT; - typedef wxZipPairIter PairIterT; -}; - - /////////////////////////////////////////////////////////////////////////////// // A class to hold a test entry -class TestEntry -{ -public: - TestEntry(const wxDateTime& dt, int len, const char *data); - ~TestEntry() { delete [] (char*) m_data; } - - wxDateTime GetDateTime() const { return m_dt; } - wxFileOffset GetLength() const { return m_len; } - size_t GetSize() const { return m_len; } - const char *GetData() const { return m_data; } - wxString GetComment() const { return m_comment; } - bool IsText() const { return m_isText; } - - void SetComment(const wxString& comment) { m_comment = comment; } - void SetDateTime(const wxDateTime& dt) { m_dt = dt; } - -private: - wxDateTime m_dt; - size_t m_len; - const char *m_data; - wxString m_comment; - bool m_isText; -}; - TestEntry::TestEntry(const wxDateTime& dt, int len, const char *data) : m_dt(dt), m_len(len), m_isText(len > 0) { - char *d = new char[len]; - memcpy(d, data, len); - m_data = d; + m_data = new char[len]; + memcpy(m_data, data, len); for (int i = 0; i < len && m_isText; i++) m_isText = (signed char)m_data[i] > 0; @@ -152,34 +82,9 @@ TestEntry::TestEntry(const wxDateTime& dt, int len, const char *data) // TestOutputStream and TestInputStream are memory streams which can be // seekable or non-seekable. -class TestOutputStream : public wxOutputStream -{ -public: - TestOutputStream(int options); - - ~TestOutputStream() { delete [] m_data; } - - int GetOptions() const { return m_options; } - wxFileOffset GetLength() const { return m_size; } - - // gives away the data, this stream is then empty, and can be reused - void GetData(const char*& data, size_t& size); - - enum { STUB_SIZE = 2048, INITIAL_SIZE = 0x18000, SEEK_LIMIT = 0x100000 }; - -private: - void Init(); - - wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); - wxFileOffset OnSysTell() const; - size_t OnSysWrite(const void *buffer, size_t size); - - int m_options; - size_t m_pos; - size_t m_capacity; - size_t m_size; - char *m_data; -}; +const size_t STUB_SIZE = 2048; +const size_t INITIAL_SIZE = 0x18000; +const wxFileOffset SEEK_LIMIT = 0x100000; TestOutputStream::TestOutputStream(int options) : m_options(options) @@ -256,7 +161,7 @@ size_t TestOutputStream::OnSysWrite(const void *buffer, size_t size) return size; } -void TestOutputStream::GetData(const char*& data, size_t& size) +void TestOutputStream::GetData(char*& data, size_t& size) { data = m_data; size = m_size; @@ -282,44 +187,25 @@ void TestOutputStream::GetData(const char*& data, size_t& size) Reset(); } -class TestInputStream : public wxInputStream -{ -public: - // ctor takes the data from the output stream, which is then empty - TestInputStream(TestOutputStream& out) : m_data(NULL) { SetData(out); } - // this ctor 'dups' - TestInputStream(const TestInputStream& in); - ~TestInputStream() { delete [] (char*) m_data; } - - void Rewind(); - wxFileOffset GetLength() const { return m_size; } - void SetData(TestOutputStream& out); -private: - wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); - wxFileOffset OnSysTell() const; - size_t OnSysRead(void *buffer, size_t size); - - int m_options; - size_t m_pos; - size_t m_size; - const char *m_data; -}; +/////////////////////////////////////////////////////////////////////////////// +// TestOutputStream and TestInputStream are memory streams which can be +// seekable or non-seekable. TestInputStream::TestInputStream(const TestInputStream& in) - : m_options(in.m_options), + : wxInputStream(), + m_options(in.m_options), m_pos(in.m_pos), m_size(in.m_size) { - char *p = new char[m_size]; - memcpy(p, in.m_data, m_size); - m_data = p; + m_data = new char[m_size]; + memcpy(m_data, in.m_data, m_size); } void TestInputStream::Rewind() { if ((m_options & Stub) && (m_options & PipeIn)) - m_pos = TestOutputStream::STUB_SIZE * 2; + m_pos = STUB_SIZE * 2; else m_pos = 0; @@ -333,7 +219,7 @@ void TestInputStream::Rewind() void TestInputStream::SetData(TestOutputStream& out) { - delete [] (char*) m_data; + delete [] m_data; m_options = out.GetOptions(); out.GetData(m_data, m_size); Rewind(); @@ -348,7 +234,7 @@ wxFileOffset TestInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) case wxFromCurrent: pos += m_pos; break; case wxFromEnd: pos += m_size; break; } - if (pos < 0 || pos > TestOutputStream::SEEK_LIMIT) + if (pos < 0 || pos > SEEK_LIMIT) return wxInvalidOffset; m_pos = (size_t)pos; return m_pos; @@ -434,7 +320,7 @@ private: TempDir::TempDir() { wxString tmp = wxFileName::CreateTempFileName(_T("arctest-")); - if (tmp != wxEmptyString) { + if (!tmp.empty()) { wxRemoveFile(tmp); m_original = wxGetCwd(); CPPUNIT_ASSERT(wxMkdir(tmp, 0700)); @@ -445,7 +331,7 @@ TempDir::TempDir() TempDir::~TempDir() { - if (m_tmp != wxEmptyString) { + if (!m_tmp.empty()) { wxSetWorkingDirectory(m_original); RemoveDir(m_tmp); } @@ -511,143 +397,60 @@ void TempDir::RemoveDir(wxString& path) # define WXARC_b #endif -class PFileInputStream : public wxFFileInputStream +PFileInputStream::PFileInputStream(const wxString& cmd) + : wxFFileInputStream(WXARC_popen(cmd.mb_str(), "r" WXARC_b)) { -public: - PFileInputStream(const wxString& cmd) : - wxFFileInputStream(WXARC_popen(cmd.mb_str(), "r" WXARC_b)) { } - ~PFileInputStream() - { WXARC_pclose(m_file->fp()); m_file->Detach(); } -}; +} -class PFileOutputStream : public wxFFileOutputStream +PFileInputStream::~PFileInputStream() { -public: - PFileOutputStream(const wxString& cmd) : - wxFFileOutputStream(WXARC_popen(cmd.mb_str(), "w" WXARC_b)) { } - ~PFileOutputStream() - { WXARC_pclose(m_file->fp()); m_file->Detach(); } -}; + WXARC_pclose(m_file->fp()); m_file->Detach(); +} + +PFileOutputStream::PFileOutputStream(const wxString& cmd) +: wxFFileOutputStream(WXARC_popen(cmd.mb_str(), "w" WXARC_b)) +{ +} + +PFileOutputStream::~PFileOutputStream() +{ + WXARC_pclose(m_file->fp()); m_file->Detach(); +} /////////////////////////////////////////////////////////////////////////////// // The test case -template -class ArchiveTestCase : public CppUnit::TestCase -{ -public: - ArchiveTestCase(string name, - int id, - wxArchiveClassFactory *factory, - int options, - const wxString& archiver = wxEmptyString, - const wxString& unarchiver = wxEmptyString); - - ~ArchiveTestCase(); - -protected: - // the classes to test - typedef typename Classes::EntryT EntryT; - typedef typename Classes::InputStreamT InputStreamT; - typedef typename Classes::OutputStreamT OutputStreamT; - typedef typename Classes::ClassFactoryT ClassFactoryT; - typedef typename Classes::NotifierT NotifierT; - typedef typename Classes::IterT IterT; - typedef typename Classes::PairIterT PairIterT; - - // the entry point for the test - void runTest(); - - // create the test data - void CreateTestData(); - TestEntry& Add(const char *name, const char *data, int len = -1); - TestEntry& Add(const char *name, int len = 0, int value = EOF); - - // 'archive up' the test data - void CreateArchive(wxOutputStream& out); - void CreateArchive(wxOutputStream& out, const wxString& archiver); - - // perform various modifications on the archive - void ModifyArchive(wxInputStream& in, wxOutputStream& out); - - // extract the archive and verify its contents - void ExtractArchive(wxInputStream& in); - void ExtractArchive(wxInputStream& in, const wxString& unarchiver); - void VerifyDir(wxString& path, size_t rootlen = 0); - - // tests for the iterators - void TestIterator(wxInputStream& in); - void TestPairIterator(wxInputStream& in); - void TestSmartIterator(wxInputStream& in); - void TestSmartPairIterator(wxInputStream& in); - - // try reading two entries at the same time - void ReadSimultaneous(TestInputStream& in); - - // overridables - virtual void OnCreateArchive(OutputStreamT& WXUNUSED(arc)) { } - virtual void OnSetNotifier(EntryT& entry); - - virtual void OnArchiveExtracted(InputStreamT& WXUNUSED(arc), - int WXUNUSED(expectedTotal)) { } - - virtual void OnCreateEntry( OutputStreamT& WXUNUSED(arc), - TestEntry& WXUNUSED(testEntry), - EntryT *entry = NULL) { (void)entry; } - - virtual void OnEntryExtracted( EntryT& WXUNUSED(entry), - const TestEntry& WXUNUSED(testEntry), - InputStreamT *arc = NULL) { (void)arc; } - - typedef std::map TestEntries; - TestEntries m_testEntries; // test data - auto_ptr m_factory; // factory to make classes - int m_options; // test options - wxDateTime m_timeStamp; // timestamp to give test entries - int m_id; // select between the possibilites - wxString m_archiver; // external archiver - wxString m_unarchiver; // external unarchiver -}; - -// Constructor -// The only way I could get this to compile on VC++ 5.0 was to pass 'factory' -// as a wxArchiveFactory* then cast it, even then only with some ifdefing. -// -template -ArchiveTestCase::ArchiveTestCase( +template +ArchiveTestCase::ArchiveTestCase( string name, int id, - wxArchiveClassFactory *factory, + ClassFactoryT *factory, int options, const wxString& archiver, const wxString& unarchiver) : CppUnit::TestCase(name), -#if defined _MSC_VER && _MSC_VER < 1300 - m_factory(dynamic_cast(factory)), -#else - m_factory(dynamic_cast(factory)), -#endif + m_factory(factory), m_options(options), - m_timeStamp(1, wxDateTime::Mar, 2005, 12, 0), + m_timeStamp(1, wxDateTime::Mar, 2004, 12, 0), m_id(id), m_archiver(archiver), m_unarchiver(unarchiver) { wxASSERT(m_factory.get() != NULL); } - -template -ArchiveTestCase::~ArchiveTestCase() + +template +ArchiveTestCase::~ArchiveTestCase() { TestEntries::iterator it; for (it = m_testEntries.begin(); it != m_testEntries.end(); ++it) delete it->second; } -template -void ArchiveTestCase::runTest() +template +void ArchiveTestCase::runTest() { TestOutputStream out(m_options); @@ -684,13 +487,13 @@ void ArchiveTestCase::runTest() ExtractArchive(in); else ExtractArchive(in, m_unarchiver); - + // check that all the test entries were found in the archive CPPUNIT_ASSERT(m_testEntries.empty()); } -template -void ArchiveTestCase::CreateTestData() +template +void ArchiveTestCase::CreateTestData() { Add("text/"); Add("text/empty", ""); @@ -713,10 +516,10 @@ void ArchiveTestCase::CreateTestData() Add("empty/"); } -template -TestEntry& ArchiveTestCase::Add(const char *name, - const char *data, - int len /*=-1*/) +template +TestEntry& ArchiveTestCase::Add(const char *name, + const char *data, + int len /*=-1*/) { if (len == -1) len = strlen(data); @@ -727,21 +530,21 @@ TestEntry& ArchiveTestCase::Add(const char *name, return *entry; } -template -TestEntry& ArchiveTestCase::Add(const char *name, - int len /*=0*/, - int value /*=EOF*/) +template +TestEntry& ArchiveTestCase::Add(const char *name, + int len /*=0*/, + int value /*=EOF*/) { wxCharBuffer buf(len); for (int i = 0; i < len; i++) - buf.data()[i] = value == EOF ? rand() : value; + buf.data()[i] = (char)(value == EOF ? rand() : value); return Add(name, buf, len); } // Create an archive using the wx archive classes, write it to 'out' // -template -void ArchiveTestCase::CreateArchive(wxOutputStream& out) +template +void ArchiveTestCase::CreateArchive(wxOutputStream& out) { auto_ptr arc(m_factory->NewStream(out)); TestEntries::iterator it; @@ -793,7 +596,7 @@ void ArchiveTestCase::CreateArchive(wxOutputStream& out) testEntry.GetLength())); } - if (name.Last() != _T('/')) { + if (it->first.Last() != _T('/')) { // for non-dirs write the data arc->Write(testEntry.GetData(), testEntry.GetSize()); CPPUNIT_ASSERT_MESSAGE("LastWrite check" + error_context, @@ -814,9 +617,9 @@ void ArchiveTestCase::CreateArchive(wxOutputStream& out) // Create an archive using an external archive program // -template -void ArchiveTestCase::CreateArchive(wxOutputStream& out, - const wxString& archiver) +template +void ArchiveTestCase::CreateArchive(wxOutputStream& out, + const wxString& archiver) { // for an external archiver the test data need to be written to // temp files @@ -852,7 +655,7 @@ void ArchiveTestCase::CreateArchive(wxOutputStream& out, if ((m_options & PipeOut) == 0) { wxFileName fn(tmpdir.GetName()); fn.SetExt(_T("arc")); - wxString tmparc = fn.GetFullPath(); + wxString tmparc = fn.GetPath(wxPATH_GET_SEPARATOR) + fn.GetFullName(); // call the archiver to create an archive file system(wxString::Format(archiver, tmparc.c_str()).mb_str()); @@ -878,13 +681,13 @@ void ArchiveTestCase::CreateArchive(wxOutputStream& out, // Do a standard set of modification on an archive, delete an entry, // rename an entry and add an entry // -template -void ArchiveTestCase::ModifyArchive(wxInputStream& in, - wxOutputStream& out) +template +void ArchiveTestCase::ModifyArchive(wxInputStream& in, + wxOutputStream& out) { auto_ptr arcIn(m_factory->NewStream(in)); auto_ptr arcOut(m_factory->NewStream(out)); - ; + EntryT *pEntry; const wxString deleteName = _T("bin/bin1000"); const wxString renameFrom = _T("zero/zero1024"); @@ -894,14 +697,10 @@ void ArchiveTestCase::ModifyArchive(wxInputStream& in, arcOut->CopyArchiveMetaData(*arcIn); - auto_ptr* pEntry; - - for (pEntry = new auto_ptr(arcIn->GetNextEntry()) ; - pEntry->get() != NULL ; - delete pEntry, pEntry = new auto_ptr(arcIn->GetNextEntry())) - { - OnSetNotifier(**pEntry); - wxString name = (*pEntry)->GetName(wxPATH_UNIX); + while ((pEntry = arcIn->GetNextEntry()) != NULL) { + auto_ptr entry(pEntry); + OnSetNotifier(*entry); + wxString name = entry->GetName(wxPATH_UNIX); // provide some context for the error message so that we know which // iteration of the loop we were on @@ -919,7 +718,7 @@ void ArchiveTestCase::ModifyArchive(wxInputStream& in, } else { if (name == renameFrom) { - (*pEntry)->SetName(renameTo); + entry->SetName(renameTo); TestEntries::iterator it = m_testEntries.find(renameFrom); CPPUNIT_ASSERT_MESSAGE( "rename failed (already renamed?) for" + error_entry, @@ -930,12 +729,10 @@ void ArchiveTestCase::ModifyArchive(wxInputStream& in, } CPPUNIT_ASSERT_MESSAGE("CopyEntry" + error_context, - arcOut->CopyEntry(pEntry->release(), *arcIn)); + arcOut->CopyEntry(entry.release(), *arcIn)); } } - delete pEntry; - // check that the deletion and rename were done CPPUNIT_ASSERT(m_testEntries.count(deleteName) == 0); CPPUNIT_ASSERT(m_testEntries.count(renameFrom) == 0); @@ -962,8 +759,8 @@ void ArchiveTestCase::ModifyArchive(wxInputStream& in, // Extract an archive using the wx archive classes // -template -void ArchiveTestCase::ExtractArchive(wxInputStream& in) +template +void ArchiveTestCase::ExtractArchive(wxInputStream& in) { typedef Ptr EntryPtr; typedef std::list Entries; @@ -1057,9 +854,9 @@ void ArchiveTestCase::ExtractArchive(wxInputStream& in) // Extract an archive using an external unarchive program // -template -void ArchiveTestCase::ExtractArchive(wxInputStream& in, - const wxString& unarchiver) +template +void ArchiveTestCase::ExtractArchive(wxInputStream& in, + const wxString& unarchiver) { // for an external unarchiver, unarchive to a tempdir TempDir tmpdir; @@ -1067,10 +864,10 @@ void ArchiveTestCase::ExtractArchive(wxInputStream& in, if ((m_options & PipeIn) == 0) { wxFileName fn(tmpdir.GetName()); fn.SetExt(_T("arc")); - wxString tmparc = fn.GetFullPath(); - + wxString tmparc = fn.GetPath(wxPATH_GET_SEPARATOR) + fn.GetFullName(); + if (m_options & Stub) - in.SeekI(TestOutputStream::STUB_SIZE * 2); + in.SeekI(STUB_SIZE * 2); // write the archive to a temporary file { @@ -1097,8 +894,9 @@ void ArchiveTestCase::ExtractArchive(wxInputStream& in, // Verifies the files produced by an external unarchiver are as expected // -template -void ArchiveTestCase::VerifyDir(wxString& path, size_t rootlen /*=0*/) +template +void ArchiveTestCase::VerifyDir(wxString& path, + size_t rootlen /*=0*/) { wxDir dir; path += wxFileName::GetPathSeparator(); @@ -1141,7 +939,7 @@ void ArchiveTestCase::VerifyDir(wxString& path, size_t rootlen /*=0*/) CPPUNIT_ASSERT_MESSAGE( "entry not found in archive" + error_entry, in.Ok()); - size_t size = in.GetLength(); + size_t size = (size_t)in.GetLength(); wxCharBuffer buf(size); CPPUNIT_ASSERT_MESSAGE("Read" + error_context, in.Read(buf.data(), size).LastRead() == size); @@ -1163,8 +961,8 @@ void ArchiveTestCase::VerifyDir(wxString& path, size_t rootlen /*=0*/) // test the simple iterators that give away ownership of an entry // -template -void ArchiveTestCase::TestIterator(wxInputStream& in) +template +void ArchiveTestCase::TestIterator(wxInputStream& in) { typedef std::list ArchiveCatalog; typedef typename ArchiveCatalog::iterator CatalogIter; @@ -1192,8 +990,8 @@ void ArchiveTestCase::TestIterator(wxInputStream& in) // test the pair iterators that can be used to load a std::map or wxHashMap // these also give away ownership of entries // -template -void ArchiveTestCase::TestPairIterator(wxInputStream& in) +template +void ArchiveTestCase::TestPairIterator(wxInputStream& in) { typedef std::map ArchiveCatalog; typedef typename ArchiveCatalog::iterator CatalogIter; @@ -1220,8 +1018,8 @@ void ArchiveTestCase::TestPairIterator(wxInputStream& in) // simple iterators using smart pointers, no need to worry about ownership // -template -void ArchiveTestCase::TestSmartIterator(wxInputStream& in) +template +void ArchiveTestCase::TestSmartIterator(wxInputStream& in) { typedef std::list > ArchiveCatalog; typedef typename ArchiveCatalog::iterator CatalogIter; @@ -1245,9 +1043,14 @@ void ArchiveTestCase::TestSmartIterator(wxInputStream& in) // pair iterator using smart pointers // -template -void ArchiveTestCase::TestSmartPairIterator(wxInputStream& in) +template +void ArchiveTestCase::TestSmartPairIterator(wxInputStream& in) { +#if defined _MSC_VER && defined _MSC_VER < 1200 + // With VC++ 5.0 the '=' operator of std::pair breaks when the second + // type is Ptr, so this iterator can't be made to work. + (void)in; +#else typedef std::map > ArchiveCatalog; typedef typename ArchiveCatalog::iterator CatalogIter; typedef wxArchiveIterator::TestSmartPairIterator(wxInputStream& in) for (CatalogIter it = cat.begin(); it != cat.end(); ++it) CPPUNIT_ASSERT(m_testEntries.count(it->second->GetName(wxPATH_UNIX))); +#endif } // try reading two entries at the same time // -template -void ArchiveTestCase::ReadSimultaneous(TestInputStream& in) +template +void ArchiveTestCase::ReadSimultaneous(TestInputStream& in) { typedef std::map > ArchiveCatalog; typedef wxArchiveIterator -void ArchiveTestCase::OnSetNotifier(EntryT& entry) +template +void ArchiveTestCase::OnSetNotifier(EntryT& entry) { static ArchiveNotifier notifier; entry.SetNotifier(notifier); @@ -1353,211 +1157,17 @@ void ArchiveTestCase::OnSetNotifier(EntryT& entry) /////////////////////////////////////////////////////////////////////////////// -// ArchiveTestCase could be used directly, but instead this -// derived class is used so that zip specific features can be tested. - -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, - options, archiver, unarchiver), - m_count(0) - { } - -protected: - void OnCreateArchive(wxZipOutputStream& zip); - - void OnArchiveExtracted(wxZipInputStream& zip, int expectedTotal); - - void OnCreateEntry(wxZipOutputStream& zip, - TestEntry& testEntry, - wxZipEntry *entry); - - void OnEntryExtracted(wxZipEntry& entry, - const TestEntry& testEntry, - wxZipInputStream *arc); - - void OnSetNotifier(EntryT& entry); - - int m_count; - wxString m_comment; -}; - -void ZipTestCase::OnCreateArchive(wxZipOutputStream& zip) -{ - m_comment << _T("Comment for test ") << m_id; - zip.SetComment(m_comment); -} - -void ZipTestCase::OnArchiveExtracted(wxZipInputStream& zip, int expectedTotal) -{ - CPPUNIT_ASSERT(zip.GetComment() == m_comment); - CPPUNIT_ASSERT(zip.GetTotalEntries() == expectedTotal); -} - -void ZipTestCase::OnCreateEntry(wxZipOutputStream& zip, - TestEntry& testEntry, - wxZipEntry *entry) -{ - zip.SetLevel((m_id + m_count) % 10); - - if (entry) { - switch ((m_id + m_count) % 5) { - case 0: - { - wxString comment = _T("Comment for ") + entry->GetName(); - entry->SetComment(comment); - // lowercase the expected result, and the notifier should do - // the same for the zip entries when ModifyArchive() runs - testEntry.SetComment(comment.Lower()); - break; - } - case 2: - entry->SetMethod(wxZIP_METHOD_STORE); - break; - case 4: - entry->SetMethod(wxZIP_METHOD_DEFLATE); - break; - } - entry->SetIsText(testEntry.IsText()); - } - - m_count++; -} - -void ZipTestCase::OnEntryExtracted(wxZipEntry& entry, - const TestEntry& testEntry, - wxZipInputStream *arc) -{ - // provide some context for the error message so that we know which - // iteration of the loop we were on - wxString name = _T(" '") + entry.GetName() + _T("'"); - string error_entry(name.mb_str()); - string error_context(" failed for entry" + error_entry); - - CPPUNIT_ASSERT_MESSAGE("GetComment" + error_context, - entry.GetComment() == testEntry.GetComment()); - - // for seekable streams, GetNextEntry() doesn't read the local header so - // call OpenEntry() to do it - if (arc && (m_options & PipeIn) == 0 && entry.IsDir()) - arc->OpenEntry(entry); - - CPPUNIT_ASSERT_MESSAGE("IsText" + error_context, - entry.IsText() == testEntry.IsText()); - - CPPUNIT_ASSERT_MESSAGE("Extra/LocalExtra mismatch for entry" + error_entry, - (entry.GetExtraLen() != 0 && entry.GetLocalExtraLen() != 0) || - (entry.GetExtraLen() == 0 && entry.GetLocalExtraLen() == 0)); -} - -// check the notifier mechanism by using it to fold the entry comments to -// lowercase -// -class ZipNotifier : public wxZipNotifier -{ -public: - void OnEntryUpdated(wxZipEntry& entry); -}; - -void ZipNotifier::OnEntryUpdated(wxZipEntry& entry) -{ - entry.SetComment(entry.GetComment().Lower()); -} - -void ZipTestCase::OnSetNotifier(EntryT& entry) -{ - static ZipNotifier notifier; - entry.SetNotifier(notifier); -} - - -/////////////////////////////////////////////////////////////////////////////// -// 'zip - -' produces local headers without the size field set. This is a -// case not covered by all the other tests, so this class tests it as a -// special case - -class ZipPipeTestCase : public CppUnit::TestCase -{ -public: - ZipPipeTestCase(string name, int options) : - CppUnit::TestCase(name), m_options(options) { } - -protected: - void runTest(); - int m_options; -}; - -void ZipPipeTestCase::runTest() -{ - TestOutputStream out(m_options); - - wxString testdata = _T("test data to pipe through zip"); - wxString cmd = _T("echo ") + testdata + _T(" | zip -q - -"); - - { - PFileInputStream in(cmd); - if (in.Ok()) - out.Write(in); - } - - TestInputStream in(out); - wxZipInputStream zip(in); - - auto_ptr entry(zip.GetNextEntry()); - CPPUNIT_ASSERT(entry.get() != NULL); - - if ((m_options & PipeIn) == 0) - CPPUNIT_ASSERT(entry->GetSize() != wxInvalidOffset); - - char buf[64]; - size_t len = zip.Read(buf, sizeof(buf) - 1).LastRead(); - - while (len > 0 && buf[len - 1] <= 32) - --len; - buf[len] = 0; - - CPPUNIT_ASSERT(zip.Eof()); - CPPUNIT_ASSERT(wxString(buf, *wxConvCurrent) == testdata); -} - - -/////////////////////////////////////////////////////////////////////////////// -// The suite - -class ArchiveTestSuite : public CppUnit::TestSuite -{ -public: - ArchiveTestSuite(); - static CppUnit::Test *suite() - { return (new ArchiveTestSuite)->makeSuite(); } - -private: - int m_id; - wxPathList m_path; - - ArchiveTestSuite *makeSuite(); - void AddCmd(wxArrayString& cmdlist, const wxString& cmd); - bool IsInPath(const wxString& cmd); - - string Description(const wxString& type, - int options, - bool genericInterface = false, - const wxString& archiver = wxEmptyString, - const wxString& unarchiver = wxEmptyString); -}; +// Suite base -ArchiveTestSuite::ArchiveTestSuite() - : CppUnit::TestSuite("ArchiveTestSuite"), - m_id(0) +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(); m_path.AddEnvList(_T("PATH")); + m_archivers.push_back(_T("")); + m_unarchivers.push_back(_T("")); } // add the command for an external archiver to the list, testing for it in @@ -1565,8 +1175,6 @@ ArchiveTestSuite::ArchiveTestSuite() // void ArchiveTestSuite::AddCmd(wxArrayString& cmdlist, const wxString& cmd) { - if (cmdlist.empty()) - cmdlist.push_back(_T("")); if (IsInPath(cmd)) cmdlist.push_back(cmd); } @@ -1585,52 +1193,45 @@ bool ArchiveTestSuite::IsInPath(const wxString& cmd) ArchiveTestSuite *ArchiveTestSuite::makeSuite() { typedef wxArrayString::iterator Iter; - wxArrayString zippers; - wxArrayString unzippers; - AddCmd(zippers, _T("zip -qr %s *")); - AddCmd(unzippers, _T("unzip -q %s")); - - for (int genInterface = 0; genInterface < 2; genInterface++) - for (Iter i = unzippers.begin(); i != unzippers.end(); ++i) - for (Iter j = zippers.begin(); j != zippers.end(); ++j) + for (int generic = 0; generic < 2; generic++) + for (Iter i = m_unarchivers.begin(); i != m_unarchivers.end(); ++i) + for (Iter j = m_archivers.begin(); j != m_archivers.end(); ++j) for (int options = 0; options <= AllOptions; options++) { - // unzip doesn't support piping in the zip +#ifdef WXARC_NO_POPEN + // if no popen then can't pipe in/out of archiver if ((options & PipeIn) && !i->empty()) continue; -#ifdef WXARC_NO_POPEN - // if no popen then can use piped output of zip if ((options & PipeOut) && !j->empty()) continue; #endif - string name = Description(_T("wxZip"), options, - genInterface != 0, *j, *i); - - if (genInterface) - addTest(new ArchiveTestCase( - name, m_id, - new wxZipClassFactory, - options, *j, *i)); - else - addTest(new ZipTestCase(name, m_id, options, *j, *i)); - - m_id++; - } + string descr = Description(m_name, options, + generic != 0, *j, *i); -#ifndef WXARC_NO_POPEN - // if have popen then can check the piped output of 'zip - -' - if (IsInPath(_T("zip"))) - for (int options = 0; options <= PipeIn; options += PipeIn) { - string name = Description(_T("ZipPipeTestCase"), options); - addTest(new ZipPipeTestCase(name, options)); - m_id++; - } -#endif + CppUnit::Test *test = makeTest(descr, m_id, options, + generic != 0, *j, *i); + + if (test) { + addTest(test); + m_id++; + } + } return this; } +CppUnit::Test *ArchiveTestSuite::makeTest( + string WXUNUSED(descr), + int WXUNUSED(id), + int WXUNUSED(options), + bool WXUNUSED(genericInterface), + const wxString& WXUNUSED(archiver), + const wxString& WXUNUSED(unarchiver)) +{ + return NULL; +} + // make a display string for the option bits // string ArchiveTestSuite::Description(const wxString& type, @@ -1641,17 +1242,21 @@ string ArchiveTestSuite::Description(const wxString& type, { wxString descr; descr << m_id << _T(" "); - + if (genericInterface) descr << _T("wxArchive (") << type << _T(")"); else descr << type; - if (!archiver.empty()) - descr << _T(" ") << archiver.BeforeFirst(_T(' ')); - if (!unarchiver.empty()) - descr << _T(" ") << unarchiver.BeforeFirst(_T(' ')); - + if (!archiver.empty()) { + const wxChar *fn = (options & PipeOut) != 0 ? _T("-") : _T("file"); + descr << _T(" (") << wxString::Format(archiver, fn) << _T(")"); + } + if (!unarchiver.empty()) { + const wxChar *fn = (options & PipeIn) != 0 ? _T("-") : _T("file"); + descr << _T(" (") << wxString::Format(unarchiver, fn) << _T(")"); + } + wxString optstr; if ((options & PipeIn) != 0) @@ -1668,10 +1273,15 @@ string ArchiveTestSuite::Description(const wxString& type, return (const char*)descr.mb_str(); } -// register in the unnamed registry so that these tests are run by default -CPPUNIT_TEST_SUITE_REGISTRATION(ArchiveTestSuite); -// also include in it's own registry so that these tests can be run alone -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ArchiveTestSuite, "ArchiveTestSuite"); +/////////////////////////////////////////////////////////////////////////////// +// Instantiations + +template class ArchiveTestCase; + +#if wxUSE_ZIPSTREAM +#include "wx/zipstrm.h" +template class ArchiveTestCase; +#endif -#endif // wxUSE_STREAMS +#endif // wxUSE_STREAMS && wxUSE_ARCHIVE_STREAMS