diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-02-28 13:52:57 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-02-28 13:52:57 +0100 |
commit | 6a73a9c405473725ae7d7159e1f88ad54c10448c (patch) | |
tree | e5f8fbf1026382c4111c5cc9c9a2bf213527bed8 | |
parent | 0bcde6de2ecce96a31c0b409481f660bb9e91582 (diff) | |
download | sink-6a73a9c405473725ae7d7159e1f88ad54c10448c.tar.gz sink-6a73a9c405473725ae7d7159e1f88ad54c10448c.zip |
Fixed and tested the upgrade from a database without version.
-rw-r--r-- | common/store.cpp | 3 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/upgradetest.cpp | 138 |
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) | |||
327 | static KAsync::Job<Store::UpgradeResult> upgrade(const QByteArray &resource) | 327 | static 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 | ) |
60 | generate_flatbuffers(sink_test calendar) | 61 | generate_flatbuffers(sink_test calendar) |
61 | target_link_libraries(dummyresourcetest sink_resource_dummy) | 62 | target_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 | |||
14 | using namespace Sink; | ||
15 | using namespace Sink::ApplicationDomain; | ||
16 | |||
17 | class UpgradeTest : public QObject | ||
18 | { | ||
19 | Q_OBJECT | ||
20 | |||
21 | private 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 | |||
137 | QTEST_MAIN(UpgradeTest) | ||
138 | #include "upgradetest.moc" | ||