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
This commit is contained in:
Michael Wetherell
2005-12-18 13:58:55 +00:00
parent abffc1ff5d
commit 716e748b2f
3 changed files with 77 additions and 35 deletions

View File

@@ -196,7 +196,8 @@ TestInputStream::TestInputStream(const TestInputStream& in)
: wxInputStream(), : wxInputStream(),
m_options(in.m_options), m_options(in.m_options),
m_pos(in.m_pos), 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]; m_data = new char[m_size];
memcpy(m_data, in.m_data, 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) if (!IsOk() || !size)
return 0; return 0;
if (m_size <= m_pos) {
m_lasterror = wxSTREAM_EOF; size_t count;
return 0;
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) if (((m_eoftype & AtLast) != 0 && m_pos >= m_size) || count < size)
size = m_size - m_pos; if ((m_eoftype & WithError) != 0)
memcpy(buffer, m_data + m_pos, size); m_lasterror = wxSTREAM_READ_ERROR;
m_pos += size; else
return size; m_lasterror = wxSTREAM_EOF;
return count;
} }
@@ -424,17 +437,16 @@ PFileOutputStream::~PFileOutputStream()
template <class ClassFactoryT> template <class ClassFactoryT>
ArchiveTestCase<ClassFactoryT>::ArchiveTestCase( ArchiveTestCase<ClassFactoryT>::ArchiveTestCase(
string name, string name,
int id,
ClassFactoryT *factory, ClassFactoryT *factory,
int options, int options,
const wxString& archiver, const wxString& archiver,
const wxString& unarchiver) const wxString& unarchiver)
: :
CppUnit::TestCase(name), CppUnit::TestCase(TestId::MakeId() + name),
m_factory(factory), m_factory(factory),
m_options(options), m_options(options),
m_timeStamp(1, wxDateTime::Mar, 2004, 12, 0), m_timeStamp(1, wxDateTime::Mar, 2004, 12, 0),
m_id(id), m_id(TestId::GetId()),
m_archiver(archiver), m_archiver(archiver),
m_unarchiver(unarchiver) m_unarchiver(unarchiver)
{ {
@@ -464,7 +476,7 @@ void ArchiveTestCase<ClassFactoryT>::runTest()
// check archive could be created // check archive could be created
CPPUNIT_ASSERT(out.GetLength() > 0); CPPUNIT_ASSERT(out.GetLength() > 0);
TestInputStream in(out); TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3));
TestIterator(in); TestIterator(in);
in.Rewind(); in.Rewind();
@@ -929,7 +941,7 @@ void ArchiveTestCase<ClassFactoryT>::VerifyDir(wxString& path,
const TestEntry& testEntry = *it->second; const TestEntry& testEntry = *it->second;
#ifndef __WXMSW__ #if 0 //ndef __WXMSW__
CPPUNIT_ASSERT_MESSAGE("timestamp check" + error_context, CPPUNIT_ASSERT_MESSAGE("timestamp check" + error_context,
testEntry.GetDateTime() == testEntry.GetDateTime() ==
wxFileName(path).GetModificationTime()); wxFileName(path).GetModificationTime());
@@ -1156,12 +1168,24 @@ void ArchiveTestCase<ClassFactoryT>::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 // Suite base
ArchiveTestSuite::ArchiveTestSuite(string name) ArchiveTestSuite::ArchiveTestSuite(string name)
: CppUnit::TestSuite("archive/" + name), : CppUnit::TestSuite("archive/" + name),
m_id(0),
m_name(name.c_str(), *wxConvCurrent) m_name(name.c_str(), *wxConvCurrent)
{ {
m_name = _T("wx") + m_name.Left(1).Upper() + m_name.Mid(1).Lower(); 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, string descr = Description(m_name, options,
generic != 0, *j, *i); generic != 0, *j, *i);
CppUnit::Test *test = makeTest(descr, m_id, options, CppUnit::Test *test = makeTest(descr, options,
generic != 0, *j, *i); generic != 0, *j, *i);
if (test) { if (test)
addTest(test); addTest(test);
m_id++;
}
} }
return this; return this;
@@ -1223,7 +1245,6 @@ ArchiveTestSuite *ArchiveTestSuite::makeSuite()
CppUnit::Test *ArchiveTestSuite::makeTest( CppUnit::Test *ArchiveTestSuite::makeTest(
string WXUNUSED(descr), string WXUNUSED(descr),
int WXUNUSED(id),
int WXUNUSED(options), int WXUNUSED(options),
bool WXUNUSED(genericInterface), bool WXUNUSED(genericInterface),
const wxString& WXUNUSED(archiver), const wxString& WXUNUSED(archiver),
@@ -1241,7 +1262,6 @@ string ArchiveTestSuite::Description(const wxString& type,
const wxString& unarchiver) const wxString& unarchiver)
{ {
wxString descr; wxString descr;
descr << m_id << _T(" ");
if (genericInterface) if (genericInterface)
descr << _T("wxArchive (") << type << _T(")"); descr << _T("wxArchive (") << type << _T(")");

View File

@@ -60,8 +60,16 @@ private:
class TestInputStream : public wxInputStream class TestInputStream : public wxInputStream
{ {
public: 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 // 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' // this ctor 'dups'
TestInputStream(const TestInputStream& in); TestInputStream(const TestInputStream& in);
~TestInputStream() { delete [] m_data; } ~TestInputStream() { delete [] m_data; }
@@ -80,6 +88,7 @@ private:
size_t m_pos; size_t m_pos;
size_t m_size; size_t m_size;
char *m_data; char *m_data;
int m_eoftype;
}; };
@@ -137,7 +146,6 @@ class ArchiveTestCase : public CppUnit::TestCase
{ {
public: public:
ArchiveTestCase(std::string name, ArchiveTestCase(std::string name,
int id,
ClassFactoryT *factory, ClassFactoryT *factory,
int options, int options,
const wxString& archiver = wxEmptyString, const wxString& archiver = wxEmptyString,
@@ -209,6 +217,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 // Base class for the archive test suites
@@ -218,12 +242,9 @@ public:
ArchiveTestSuite(std::string name); ArchiveTestSuite(std::string name);
protected: protected:
int m_id;
virtual ArchiveTestSuite *makeSuite(); virtual ArchiveTestSuite *makeSuite();
virtual CppUnit::Test *makeTest(std::string descr, virtual CppUnit::Test *makeTest(std::string descr,
int id,
int options, int options,
bool genericInterface, bool genericInterface,
const wxString& archiver, const wxString& archiver,

View File

@@ -34,12 +34,11 @@ class ZipTestCase : public ArchiveTestCase<wxZipClassFactory>
{ {
public: public:
ZipTestCase(string name, ZipTestCase(string name,
int id,
int options, int options,
const wxString& archiver = wxEmptyString, const wxString& archiver = wxEmptyString,
const wxString& unarchiver = wxEmptyString) const wxString& unarchiver = wxEmptyString)
: :
ArchiveTestCase<wxZipClassFactory>(name, id, new wxZipClassFactory, ArchiveTestCase<wxZipClassFactory>(name, new wxZipClassFactory,
options, archiver, unarchiver), options, archiver, unarchiver),
m_count(0) m_count(0)
{ } { }
@@ -161,11 +160,15 @@ class ZipPipeTestCase : public CppUnit::TestCase
{ {
public: public:
ZipPipeTestCase(string name, int options) : ZipPipeTestCase(string name, int options) :
CppUnit::TestCase(name), m_options(options) { } CppUnit::TestCase(TestId::MakeId() + name),
m_options(options),
m_id(TestId::GetId())
{ }
protected: protected:
void runTest(); void runTest();
int m_options; int m_options;
int m_id;
}; };
void ZipPipeTestCase::runTest() void ZipPipeTestCase::runTest()
@@ -181,7 +184,7 @@ void ZipPipeTestCase::runTest()
out.Write(in); out.Write(in);
} }
TestInputStream in(out); TestInputStream in(out, m_id % ((m_options & PipeIn) ? 4 : 3));
wxZipInputStream zip(in); wxZipInputStream zip(in);
auto_ptr<wxZipEntry> entry(zip.GetNextEntry()); auto_ptr<wxZipEntry> entry(zip.GetNextEntry());
@@ -214,7 +217,7 @@ public:
protected: protected:
ArchiveTestSuite *makeSuite(); ArchiveTestSuite *makeSuite();
CppUnit::Test *makeTest(string descr, int id, int options, CppUnit::Test *makeTest(string descr, int options,
bool genericInterface, const wxString& archiver, bool genericInterface, const wxString& archiver,
const wxString& unarchiver); const wxString& unarchiver);
}; };
@@ -237,7 +240,6 @@ ArchiveTestSuite *ziptest::makeSuite()
string name = Description(_T("ZipPipeTestCase"), options, string name = Description(_T("ZipPipeTestCase"), options,
false, _T(""), _T("zip -q - -")); false, _T(""), _T("zip -q - -"));
addTest(new ZipPipeTestCase(name, options)); addTest(new ZipPipeTestCase(name, options));
m_id++;
} }
#endif #endif
@@ -246,7 +248,6 @@ ArchiveTestSuite *ziptest::makeSuite()
CppUnit::Test *ziptest::makeTest( CppUnit::Test *ziptest::makeTest(
string descr, string descr,
int id,
int options, int options,
bool genericInterface, bool genericInterface,
const wxString& archiver, const wxString& archiver,
@@ -258,10 +259,10 @@ CppUnit::Test *ziptest::makeTest(
if (genericInterface) if (genericInterface)
return new ArchiveTestCase<wxArchiveClassFactory>( return new ArchiveTestCase<wxArchiveClassFactory>(
descr, id, new wxZipClassFactory, descr, new wxZipClassFactory,
options, archiver, unarchiver); options, archiver, unarchiver);
else else
return new ZipTestCase(descr, id, options, archiver, unarchiver); return new ZipTestCase(descr, options, archiver, unarchiver);
} }
CPPUNIT_TEST_SUITE_REGISTRATION(ziptest); CPPUNIT_TEST_SUITE_REGISTRATION(ziptest);