From b8f2d746d0e7bf65d0b46baaffa0da57a38f9052 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 17 Nov 2017 21:22:41 +0100 Subject: [PATCH] SettingsAccessor: Add methods to upgrade to a specific version Change-Id: If368f4a35d3702dbf680b1306ca6311070aa9bb5 Reviewed-by: Marco Bubke --- src/libs/utils/settingsaccessor.cpp | 11 +++- src/libs/utils/settingsaccessor.h | 1 + tests/auto/utils/settings/tst_settings.cpp | 64 ++++++++++++++++++++-- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/libs/utils/settingsaccessor.cpp b/src/libs/utils/settingsaccessor.cpp index d8ae26e98b3..902511e1222 100644 --- a/src/libs/utils/settingsaccessor.cpp +++ b/src/libs/utils/settingsaccessor.cpp @@ -83,6 +83,7 @@ QVariantMap VersionUpgrader::renameKeys(const QList &changes, QVariantMa // -------------------------------------------------------------------- // SettingsAccessorPrivate: // -------------------------------------------------------------------- + class SettingsAccessorPrivate { public: @@ -352,6 +353,14 @@ bool SettingsAccessor::isValidVersionAndId(const int version, const QByteArray & */ QVariantMap SettingsAccessor::upgradeSettings(const QVariantMap &data) const { + return upgradeSettings(data, currentVersion()); +} + +QVariantMap SettingsAccessor::upgradeSettings(const QVariantMap &data, int targetVersion) const +{ + QTC_ASSERT(targetVersion >= firstSupportedVersion(), return data); + QTC_ASSERT(targetVersion <= currentVersion(), return data); + const int version = versionFromMap(data); if (!isValidVersionAndId(version, settingsIdFromMap(data))) return data; @@ -362,7 +371,7 @@ QVariantMap SettingsAccessor::upgradeSettings(const QVariantMap &data) const else result = data; - for (int i = version; i < currentVersion(); ++i) { + for (int i = version; i < targetVersion; ++i) { VersionUpgrader *upgrader = d->upgrader(i); QTC_CHECK(upgrader && upgrader->version() == i); result = upgrader->upgrade(result); diff --git a/src/libs/utils/settingsaccessor.h b/src/libs/utils/settingsaccessor.h index dc964946661..b6e712f9107 100644 --- a/src/libs/utils/settingsaccessor.h +++ b/src/libs/utils/settingsaccessor.h @@ -118,6 +118,7 @@ protected: void setApplicationDisplayName(const QString &dn); QVariantMap readFile(const Utils::FileName &path) const; QVariantMap upgradeSettings(const QVariantMap &data) const; + QVariantMap upgradeSettings(const QVariantMap &data, const int targetVersion) const; ProceedInfo reportIssues(const QVariantMap &data, const Utils::FileName &path, QWidget *parent) const; diff --git a/tests/auto/utils/settings/tst_settings.cpp b/tests/auto/utils/settings/tst_settings.cpp index 93a04219a80..7a1db7fe44e 100644 --- a/tests/auto/utils/settings/tst_settings.cpp +++ b/tests/auto/utils/settings/tst_settings.cpp @@ -131,6 +131,9 @@ private slots: void upgradeSettings_tooNew(); void upgradeSettings_oneStep(); void upgradeSettings_twoSteps(); + void upgradeSettings_partialUpdate(); + void upgradeSettings_targetVersionTooOld(); + void upgradeSettings_targetVersionTooNew(); }; static QVariantMap versionedMap(int version, const QByteArray &id = QByteArray(), @@ -310,7 +313,7 @@ void tst_SettingsAccessor::upgradeSettings_noUpgradeNecessary() const int startVersion = 8; const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); - const QVariantMap result = accessor.upgradeSettings(input); + const QVariantMap result = accessor.upgradeSettings(input, 8); for (auto it = result.cbegin(); it != result.cend(); ++it) { if (it.key() == "OriginalVersion") @@ -329,7 +332,7 @@ void tst_SettingsAccessor::upgradeSettings_invalidId() const int startVersion = 8; const QVariantMap input = versionedMap(startVersion, "foo", generateExtraData()); - const QVariantMap result = accessor.upgradeSettings(input); + const QVariantMap result = accessor.upgradeSettings(input, 8); // Data is unchanged QCOMPARE(result, input); @@ -341,7 +344,7 @@ void tst_SettingsAccessor::upgradeSettings_tooOld() const int startVersion = 1; const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); - const QVariantMap result = accessor.upgradeSettings(input); + const QVariantMap result = accessor.upgradeSettings(input, 8); // Data is unchanged QCOMPARE(result, input); @@ -353,7 +356,7 @@ void tst_SettingsAccessor::upgradeSettings_tooNew() const int startVersion = 42; const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); - const QVariantMap result = accessor.upgradeSettings(input); + const QVariantMap result = accessor.upgradeSettings(input, 8); // Data is unchanged QCOMPARE(result, input); @@ -365,7 +368,7 @@ void tst_SettingsAccessor::upgradeSettings_oneStep() const int startVersion = 7; const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); - const QVariantMap result = accessor.upgradeSettings(input); + const QVariantMap result = accessor.upgradeSettings(input, 8); for (auto it = result.cbegin(); it != result.cend(); ++it) { if (it.key() == "OriginalVersion") // was added @@ -388,7 +391,7 @@ void tst_SettingsAccessor::upgradeSettings_twoSteps() const int startVersion = 6; const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); - const QVariantMap result = accessor.upgradeSettings(input); + const QVariantMap result = accessor.upgradeSettings(input, 8); for (auto it = result.cbegin(); it != result.cend(); ++it) { if (it.key() == "OriginalVersion") // was added @@ -407,6 +410,55 @@ void tst_SettingsAccessor::upgradeSettings_twoSteps() QCOMPARE(result.size(), input.size() + 3); // OriginalVersion + VERSION_6 + VERSION_7 was added } +void tst_SettingsAccessor::upgradeSettings_partialUpdate() +{ + const TestSettingsAccessor accessor; + const int startVersion = 6; + const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); + + const QVariantMap result = accessor.upgradeSettings(input, 7); + + for (auto it = result.cbegin(); it != result.cend(); ++it) { + if (it.key() == "OriginalVersion") // was added + QCOMPARE(it.value().toInt(), startVersion); + else if (it.key() == "Version") // was overridden + QCOMPARE(it.value().toInt(), 7); + else if (input.contains(it.key())) // extra settings pass through unchanged! + QCOMPARE(it.value(), input.value(it.key())); + else if (it.key() == "VERSION_6") + QCOMPARE(it.value().toInt(), 6); + else + QVERIFY2(false, "Unexpected value found in upgraded result!"); + } + QCOMPARE(result.size(), input.size() + 2); // OriginalVersion + VERSION_6 was added +} + +void tst_SettingsAccessor::upgradeSettings_targetVersionTooOld() +{ + const TestSettingsAccessor accessor; + const QVariantMap extra = generateExtraData(); + const int startVersion = 6; + const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, extra); + + const QVariantMap result = accessor.upgradeSettings(input, 2); + + // result is unchanged! + QCOMPARE(result, input); +} + +void tst_SettingsAccessor::upgradeSettings_targetVersionTooNew() +{ + const TestSettingsAccessor accessor; + const QVariantMap extra = generateExtraData(); + const int startVersion = 6; + const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, extra); + + const QVariantMap result = accessor.upgradeSettings(input, 42); + + // result is unchanged! + QCOMPARE(result, input); +} + QTEST_MAIN(tst_SettingsAccessor) #include "tst_settings.moc"