From cd26e9d474e55bbfe25980856b41b2ea60e5149e Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Wed, 25 Aug 2010 21:14:41 +0200 Subject: [PATCH] Add a bunch of new Parser testcases. --- src/core/Uuid.cpp | 6 + src/core/Uuid.h | 1 + tests/NewDatabase.xml | 367 ++++++++++++++++++++++++++++++++++-------- tests/TestParser.cpp | 235 +++++++++++++++++++++++++-- 4 files changed, 531 insertions(+), 78 deletions(-) diff --git a/src/core/Uuid.cpp b/src/core/Uuid.cpp index dc39d2d01..850e2d7b3 100644 --- a/src/core/Uuid.cpp +++ b/src/core/Uuid.cpp @@ -70,6 +70,12 @@ bool Uuid::operator!=(const Uuid& other) const return !operator==(other); } +Uuid Uuid::fromBase64(const QString& str) +{ + QByteArray data = QByteArray::fromBase64(str.toAscii()); + return Uuid(data); +} + uint qHash(const Uuid& key) { return qHash(key.toByteArray()); diff --git a/src/core/Uuid.h b/src/core/Uuid.h index b8cc531b0..1916a0fa0 100644 --- a/src/core/Uuid.h +++ b/src/core/Uuid.h @@ -33,6 +33,7 @@ public: bool operator==(const Uuid& other) const; bool operator!=(const Uuid& other) const; static const int length; + static Uuid fromBase64(const QString& str); private: QByteArray m_data; diff --git a/tests/NewDatabase.xml b/tests/NewDatabase.xml index af631970f..c4b12fb87 100644 --- a/tests/NewDatabase.xml +++ b/tests/NewDatabase.xml @@ -15,20 +15,26 @@ False True False - True + False + + + ++vyI+daLk6omox4a6kQGA== + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAACZJREFUOE9jbGBo+M9ACQAZQAlmoEQz2PWjBoyGwWg6AGdCivMCAKxN4SAQ+6S+AAAAAElFTkSuQmCC + + True - 7PAwxNhPaE2klutz45i2xg== - 2010-08-08T17:24:17Z + 6w7wZdhAp0qVlXjkemuCYw== + 2010-08-25T16:12:57Z AAAAAAAAAAAAAAAAAAAAAA== 2010-08-08T17:24:19Z - zKuE27EWr0mlU75b2SRkTQ== - zKuE27EWr0mlU75b2SRkTQ== + lmU+9n0aeESKZvcEze+bRg== + lmU+9n0aeESKZvcEze+bRg== - zKuE27EWr0mlU75b2SRkTQ== + lmU+9n0aeESKZvcEze+bRg== NewDatabase 49 @@ -38,33 +44,29 @@ 2010-08-09T09:09:44Z 2010-08-08T17:24:17Z False - 2 + 52 2010-08-08T17:24:27Z True null null - QW4G0r/z90qql4iKZ0RwlA== + +wSUOv6qf0OzW8/ZHAs2sA== - QW4G0r/z90qql4iKZ0RwlA== + +wSUOv6qf0OzW8/ZHAs2sA== 0 - #0000FF - #000000 - OMGAURL + + + - 2010-08-09T09:09:31Z - 2010-08-08T17:24:53Z - 2010-08-09T09:09:31Z - 2011-08-08T17:25:58Z - True - 6 - 2010-08-08T17:24:53Z + 2010-08-25T16:19:25Z + 2010-08-25T16:13:54Z + 2010-08-25T16:19:25Z + 2010-08-25T16:12:57Z + False + 8 + 2010-08-25T16:13:54Z - - customfield - customfield value - Notes Notes @@ -75,84 +77,292 @@ Title - Sample Entry + Sample Entry 1 URL - bleh + UserName User Name + + False + 0 + + Target Window + + + + + + +wSUOv6qf0OzW8/ZHAs2sA== + 0 + + + + + 2010-08-25T16:13:54Z + 2010-08-25T16:13:54Z + 2010-08-25T16:15:37Z + 2010-08-25T16:12:57Z + False + 3 + 2010-08-25T16:13:54Z + + + Notes + Notes + + + Password + Password + + + Title + Sample Entry + + + URL + http://www.somesite.com/ + + + UserName + User Name + + + True + 0 + + Target Window + {USERNAME}{TAB}{PASSWORD}{TAB}{ENTER} + + + + + +wSUOv6qf0OzW8/ZHAs2sA== + 0 + + + + + 2010-08-25T16:15:43Z + 2010-08-25T16:13:54Z + 2010-08-25T16:18:40Z + 2010-08-25T16:12:57Z + False + 7 + 2010-08-25T16:13:54Z + + + Notes + Notes + + + Password + Password + + + Title + Sample Entry 1 + + + URL + http://www.somesite.com/ + + + UserName + User Name + + + True + 0 + + Target Window + {USERNAME}{TAB}{PASSWORD}{TAB}{ENTER} + + + + + + + 4jbADG37hkiLh2O0qUdaOQ== + 0 + ++vyI+daLk6omox4a6kQGA== + #FF0000 + #FFFF00 + http://override.net/ + + 2010-08-25T16:20:24Z + 2010-08-25T16:15:45Z + 2010-08-25T16:20:24Z + 2010-09-01T16:16:20Z + True + 7 + 2010-08-25T16:15:45Z + + + CustomString + isavalue + + + Notes + + + + Password + Jer60Hz8o9XHvxBGcRqT + + + Protected String + y + + + Title + Sample Entry 2 + + + URL + http://www.keepassx.org/ + + + UserName + notDEFUSERNAME + + + testattach.txt + NDI= + True 1 {USERNAME}{TAB}{PASSWORD}{ENTER} Target Window - {USERNAME}{TAB}{PASSWORD}{TAB}{ENTER} + {Title}{UserName} - Edit Entry - {Title}{UserName}{UserName} + Target Window 2 + {Title}{UserName} test - abLbFtNUfEi5TmbaxiW6yg== + AaUYVdXsI02h4T1RiAlgtg== General - + Group Notez 48 - 2010-08-08T17:24:53Z - 2010-08-08T17:24:53Z - 2010-08-08T17:24:53Z - 2010-08-08T17:24:17Z - False - 0 - 2010-08-08T17:24:53Z + 2010-08-25T16:22:20Z + 2010-08-25T16:13:54Z + 2010-08-25T16:22:29Z + 2010-08-20T16:21:51Z + True + 12 + 2010-08-25T16:13:54Z True - - null - null + {Password}{ENTER} + true + false AAAAAAAAAAAAAAAAAAAAAA== - u1lTRAICOkWv5QSl2xyU8w== + 1h4NtL5DK0yVyvaEnN//4A== Windows 38 - 2010-08-08T17:24:53Z - 2010-08-08T17:24:53Z - 2010-08-08T17:24:53Z - 2010-08-08T17:24:17Z + 2010-08-25T16:13:54Z + 2010-08-25T16:13:54Z + 2010-08-25T16:22:24Z + 2010-08-25T16:12:57Z False - 0 - 2010-08-08T17:24:53Z + 15 + 2010-08-25T16:13:54Z - True + False null null AAAAAAAAAAAAAAAAAAAAAA== + + HoYE/BjLfUSW257pCHJ/eA== + Subsub + + 68 + + 2010-08-25T16:21:33Z + 2010-08-25T16:14:31Z + 2010-08-25T16:21:41Z + 2010-08-25T16:21:21Z + False + 8 + 2010-08-25T16:14:31Z + + True + + null + null + AAAAAAAAAAAAAAAAAAAAAA== + + GZpdQvGXOU2kaKRL/IVAGg== + 0 + + + + + 2010-08-25T16:21:15Z + 2010-08-25T16:20:45Z + 2010-08-25T16:21:41Z + 2010-08-25T16:12:57Z + False + 3 + 2010-08-25T16:20:45Z + + + Notes + + + + Password + + + + Title + Subsub Entry + + + URL + + + + UserName + + + + True + 0 + + + + - 7PAwxNhPaE2klutz45i2xg== + 6w7wZdhAp0qVlXjkemuCYw== Recycle Bin 43 - 2010-08-09T09:09:44Z - 2010-08-09T09:09:44Z - 2010-08-09T09:09:44Z - 2010-08-09T09:07:16Z + 2010-08-25T16:13:57Z + 2010-08-25T16:13:57Z + 2010-08-25T16:20:55Z + 2010-08-25T16:12:57Z False - 1 - 2010-08-09T09:09:44Z + 10 + 2010-08-25T16:13:57Z True @@ -160,19 +370,19 @@ false AAAAAAAAAAAAAAAAAAAAAA== - KIeQe6yDN0SbjIJ83NB++Q== + Wh3kfvnEqE2VqK+5KIiPXg== 0 - 2010-08-09T09:09:40Z - 2010-08-09T09:09:37Z - 2010-08-09T09:09:44Z - 2010-08-09T09:07:16Z + 2010-08-25T16:20:32Z + 2010-08-25T16:20:27Z + 2010-08-25T16:20:37Z + 2010-08-25T16:12:57Z False 2 - 2010-08-09T09:09:44Z + 2010-08-25T16:20:37Z Notes @@ -180,11 +390,11 @@ Password - 5Ciyy3kcVSPFUFqTuK1o + gJBbkrCsiLBftfocQbNM Title - test + delentry URL @@ -200,8 +410,37 @@ + + KtRKIna41ky8WkqrAUXPig== + Network + + 3 + + 2010-08-25T16:13:54Z + 2010-08-25T16:13:54Z + 2010-08-25T16:20:55Z + 2010-08-25T16:12:57Z + False + 3 + 2010-08-25T16:14:09Z + + True + + null + null + AAAAAAAAAAAAAAAAAAAAAA== + - + + + 5K/bzWCSmkCv5OZxYl4N/w== + 2010-08-25T16:14:12Z + + + 80h8uSNWgkKhKCp1TgXF7g== + 2010-08-25T16:14:14Z + + \ No newline at end of file diff --git a/tests/TestParser.cpp b/tests/TestParser.cpp index 9190d765e..d085cf60a 100644 --- a/tests/TestParser.cpp +++ b/tests/TestParser.cpp @@ -22,6 +22,17 @@ #include "core/Parser.h" #include "config-keepassx-tests.h" +namespace QTest { + template<> + char *toString(const Uuid &uuid) + { + QByteArray ba = "Uuid("; + ba += uuid.toBase64(); + ba += ")"; + return qstrdup(ba.data()); + } +} + class TestParser : public QObject { Q_OBJECT @@ -29,7 +40,14 @@ class TestParser : public QObject private Q_SLOTS: void initTestCase(); void testMetadata(); - void testGroups(); + void testCustomIcon(); + void testGroupRoot(); + void testGroup1(); + void testGroup2(); + void testEntry1(); + void testEntry2(); + void testEntryHistory(); + void testDeletedObjects(); private: QDateTime genDT(int year, int month, int day, int hour, int min, int second); @@ -67,11 +85,11 @@ void TestParser::testMetadata() QCOMPARE(m_db->metadata()->protectPassword(), false); QCOMPARE(m_db->metadata()->protectUrl(), true); QCOMPARE(m_db->metadata()->protectNotes(), false); - QCOMPARE(m_db->metadata()->autoEnableVisualHiding(), true); + QCOMPARE(m_db->metadata()->autoEnableVisualHiding(), false); QCOMPARE(m_db->metadata()->recycleBinEnabled(), true); QVERIFY(m_db->metadata()->recycleBin() != 0); QCOMPARE(m_db->metadata()->recycleBin()->name(), QString("Recycle Bin")); - QCOMPARE(m_db->metadata()->recycleBinChanged(), genDT(2010, 8, 8, 17, 24, 17)); + QCOMPARE(m_db->metadata()->recycleBinChanged(), genDT(2010, 8, 25, 16, 12, 57)); QVERIFY(m_db->metadata()->entryTemplatesGroup() == 0); QCOMPARE(m_db->metadata()->entryTemplatesGroupChanged(), genDT(2010, 8, 8, 17, 24, 19)); QVERIFY(m_db->metadata()->lastSelectedGroup() != 0); @@ -79,26 +97,215 @@ void TestParser::testMetadata() QVERIFY(m_db->metadata()->lastTopVisibleGroup() == m_db->metadata()->lastSelectedGroup()); } -void TestParser::testGroups() +void TestParser::testCustomIcon() { - QVERIFY(m_db->rootGroup() != 0); - QCOMPARE(m_db->rootGroup()->name(), QString("NewDatabase")); - QCOMPARE(m_db->rootGroup()->uuid().toBase64(), QString("zKuE27EWr0mlU75b2SRkTQ==")); - QVERIFY(m_db->rootGroup()->isExpanded()); - TimeInfo ti = m_db->rootGroup()->timeInfo(); + QCOMPARE(m_db->metadata()->customIcons().size(), 1); + Uuid uuid = Uuid::fromBase64("++vyI+daLk6omox4a6kQGA=="); + QVERIFY(m_db->metadata()->customIcons().contains(uuid)); + const QImage& img = m_db->metadata()->customIcons()[uuid]; + QCOMPARE(img.width(), 16); + QCOMPARE(img.height(), 16); + for (int x=0; x<16; x++) { + for (int y=0; y<16; y++) { + QRgb rgb = img.pixel(x, y); + QCOMPARE(qRed(rgb), 128); + QCOMPARE(qGreen(rgb), 0); + QCOMPARE(qBlue(rgb), 128); + } + } +} + +void TestParser::testGroupRoot() +{ + const Group* group = m_db->rootGroup(); + QVERIFY(group); + QCOMPARE(group->uuid().toBase64(), QString("lmU+9n0aeESKZvcEze+bRg==")); + QCOMPARE(group->name(), QString("NewDatabase")); + QCOMPARE(group->notes(), QString("")); + QCOMPARE(group->iconNumber(), 49); + QCOMPARE(group->iconUuid(), Uuid()); + QVERIFY(group->isExpanded()); + TimeInfo ti = group->timeInfo(); QCOMPARE(ti.lastModificationTime(), genDT(2010, 8, 8, 17, 24, 27)); QCOMPARE(ti.creationTime(), genDT(2010, 8, 7, 17, 24, 27)); QCOMPARE(ti.lastAccessTime(), genDT(2010, 8, 9, 9, 9, 44)); QCOMPARE(ti.expiryTime(), genDT(2010, 8, 8, 17, 24, 17)); QVERIFY(!ti.expires()); - QCOMPARE(ti.usageCount(), 2); + QCOMPARE(ti.usageCount(), 52); QCOMPARE(ti.locationChanged(), genDT(2010, 8, 8, 17, 24, 27)); + QCOMPARE(group->defaultAutoTypeSequence(), QString("")); + QCOMPARE(group->autoTypeEnabled(), -1); + QCOMPARE(group->searchingEnabed(), -1); + QCOMPARE(group->lastTopVisibleEntry()->uuid().toBase64(), QString("+wSUOv6qf0OzW8/ZHAs2sA==")); - QCOMPARE(m_db->rootGroup()->children().size(), 3); - QCOMPARE(m_db->rootGroup()->children().at(0)->uuid().toBase64(), QString("abLbFtNUfEi5TmbaxiW6yg==")); - QCOMPARE(m_db->rootGroup()->children().at(1)->uuid().toBase64(), QString("u1lTRAICOkWv5QSl2xyU8w==")); - QCOMPARE(m_db->rootGroup()->children().at(2)->uuid().toBase64(), QString("7PAwxNhPaE2klutz45i2xg==")); + QCOMPARE(group->children().size(), 3); QVERIFY(m_db->metadata()->recycleBin() == m_db->rootGroup()->children().at(2)); + + QCOMPARE(group->entries().size(), 2); +} + +void TestParser::testGroup1() +{ + const Group* group = m_db->rootGroup()->children().at(0); + + QCOMPARE(group->uuid().toBase64(), QString("AaUYVdXsI02h4T1RiAlgtg==")); + QCOMPARE(group->name(), QString("General")); + QCOMPARE(group->notes(), QString("Group Notez")); + QCOMPARE(group->iconNumber(), 48); + QCOMPARE(group->iconUuid(), Uuid()); + QCOMPARE(group->isExpanded(), true); + QCOMPARE(group->defaultAutoTypeSequence(), QString("{Password}{ENTER}")); + QCOMPARE(group->autoTypeEnabled(), 1); + QCOMPARE(group->searchingEnabed(), 0); + QVERIFY(!group->lastTopVisibleEntry()); +} + +void TestParser::testGroup2() +{ + const Group* group = m_db->rootGroup()->children().at(1); + + QCOMPARE(group->uuid().toBase64(), QString("1h4NtL5DK0yVyvaEnN//4A==")); + QCOMPARE(group->name(), QString("Windows")); + QCOMPARE(group->isExpanded(), false); + + QCOMPARE(group->children().size(), 1); + const Group* child = group->children().first(); + + QCOMPARE(child->uuid().toBase64(), QString("HoYE/BjLfUSW257pCHJ/eA==")); + QCOMPARE(child->name(), QString("Subsub")); + QCOMPARE(child->entries().size(), 1); + + const Entry* entry = child->entries().first(); + QCOMPARE(entry->uuid().toBase64(), QString("GZpdQvGXOU2kaKRL/IVAGg==")); + QCOMPARE(entry->title(), QString("Subsub Entry")); +} + +void TestParser::testEntry1() +{ + const Entry* entry = m_db->rootGroup()->entries().at(0); + + QCOMPARE(entry->uuid().toBase64(), QString("+wSUOv6qf0OzW8/ZHAs2sA==")); + QCOMPARE(entry->iconNumber(), 0); + QCOMPARE(entry->iconUuid(), Uuid()); + QVERIFY(!entry->foregroundColor().isValid()); + QVERIFY(!entry->backgroundColor().isValid()); + QCOMPARE(entry->overrideUrl(), QString("")); + + const TimeInfo ti = entry->timeInfo(); + QCOMPARE(ti.lastModificationTime(), genDT(2010, 8, 25, 16, 19, 25)); + QCOMPARE(ti.creationTime(), genDT(2010, 8, 25, 16, 13, 54)); + QCOMPARE(ti.lastAccessTime(), genDT(2010, 8, 25, 16, 19, 25)); + QCOMPARE(ti.expiryTime(), genDT(2010, 8, 25, 16, 12, 57)); + QVERIFY(!ti.expires()); + QCOMPARE(ti.usageCount(), 8); + QCOMPARE(ti.locationChanged(), genDT(2010, 8, 25, 16, 13, 54)); + + QHash attrs = entry->attributes(); + QCOMPARE(attrs.take("Notes"), QString("Notes")); + QCOMPARE(attrs.take("Password"), QString("Password")); + QCOMPARE(attrs.take("Title"), QString("Sample Entry 1")); + QCOMPARE(attrs.take("URL"), QString("")); + QCOMPARE(attrs.take("UserName"), QString("User Name")); + QVERIFY(attrs.isEmpty()); + + QCOMPARE(entry->title(), entry->attributes().value("Title")); + QCOMPARE(entry->url(), entry->attributes().value("URL")); + QCOMPARE(entry->username(), entry->attributes().value("UserName")); + QCOMPARE(entry->password(), entry->attributes().value("Password")); + QCOMPARE(entry->notes(), entry->attributes().value("Notes")); + + QCOMPARE(entry->attachments().size(), 0); + QCOMPARE(entry->autoTypeEnabled(), false); + QCOMPARE(entry->autoTypeObfuscation(), 0); + QCOMPARE(entry->defaultAutoTypeSequence(), QString("")); + QCOMPARE(entry->autoTypeAssociations().size(), 1); + const AutoTypeAssociation assoc1 = entry->autoTypeAssociations().at(0); + QCOMPARE(assoc1.window, QString("Target Window")); + QCOMPARE(assoc1.sequence, QString("")); +} + +void TestParser::testEntry2() +{ + const Entry* entry = m_db->rootGroup()->entries().at(1); + + QCOMPARE(entry->uuid().toBase64(), QString("4jbADG37hkiLh2O0qUdaOQ==")); + QCOMPARE(entry->iconNumber(), 0); + QCOMPARE(entry->iconUuid().toBase64(), QString("++vyI+daLk6omox4a6kQGA==")); + // TODO test entry->icon() + QCOMPARE(entry->foregroundColor(), QColor(255, 0, 0)); + QCOMPARE(entry->backgroundColor(), QColor(255, 255, 0)); + QCOMPARE(entry->overrideUrl(), QString("http://override.net/")); + + const TimeInfo ti = entry->timeInfo(); + QCOMPARE(ti.usageCount(), 7); + + QHash attrs = entry->attributes(); + QCOMPARE(attrs.take("CustomString"), QString("isavalue")); + QCOMPARE(attrs.take("Notes"), QString("")); + QCOMPARE(attrs.take("Password"), QString("Jer60Hz8o9XHvxBGcRqT")); + QCOMPARE(attrs.take("Protected String"), QString("y")); // TODO should have a protection attribute + QCOMPARE(attrs.take("Title"), QString("Sample Entry 2")); + QCOMPARE(attrs.take("URL"), QString("http://www.keepassx.org/")); + QCOMPARE(attrs.take("UserName"), QString("notDEFUSERNAME")); + QVERIFY(attrs.isEmpty()); + + QCOMPARE(entry->attachments().size(), 1); + QCOMPARE(QString(entry->attachments().value("testattach.txt")), QString("42")); + + QCOMPARE(entry->autoTypeEnabled(), true); + QCOMPARE(entry->autoTypeObfuscation(), 1); + QCOMPARE(entry->defaultAutoTypeSequence(), QString("{USERNAME}{TAB}{PASSWORD}{ENTER}")); + QCOMPARE(entry->autoTypeAssociations().size(), 2); + const AutoTypeAssociation assoc1 = entry->autoTypeAssociations().at(0); + QCOMPARE(assoc1.window, QString("Target Window")); + QCOMPARE(assoc1.sequence, QString("{Title}{UserName}")); + const AutoTypeAssociation assoc2 = entry->autoTypeAssociations().at(1); + QCOMPARE(assoc2.window, QString("Target Window 2")); + QCOMPARE(assoc2.sequence, QString("{Title}{UserName} test")); +} + +void TestParser::testEntryHistory() +{ + const Entry* entryMain = m_db->rootGroup()->entries().first(); + QCOMPARE(entryMain->historyItems().size(), 2); + + { + const Entry* entry = entryMain->historyItems().at(0); + QCOMPARE(entry->uuid(), entryMain->uuid()); + QVERIFY(!entry->parent()); + QCOMPARE(entry->children().size(), 0); + QCOMPARE(entry->timeInfo().lastModificationTime(), genDT(2010, 8, 25, 16, 13, 54)); + QCOMPARE(entry->timeInfo().usageCount(), 3); + QCOMPARE(entry->title(), QString("Sample Entry")); + QCOMPARE(entry->url(), QString("http://www.somesite.com/")); + } + + { + const Entry* entry = entryMain->historyItems().at(1); + QCOMPARE(entry->uuid(), entryMain->uuid()); + QVERIFY(!entry->parent()); + QCOMPARE(entry->children().size(), 0); + QCOMPARE(entry->timeInfo().lastModificationTime(), genDT(2010, 8, 25, 16, 15, 43)); + QCOMPARE(entry->timeInfo().usageCount(), 7); + QCOMPARE(entry->title(), QString("Sample Entry 1")); + QCOMPARE(entry->url(), QString("http://www.somesite.com/")); + } +} + +void TestParser::testDeletedObjects() +{ + QList objList = m_db->deletedObjects(); + DeletedObject delObj; + + delObj = objList.takeFirst(); + QCOMPARE(delObj.uuid.toBase64(), QString("5K/bzWCSmkCv5OZxYl4N/w==")); + QCOMPARE(delObj.deletionTime, genDT(2010, 8, 25, 16, 14, 12)); + + delObj = objList.takeFirst(); + QCOMPARE(delObj.uuid.toBase64(), QString("80h8uSNWgkKhKCp1TgXF7g==")); + QCOMPARE(delObj.deletionTime, genDT(2010, 8, 25, 16, 14, 14)); + + QVERIFY(objList.isEmpty()); } QTEST_MAIN(TestParser);