1 /* SPDX-FileCopyrightText: 2020 Sandro Knauß <sknauss@kde.org>
2
3 SPDX-License-Identifier: LGPL-2.0-or-later
4 */
5 #include "autocryptstoragetest.h"
6
7 #include "autocrypt/autocryptstorage.h"
8 #include "autocrypt/autocryptstorage_p.h"
9
10 #include <QFile>
11 #include <QJsonObject>
12 #include <QStandardPaths>
13 #include <QTest>
14
15 using namespace MessageCore;
16
QTEST_MAIN(AutocryptStorageTest)17 QTEST_MAIN(AutocryptStorageTest)
18
19 void AutocryptStorageTest::initTestCase()
20 {
21 qputenv("LC_ALL", "C");
22 QStandardPaths::setTestModeEnabled(true);
23 const QDir genericDataLocation(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
24 baseDir = QDir(genericDataLocation.filePath(QStringLiteral("autocrypt")));
25 }
26
init()27 void AutocryptStorageTest::init()
28 {
29 baseDir.removeRecursively();
30 baseDir.mkpath(QStringLiteral("."));
31 }
32
cleanup()33 void AutocryptStorageTest::cleanup()
34 {
35 baseDir.removeRecursively();
36 auto storage = AutocryptStorage::self();
37 storage->d_func()->recipients.clear();
38 }
39
test_uniqness()40 void AutocryptStorageTest::test_uniqness()
41 {
42 auto storage = AutocryptStorage::self();
43 auto storage2 = AutocryptStorage::self();
44
45 QCOMPARE(storage.data(), storage2.data());
46 }
47
test_unknown()48 void AutocryptStorageTest::test_unknown()
49 {
50 auto storage = AutocryptStorage::self();
51
52 QCOMPARE(storage->getRecipient("unknown@autocrypt.example"), nullptr);
53 }
54
test_existing()55 void AutocryptStorageTest::test_existing()
56 {
57 auto storage = AutocryptStorage::self();
58 QFile file(QLatin1String(DATA_DIR) + QStringLiteral("/autocrypt/empty.json"));
59 QVERIFY(file.copy(baseDir.path() + QStringLiteral("/empty%40autocrypt.example.json")));
60
61 const auto recipient = storage->getRecipient("empty@autocrypt.example");
62 const auto recipient2 = storage->getRecipient("empty@autocrypt.example");
63 QVERIFY(recipient);
64 QCOMPARE(recipient->hasChanged(), false);
65 QCOMPARE(recipient.data(), recipient2.data());
66 }
67
test_store()68 void AutocryptStorageTest::test_store()
69 {
70 auto storage = AutocryptStorage::self();
71 QFile data(QLatin1String(DATA_DIR) + QStringLiteral("/autocrypt/empty.json"));
72
73 const QString fileName(QStringLiteral("store%40autocrypt.example.json"));
74 QFile file(baseDir.filePath(fileName));
75
76 QVERIFY(data.copy(baseDir.filePath(fileName)));
77
78 const auto recipient = storage->getRecipient("store@autocrypt.example");
79 QVERIFY(recipient);
80
81 baseDir.remove(fileName);
82 QCOMPARE(baseDir.exists(fileName), false);
83
84 // Save file, when file does not exist
85 storage->save();
86 QCOMPARE(baseDir.exists(fileName), true);
87
88 // Don't save when file exists and changed flag is false
89
90 QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text));
91 file.write("something");
92 file.close();
93
94 storage->save();
95
96 QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text));
97 QCOMPARE(file.readAll(), "something");
98 file.close();
99
100 // save when changed flag is true
101 recipient->setChangedFlag(true);
102 storage->save();
103 QCOMPARE(baseDir.exists(fileName), true);
104 QCOMPARE(recipient->hasChanged(), false);
105
106 QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text));
107 QVERIFY(data.open(QIODevice::ReadOnly | QIODevice::Text));
108 QCOMPARE(file.readAll().trimmed(), data.readAll().trimmed());
109 file.close();
110 data.close();
111 }
112
test_addRecipient()113 void AutocryptStorageTest::test_addRecipient()
114 {
115 const QString fileName(QStringLiteral("add%40autocrypt.example.json"));
116 baseDir.remove(fileName);
117
118 auto storage = AutocryptStorage::self();
119 QCOMPARE(storage->getRecipient("add@autocrypt.example"), nullptr);
120 const auto recipient = storage->addRecipient("add@autocrypt.example");
121 QVERIFY(recipient);
122
123 const auto document = QJsonDocument::fromJson(recipient->toJson(QJsonDocument::Compact));
124 QVERIFY(document.isObject());
125 const auto &obj = document.object();
126
127 QCOMPARE(obj.value(QStringLiteral("addr")).toString(), QStringLiteral("add@autocrypt.example"));
128 }
129
test_deleteRecipient()130 void AutocryptStorageTest::test_deleteRecipient()
131 {
132 const QByteArray addr("delete@autocrypt.example");
133 const QString fileName(QStringLiteral("delete%40autocrypt.example.json"));
134 auto storage = AutocryptStorage::self();
135 QVERIFY(storage->addRecipient(addr));
136 QVERIFY(storage->getRecipient(addr));
137 storage->save();
138 QCOMPARE(baseDir.exists(fileName), true);
139
140 storage->deleteRecipient(addr);
141 QCOMPARE(baseDir.exists(fileName), false);
142 QCOMPARE(storage->getRecipient(addr), nullptr);
143 }
144
test_create_basedir()145 void AutocryptStorageTest::test_create_basedir()
146 {
147 const QByteArray addr("recipient@autocrypt.example");
148 const QString fileName(QStringLiteral("recipient%40autocrypt.example.json"));
149 auto storage = AutocryptStorage::self();
150 QVERIFY(storage->addRecipient(addr));
151 baseDir.removeRecursively();
152 QCOMPARE(baseDir.exists(), false);
153 storage->save();
154 QCOMPARE(baseDir.exists(fileName), true);
155 }
156