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. --- tests/CMakeLists.txt | 1 + tests/upgradetest.cpp | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 tests/upgradetest.cpp (limited to 'tests') 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