Add line-endings fuzzing test to TextFileTestCase.
Stress-test wxTextFile's handling of unusual CR,LF characters. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@75804 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -35,7 +35,10 @@
|
|||||||
class TextFileTestCase : public CppUnit::TestCase
|
class TextFileTestCase : public CppUnit::TestCase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TextFileTestCase() { }
|
TextFileTestCase()
|
||||||
|
{
|
||||||
|
srand((unsigned)time(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
virtual void tearDown() { unlink(GetTestFileName()); }
|
virtual void tearDown() { unlink(GetTestFileName()); }
|
||||||
|
|
||||||
@@ -49,6 +52,7 @@ private:
|
|||||||
CPPUNIT_TEST( ReadMac );
|
CPPUNIT_TEST( ReadMac );
|
||||||
CPPUNIT_TEST( ReadMacLast );
|
CPPUNIT_TEST( ReadMacLast );
|
||||||
CPPUNIT_TEST( ReadMixed );
|
CPPUNIT_TEST( ReadMixed );
|
||||||
|
CPPUNIT_TEST( ReadMixedWithFuzzing );
|
||||||
CPPUNIT_TEST( ReadCRCRLF );
|
CPPUNIT_TEST( ReadCRCRLF );
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
CPPUNIT_TEST( ReadUTF8 );
|
CPPUNIT_TEST( ReadUTF8 );
|
||||||
@@ -65,6 +69,7 @@ private:
|
|||||||
void ReadMac();
|
void ReadMac();
|
||||||
void ReadMacLast();
|
void ReadMacLast();
|
||||||
void ReadMixed();
|
void ReadMixed();
|
||||||
|
void ReadMixedWithFuzzing();
|
||||||
void ReadCRCRLF();
|
void ReadCRCRLF();
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
void ReadUTF8();
|
void ReadUTF8();
|
||||||
@@ -212,6 +217,33 @@ void TextFileTestCase::ReadMixed()
|
|||||||
CPPUNIT_ASSERT_EQUAL( wxString(wxT("baz")), f.GetLastLine() );
|
CPPUNIT_ASSERT_EQUAL( wxString(wxT("baz")), f.GetLastLine() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextFileTestCase::ReadMixedWithFuzzing()
|
||||||
|
{
|
||||||
|
// Create a random buffer with lots of newlines. This is intended to catch
|
||||||
|
// bad parsing in unexpected situations such as the one from ReadCRCRLF()
|
||||||
|
// (which is so common it deserves a test of its own).
|
||||||
|
static const char CHOICES[] = {'\r', '\n', 'X'};
|
||||||
|
|
||||||
|
unsigned linesCnt = 0;
|
||||||
|
const size_t BUF_LEN = 20000;
|
||||||
|
char data[BUF_LEN + 1];
|
||||||
|
data[0] = 'X';
|
||||||
|
data[BUF_LEN] = '\0';
|
||||||
|
for ( size_t i = 1; i < BUF_LEN; i++ )
|
||||||
|
{
|
||||||
|
char ch = CHOICES[rand() % WXSIZEOF(CHOICES)];
|
||||||
|
data[i] = ch;
|
||||||
|
if ( ch == '\r' || (ch == '\n' && data[i-1] != '\r') )
|
||||||
|
linesCnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateTestFile(data);
|
||||||
|
|
||||||
|
wxTextFile f;
|
||||||
|
CPPUNIT_ASSERT( f.Open(wxString::FromAscii(GetTestFileName())) );
|
||||||
|
CPPUNIT_ASSERT_EQUAL( (size_t)linesCnt, f.GetLineCount() );
|
||||||
|
}
|
||||||
|
|
||||||
void TextFileTestCase::ReadCRCRLF()
|
void TextFileTestCase::ReadCRCRLF()
|
||||||
{
|
{
|
||||||
// Notepad may create files with CRCRLF line endings (see
|
// Notepad may create files with CRCRLF line endings (see
|
||||||
|
Reference in New Issue
Block a user