| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 | 
							- ///////////////////////////////////////////////////////////////////////////////
 
- // Name:        tests/archive/ziptest.cpp
 
- // Purpose:     Test the zip classes
 
- // Author:      Mike Wetherell
 
- // Copyright:   (c) 2004 Mike Wetherell
 
- // Licence:     wxWindows licence
 
- ///////////////////////////////////////////////////////////////////////////////
 
- #include "testprec.h"
 
- #ifdef __BORLANDC__
 
- #   pragma hdrstop
 
- #endif
 
- #ifndef WX_PRECOMP
 
- #   include "wx/wx.h"
 
- #endif
 
- #if wxUSE_STREAMS && wxUSE_ZIPSTREAM
 
- #include "archivetest.h"
 
- #include "wx/zipstrm.h"
 
- using std::string;
 
- using std::auto_ptr;
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // ArchiveTestCase<wxZipClassFactory> could be used directly, but instead this
 
- // derived class is used so that zip specific features can be tested.
 
- class ZipTestCase : public ArchiveTestCase<wxZipClassFactory>
 
- {
 
- public:
 
-     ZipTestCase(string name,
 
-                 int options,
 
-                 const wxString& archiver = wxEmptyString,
 
-                 const wxString& unarchiver = wxEmptyString)
 
-     :
 
-         ArchiveTestCase<wxZipClassFactory>(name, 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 << wxT("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 = wxT("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 = wxT(" '") + entry.GetName() + wxT("'");
 
-     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(TestId::MakeId() + name),
 
-         m_options(options),
 
-         m_id(TestId::GetId())
 
-     { }
 
- protected:
 
-     void runTest();
 
-     int m_options;
 
-     int m_id;
 
- };
 
- void ZipPipeTestCase::runTest()
 
- {
 
-     TestOutputStream out(m_options);
 
-     wxString testdata = wxT("test data to pipe through zip");
 
-     wxString cmd = wxT("echo ") + testdata + wxT(" | zip -q - -");
 
-     {
 
-         PFileInputStream in(cmd);
 
-         if (in.IsOk())
 
-             out.Write(in);
 
-     }
 
-     TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3));
 
-     wxZipInputStream zip(in);
 
-     auto_ptr<wxZipEntry> 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);
 
- }
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // Zip suite 
 
- class ziptest : public ArchiveTestSuite
 
- {
 
- public:
 
-     ziptest();
 
-     static CppUnit::Test *suite() { return (new ziptest)->makeSuite(); }
 
- protected:
 
-     ArchiveTestSuite *makeSuite();
 
-     CppUnit::Test *makeTest(string descr, int options,
 
-                             bool genericInterface, const wxString& archiver,
 
-                             const wxString& unarchiver);
 
- };
 
- ziptest::ziptest()
 
-   : ArchiveTestSuite("zip")
 
- {
 
-     AddArchiver(wxT("zip -qr %s *"));
 
-     AddUnArchiver(wxT("unzip -q %s"));
 
- }
 
- ArchiveTestSuite *ziptest::makeSuite()
 
- {
 
-     ArchiveTestSuite::makeSuite();
 
- #if 0
 
-     // zip doesn't support this any more so disabled
 
-     if (IsInPath(wxT("zip")))
 
-         for (int options = 0; options <= PipeIn; options += PipeIn) {
 
-             string name = Description(wxT("ZipPipeTestCase"), options,
 
-                                       false, wxT(""), wxT("zip -q - -"));
 
-             addTest(new ZipPipeTestCase(name, options));
 
-         }
 
- #endif
 
-     return this;
 
- }
 
- CppUnit::Test *ziptest::makeTest(
 
-     string descr,
 
-     int   options,
 
-     bool  genericInterface,
 
-     const wxString& archiver,
 
-     const wxString& unarchiver)
 
- {
 
-     // unzip doesn't support piping in the zip
 
-     if ((options & PipeIn) && !unarchiver.empty())
 
-         return NULL;
 
-     if (genericInterface)
 
-     {
 
-         return new ArchiveTestCase<wxArchiveClassFactory>(
 
-                             descr, new wxZipClassFactory,
 
-                             options, archiver, unarchiver);
 
-     }
 
-     return new ZipTestCase(descr, options, archiver, unarchiver);
 
- }
 
- CPPUNIT_TEST_SUITE_REGISTRATION(ziptest);
 
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ziptest, "archive");
 
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ziptest, "archive/zip");
 
- #endif // wxUSE_STREAMS && wxUSE_ZIPSTREAM
 
 
  |