diff options
author | Ali Akhtarzada <ali.akhtarzada@nokia.com> | 2012-06-01 10:56:26 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-13 01:51:45 +0200 |
commit | b85bf84c87c363e79030bdd819b016fee8aa04a6 (patch) | |
tree | fec1884a09df7d8306ea1fb9514ae864414d83b7 | |
parent | 470174481800efd604f8760bd06e84284892f5b8 (diff) |
Make sure invalid partition function calls work propertly
Make sure the return values are what is expected and that
there is no seg faulting
Change-Id: I344835bca44ba0277813ae2465b79f286fd11f37
Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com>
-rw-r--r-- | src/partition/jsondbpartition.cpp | 11 | ||||
-rw-r--r-- | tests/auto/partition/testpartition.cpp | 41 |
2 files changed, 48 insertions, 4 deletions
diff --git a/src/partition/jsondbpartition.cpp b/src/partition/jsondbpartition.cpp index 170873a..173e4c0 100644 --- a/src/partition/jsondbpartition.cpp +++ b/src/partition/jsondbpartition.cpp @@ -568,7 +568,7 @@ bool JsonDbPartition::clear() { Q_D(JsonDbPartition); - if (d->mObjectTable->bdb()) { + if (d->mObjectTable && d->mObjectTable->bdb() && d->mObjectTable->bdb()->isOpen()) { qCritical() << JSONDB_ERROR << "cannot clear database while it is open."; return false; } @@ -746,10 +746,13 @@ bool JsonDbPartitionPrivate::abortTransaction() int JsonDbPartition::flush(bool *ok) { Q_D(JsonDbPartition); + if (ok) + *ok = false; if (d->mIsOpen) { - *ok = d->mObjectTable->sync(JsonDbObjectTable::SyncObjectTable); - - if (*ok) + bool result = d->mObjectTable->sync(JsonDbObjectTable::SyncObjectTable); + if (ok) + *ok = result; + if (result) return static_cast<int>(d->mObjectTable->stateNumber()); } return -1; diff --git a/tests/auto/partition/testpartition.cpp b/tests/auto/partition/testpartition.cpp index a343369..3e0af7e 100644 --- a/tests/auto/partition/testpartition.cpp +++ b/tests/auto/partition/testpartition.cpp @@ -245,6 +245,8 @@ private slots: void updateListWithIndex(); void addBigIndex(); + void ensureBadPartitionFunctionCalls_data(); + void ensureBadPartitionFunctionCalls(); private: void createContacts(); @@ -4866,5 +4868,44 @@ void TestPartition::addBigIndex() remove(mOwner, indexObject); } +void TestPartition::ensureBadPartitionFunctionCalls_data() +{ + QTest::addColumn<bool>("callOpen"); + QTest::newRow("Failed open call") << true; + QTest::newRow("No open call") << false; +} + +void TestPartition::ensureBadPartitionFunctionCalls() +{ + QFETCH(bool, callOpen); + JsonDbPartition *partition = new JsonDbPartition(); + partition->setDefaultOwner(mOwner); + + if (callOpen) { + JsonDbPartitionSpec spec; + spec.name = QString::fromAscii(QByteArray(10000, 'a')); // Make the open fail + partition->setPartitionSpec(spec); + QVERIFY(!partition->open()); + } + + QVERIFY(!partition->isOpen()); + QCOMPARE(partition->changesSince(0, QSet<QString>()).code, JsonDbError::PartitionUnavailable); + if (!callOpen) + QTest::ignoreMessage(QtWarningMsg, "QFileInfo::absolutePath: Constructed with empty filename"); + QVERIFY(partition->clear()); + QVERIFY(!partition->compact()); + QCOMPARE(partition->queryObjects(mOwner, JsonDbQuery()).code, JsonDbError::PartitionUnavailable); + QCOMPARE(partition->updateObjects(mOwner, JsonDbObjectList()).code, JsonDbError::PartitionUnavailable); + QCOMPARE(partition->updateObject(mOwner, JsonDbObject()).code, JsonDbError::PartitionUnavailable); + QCOMPARE(partition->changesSince(0).code, JsonDbError::PartitionUnavailable); + bool ok = false; + QCOMPARE(partition->flush(&ok), -1); + QCOMPARE(ok, false); + QCOMPARE(partition->mainObjectTable() != NULL, callOpen); + QVERIFY(partition->fileSizes().isEmpty()); + + delete partition; +} + QTEST_MAIN(TestPartition) #include "testpartition.moc" |