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