mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-04-04 21:17:43 +03:00
Support Database Custom Data Merging (#3002)
* Introduce _LAST_MODIFIED custom data entry that stores the last modified datetime of the database's custom data entries * Merge custom data from source database to target * Modify tests to be aware of _LAST_MODIFIED entry
This commit is contained in:
parent
01a3d5b0ba
commit
e4eee897f9
6 changed files with 132 additions and 11 deletions
|
@ -1164,6 +1164,65 @@ void TestMerge::testMetadata()
|
|||
// will be used - exception is the target has no recycle bin activated
|
||||
}
|
||||
|
||||
void TestMerge::testCustomdata()
|
||||
{
|
||||
QScopedPointer<Database> dbDestination(new Database());
|
||||
QScopedPointer<Database> dbSource(createTestDatabase());
|
||||
QScopedPointer<Database> dbDestination2(new Database());
|
||||
QScopedPointer<Database> dbSource2(createTestDatabase());
|
||||
|
||||
m_clock->advanceSecond(1);
|
||||
|
||||
dbDestination->metadata()->customData()->set("toBeDeleted", "value");
|
||||
dbDestination->metadata()->customData()->set("key3", "oldValue");
|
||||
|
||||
dbSource2->metadata()->customData()->set("key1", "value1");
|
||||
dbSource2->metadata()->customData()->set("key2", "value2");
|
||||
dbSource2->metadata()->customData()->set("key3", "newValue");
|
||||
dbSource2->metadata()->customData()->set("Browser", "n'8=3W@L^6d->d.]St_>]");
|
||||
|
||||
m_clock->advanceSecond(1);
|
||||
|
||||
dbSource->metadata()->customData()->set("key1", "value1");
|
||||
dbSource->metadata()->customData()->set("key2", "value2");
|
||||
dbSource->metadata()->customData()->set("key3", "newValue");
|
||||
dbSource->metadata()->customData()->set("Browser", "n'8=3W@L^6d->d.]St_>]");
|
||||
|
||||
dbDestination2->metadata()->customData()->set("notToBeDeleted", "value");
|
||||
dbDestination2->metadata()->customData()->set("key3", "oldValue");
|
||||
|
||||
// Sanity check.
|
||||
QVERIFY(!dbSource->metadata()->customData()->isEmpty());
|
||||
QVERIFY(!dbSource2->metadata()->customData()->isEmpty());
|
||||
|
||||
m_clock->advanceSecond(1);
|
||||
|
||||
Merger merger(dbSource.data(), dbDestination.data());
|
||||
merger.merge();
|
||||
|
||||
Merger merger2(dbSource2.data(), dbDestination2.data());
|
||||
merger2.merge();
|
||||
|
||||
// Source is newer, data should be merged
|
||||
QVERIFY(!dbDestination->metadata()->customData()->isEmpty());
|
||||
QVERIFY(dbDestination->metadata()->customData()->contains("key1"));
|
||||
QVERIFY(dbDestination->metadata()->customData()->contains("key2"));
|
||||
QVERIFY(dbDestination->metadata()->customData()->contains("Browser"));
|
||||
QVERIFY(!dbDestination->metadata()->customData()->contains("toBeDeleted"));
|
||||
QCOMPARE(dbDestination->metadata()->customData()->value("key1"), QString("value1"));
|
||||
QCOMPARE(dbDestination->metadata()->customData()->value("key2"), QString("value2"));
|
||||
QCOMPARE(dbDestination->metadata()->customData()->value("Browser"), QString("n'8=3W@L^6d->d.]St_>]"));
|
||||
QCOMPARE(dbDestination->metadata()->customData()->value("key3"), QString("newValue")); // Old value should be replaced
|
||||
|
||||
// Target is newer, no data is merged
|
||||
QVERIFY(!dbDestination2->metadata()->customData()->isEmpty());
|
||||
QVERIFY(!dbDestination2->metadata()->customData()->contains("key1"));
|
||||
QVERIFY(!dbDestination2->metadata()->customData()->contains("key2"));
|
||||
QVERIFY(!dbDestination2->metadata()->customData()->contains("Browser"));
|
||||
QVERIFY(dbDestination2->metadata()->customData()->contains("notToBeDeleted"));
|
||||
QCOMPARE(dbDestination2->metadata()->customData()->value("key3"), QString("oldValue")); // Old value should not be replaced
|
||||
}
|
||||
|
||||
void TestMerge::testDeletedEntry()
|
||||
{
|
||||
QScopedPointer<Database> dbDestination(createTestDatabase());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue