SVN commit 983605 by bbroeksema: - Make sure that entries are only added when a file is loaded. - Add tests for appendEntry. M +24 -7 mbox.cpp M +8 -2 mbox.h M +36 -1 tests/mboxtest.cpp M +5 -0 tests/mboxtest.h --- trunk/KDE/kdepim/akonadi/resources/mbox/libmbox/mbox.cpp #983604:983605 @@ -88,7 +88,7 @@ { // Set some sane defaults d->mFileLocked = false; - d->mLockType = None; + d->mLockType = None; // } MBox::~MBox() @@ -103,6 +103,9 @@ qint64 MBox::appendEntry( const MessagePtr &entry ) { + if ( d->mMboxFile.fileName().isEmpty() ) + return -1; // It doesn't make sense to add entries when we don't have an reference file. + const QByteArray rawEntry = escapeFrom( entry->encodedContent() ); if ( rawEntry.size() <= 0 ) { @@ -115,9 +118,20 @@ // Make sure the byte array is large enough to check for an end character. // Then check if the required newlines are there. - if ( nextOffset >= 2 ) { - if ( nextOffset > 0 && d->mAppendedEntries.at( nextOffset - 1 ) != '\n' ) { - if ( d->mAppendedEntries.at( nextOffset - 1 ) != '\n' ) { + if ( nextOffset < 1 ) { // Empty, add one empty line + if ( d->mMboxFile.size() == 0 ) { + d->mAppendedEntries.append( "\n"); + ++nextOffset; + } + } else if ( nextOffset == 1 && d->mAppendedEntries.at( 0 ) != '\n' ) { + // This should actually not happen, but catch it anyway. + if (d->mMboxFile.size() < 0 ) { + d->mAppendedEntries.append( "\n"); + ++nextOffset; + } + } else { + if ( d->mAppendedEntries.at( nextOffset - 1 ) != '\n' ) { + if ( d->mAppendedEntries.at( nextOffset ) != '\n' ) { d->mAppendedEntries.append( "\n\n" ); nextOffset += 2; } else { @@ -133,6 +147,11 @@ d->mAppendedEntries.append( "\n\n" ); } + MsgInfo info; + info.first = d->mInitialMboxFileSize + nextOffset; + info.second = rawEntry.size(); + d->mEntries << info; + return d->mInitialMboxFileSize + nextOffset; } @@ -195,9 +214,7 @@ } } - unlock(); // FIXME: What if unlock fails? - - return true; + return unlock(); // FIXME: What if unlock fails? } bool MBox::lock() --- trunk/KDE/kdepim/akonadi/resources/mbox/libmbox/mbox.h #983604:983605 @@ -45,14 +45,20 @@ MBox(); /** - * Closes the file if it is still open. + * Unlocks the file if it is still open. */ ~MBox(); /** * Appends @param entry to the MBox. Returns the offset in the file * where the added message starts or -1 if the entry was not added (e.g. - * when it doesn't contain data). + * when it doesn't contain data). Entries are only added after a call to + * load( const QString& ). The returned offset is only valid for + * that particular file. + * + * @param entry The message to append to the mbox. + * @return the offset of the entry in the file or -1 if the entry was not + * added. */ qint64 appendEntry( const MessagePtr &entry ); --- trunk/KDE/kdepim/akonadi/resources/mbox/libmbox/tests/mboxtest.cpp #983604:983605 @@ -29,7 +29,7 @@ QTEST_KDEMAIN_CORE(MboxTest) -#include "../mbox.h" +#include "test-entries.h" static const char * testDir = "libmbox-unit-test"; static const char * testFile = "test-mbox-file"; @@ -56,6 +56,15 @@ mboxfile.open( QIODevice::WriteOnly ); mboxfile.close(); QVERIFY(mboxfile.exists()); + + mMail1 = MessagePtr( new KMime::Message ); + mMail1->setContent( KMime::CRLFtoLF( sEntry1 ) ); + mMail1->parse(); + + mMail2 = MessagePtr( new KMime::Message ); + mMail2->setContent( KMime::CRLFtoLF( sEntry2 ) ); + mMail2->parse(); + } void MboxTest::testSetLockMethod() @@ -134,6 +143,32 @@ QVERIFY( !QFile( lockFileName() ).exists() ); } +void MboxTest::testAppend() +{ + QFileInfo info( fileName() ); + QCOMPARE( info.size(), static_cast( 0 ) ); + + MBox mbox; + mbox.setLockType( MBox::None ); + + // When no file is loaded no entries should get added to the mbox. + QCOMPARE( mbox.entryList().size(), 0 ); + QCOMPARE( mbox.appendEntry( mMail1 ), static_cast( -1 ) ); + QCOMPARE( mbox.entryList().size(), 0 ); + + QVERIFY( mbox.load( fileName() ) ); + + // First message added to an emtpy file should be at offset 0 + QCOMPARE( mbox.entryList().size(), 0 ); + QCOMPARE( mbox.appendEntry( mMail1 ), static_cast( 0 ) ); + QCOMPARE( mbox.entryList().size(), 1 ); + QCOMPARE( mbox.entryList().first().second, static_cast( sEntry1.size() ) ); + + QVERIFY( mbox.appendEntry( mMail2 ) > sEntry1.size() ); + QCOMPARE( mbox.entryList().size(), 2 ); + QCOMPARE( mbox.entryList().last().second, static_cast( sEntry2.size() ) ); +} + void MboxTest::cleanupTestCase() { mTempDir->unlink(); --- trunk/KDE/kdepim/akonadi/resources/mbox/libmbox/tests/mboxtest.h #983604:983605 @@ -22,6 +22,8 @@ #include +#include "../mbox.h" + class KTempDir; class MboxTest : public QObject @@ -32,6 +34,7 @@ void testSetLockMethod(); void testLockBeforeLoad(); void testProcMailLock(); + void testAppend(); void cleanupTestCase(); private: @@ -40,6 +43,8 @@ private: KTempDir *mTempDir; + MessagePtr mMail1; + MessagePtr mMail2; }; #endif // MBOXTEST_H