From 6a73a9c405473725ae7d7159e1f88ad54c10448c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 28 Feb 2018 13:52:57 +0100 Subject: Fixed and tested the upgrade from a database without version. --- common/store.cpp | 3 +- tests/CMakeLists.txt | 1 + tests/upgradetest.cpp | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 tests/upgradetest.cpp 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 Store::removeDataFromDisk(const QByteArray &identifier) static KAsync::Job upgrade(const QByteArray &resource) { auto store = Sink::Storage::DataStore(Sink::storageLocation(), resource, Sink::Storage::DataStore::ReadOnly); - const auto version = Storage::DataStore::databaseVersion(store.createTransaction(Storage::DataStore::ReadOnly)); - if (version == Sink::latestDatabaseVersion() || version == 0) { + if (!store.exists() || Storage::DataStore::databaseVersion(store.createTransaction(Storage::DataStore::ReadOnly)) == Sink::latestDatabaseVersion()) { return KAsync::value(Store::UpgradeResult{false}); } 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 ( interresourcemovetest notificationtest entitystoretest + upgradetest ) generate_flatbuffers(sink_test calendar) 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 @@ +#include + +#include + +#include "dummyresource/resourcefactory.h" +#include "store.h" +#include "resourceconfig.h" +#include "resourcecontrol.h" +#include "log.h" +#include "test.h" +#include "testutils.h" +#include "definitions.h" + +using namespace Sink; +using namespace Sink::ApplicationDomain; + +class UpgradeTest : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase() + { + Sink::Test::initTest(); + auto factory = Sink::ResourceFactory::load("sink.dummy"); + QVERIFY(factory); + ::DummyResource::removeFromDisk("sink.dummy.instance1"); + ResourceConfig::addResource("sink.dummy.instance1", "sink.dummy"); + } + + void init() + { + } + + void cleanup() + { + VERIFYEXEC(Sink::Store::removeDataFromDisk(QByteArray("sink.dummy.instance1"))); + } + + void noUpgradeOnNoDb() + { + auto upgradeJob = Sink::Store::upgrade() + .then([](const Sink::Store::UpgradeResult &result) { + ASYNCVERIFY(!result.upgradeExecuted); + return KAsync::null(); + }); + VERIFYEXEC(upgradeJob); + } + + void noUpgradeOnCurrentDb() + { + Event event("sink.dummy.instance1"); + event.setProperty("uid", "testuid"); + event.setProperty("summary", "summaryValue"); + Sink::Store::create(event).exec().waitForFinished(); + + // Ensure all local data is processed + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + + auto upgradeJob = Sink::Store::upgrade() + .then([](const Sink::Store::UpgradeResult &result) { + ASYNCVERIFY(!result.upgradeExecuted); + return KAsync::null(); + }); + VERIFYEXEC(upgradeJob); + } + + void upgradeFromOldDb() + { + Event event("sink.dummy.instance1"); + event.setProperty("uid", "testuid"); + event.setProperty("summary", "summaryValue"); + Sink::Store::create(event).exec().waitForFinished(); + + // Ensure all local data is processed + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + + //force the db to an old version. + { + Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadWrite); + auto t = store.createTransaction(); + t.openDatabase().write("__internal_databaseVersion", QByteArray::number(1)); + t.commit(); + } + + auto upgradeJob = Sink::Store::upgrade() + .then([](const Sink::Store::UpgradeResult &result) { + ASYNCVERIFY(result.upgradeExecuted); + return KAsync::null(); + }); + VERIFYEXEC(upgradeJob); + + //FIXME + // QTest::qWait(1000); + // { + // Sink::Storage::DataStore::clearEnv(); + // Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadOnly); + // auto version = Sink::Storage::DataStore::databaseVersion(store.createTransaction(Sink::Storage::DataStore::ReadOnly)); + // QCOMPARE(version, Sink::latestDatabaseVersion()); + // } + } + + void upgradeFromDbWithNoVersion() + { + Event event("sink.dummy.instance1"); + event.setProperty("uid", "testuid"); + event.setProperty("summary", "summaryValue"); + Sink::Store::create(event).exec().waitForFinished(); + + // Ensure all local data is processed + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + + //force the db to an old version. + Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadWrite); + auto t = store.createTransaction(); + t.openDatabase().remove("__internal_databaseVersion"); + t.commit(); + + auto upgradeJob = Sink::Store::upgrade() + .then([](const Sink::Store::UpgradeResult &result) { + ASYNCVERIFY(result.upgradeExecuted); + return KAsync::null(); + }); + VERIFYEXEC(upgradeJob); + + //FIXME + // QTest::qWait(1000); + // { + // Sink::Storage::DataStore::clearEnv(); + // Sink::Storage::DataStore store(Sink::storageLocation(), "sink.dummy.instance1", Sink::Storage::DataStore::ReadOnly); + // auto version = Sink::Storage::DataStore::databaseVersion(store.createTransaction(Sink::Storage::DataStore::ReadOnly)); + // QCOMPARE(version, Sink::latestDatabaseVersion()); + // } + } +}; + +QTEST_MAIN(UpgradeTest) +#include "upgradetest.moc" -- cgit v1.2.3