void TestEntryModel::testAttributesModel() { EntryAttributes* entryAttributes = new EntryAttributes(this); EntryAttributesModel* model = new EntryAttributesModel(this); ModelTest* modelTest = new ModelTest(model, this); QCOMPARE(model->rowCount(), 0); model->setEntryAttributes(entryAttributes); QCOMPARE(model->rowCount(), 0); QSignalSpy spyDataChanged(model, SIGNAL(dataChanged(QModelIndex,QModelIndex))); QSignalSpy spyAboutToAdd(model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); QSignalSpy spyAdded(model, SIGNAL(rowsInserted(QModelIndex,int,int))); QSignalSpy spyAboutToRemove(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); QSignalSpy spyRemoved(model, SIGNAL(rowsRemoved(QModelIndex,int,int))); entryAttributes->set("first", "123"); entryAttributes->set("2nd", "456"); entryAttributes->set("2nd", "789"); QCOMPARE(model->data(model->index(0, 0)).toString(), QString("2nd")); entryAttributes->remove("first"); // make sure these don't generate messages entryAttributes->set("Title", "test"); entryAttributes->set("Notes", "test"); QCOMPARE(spyDataChanged.count(), 1); QCOMPARE(spyAboutToAdd.count(), 2); QCOMPARE(spyAdded.count(), 2); QCOMPARE(spyAboutToRemove.count(), 1); QCOMPARE(spyRemoved.count(), 1); QSignalSpy spyReset(model, SIGNAL(modelReset())); entryAttributes->clear(); model->setEntryAttributes(0); QCOMPARE(spyReset.count(), 2); QCOMPARE(model->rowCount(), 0); delete modelTest; delete model; }
void TestModified::testHistoryItem() { Entry* entry = new Entry(); QDateTime created = entry->timeInfo().creationTime(); entry->setUuid(Uuid::random()); entry->setTitle("a"); entry->setTags("a"); EntryAttributes* attributes = new EntryAttributes(); attributes->copyCustomKeysFrom(entry->attributes()); Entry* historyEntry; int historyItemsSize = 0; entry->beginUpdate(); entry->setTitle("a"); entry->setTags("a"); entry->setOverrideUrl(""); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), historyItemsSize); QDateTime modified = entry->timeInfo().lastModificationTime(); QTest::qSleep(10); entry->beginUpdate(); entry->setTitle("b"); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); historyEntry = entry->historyItems().at(historyItemsSize - 1); QCOMPARE(historyEntry->title(), QString("a")); QCOMPARE(historyEntry->uuid(), entry->uuid()); QCOMPARE(historyEntry->tags(), entry->tags()); QCOMPARE(historyEntry->overrideUrl(), entry->overrideUrl()); QCOMPARE(historyEntry->timeInfo().creationTime(), created); QCOMPARE(historyEntry->timeInfo().lastModificationTime(), modified); QCOMPARE(historyEntry->historyItems().size(), 0); entry->beginUpdate(); entry->setTags("b"); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); QCOMPARE(entry->historyItems().at(historyItemsSize - 1)->tags(), QString("a")); entry->beginUpdate(); entry->attachments()->set("test", QByteArray("value")); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); QCOMPARE(entry->historyItems().at(historyItemsSize - 1)->attachments()->keys().size(), 0); attributes->set("k", "myvalue"); entry->beginUpdate(); entry->attributes()->copyCustomKeysFrom(attributes); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); QVERIFY(!entry->historyItems().at(historyItemsSize - 1)->attributes()->keys().contains("k")); delete attributes; delete entry; Database* db = new Database(); Group* root = db->rootGroup(); db->metadata()->setHistoryMaxItems(3); db->metadata()->setHistoryMaxSize(-1); Entry* historyEntry2; Entry* entry2 = new Entry(); entry2->setGroup(root); entry2->beginUpdate(); entry2->setTitle("1"); entry2->endUpdate(); entry2->beginUpdate(); entry2->setTitle("2"); entry2->endUpdate(); entry2->beginUpdate(); entry2->setTitle("3"); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 3); entry2->beginUpdate(); entry2->setTitle("4"); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 3); db->metadata()->setHistoryMaxItems(1); entry2->beginUpdate(); entry2->setTitle("5"); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 1); historyEntry2 = entry2->historyItems().at(0); QCOMPARE(historyEntry2->title(), QString("4")); db->metadata()->setHistoryMaxItems(-1); for (int i = 0; i < 20; i++) { entry2->beginUpdate(); entry2->setTitle("6"); entry2->endUpdate(); entry2->beginUpdate(); entry2->setTitle("6b"); entry2->endUpdate(); } QCOMPARE(entry2->historyItems().size(), 41); db->metadata()->setHistoryMaxItems(0); entry2->beginUpdate(); entry2->setTitle("7"); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 0); db->metadata()->setHistoryMaxItems(-1); db->metadata()->setHistoryMaxSize(17000); entry2->beginUpdate(); entry2->attachments()->set("test", QByteArray(18000, 'X')); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 1); historyEntry2 = entry2->historyItems().at(0); QCOMPARE(historyEntry2->title(), QString("7")); entry2->beginUpdate(); entry2->setTitle("8"); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 2); entry2->beginUpdate(); entry2->attachments()->remove("test"); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 0); entry2->beginUpdate(); entry2->attachments()->set("test2", QByteArray(6000, 'a')); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 1); entry2->beginUpdate(); entry2->attachments()->set("test3", QByteArray(6000, 'b')); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 2); entry2->beginUpdate(); entry2->attachments()->set("test4", QByteArray(6000, 'c')); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 3); entry2->beginUpdate(); entry2->attachments()->set("test5", QByteArray(6000, 'd')); entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 4); Entry* entry3 = new Entry(); entry3->setGroup(root); QCOMPARE(entry3->historyItems().size(), 0); entry3->beginUpdate(); entry3->attachments()->set("test", QByteArray(6000, 'a')); entry3->endUpdate(); QCOMPARE(entry3->historyItems().size(), 1); entry3->beginUpdate(); entry3->attachments()->set("test", QByteArray(6000, 'b')); entry3->endUpdate(); QCOMPARE(entry3->historyItems().size(), 2); entry3->beginUpdate(); entry3->attachments()->set("test", QByteArray(6000, 'c')); entry3->endUpdate(); QCOMPARE(entry3->historyItems().size(), 3); entry3->beginUpdate(); entry3->attachments()->set("test", QByteArray(6000, 'd')); entry3->endUpdate(); QCOMPARE(entry3->historyItems().size(), 2); delete db; }
void TestKeePass2Format::testXmlInvalidXmlChars() { QScopedPointer<Database> dbWrite(new Database()); QString strPlainInvalid = QString().append(QChar(0x02)).append(QChar(0x19)).append(QChar(0xFFFE)).append(QChar(0xFFFF)); QString strPlainValid = QString() .append(QChar(0x09)) .append(QChar(0x0A)) .append(QChar(0x20)) .append(QChar(0xD7FF)) .append(QChar(0xE000)) .append(QChar(0xFFFD)); // U+10437 in UTF-16: D801 DC37 // high low surrogate QString strSingleHighSurrogate1 = QString().append(QChar(0xD801)); QString strSingleHighSurrogate2 = QString().append(QChar(0x31)).append(QChar(0xD801)).append(QChar(0x32)); QString strHighHighSurrogate = QString().append(QChar(0xD801)).append(QChar(0xD801)); QString strSingleLowSurrogate1 = QString().append(QChar(0xDC37)); QString strSingleLowSurrogate2 = QString().append(QChar((0x31))).append(QChar(0xDC37)).append(QChar(0x32)); QString strLowLowSurrogate = QString().append(QChar(0xDC37)).append(QChar(0xDC37)); QString strSurrogateValid1 = QString().append(QChar(0xD801)).append(QChar(0xDC37)); QString strSurrogateValid2 = QString().append(QChar(0x31)).append(QChar(0xD801)).append(QChar(0xDC37)).append(QChar(0x32)); auto entry = new Entry(); entry->setUuid(QUuid::createUuid()); entry->setGroup(dbWrite->rootGroup()); entry->attributes()->set("PlainInvalid", strPlainInvalid); entry->attributes()->set("PlainValid", strPlainValid); entry->attributes()->set("SingleHighSurrogate1", strSingleHighSurrogate1); entry->attributes()->set("SingleHighSurrogate2", strSingleHighSurrogate2); entry->attributes()->set("HighHighSurrogate", strHighHighSurrogate); entry->attributes()->set("SingleLowSurrogate1", strSingleLowSurrogate1); entry->attributes()->set("SingleLowSurrogate2", strSingleLowSurrogate2); entry->attributes()->set("LowLowSurrogate", strLowLowSurrogate); entry->attributes()->set("SurrogateValid1", strSurrogateValid1); entry->attributes()->set("SurrogateValid2", strSurrogateValid2); QBuffer buffer; buffer.open(QIODevice::ReadWrite); bool hasError; QString errorString; writeXml(&buffer, dbWrite.data(), hasError, errorString); QVERIFY(!hasError); buffer.seek(0); auto dbRead = readXml(&buffer, true, hasError, errorString); if (hasError) { qWarning("Database read error: %s", qPrintable(errorString)); } QVERIFY(!hasError); QVERIFY(dbRead.data()); QCOMPARE(dbRead->rootGroup()->entries().size(), 1); Entry* entryRead = dbRead->rootGroup()->entries().at(0); EntryAttributes* attrRead = entryRead->attributes(); QCOMPARE(attrRead->value("PlainInvalid"), QString()); QCOMPARE(attrRead->value("PlainValid"), strPlainValid); QCOMPARE(attrRead->value("SingleHighSurrogate1"), QString()); QCOMPARE(attrRead->value("SingleHighSurrogate2"), QString("12")); QCOMPARE(attrRead->value("HighHighSurrogate"), QString()); QCOMPARE(attrRead->value("SingleLowSurrogate1"), QString()); QCOMPARE(attrRead->value("SingleLowSurrogate2"), QString("12")); QCOMPARE(attrRead->value("LowLowSurrogate"), QString()); QCOMPARE(attrRead->value("SurrogateValid1"), strSurrogateValid1); QCOMPARE(attrRead->value("SurrogateValid2"), strSurrogateValid2); }