Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJanek Bevendorff <janek@jbev.net>2018-11-22 13:47:31 +0300
committerGitHub <noreply@github.com>2018-11-22 13:47:31 +0300
commitd612cad09a4f1cd8ef9bf6be8bf90b75248ecfef (patch)
tree94fbd4d07f56f9646dc8c0dd8e7586776c2e3585 /tests
parent917c4cc18b8dbc04034cb0d43301b3f406644885 (diff)
Refactor Database and Database widgets (#2491)
The Database, DatabaseWidget, and DatabaseTabWidget classes share many responsibilities in inconsistent ways resulting in impenetrable and unmaintainable code and a diverse set of bugs and architecture restrictions. This patch reworks the architecture, responsibilities of, and dependencies between these classes. The core changes are: * Move loading and saving logic from widgets into the Database class * Get rid of the DatabaseManagerStruct and move all the information contained in it into the Database * Let database objects keep track of modifications and dirty/clean state instead of handing this to external widgets * Move GUI interactions for loading and saving from the DatabaseTabWidget into the DatabaseWidget (resolves #2494 as a side-effect) * Heavily clean up DatabaseTabWidget and degrade it to a slightly glorified QTabWidget * Use QSharedPointers for all Database objects * Remove the modifiedImmediate signal and replace it with a markAsModified() method * Implement proper tabName() method instead of reading back titles from GUI widgets (resolves #1389 and its duplicates #2146 #855) * Fix unwanted AES-KDF downgrade if database uses Argon2 and has CustomData * Improve code This patch is also the first major step towards solving issues #476 and #2322.
Diffstat (limited to 'tests')
-rw-r--r--tests/TestAutoType.cpp3
-rw-r--r--tests/TestAutoType.h5
-rw-r--r--tests/TestCli.cpp12
-rw-r--r--tests/TestCsvExporter.cpp20
-rw-r--r--tests/TestCsvExporter.h5
-rw-r--r--tests/TestDatabase.cpp37
-rw-r--r--tests/TestDeletedObjects.cpp27
-rw-r--r--tests/TestDeletedObjects.h2
-rw-r--r--tests/TestKdbx2.cpp17
-rw-r--r--tests/TestKdbx2.h2
-rw-r--r--tests/TestKdbx3.cpp34
-rw-r--r--tests/TestKdbx3.h8
-rw-r--r--tests/TestKdbx4.cpp28
-rw-r--r--tests/TestKdbx4.h8
-rw-r--r--tests/TestKeePass1Reader.cpp27
-rw-r--r--tests/TestKeePass1Reader.h5
-rw-r--r--tests/TestKeePass2Format.cpp17
-rw-r--r--tests/TestKeePass2Format.h16
-rw-r--r--tests/TestKeys.cpp25
-rw-r--r--tests/TestMerge.cpp8
-rw-r--r--tests/TestModified.cpp234
-rw-r--r--tests/gui/TestGui.cpp104
-rw-r--r--tests/gui/TestGui.h3
23 files changed, 354 insertions, 293 deletions
diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp
index f59625d89..0f15032a1 100644
--- a/tests/TestAutoType.cpp
+++ b/tests/TestAutoType.cpp
@@ -57,7 +57,7 @@ void TestAutoType::init()
config()->set("AutoTypeEntryTitleMatch", false);
m_test->clearActions();
- m_db = new Database();
+ m_db = QSharedPointer<Database>::create();
m_dbList.clear();
m_dbList.append(m_db);
m_group = new Group();
@@ -126,7 +126,6 @@ void TestAutoType::init()
void TestAutoType::cleanup()
{
- delete m_db;
}
void TestAutoType::testInternal()
diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h
index 93a7d682c..03086a68e 100644
--- a/tests/TestAutoType.h
+++ b/tests/TestAutoType.h
@@ -20,6 +20,7 @@
#define KEEPASSX_TESTAUTOTYPE_H
#include <QObject>
+#include <QSharedPointer>
class AutoType;
class AutoTypePlatformInterface;
@@ -53,8 +54,8 @@ private:
AutoTypePlatformInterface* m_platform;
AutoTypeTestInterface* m_test;
AutoType* m_autoType;
- Database* m_db;
- QList<Database*> m_dbList;
+ QSharedPointer<Database> m_db;
+ QList<QSharedPointer<Database>> m_dbList;
Group* m_group;
Entry* m_entry1;
Entry* m_entry2;
diff --git a/tests/TestCli.cpp b/tests/TestCli.cpp
index 36ca479d5..3c5afc347 100644
--- a/tests/TestCli.cpp
+++ b/tests/TestCli.cpp
@@ -671,7 +671,8 @@ void TestCli::testMerge()
QFile readBack(targetFile1.fileName());
readBack.open(QIODevice::ReadOnly);
- QScopedPointer<Database> mergedDb(reader.readDatabase(&readBack, oldKey));
+ auto mergedDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&readBack, oldKey, mergedDb.data());
readBack.close();
QVERIFY(mergedDb);
auto* entry1 = mergedDb->rootGroup()->findEntryByPath("/Internet/Some Website");
@@ -691,7 +692,8 @@ void TestCli::testMerge()
readBack.setFileName(targetFile2.fileName());
readBack.open(QIODevice::ReadOnly);
- mergedDb.reset(reader.readDatabase(&readBack, key));
+ mergedDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&readBack, key, mergedDb.data());
readBack.close();
QVERIFY(mergedDb);
entry1 = mergedDb->rootGroup()->findEntryByPath("/Internet/Some Website");
@@ -740,7 +742,8 @@ void TestCli::testRemove()
key->addKey(QSharedPointer<PasswordKey>::create("a"));
QFile readBack(m_dbFile->fileName());
readBack.open(QIODevice::ReadOnly);
- QScopedPointer<Database> readBackDb(reader.readDatabase(&readBack, key));
+ auto readBackDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&readBack, key, readBackDb.data());
readBack.close();
QVERIFY(readBackDb);
QVERIFY(!readBackDb->rootGroup()->findEntryByPath("/Sample Entry"));
@@ -757,7 +760,8 @@ void TestCli::testRemove()
readBack.setFileName(fileCopy.fileName());
readBack.open(QIODevice::ReadOnly);
- readBackDb.reset(reader.readDatabase(&readBack, key));
+ readBackDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&readBack, key, readBackDb.data());
readBack.close();
QVERIFY(readBackDb);
QVERIFY(!readBackDb->rootGroup()->findEntryByPath("/Sample Entry"));
diff --git a/tests/TestCsvExporter.cpp b/tests/TestCsvExporter.cpp
index 732e2636d..b71cf9ca7 100644
--- a/tests/TestCsvExporter.cpp
+++ b/tests/TestCsvExporter.cpp
@@ -31,8 +31,8 @@ const QString TestCsvExporter::ExpectedHeaderLine =
void TestCsvExporter::init()
{
- m_db = new Database();
- m_csvExporter = new CsvExporter();
+ m_db = QSharedPointer<Database>::create();
+ m_csvExporter = QSharedPointer<CsvExporter>::create();
}
void TestCsvExporter::initTestCase()
@@ -42,17 +42,15 @@ void TestCsvExporter::initTestCase()
void TestCsvExporter::cleanup()
{
- delete m_db;
- delete m_csvExporter;
}
void TestCsvExporter::testExport()
{
Group* groupRoot = m_db->rootGroup();
- Group* group = new Group();
+ auto* group = new Group();
group->setName("Test Group Name");
group->setParent(groupRoot);
- Entry* entry = new Entry();
+ auto* entry = new Entry();
entry->setGroup(group);
entry->setTitle("Test Entry Title");
entry->setUsername("Test Username");
@@ -65,7 +63,7 @@ void TestCsvExporter::testExport()
m_csvExporter->exportDatabase(&buffer, m_db);
QString expectedResult =
- QString().append(ExpectedHeaderLine).append("\"Test Group Name\",\"Test Entry Title\",\"Test Username\",\"Test "
+ QString().append(ExpectedHeaderLine).append("\"Root/Test Group Name\",\"Test Entry Title\",\"Test Username\",\"Test "
"Password\",\"http://test.url\",\"Test Notes\"\n");
QCOMPARE(QString::fromUtf8(buffer.buffer().constData()), expectedResult);
@@ -83,13 +81,13 @@ void TestCsvExporter::testEmptyDatabase()
void TestCsvExporter::testNestedGroups()
{
Group* groupRoot = m_db->rootGroup();
- Group* group = new Group();
+ auto* group = new Group();
group->setName("Test Group Name");
group->setParent(groupRoot);
- Group* childGroup = new Group();
+ auto* childGroup = new Group();
childGroup->setName("Test Sub Group Name");
childGroup->setParent(group);
- Entry* entry = new Entry();
+ auto* entry = new Entry();
entry->setGroup(childGroup);
entry->setTitle("Test Entry Title");
@@ -100,5 +98,5 @@ void TestCsvExporter::testNestedGroups()
QCOMPARE(QString::fromUtf8(buffer.buffer().constData()),
QString()
.append(ExpectedHeaderLine)
- .append("\"Test Group Name/Test Sub Group Name\",\"Test Entry Title\",\"\",\"\",\"\",\"\"\n"));
+ .append("\"Root/Test Group Name/Test Sub Group Name\",\"Test Entry Title\",\"\",\"\",\"\",\"\"\n"));
}
diff --git a/tests/TestCsvExporter.h b/tests/TestCsvExporter.h
index 39597f752..378ac6c0d 100644
--- a/tests/TestCsvExporter.h
+++ b/tests/TestCsvExporter.h
@@ -20,6 +20,7 @@
#define KEEPASSX_TESTCSVEXPORTER_H
#include <QObject>
+#include <QSharedPointer>
class Database;
class CsvExporter;
@@ -40,8 +41,8 @@ private slots:
void testNestedGroups();
private:
- Database* m_db;
- CsvExporter* m_csvExporter;
+ QSharedPointer<Database> m_db;
+ QSharedPointer<CsvExporter> m_csvExporter;
};
#endif // KEEPASSX_TESTCSVEXPORTER_H
diff --git a/tests/TestDatabase.cpp b/tests/TestDatabase.cpp
index 78e1b10a4..94e3c8ba7 100644
--- a/tests/TestDatabase.cpp
+++ b/tests/TestDatabase.cpp
@@ -40,14 +40,18 @@ void TestDatabase::testEmptyRecycleBinOnDisabled()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/RecycleBinDisabled.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("123"));
- QScopedPointer<Database> db(Database::openDatabaseFile(filename, key));
- QVERIFY(db);
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ // Explicitly mark DB as read-write in case it was opened from a read-only drive.
+ // Prevents assertion failures on CI systems when the data dir is not writable
+ db->setReadOnly(false);
+
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
db->emptyRecycleBin();
// The database must be unmodified in this test after emptying the recycle bin.
- QCOMPARE(spyModified.count(), 0);
+ QTRY_COMPARE(spyModified.count(), 0);
}
void TestDatabase::testEmptyRecycleBinOnNotCreated()
@@ -55,14 +59,15 @@ void TestDatabase::testEmptyRecycleBinOnNotCreated()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/RecycleBinNotYetCreated.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("123"));
- QScopedPointer<Database> db(Database::openDatabaseFile(filename, key));
- QVERIFY(db);
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
+ db->setReadOnly(false);
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
db->emptyRecycleBin();
// The database must be unmodified in this test after emptying the recycle bin.
- QCOMPARE(spyModified.count(), 0);
+ QTRY_COMPARE(spyModified.count(), 0);
}
void TestDatabase::testEmptyRecycleBinOnEmpty()
@@ -70,14 +75,15 @@ void TestDatabase::testEmptyRecycleBinOnEmpty()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/RecycleBinEmpty.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("123"));
- QScopedPointer<Database> db(Database::openDatabaseFile(filename, key));
- QVERIFY(db);
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
+ db->setReadOnly(false);
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
db->emptyRecycleBin();
// The database must be unmodified in this test after emptying the recycle bin.
- QCOMPARE(spyModified.count(), 0);
+ QTRY_COMPARE(spyModified.count(), 0);
}
void TestDatabase::testEmptyRecycleBinWithHierarchicalData()
@@ -85,8 +91,9 @@ void TestDatabase::testEmptyRecycleBinWithHierarchicalData()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/RecycleBinWithData.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("123"));
- QScopedPointer<Database> db(Database::openDatabaseFile(filename, key));
- QVERIFY(db);
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
+ db->setReadOnly(false);
QFile originalFile(filename);
qint64 initialSize = originalFile.size();
@@ -97,6 +104,8 @@ void TestDatabase::testEmptyRecycleBinWithHierarchicalData()
QVERIFY(db->metadata()->recycleBin()->children().empty());
QTemporaryFile afterCleanup;
+ afterCleanup.open();
+
KeePass2Writer writer;
writer.writeDatabase(&afterCleanup, db.data());
QVERIFY(afterCleanup.size() < initialSize);
diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp
index 00b9cd52c..150249879 100644
--- a/tests/TestDeletedObjects.cpp
+++ b/tests/TestDeletedObjects.cpp
@@ -30,7 +30,7 @@ void TestDeletedObjects::initTestCase()
QVERIFY(Crypto::init());
}
-void TestDeletedObjects::createAndDelete(Database* db, int delObjectsSize)
+void TestDeletedObjects::createAndDelete(QSharedPointer<Database> db, int delObjectsSize)
{
QCOMPARE(db->deletedObjects().size(), delObjectsSize);
Group* root = db->rootGroup();
@@ -89,32 +89,27 @@ void TestDeletedObjects::testDeletedObjectsFromFile()
KdbxXmlReader reader(KeePass2::FILE_VERSION_3_1);
reader.setStrictMode(true);
QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml");
- Database* db = reader.readDatabase(xmlFile);
+ auto db = reader.readDatabase(xmlFile);
createAndDelete(db, 2);
-
- delete db;
}
void TestDeletedObjects::testDeletedObjectsFromNewDb()
{
- Database* db = new Database();
-
+ auto db = QSharedPointer<Database>::create();
createAndDelete(db, 0);
-
- delete db;
}
void TestDeletedObjects::testDatabaseChange()
{
- Database* db = new Database();
+ auto db = QSharedPointer<Database>::create();
Group* root = db->rootGroup();
int delObjectsSize = 0;
- Database* db2 = new Database();
+ auto db2 = QSharedPointer<Database>::create();
Group* root2 = db2->rootGroup();
int delObjectsSize2 = 0;
- Entry* e = new Entry();
+ auto* e = new Entry();
e->setGroup(root);
QCOMPARE(db->deletedObjects().size(), delObjectsSize);
@@ -130,11 +125,11 @@ void TestDeletedObjects::testDatabaseChange()
QCOMPARE(db->deletedObjects().size(), delObjectsSize);
QCOMPARE(db2->deletedObjects().size(), ++delObjectsSize2);
- Group* g1 = new Group();
+ auto* g1 = new Group();
g1->setParent(root);
QUuid g1Uuid = QUuid::createUuid();
g1->setUuid(g1Uuid);
- Entry* e1 = new Entry();
+ auto* e1 = new Entry();
e1->setGroup(g1);
QUuid e1Uuid = QUuid::createUuid();
e1->setUuid(e1Uuid);
@@ -146,8 +141,8 @@ void TestDeletedObjects::testDatabaseChange()
QCOMPARE(db->deletedObjects().at(delObjectsSize - 2).uuid, e1Uuid);
QCOMPARE(db->deletedObjects().at(delObjectsSize - 1).uuid, g1Uuid);
- Group* group = new Group();
- Entry* entry = new Entry();
+ auto* group = new Group();
+ auto* entry = new Entry();
entry->setGroup(group);
entry->setGroup(root);
@@ -155,6 +150,4 @@ void TestDeletedObjects::testDatabaseChange()
QCOMPARE(db2->deletedObjects().size(), delObjectsSize2);
delete group;
- delete db;
- delete db2;
}
diff --git a/tests/TestDeletedObjects.h b/tests/TestDeletedObjects.h
index d96452093..61d864a67 100644
--- a/tests/TestDeletedObjects.h
+++ b/tests/TestDeletedObjects.h
@@ -27,7 +27,7 @@ class TestDeletedObjects : public QObject
Q_OBJECT
private:
- void createAndDelete(Database* db, int delObjectsSize);
+ void createAndDelete(QSharedPointer<Database> db, int delObjectsSize);
private slots:
void initTestCase();
diff --git a/tests/TestKdbx2.cpp b/tests/TestKdbx2.cpp
index ef944f7fd..2ddcbf11f 100644
--- a/tests/TestKdbx2.cpp
+++ b/tests/TestKdbx2.cpp
@@ -37,7 +37,7 @@ void TestKdbx2::initTestCase()
/**
* Helper method for verifying contents of the sample KDBX 2 file.
*/
-void TestKdbx2::verifyKdbx2Db(Database* db)
+void TestKdbx2::verifyKdbx2Db(QSharedPointer<Database> db)
{
QVERIFY(db);
QCOMPARE(db->rootGroup()->name(), QString("Format200"));
@@ -67,12 +67,13 @@ void TestKdbx2::testFormat200()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
+ auto db = QSharedPointer<Database>::create();
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ QVERIFY(reader.readDatabase(filename, key, db.data()));
QCOMPARE(reader.version(), KeePass2::FILE_VERSION_2 & KeePass2::FILE_VERSION_CRITICAL_MASK);
QVERIFY2(!reader.hasError(), reader.errorString().toStdString().c_str());
- verifyKdbx2Db(db.data());
+ verifyKdbx2Db(db);
}
void TestKdbx2::testFormat200Upgrade()
@@ -80,8 +81,9 @@ void TestKdbx2::testFormat200Upgrade()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
+ auto db = QSharedPointer<Database>::create();
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ reader.readDatabase(filename, key, db.data());
QVERIFY2(!reader.hasError(), reader.errorString().toStdString().c_str());
QVERIFY(!db.isNull());
QCOMPARE(reader.version(), KeePass2::FILE_VERSION_2 & KeePass2::FILE_VERSION_CRITICAL_MASK);
@@ -92,20 +94,21 @@ void TestKdbx2::testFormat200Upgrade()
// write KDBX 3 to upgrade it
KeePass2Writer writer;
- writer.writeDatabase(&buffer, db.data());
+ QVERIFY(writer.writeDatabase(&buffer, db.data()));
if (writer.hasError()) {
QFAIL(qPrintable(QString("Error while writing database: %1").arg(writer.errorString())));
}
// read buffer back
buffer.seek(0);
- QScopedPointer<Database> targetDb(reader.readDatabase(&buffer, key));
+ auto targetDb = QSharedPointer<Database>::create();
+ QVERIFY(reader.readDatabase(&buffer, key, targetDb.data()));
if (reader.hasError()) {
QFAIL(qPrintable(QString("Error while reading database: %1").arg(reader.errorString())));
}
// database should now be upgraded to KDBX 3 without data loss
- verifyKdbx2Db(targetDb.data());
+ verifyKdbx2Db(targetDb);
QCOMPARE(reader.version(), KeePass2::FILE_VERSION_3_1 & KeePass2::FILE_VERSION_CRITICAL_MASK);
QCOMPARE(targetDb->kdf()->uuid(), KeePass2::KDF_AES_KDBX3);
}
diff --git a/tests/TestKdbx2.h b/tests/TestKdbx2.h
index 9eb0e415e..7386270be 100644
--- a/tests/TestKdbx2.h
+++ b/tests/TestKdbx2.h
@@ -32,7 +32,7 @@ private slots:
void testFormat200Upgrade();
private:
- void verifyKdbx2Db(Database* db);
+ void verifyKdbx2Db(QSharedPointer<Database> db);
};
#endif // KEEPASSXC_TEST_KDBX2_H
diff --git a/tests/TestKdbx3.cpp b/tests/TestKdbx3.cpp
index 5fdfe0241..bf9a1ec8b 100644
--- a/tests/TestKdbx3.cpp
+++ b/tests/TestKdbx3.cpp
@@ -33,7 +33,7 @@ void TestKdbx3::initTestCaseImpl()
{
}
-Database* TestKdbx3::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString)
+QSharedPointer<Database> TestKdbx3::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString)
{
KdbxXmlReader reader(KeePass2::FILE_VERSION_3_1);
reader.setStrictMode(strictMode);
@@ -43,7 +43,7 @@ Database* TestKdbx3::readXml(const QString& path, bool strictMode, bool& hasErro
return db;
}
-Database* TestKdbx3::readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString)
+QSharedPointer<Database> TestKdbx3::readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString)
{
KdbxXmlReader reader(KeePass2::FILE_VERSION_3_1);
reader.setStrictMode(strictMode);
@@ -63,12 +63,12 @@ void TestKdbx3::writeXml(QBuffer* buf, Database* db, bool& hasError, QString& er
void TestKdbx3::readKdbx(QIODevice* device,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString)
{
KeePass2Reader reader;
- db.reset(reader.readDatabase(device, key));
+ reader.readDatabase(device, key, db.data());
hasError = reader.hasError();
if (hasError) {
errorString = reader.errorString();
@@ -78,12 +78,12 @@ void TestKdbx3::readKdbx(QIODevice* device,
void TestKdbx3::readKdbx(const QString& path,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString)
{
KeePass2Reader reader;
- db.reset(reader.readDatabase(path, key));
+ reader.readDatabase(path, key, db.data());
hasError = reader.hasError();
if (hasError) {
errorString = reader.errorString();
@@ -108,7 +108,8 @@ void TestKdbx3::testFormat300()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(reader.readDatabase(filename, key, db.data()));
QCOMPARE(reader.version(), KeePass2::FILE_VERSION_3);
QVERIFY(db.data());
QVERIFY(!reader.hasError());
@@ -123,11 +124,12 @@ void TestKdbx3::testNonAscii()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create(QString::fromUtf8("\xce\x94\xc3\xb6\xd8\xb6")));
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
QVERIFY(db.data());
QVERIFY(!reader.hasError());
QCOMPARE(db->metadata()->name(), QString("NonAsciiTest"));
- QCOMPARE(db->compressionAlgo(), Database::CompressionNone);
+ QCOMPARE(db->compressionAlgorithm(), Database::CompressionNone);
}
void TestKdbx3::testCompressed()
@@ -136,11 +138,12 @@ void TestKdbx3::testCompressed()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create(""));
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
QVERIFY(db.data());
QVERIFY(!reader.hasError());
QCOMPARE(db->metadata()->name(), QString("Compressed"));
- QCOMPARE(db->compressionAlgo(), Database::CompressionGZip);
+ QCOMPARE(db->compressionAlgorithm(), Database::CompressionGZip);
}
void TestKdbx3::testProtectedStrings()
@@ -149,7 +152,8 @@ void TestKdbx3::testProtectedStrings()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("masterpw"));
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(filename, key, nullptr, false));
QVERIFY(db.data());
QVERIFY(!reader.hasError());
QCOMPARE(db->metadata()->name(), QString("Protected Strings Test"));
@@ -175,8 +179,6 @@ void TestKdbx3::testBrokenHeaderHash()
QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/BrokenHeaderHash.kdbx");
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create(""));
- KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
- QVERIFY(!db.data());
- QVERIFY(reader.hasError());
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(!db->open(filename, key, nullptr, false));
}
diff --git a/tests/TestKdbx3.h b/tests/TestKdbx3.h
index aadc50aa8..2442a25b6 100644
--- a/tests/TestKdbx3.h
+++ b/tests/TestKdbx3.h
@@ -34,18 +34,18 @@ private slots:
protected:
void initTestCaseImpl() override;
- Database* readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override;
- Database* readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) override;
+ QSharedPointer<Database> readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override;
+ QSharedPointer<Database> readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) override;
void writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override;
void readKdbx(QIODevice* device,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString) override;
void readKdbx(const QString& path,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString) override;
void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) override;
diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp
index 297cde284..a7fd52e0e 100644
--- a/tests/TestKdbx4.cpp
+++ b/tests/TestKdbx4.cpp
@@ -37,7 +37,7 @@ void TestKdbx4::initTestCaseImpl()
m_kdbxSourceDb->changeKdf(fastKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2)));
}
-Database* TestKdbx4::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString)
+QSharedPointer<Database> TestKdbx4::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString)
{
KdbxXmlReader reader(KeePass2::FILE_VERSION_4);
reader.setStrictMode(strictMode);
@@ -47,7 +47,7 @@ Database* TestKdbx4::readXml(const QString& path, bool strictMode, bool& hasErro
return db;
}
-Database* TestKdbx4::readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString)
+QSharedPointer<Database> TestKdbx4::readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString)
{
KdbxXmlReader reader(KeePass2::FILE_VERSION_4);
reader.setStrictMode(strictMode);
@@ -67,12 +67,12 @@ void TestKdbx4::writeXml(QBuffer* buf, Database* db, bool& hasError, QString& er
void TestKdbx4::readKdbx(QIODevice* device,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString)
{
KeePass2Reader reader;
- db.reset(reader.readDatabase(device, key));
+ reader.readDatabase(device, key, db.data());
hasError = reader.hasError();
if (hasError) {
errorString = reader.errorString();
@@ -82,12 +82,12 @@ void TestKdbx4::readKdbx(QIODevice* device,
void TestKdbx4::readKdbx(const QString& path,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString)
{
KeePass2Reader reader;
- db.reset(reader.readDatabase(path, key));
+ reader.readDatabase(path, key, db.data());
hasError = reader.hasError();
if (hasError) {
errorString = reader.errorString();
@@ -116,7 +116,8 @@ void TestKdbx4::testFormat400()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("t"));
KeePass2Reader reader;
- QScopedPointer<Database> db(reader.readDatabase(filename, key));
+ auto db = QSharedPointer<Database>::create();
+ reader.readDatabase(filename, key, db.data());
QCOMPARE(reader.version(), KeePass2::FILE_VERSION_4);
QVERIFY(db.data());
QVERIFY(!reader.hasError());
@@ -174,7 +175,8 @@ void TestKdbx4::testFormat400Upgrade()
// read buffer back
buffer.seek(0);
KeePass2Reader reader;
- QScopedPointer<Database> targetDb(reader.readDatabase(&buffer, key));
+ auto targetDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&buffer, key, targetDb.data());
if (reader.hasError()) {
QFAIL(qPrintable(QString("Error while reading database: %1").arg(reader.errorString())));
}
@@ -292,14 +294,15 @@ void TestKdbx4::testUpgradeMasterKeyIntegrity()
// paranoid check that we cannot decrypt the database without a key
buffer.seek(0);
KeePass2Reader reader;
- QScopedPointer<Database> db2;
- db2.reset(reader.readDatabase(&buffer, QSharedPointer<CompositeKey>::create()));
+ auto db2 = QSharedPointer<Database>::create();
+ reader.readDatabase(&buffer, QSharedPointer<CompositeKey>::create(), db2.data());
QVERIFY(reader.hasError());
// check that we can read back the database with the original composite key,
// i.e., no components have been lost on the way
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKey));
+ db2 = QSharedPointer<Database>::create();
+ reader.readDatabase(&buffer, compositeKey, db2.data());
if (reader.hasError()) {
QFAIL(qPrintable(reader.errorString()));
}
@@ -396,7 +399,8 @@ void TestKdbx4::testCustomData()
// read buffer back
buffer.seek(0);
KeePass2Reader reader;
- QSharedPointer<Database> newDb(reader.readDatabase(&buffer, QSharedPointer<CompositeKey>::create()));
+ auto newDb = QSharedPointer<Database>::create();
+ reader.readDatabase(&buffer, QSharedPointer<CompositeKey>::create(), newDb.data());
// test all custom data are read back successfully from KDBX
QCOMPARE(newDb->publicCustomData(), publicCustomData);
diff --git a/tests/TestKdbx4.h b/tests/TestKdbx4.h
index edf319a96..e5fd85ae3 100644
--- a/tests/TestKdbx4.h
+++ b/tests/TestKdbx4.h
@@ -35,18 +35,18 @@ private slots:
protected:
void initTestCaseImpl() override;
- Database* readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override;
- Database* readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) override;
+ QSharedPointer<Database> readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override;
+ QSharedPointer<Database> readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) override;
void writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override;
void readKdbx(const QString& path,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString) override;
void readKdbx(QIODevice* device,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString) override;
void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) override;
diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp
index a3c148324..bb9e07a42 100644
--- a/tests/TestKeePass1Reader.cpp
+++ b/tests/TestKeePass1Reader.cpp
@@ -177,15 +177,13 @@ void TestKeePass1Reader::testFileKey()
QString dbFilename = QString("%1/%2.kdb").arg(QString(KEEPASSX_TEST_DATA_DIR), name);
QString keyFilename = QString("%1/%2.key").arg(QString(KEEPASSX_TEST_DATA_DIR), name);
- Database* db = reader.readDatabase(dbFilename, QString(), keyFilename);
+ auto db = reader.readDatabase(dbFilename, QString(), keyFilename);
QVERIFY(db);
QVERIFY(!reader.hasError());
QCOMPARE(db->rootGroup()->children().size(), 1);
QCOMPARE(db->rootGroup()->children().at(0)->name(), name);
reopenDatabase(db, QString(), keyFilename);
-
- delete db;
}
void TestKeePass1Reader::testFileKey_data()
@@ -205,15 +203,13 @@ void TestKeePass1Reader::testCompositeKey()
QString dbFilename = QString("%1/%2.kdb").arg(QString(KEEPASSX_TEST_DATA_DIR), name);
QString keyFilename = QString("%1/FileKeyHex.key").arg(QString(KEEPASSX_TEST_DATA_DIR));
- Database* db = reader.readDatabase(dbFilename, "mypassword", keyFilename);
+ auto db = reader.readDatabase(dbFilename, "mypassword", keyFilename);
QVERIFY(db);
QVERIFY(!reader.hasError());
QCOMPARE(db->rootGroup()->children().size(), 1);
QCOMPARE(db->rootGroup()->children().at(0)->name(), name);
reopenDatabase(db, "mypassword", keyFilename);
-
- delete db;
}
void TestKeePass1Reader::testTwofish()
@@ -224,13 +220,11 @@ void TestKeePass1Reader::testTwofish()
QString dbFilename = QString("%1/%2.kdb").arg(QString(KEEPASSX_TEST_DATA_DIR), name);
- Database* db = reader.readDatabase(dbFilename, "masterpw", 0);
+ auto db = reader.readDatabase(dbFilename, "masterpw", 0);
QVERIFY(db);
QVERIFY(!reader.hasError());
QCOMPARE(db->rootGroup()->children().size(), 1);
QCOMPARE(db->rootGroup()->children().at(0)->name(), name);
-
- delete db;
}
void TestKeePass1Reader::testCP1252Password()
@@ -242,18 +236,15 @@ void TestKeePass1Reader::testCP1252Password()
QString dbFilename = QString("%1/%2.kdb").arg(QString(KEEPASSX_TEST_DATA_DIR), name);
QString password = QString::fromUtf8("\xe2\x80\x9e\x70\x61\x73\x73\x77\x6f\x72\x64\xe2\x80\x9d");
- Database* db = reader.readDatabase(dbFilename, password, 0);
+ auto db = reader.readDatabase(dbFilename, password, 0);
QVERIFY(db);
QVERIFY(!reader.hasError());
QCOMPARE(db->rootGroup()->children().size(), 1);
QCOMPARE(db->rootGroup()->children().at(0)->name(), name);
-
- delete db;
}
void TestKeePass1Reader::cleanupTestCase()
{
- delete m_db;
}
QDateTime TestKeePass1Reader::genDT(int year, int month, int day, int hour, int min)
@@ -263,13 +254,15 @@ QDateTime TestKeePass1Reader::genDT(int year, int month, int day, int hour, int
return QDateTime(date, time, Qt::UTC);
}
-void TestKeePass1Reader::reopenDatabase(Database* db, const QString& password, const QString& keyfileName)
+void TestKeePass1Reader::reopenDatabase(QSharedPointer<Database> db,
+ const QString& password,
+ const QString& keyfileName)
{
QBuffer buffer;
buffer.open(QIODevice::ReadWrite);
KeePass2Writer writer;
- writer.writeDatabase(&buffer, db);
+ writer.writeDatabase(&buffer, db.data());
QVERIFY(!writer.hasError());
QVERIFY(buffer.seek(0));
@@ -284,7 +277,7 @@ void TestKeePass1Reader::reopenDatabase(Database* db, const QString& password, c
}
KeePass2Reader reader;
- QScopedPointer<Database> newDb(reader.readDatabase(&buffer, key));
- QVERIFY(newDb);
+ auto newDb = QSharedPointer<Database>::create();
+ QVERIFY(reader.readDatabase(&buffer, key, newDb.data()));
QVERIFY(!reader.hasError());
}
diff --git a/tests/TestKeePass1Reader.h b/tests/TestKeePass1Reader.h
index 9a5ab9e49..b847d910c 100644
--- a/tests/TestKeePass1Reader.h
+++ b/tests/TestKeePass1Reader.h
@@ -20,6 +20,7 @@
#include <QDateTime>
#include <QObject>
+#include <QSharedPointer>
class Database;
@@ -43,9 +44,9 @@ private slots:
private:
static QDateTime genDT(int year, int month, int day, int hour, int min);
- static void reopenDatabase(Database* db, const QString& password, const QString& keyfileName);
+ static void reopenDatabase(QSharedPointer<Database> db, const QString& password, const QString& keyfileName);
- Database* m_db;
+ QSharedPointer<Database> m_db;
};
#endif // KEEPASSX_TESTKEEPASS1READER_H
diff --git a/tests/TestKeePass2Format.cpp b/tests/TestKeePass2Format.cpp
index c2c3f75d3..35bbfed3e 100644
--- a/tests/TestKeePass2Format.cpp
+++ b/tests/TestKeePass2Format.cpp
@@ -34,7 +34,7 @@ void TestKeePass2Format::initTestCase()
// read raw XML database
bool hasError;
QString errorString;
- m_xmlDb.reset(readXml(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"), true, hasError, errorString));
+ m_xmlDb = readXml(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"), true, hasError, errorString);
if (hasError) {
QFAIL(qPrintable(QString("Error while reading XML: ").append(errorString)));
}
@@ -44,7 +44,7 @@ void TestKeePass2Format::initTestCase()
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("test"));
- m_kdbxSourceDb.reset(new Database());
+ m_kdbxSourceDb = QSharedPointer<Database>::create();
m_kdbxSourceDb->setKey(key);
m_kdbxSourceDb->metadata()->setName("TESTDB");
Group* group = m_kdbxSourceDb->rootGroup();
@@ -351,7 +351,7 @@ void TestKeePass2Format::testXmlBroken()
QVERIFY(QFile::exists(xmlFile));
bool hasError;
QString errorString;
- QScopedPointer<Database> db(readXml(xmlFile, strictMode, hasError, errorString));
+ auto db = readXml(xmlFile, strictMode, hasError, errorString);
if (hasError) {
qWarning("Reader error: %s", qPrintable(errorString));
}
@@ -392,7 +392,7 @@ void TestKeePass2Format::testXmlEmptyUuids()
QVERIFY(QFile::exists(xmlFile));
bool hasError;
QString errorString;
- QScopedPointer<Database> dbp(readXml(xmlFile, true, hasError, errorString));
+ auto db = readXml(xmlFile, true, hasError, errorString);
if (hasError) {
qWarning("Reader error: %s", qPrintable(errorString));
}
@@ -446,7 +446,7 @@ void TestKeePass2Format::testXmlInvalidXmlChars()
QVERIFY(!hasError);
buffer.seek(0);
- QScopedPointer<Database> dbRead(readXml(&buffer, true, hasError, errorString));
+ auto dbRead = readXml(&buffer, true, hasError, errorString);
if (hasError) {
qWarning("Database read error: %s", qPrintable(errorString));
}
@@ -474,7 +474,7 @@ void TestKeePass2Format::testXmlRepairUuidHistoryItem()
QVERIFY(QFile::exists(xmlFile));
bool hasError;
QString errorString;
- QScopedPointer<Database> db(readXml(xmlFile, false, hasError, errorString));
+ auto db = readXml(xmlFile, false, hasError, errorString);
if (hasError) {
qWarning("Database read error: %s", qPrintable(errorString));
}
@@ -503,6 +503,7 @@ void TestKeePass2Format::testReadBackTargetDb()
QString errorString;
m_kdbxTargetBuffer.seek(0);
+ m_kdbxTargetDb = QSharedPointer<Database>::create();
readKdbx(&m_kdbxTargetBuffer, key, m_kdbxTargetDb, hasError, errorString);
if (hasError) {
QFAIL(qPrintable(QString("Error while reading database: ").append(errorString)));
@@ -548,7 +549,7 @@ void TestKeePass2Format::testKdbxDeviceFailure()
QScopedPointer<Database> db(new Database());
db->setKey(key);
// Disable compression so we write a predictable number of bytes.
- db->setCompressionAlgo(Database::CompressionNone);
+ db->setCompressionAlgorithm(Database::CompressionNone);
auto entry = new Entry();
entry->setParent(db->rootGroup());
@@ -569,7 +570,7 @@ void TestKeePass2Format::testKdbxDeviceFailure()
*/
void TestKeePass2Format::testDuplicateAttachments()
{
- QScopedPointer<Database> db(new Database());
+ auto db = QSharedPointer<Database>::create();
db->setKey(QSharedPointer<CompositeKey>::create());
const QByteArray attachment1("abc");
diff --git a/tests/TestKeePass2Format.h b/tests/TestKeePass2Format.h
index 19b0fb649..5d85a73b8 100644
--- a/tests/TestKeePass2Format.h
+++ b/tests/TestKeePass2Format.h
@@ -21,7 +21,7 @@
#include <QBuffer>
#include <QDateTime>
#include <QObject>
-#include <QScopedPointer>
+#include <QSharedPointer>
#include "core/Database.h"
@@ -67,25 +67,25 @@ private slots:
protected:
virtual void initTestCaseImpl() = 0;
- virtual Database* readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) = 0;
- virtual Database* readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) = 0;
+ virtual QSharedPointer<Database> readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) = 0;
+ virtual QSharedPointer<Database> readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) = 0;
virtual void writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) = 0;
virtual void readKdbx(QIODevice* device,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString) = 0;
virtual void readKdbx(const QString& path,
QSharedPointer<const CompositeKey> key,
- QScopedPointer<Database>& db,
+ QSharedPointer<Database> db,
bool& hasError,
QString& errorString) = 0;
virtual void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) = 0;
- QScopedPointer<Database> m_xmlDb;
- QScopedPointer<Database> m_kdbxSourceDb;
- QScopedPointer<Database> m_kdbxTargetDb;
+ QSharedPointer<Database> m_xmlDb;
+ QSharedPointer<Database> m_kdbxSourceDb;
+ QSharedPointer<Database> m_kdbxTargetDb;
private:
QBuffer m_kdbxTargetBuffer;
diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp
index 84c202914..c2e9aa196 100644
--- a/tests/TestKeys.cpp
+++ b/tests/TestKeys.cpp
@@ -87,8 +87,8 @@ void TestKeys::testFileKey()
compositeKey->addKey(fileKey);
- QScopedPointer<Database> db(reader.readDatabase(dbFilename, compositeKey));
- QVERIFY(db);
+ auto db = QSharedPointer<Database>::create();
+ QVERIFY(db->open(dbFilename, compositeKey, nullptr, false));
QVERIFY(!reader.hasError());
QCOMPARE(db->metadata()->name(), QString("%1 Database").arg(name));
}
@@ -152,7 +152,8 @@ void TestKeys::testCreateAndOpenFileKey()
dbBuffer.reset();
KeePass2Reader reader;
- QScopedPointer<Database> dbRead(reader.readDatabase(&dbBuffer, compositeKey));
+ auto dbRead = QSharedPointer<Database>::create();
+ reader.readDatabase(&dbBuffer, compositeKey, dbRead.data());
if (reader.hasError()) {
QFAIL(reader.errorString().toUtf8().constData());
}
@@ -236,7 +237,7 @@ void TestKeys::testCompositeKeyComponents()
compositeKeyEnc->addKey(fileKeyEnc);
compositeKeyEnc->addChallengeResponseKey(challengeResponseKeyEnc);
- QScopedPointer<Database> db1(new Database());
+ auto db1 = QSharedPointer<Database>::create();
db1->setKey(compositeKeyEnc);
KeePass2Writer writer;
@@ -245,27 +246,27 @@ void TestKeys::testCompositeKeyComponents()
QVERIFY(writer.writeDatabase(&buffer, db1.data()));
buffer.seek(0);
- QScopedPointer<Database> db2;
+ auto db2 = QSharedPointer<Database>::create();
KeePass2Reader reader;
auto compositeKeyDec1 = QSharedPointer<CompositeKey>::create();
// try decryption and subsequently add key components until decryption is successful
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec1));
+ QVERIFY(!reader.readDatabase(&buffer, compositeKeyDec1, db2.data()));
QVERIFY(reader.hasError());
compositeKeyDec1->addKey(passwordKeyEnc);
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec1));
+ QVERIFY(!reader.readDatabase(&buffer, compositeKeyDec1, db2.data()));
QVERIFY(reader.hasError());
compositeKeyDec1->addKey(fileKeyEnc);
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec1));
+ QVERIFY(!reader.readDatabase(&buffer, compositeKeyDec1, db2.data()));
QVERIFY(reader.hasError());
compositeKeyDec1->addChallengeResponseKey(challengeResponseKeyEnc);
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec1));
+ QVERIFY(reader.readDatabase(&buffer, compositeKeyDec1, db2.data()));
// now we should be able to open the database
if (reader.hasError()) {
QFAIL(qPrintable(reader.errorString()));
@@ -277,7 +278,7 @@ void TestKeys::testCompositeKeyComponents()
compositeKeyDec2->addKey(fileKeyEnc);
compositeKeyDec2->addChallengeResponseKey(challengeResponseKeyEnc);
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec2));
+ QVERIFY(!reader.readDatabase(&buffer, compositeKeyDec2, db2.data()));
QVERIFY(reader.hasError());
auto compositeKeyDec3 = QSharedPointer<CompositeKey>::create();
@@ -290,7 +291,7 @@ void TestKeys::testCompositeKeyComponents()
compositeKeyDec3->addKey(fileKeyWrong);
compositeKeyDec3->addChallengeResponseKey(challengeResponseKeyEnc);
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec3));
+ QVERIFY(!reader.readDatabase(&buffer, compositeKeyDec3, db2.data()));
QVERIFY(reader.hasError());
auto compositeKeyDec4 = QSharedPointer<CompositeKey>::create();
@@ -298,6 +299,6 @@ void TestKeys::testCompositeKeyComponents()
compositeKeyDec4->addKey(fileKeyEnc);
compositeKeyDec4->addChallengeResponseKey(QSharedPointer<MockChallengeResponseKey>::create(QByteArray(16, 0x20)));
buffer.seek(0);
- db2.reset(reader.readDatabase(&buffer, compositeKeyDec4));
+ QVERIFY(!reader.readDatabase(&buffer, compositeKeyDec4, db2.data()));
QVERIFY(reader.hasError());
}
diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp
index 60e3a9ea8..3e41d7d50 100644
--- a/tests/TestMerge.cpp
+++ b/tests/TestMerge.cpp
@@ -1363,10 +1363,10 @@ void TestMerge::testMergeNotModified()
QScopedPointer<Database> dbSource(
createTestDatabaseStructureClone(dbDestination.data(), Entry::CloneNoFlags, Group::CloneIncludeEntries));
- QSignalSpy modifiedSignalSpy(dbDestination.data(), SIGNAL(modified()));
+ QSignalSpy modifiedSignalSpy(dbDestination.data(), SIGNAL(databaseModified()));
Merger merger(dbSource.data(), dbDestination.data());
merger.merge();
- QVERIFY(modifiedSignalSpy.empty());
+ QTRY_VERIFY(modifiedSignalSpy.empty());
}
void TestMerge::testMergeModified()
@@ -1375,7 +1375,7 @@ void TestMerge::testMergeModified()
QScopedPointer<Database> dbSource(
createTestDatabaseStructureClone(dbDestination.data(), Entry::CloneNoFlags, Group::CloneIncludeEntries));
- QSignalSpy modifiedSignalSpy(dbDestination.data(), SIGNAL(modified()));
+ QSignalSpy modifiedSignalSpy(dbDestination.data(), SIGNAL(databaseModified()));
// Make sure the two changes have a different timestamp.
QTest::qSleep(1);
Entry* entry = dbSource->rootGroup()->findEntryByPath("entry1");
@@ -1385,7 +1385,7 @@ void TestMerge::testMergeModified()
Merger merger(dbSource.data(), dbDestination.data());
merger.merge();
- QVERIFY(!modifiedSignalSpy.empty());
+ QTRY_VERIFY(!modifiedSignalSpy.empty());
}
Database* TestMerge::createTestDatabase()
diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp
index 63013fd5e..fff558b22 100644
--- a/tests/TestModified.cpp
+++ b/tests/TestModified.cpp
@@ -61,67 +61,83 @@ void TestModified::testSignals()
QScopedPointer<Database> db(new Database());
auto* root = db->rootGroup();
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
db->setKey(compositeKey);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
auto* group1 = new Group();
group1->setParent(root);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
auto* group2 = new Group();
group2->setParent(root);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group2->setParent(root, 0);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
auto* entry1 = new Entry();
entry1->setGroup(group1);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
QScopedPointer<Database> db2(new Database());
auto* root2 = db2->rootGroup();
- QSignalSpy spyModified2(db2.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified2(db2.data(), SIGNAL(databaseModified()));
group1->setParent(root2);
- QCOMPARE(spyModified.count(), ++spyCount);
- QCOMPARE(spyModified2.count(), ++spyCount2);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
+ ++spyCount2;
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
entry1->setTitle("test");
- QCOMPARE(spyModified.count(), spyCount);
- QCOMPARE(spyModified2.count(), ++spyCount2);
+ QTRY_COMPARE(spyModified.count(), spyCount);
+ ++spyCount2;
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
auto* entry2 = new Entry();
entry2->setGroup(group2);
- QCOMPARE(spyModified.count(), ++spyCount);
- QCOMPARE(spyModified2.count(), spyCount2);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
entry2->setGroup(root2);
- QCOMPARE(spyModified.count(), ++spyCount);
- QCOMPARE(spyModified2.count(), ++spyCount2);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
+ ++spyCount2;
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
entry2->setTitle("test2");
- QCOMPARE(spyModified.count(), spyCount);
- QCOMPARE(spyModified2.count(), ++spyCount2);
+ QTRY_COMPARE(spyModified.count(), spyCount);
+ ++spyCount2;
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
auto* group3 = new Group();
group3->setParent(root);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
auto* group4 = new Group();
group4->setParent(group3);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
delete group4;
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
delete entry2;
- QCOMPARE(spyModified2.count(), ++spyCount2);
+ ++spyCount2;
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
- QCOMPARE(spyModified.count(), spyCount);
- QCOMPARE(spyModified2.count(), spyCount2);
+ QTRY_COMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified2.count(), spyCount2);
}
void TestModified::testGroupSets()
@@ -133,58 +149,68 @@ void TestModified::testGroupSets()
auto* group = new Group();
group->setParent(root);
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
root->setUuid(QUuid::createUuid());
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setUuid(root->uuid());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setName("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setName(root->name());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setNotes("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setNotes(root->notes());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setIcon(1);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setIcon(root->iconNumber());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setIcon(QUuid::createUuid());
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
root->setIcon(root->iconUuid());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setUuid(QUuid::createUuid());
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setUuid(group->uuid());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setName("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setName(group->name());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setNotes("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setNotes(group->notes());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setIcon(1);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setIcon(group->iconNumber());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setIcon(QUuid::createUuid());
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->setIcon(group->iconUuid());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
}
void TestModified::testEntrySets()
@@ -198,106 +224,127 @@ void TestModified::testEntrySets()
auto* entry = new Entry();
entry->setGroup(group);
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
entry->setUuid(QUuid::createUuid());
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setUuid(entry->uuid());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setTitle("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setTitle(entry->title());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setUrl("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setUrl(entry->url());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setUsername("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setUsername(entry->username());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setPassword("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setPassword(entry->password());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setNotes("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setNotes(entry->notes());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setIcon(1);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setIcon(entry->iconNumber());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setIcon(QUuid::createUuid());
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setIcon(entry->iconUuid());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setTags("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setTags(entry->tags());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setExpires(true);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setExpires(entry->timeInfo().expires());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setExpiryTime(Clock::currentDateTimeUtc().addYears(1));
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setExpiryTime(entry->timeInfo().expiryTime());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setAutoTypeEnabled(false);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setAutoTypeEnabled(entry->autoTypeEnabled());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setAutoTypeObfuscation(1);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setAutoTypeObfuscation(entry->autoTypeObfuscation());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setDefaultAutoTypeSequence("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setDefaultAutoTypeSequence(entry->defaultAutoTypeSequence());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setForegroundColor(Qt::red);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setForegroundColor(entry->foregroundColor());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setBackgroundColor(Qt::red);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setBackgroundColor(entry->backgroundColor());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setOverrideUrl("test");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->setOverrideUrl(entry->overrideUrl());
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->attributes()->set("test key", "test value", false);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->attributes()->set("test key", entry->attributes()->value("test key"), false);
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->attributes()->set("test key", entry->attributes()->value("test key"), true);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->attributes()->set("test key", "new test value", true);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->attributes()->set("test key2", "test value2", true);
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->attributes()->set("test key2", entry->attributes()->value("test key2"), true);
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
}
void TestModified::testHistoryItems()
@@ -601,20 +648,23 @@ void TestModified::testCustomData()
auto* entry = new Entry();
entry->setGroup(group);
- QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate()));
+ QSignalSpy spyModified(db.data(), SIGNAL(databaseModified()));
db->metadata()->customData()->set("Key", "Value");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
db->metadata()->customData()->set("Key", "Value");
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->customData()->set("Key", "Value");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
entry->customData()->set("Key", "Value");
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->customData()->set("Key", "Value");
- QCOMPARE(spyModified.count(), ++spyCount);
+ ++spyCount;
+ QTRY_COMPARE(spyModified.count(), spyCount);
group->customData()->set("Key", "Value");
- QCOMPARE(spyModified.count(), spyCount);
+ QTRY_COMPARE(spyModified.count(), spyCount);
}
diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp
index 0adeabd95..41499d16e 100644
--- a/tests/gui/TestGui.cpp
+++ b/tests/gui/TestGui.cpp
@@ -110,37 +110,36 @@ void TestGui::init()
m_dbFilePath = m_dbFile->fileName();
m_dbFile->close();
+ // make sure window is activated or focus tests may fail
+ m_mainWindow->activateWindow();
+ QApplication::processEvents();
+
fileDialog()->setNextFileName(m_dbFilePath);
triggerAction("actionDatabaseOpen");
- auto* databaseOpenWidget = m_mainWindow->findChild<QWidget*>("databaseOpenWidget");
+ auto* databaseOpenWidget = m_tabWidget->currentDatabaseWidget()->findChild<QWidget*>("databaseOpenWidget");
+ QVERIFY(databaseOpenWidget);
auto* editPassword = databaseOpenWidget->findChild<QLineEdit*>("editPassword");
QVERIFY(editPassword);
+ editPassword->setFocus();
QTest::keyClicks(editPassword, "a");
QTest::keyClick(editPassword, Qt::Key_Enter);
- QTRY_VERIFY(m_tabWidget->currentDatabaseWidget());
-
m_dbWidget = m_tabWidget->currentDatabaseWidget();
m_db = m_dbWidget->database();
-
- // make sure window is activated or focus tests may fail
- m_mainWindow->activateWindow();
- QApplication::processEvents();
}
// Every test ends with closing the temp database without saving
void TestGui::cleanup()
{
// DO NOT save the database
+ m_db->markAsClean();
MessageBox::setNextAnswer(QMessageBox::No);
triggerAction("actionDatabaseClose");
QApplication::processEvents();
+ MessageBox::setNextAnswer(QMessageBox::NoButton);
- if (m_db) {
- delete m_db;
- }
if (m_dbWidget) {
delete m_dbWidget;
}
@@ -301,13 +300,14 @@ void TestGui::createDatabaseCallback()
void TestGui::testMergeDatabase()
{
// It is safe to ignore the warning this line produces
- QSignalSpy dbMergeSpy(m_dbWidget.data(), SIGNAL(databaseMerged(Database*)));
+ QSignalSpy dbMergeSpy(m_dbWidget.data(), SIGNAL(databaseMerged(QSharedPointer<Database>)));
+ QApplication::processEvents();
// set file to merge from
fileDialog()->setNextFileName(QString(KEEPASSX_TEST_DATA_DIR).append("/MergeDatabase.kdbx"));
triggerAction("actionDatabaseMerge");
- auto* databaseOpenMergeWidget = m_mainWindow->findChild<QWidget*>("databaseOpenMergeWidget");
+ auto* databaseOpenMergeWidget = m_tabWidget->currentDatabaseWidget()->findChild<QWidget*>("databaseOpenMergeWidget");
auto* editPasswordMerge = databaseOpenMergeWidget->findChild<QLineEdit*>("editPassword");
QVERIFY(editPasswordMerge->isVisible());
@@ -317,7 +317,7 @@ void TestGui::testMergeDatabase()
QTest::keyClick(editPasswordMerge, Qt::Key_Enter);
QTRY_COMPARE(dbMergeSpy.count(), 1);
- QTRY_VERIFY(m_tabWidget->tabText(m_tabWidget->currentIndex()).contains("*"));
+ QTRY_VERIFY(m_tabWidget->tabName(m_tabWidget->currentIndex()).contains("*"));
m_db = m_tabWidget->currentDatabaseWidget()->database();
@@ -352,7 +352,7 @@ void TestGui::testAutoreloadDatabase()
// the General group contains one entry from the new db data
QCOMPARE(m_db->rootGroup()->findChildByName("General")->entries().size(), 1);
- QVERIFY(!m_tabWidget->tabText(m_tabWidget->currentIndex()).endsWith("*"));
+ QVERIFY(!m_tabWidget->tabName(m_tabWidget->currentIndex()).endsWith("*"));
// Reset the state
cleanup();
@@ -370,7 +370,7 @@ void TestGui::testAutoreloadDatabase()
// Ensure the merge did not take place
QCOMPARE(m_db->rootGroup()->findChildByName("General")->entries().size(), 0);
- QVERIFY(m_tabWidget->tabText(m_tabWidget->currentIndex()).endsWith("*"));
+ QVERIFY(m_tabWidget->tabName(m_tabWidget->currentIndex()).endsWith("*"));
// Reset the state
cleanup();
@@ -393,13 +393,13 @@ void TestGui::testAutoreloadDatabase()
m_db = m_dbWidget->database();
QCOMPARE(m_db->rootGroup()->findChildByName("General")->entries().size(), 1);
- QVERIFY(m_tabWidget->tabText(m_tabWidget->currentIndex()).endsWith("*"));
+ QTRY_VERIFY(m_tabWidget->tabText(m_tabWidget->currentIndex()).endsWith("*"));
}
void TestGui::testTabs()
{
QCOMPARE(m_tabWidget->count(), 1);
- QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), m_dbFileName);
+ QCOMPARE(m_tabWidget->tabName(m_tabWidget->currentIndex()), m_dbFileName);
}
void TestGui::testEditEntry()
@@ -424,15 +424,16 @@ void TestGui::testEditEntry()
// Edit the first entry ("Sample Entry")
QTest::mouseClick(entryEditWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
auto* titleEdit = editEntryWidget->findChild<QLineEdit*>("titleEdit");
QTest::keyClicks(titleEdit, "_test");
// Apply the edit
auto* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox");
+ QVERIFY(editEntryWidgetButtonBox);
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Apply), Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
QCOMPARE(entry->title(), QString("Sample Entry_test"));
QCOMPARE(entry->historyItems().size(), ++editCount);
@@ -473,15 +474,16 @@ void TestGui::testEditEntry()
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
auto* messageWiget = editEntryWidget->findChild<MessageWidget*>("messageWidget");
QTRY_VERIFY(messageWiget->isVisible());
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
QCOMPARE(passwordEdit->text(), QString("newpass"));
passwordEdit->setText(originalPassword);
// Save the edit (press OK)
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
+ QApplication::processEvents();
// Confirm edit was made
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
QCOMPARE(entry->title(), QString("Sample Entry_test"));
QCOMPARE(entry->foregroundColor(), fgColor);
QCOMPARE(entryItem.data(Qt::ForegroundRole), QVariant(fgColor));
@@ -490,11 +492,11 @@ void TestGui::testEditEntry()
QCOMPARE(entry->historyItems().size(), ++editCount);
// Confirm modified indicator is showing
- QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("%1*").arg(m_dbFileName));
+ QTRY_COMPARE(m_tabWidget->tabName(m_tabWidget->currentIndex()), QString("%1*").arg(m_dbFileName));
// Test copy & paste newline sanitization
QTest::mouseClick(entryEditWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
titleEdit->setText("multiline\ntitle");
editEntryWidget->findChild<QLineEdit*>("usernameEdit")->setText("multiline\nusername");
editEntryWidget->findChild<QLineEdit*>("passwordEdit")->setText("multiline\npassword");
@@ -550,11 +552,11 @@ void TestGui::testSearchEditEntry()
auto* searchTextEdit = searchWidget->findChild<QLineEdit*>("searchEdit");
QTest::mouseClick(searchTextEdit, Qt::LeftButton);
QTest::keyClicks(searchTextEdit, "Doggy");
- QTRY_VERIFY(m_dbWidget->isInSearchMode());
+ QTRY_VERIFY(m_dbWidget->isSearchActive());
// Goto "Doggy"'s edit view
QTest::keyClick(searchTextEdit, Qt::Key_Return);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
// Check the path in header is "parent-group > entry"
QCOMPARE(m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget")->findChild<QLabel*>("headerLabel")->text(),
@@ -577,7 +579,7 @@ void TestGui::testAddEntry()
// Click the new entry button and check that we enter edit mode
QTest::mouseClick(entryNewWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
// Add entry "test" and confirm added
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
@@ -586,7 +588,7 @@ void TestGui::testAddEntry()
auto* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox");
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
QModelIndex item = entryView->model()->index(1, 1);
Entry* entry = entryView->entryFromIndex(item);
@@ -629,7 +631,7 @@ void TestGui::testPasswordEntryEntropy()
// Click the new entry button and check that we enter edit mode
QTest::mouseClick(entryNewWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
// Add entry "test" and confirm added
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
@@ -701,7 +703,7 @@ void TestGui::testDicewareEntryEntropy()
// Click the new entry button and check that we enter edit mode
QTest::mouseClick(entryNewWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
// Add entry "test" and confirm added
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
@@ -736,7 +738,7 @@ void TestGui::testTotp()
auto* entryView = m_dbWidget->findChild<EntryView*>("entryView");
QCOMPARE(entryView->model()->rowCount(), 1);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
QModelIndex item = entryView->model()->index(0, 1);
Entry* entry = entryView->entryFromIndex(item);
clickIndex(item, entryView, Qt::LeftButton);
@@ -766,7 +768,7 @@ void TestGui::testTotp()
QVERIFY(entryEditWidget->isVisible());
QVERIFY(entryEditWidget->isEnabled());
QTest::mouseClick(entryEditWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
editEntryWidget->setCurrentPage(1);
@@ -822,7 +824,7 @@ void TestGui::testSearch()
QTest::keyClicks(searchTextEdit, "ZZZ");
QTRY_COMPARE(searchTextEdit->text(), QString("ZZZ"));
QTRY_VERIFY(clearButton->isVisible());
- QTRY_VERIFY(m_dbWidget->isInSearchMode());
+ QTRY_VERIFY(m_dbWidget->isSearchActive());
QTRY_COMPARE(entryView->model()->rowCount(), 0);
// Press the search clear button
clearButton->trigger();
@@ -834,10 +836,10 @@ void TestGui::testSearch()
QTest::keyClick(searchTextEdit, Qt::Key_Escape);
QTRY_VERIFY(searchTextEdit->text().isEmpty());
QTRY_VERIFY(searchTextEdit->hasFocus());
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
// Search for "some"
QTest::keyClicks(searchTextEdit, "some");
- QTRY_VERIFY(m_dbWidget->isInSearchMode());
+ QTRY_VERIFY(m_dbWidget->isSearchActive());
QTRY_COMPARE(entryView->model()->rowCount(), 3);
// Search for "someTHING"
QTest::keyClicks(searchTextEdit, "THING");
@@ -894,12 +896,12 @@ void TestGui::testSearch()
// Refocus back to search edit
QTest::mouseClick(searchTextEdit, Qt::LeftButton);
QTRY_VERIFY(searchTextEdit->hasFocus());
- QVERIFY(m_dbWidget->isInSearchMode());
+ QVERIFY(m_dbWidget->isSearchActive());
QModelIndex item = entryView->model()->index(0, 1);
Entry* entry = entryView->entryFromIndex(item);
QTest::keyClick(searchTextEdit, Qt::Key_Return);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
// Perform the edit and save it
EditEntryWidget* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
@@ -910,12 +912,12 @@ void TestGui::testSearch()
QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton);
// Confirm the edit was made and we are back in search mode
- QTRY_VERIFY(m_dbWidget->isInSearchMode());
+ QTRY_VERIFY(m_dbWidget->isSearchActive());
QCOMPARE(entry->title(), origTitle.append("_edited"));
// Cancel search, should return to normal view
QTest::keyClick(m_mainWindow.data(), Qt::Key_Escape);
- QTRY_COMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QTRY_COMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
}
void TestGui::testDeleteEntry()
@@ -929,7 +931,7 @@ void TestGui::testDeleteEntry()
auto* entryDeleteAction = m_mainWindow->findChild<QAction*>("actionEntryDelete");
QWidget* entryDeleteWidget = toolBar->widgetForAction(entryDeleteAction);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton);
QVERIFY(entryDeleteWidget->isVisible());
QVERIFY(entryDeleteWidget->isEnabled());
@@ -1022,7 +1024,7 @@ void TestGui::testEntryPlaceholders()
// Click the new entry button and check that we enter edit mode
QTest::mouseClick(entryNewWidget, Qt::LeftButton);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode);
// Add entry "test" and confirm added
auto* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget");
@@ -1037,7 +1039,7 @@ void TestGui::testEntryPlaceholders()
QCOMPARE(entryView->model()->rowCount(), 2);
- QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode);
+ QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
QModelIndex item = entryView->model()->index(1, 1);
Entry* entry = entryView->entryFromIndex(item);
@@ -1105,7 +1107,7 @@ void TestGui::testSaveAs()
triggerAction("actionDatabaseSaveAs");
- QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("testSaveAs"));
+ QCOMPARE(m_tabWidget->tabName(m_tabWidget->currentIndex()), QString("testSaveAs"));
checkDatabase(tmpFileName);
@@ -1122,7 +1124,7 @@ void TestGui::testSave()
QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("testSave*"));
triggerAction("actionDatabaseSave");
- QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("testSave"));
+ QCOMPARE(m_tabWidget->tabName(m_tabWidget->currentIndex()), QString("testSave"));
checkDatabase();
}
@@ -1159,15 +1161,15 @@ void TestGui::testKeePass1Import()
fileDialog()->setNextFileName(QString(KEEPASSX_TEST_DATA_DIR).append("/basic.kdb"));
triggerAction("actionImportKeePass1");
- auto* keepass1OpenWidget = m_mainWindow->findChild<QWidget*>("keepass1OpenWidget");
+ auto* keepass1OpenWidget = m_tabWidget->currentDatabaseWidget()->findChild<QWidget*>("keepass1OpenWidget");
auto* editPassword = keepass1OpenWidget->findChild<QLineEdit*>("editPassword");
QVERIFY(editPassword);
QTest::keyClicks(editPassword, "masterpw");
QTest::keyClick(editPassword, Qt::Key_Enter);
- QCOMPARE(m_tabWidget->count(), 2);
- QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("basic [New database]*"));
+ QTRY_COMPARE(m_tabWidget->count(), 2);
+ QTRY_COMPARE(m_tabWidget->tabName(m_tabWidget->currentIndex()), QString("basic [New Database]*"));
// Close the KeePass1 Database
MessageBox::setNextAnswer(QMessageBox::No);
@@ -1182,7 +1184,7 @@ void TestGui::testDatabaseLocking()
MessageBox::setNextAnswer(QMessageBox::Cancel);
triggerAction("actionLockDatabases");
- QCOMPARE(m_tabWidget->tabText(0).remove('&'), origDbName + " [locked]");
+ QCOMPARE(m_tabWidget->tabName(0), origDbName + " [Locked]");
auto* actionDatabaseMerge = m_mainWindow->findChild<QAction*>("actionDatabaseMerge", Qt::FindChildrenRecursively);
QCOMPARE(actionDatabaseMerge->isEnabled(), false);
@@ -1197,7 +1199,7 @@ void TestGui::testDatabaseLocking()
QTest::keyClicks(editPassword, "a");
QTest::keyClick(editPassword, Qt::Key_Enter);
- QCOMPARE(m_tabWidget->tabText(0).remove('&'), origDbName);
+ QCOMPARE(m_tabWidget->tabName(0), origDbName);
actionDatabaseMerge = m_mainWindow->findChild<QAction*>("actionDatabaseMerge", Qt::FindChildrenRecursively);
QCOMPARE(actionDatabaseMerge->isEnabled(), true);
@@ -1304,10 +1306,8 @@ void TestGui::checkDatabase(QString dbFileName)
auto key = QSharedPointer<CompositeKey>::create();
key->addKey(QSharedPointer<PasswordKey>::create("a"));
- KeePass2Reader reader;
- QScopedPointer<Database> dbSaved(reader.readDatabase(dbFileName, key));
- QVERIFY(dbSaved);
- QVERIFY(!reader.hasError());
+ auto dbSaved = QSharedPointer<Database>::create();
+ QVERIFY(dbSaved->open(dbFileName, key, nullptr, false));
QCOMPARE(dbSaved->metadata()->name(), m_db->metadata()->name());
}
diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h
index 4df606f4a..532600bdc 100644
--- a/tests/gui/TestGui.h
+++ b/tests/gui/TestGui.h
@@ -26,6 +26,7 @@
#include <QObject>
#include <QPointer>
#include <QScopedPointer>
+#include <QSharedPointer>
class Database;
class DatabaseTabWidget;
@@ -88,7 +89,7 @@ private:
QScopedPointer<MainWindow> m_mainWindow;
QPointer<DatabaseTabWidget> m_tabWidget;
QPointer<DatabaseWidget> m_dbWidget;
- QPointer<Database> m_db;
+ QSharedPointer<Database> m_db;
QByteArray m_dbData;
QScopedPointer<TemporaryFile> m_dbFile;
QString m_dbFileName;