summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-02-28 13:52:57 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-02-28 13:52:57 +0100
commit6a73a9c405473725ae7d7159e1f88ad54c10448c (patch)
treee5f8fbf1026382c4111c5cc9c9a2bf213527bed8
parent0bcde6de2ecce96a31c0b409481f660bb9e91582 (diff)
downloadsink-6a73a9c405473725ae7d7159e1f88ad54c10448c.tar.gz
sink-6a73a9c405473725ae7d7159e1f88ad54c10448c.zip
Fixed and tested the upgrade from a database without version.
-rw-r--r--common/store.cpp3
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/upgradetest.cpp138
3 files changed, 140 insertions, 2 deletions
diff --git a/common/store.cpp b/common/store.cpp
index ad2bb1c..34d547b 100644
--- a/common/store.cpp
+++ b/common/store.cpp
@@ -327,8 +327,7 @@ KAsync::Job<void> Store::removeDataFromDisk(const QByteArray &identifier)
327static KAsync::Job<Store::UpgradeResult> upgrade(const QByteArray &resource) 327static KAsync::Job<Store::UpgradeResult> upgrade(const QByteArray &resource)
328{ 328{
329 auto store = Sink::Storage::DataStore(Sink::storageLocation(), resource, Sink::Storage::DataStore::ReadOnly); 329 auto store = Sink::Storage::DataStore(Sink::storageLocation(), resource, Sink::Storage::DataStore::ReadOnly);
330 const auto version = Storage::DataStore::databaseVersion(store.createTransaction(Storage::DataStore::ReadOnly)); 330 if (!store.exists() || Storage::DataStore::databaseVersion(store.createTransaction(Storage::DataStore::ReadOnly)) == Sink::latestDatabaseVersion()) {
331 if (version == Sink::latestDatabaseVersion() || version == 0) {
332 return KAsync::value(Store::UpgradeResult{false}); 331 return KAsync::value(Store::UpgradeResult{false});
333 } 332 }
334 SinkLog() << "Upgrading " << resource; 333 SinkLog() << "Upgrading " << resource;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index f0d9eae..883a38b 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -56,6 +56,7 @@ auto_tests (
56 interresourcemovetest 56 interresourcemovetest
57 notificationtest 57 notificationtest
58 entitystoretest 58 entitystoretest
59 upgradetest
59) 60)
60generate_flatbuffers(sink_test calendar) 61generate_flatbuffers(sink_test calendar)
61target_link_libraries(dummyresourcetest sink_resource_dummy) 62target_link_libraries(dummyresourcetest sink_resource_dummy)
diff --git a/tests/upgradetest.cpp b/tests/upgradetest.cpp
new file mode 100644
index 0000000..1060626
--- /dev/null
+++ b/tests/upgradetest.cpp
@@ -0,0 +1,138 @@
1#include <QtTest>
2
3#include <QString>
4
5#include "dummyresource/resourcefactory.h"
6#include "store.h"
7#include "resourceconfig.h"
8#include "resourcecontrol.h"
9#include "log.h"
10#include "test.h"
11#include "testutils.h"
12#include "definitions.h"
13
14using namespace Sink;
15using namespace Sink::ApplicationDomain;
16
17class UpgradeTest : public QObject
18{
19 Q_OBJECT
20
21private slots:
22 void initTestCase()
23 {
24 Sink::Test::initTest();
25 auto factory = Sink::ResourceFactory::load("sink.dummy");
26 QVERIFY(factory);
27 ::DummyResource::removeFromDisk("sink.dummy.instance1");
28 ResourceConfig::addResource("sink.dummy.instance1", "sink.dummy");
29 }
30
31 void init()
32 {
33 }
34
35 void cleanup()
36 {
37 VERIFYEXEC(Sink::Store::removeDataFromDisk(QByteArray("sink.dummy.instance1")));
38 }
39
40 void noUpgradeOnNoDb()
41 {
42 auto upgradeJob = Sink::Store::upgrade()
43 .then([](const Sink::Store::UpgradeResult &result) {
44 ASYNCVERIFY(!result.upgradeExecuted);
45 return KAsync::null();
46 });
47 VERIFYEXEC(upgradeJob);
48 }
49
50 void noUpgradeOnCurrentDb()
51 {
52 Event event("sink.dummy.instance1");
53 event.setProperty("uid", "testuid");
54 event.setProperty("summary", "summaryValue");
55 Sink::Store::create<Event>(event).exec().waitForFinished();
56
57 // Ensure all local data is processed
58 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1"));
59
60 auto upgradeJob = Sink::Store::upgrade()
61 .then([](const Sink::Store::UpgradeResult &result) {
62 ASYNCVERIFY(!result.upgradeExecuted);
63 return KAsync::null();
64 });
65 VERIFYEXEC(upgradeJob);
66 }
67
68 void upgradeFromOldDb()
69 {
70 Event event("sink.dummy.instance1");
71 event.setProperty("uid", "testuid");
72 event.setProperty("summary", "summaryValue");
73 Sink::Store::create<Event>(event).exec().waitForFinished();
74
75 // Ensure all local data is processed
76 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1"));
77
78 //force the db to an old version.
79 {
80 Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadWrite);
81 auto t = store.createTransaction();
82 t.openDatabase().write("__internal_databaseVersion", QByteArray::number(1));
83 t.commit();
84 }
85
86 auto upgradeJob = Sink::Store::upgrade()
87 .then([](const Sink::Store::UpgradeResult &result) {
88 ASYNCVERIFY(result.upgradeExecuted);
89 return KAsync::null();
90 });
91 VERIFYEXEC(upgradeJob);
92
93 //FIXME
94 // QTest::qWait(1000);
95 // {
96 // Sink::Storage::DataStore::clearEnv();
97 // Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadOnly);
98 // auto version = Sink::Storage::DataStore::databaseVersion(store.createTransaction(Sink::Storage::DataStore::ReadOnly));
99 // QCOMPARE(version, Sink::latestDatabaseVersion());
100 // }
101 }
102
103 void upgradeFromDbWithNoVersion()
104 {
105 Event event("sink.dummy.instance1");
106 event.setProperty("uid", "testuid");
107 event.setProperty("summary", "summaryValue");
108 Sink::Store::create<Event>(event).exec().waitForFinished();
109
110 // Ensure all local data is processed
111 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1"));
112
113 //force the db to an old version.
114 Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadWrite);
115 auto t = store.createTransaction();
116 t.openDatabase().remove("__internal_databaseVersion");
117 t.commit();
118
119 auto upgradeJob = Sink::Store::upgrade()
120 .then([](const Sink::Store::UpgradeResult &result) {
121 ASYNCVERIFY(result.upgradeExecuted);
122 return KAsync::null();
123 });
124 VERIFYEXEC(upgradeJob);
125
126 //FIXME
127 // QTest::qWait(1000);
128 // {
129 // Sink::Storage::DataStore::clearEnv();
130 // Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadOnly);
131 // auto version = Sink::Storage::DataStore::databaseVersion(store.createTransaction(Sink::Storage::DataStore::ReadOnly));
132 // QCOMPARE(version, Sink::latestDatabaseVersion());
133 // }
134 }
135};
136
137QTEST_MAIN(UpgradeTest)
138#include "upgradetest.moc"