summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAli Akhtarzada <ali.akhtarzada@nokia.com>2012-06-01 10:56:26 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-13 01:51:45 +0200
commitb85bf84c87c363e79030bdd819b016fee8aa04a6 (patch)
treefec1884a09df7d8306ea1fb9514ae864414d83b7
parent470174481800efd604f8760bd06e84284892f5b8 (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.cpp11
-rw-r--r--tests/auto/partition/testpartition.cpp41
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"