SettingsAccessor: Add methods to upgrade to a specific version

Change-Id: If368f4a35d3702dbf680b1306ca6311070aa9bb5
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Tobias Hunger
2017-11-17 21:22:41 +01:00
parent 5d6c2ca159
commit b8f2d746d0
3 changed files with 69 additions and 7 deletions

View File

@@ -83,6 +83,7 @@ QVariantMap VersionUpgrader::renameKeys(const QList<Change> &changes, QVariantMa
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// SettingsAccessorPrivate: // SettingsAccessorPrivate:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
class SettingsAccessorPrivate class SettingsAccessorPrivate
{ {
public: public:
@@ -352,6 +353,14 @@ bool SettingsAccessor::isValidVersionAndId(const int version, const QByteArray &
*/ */
QVariantMap SettingsAccessor::upgradeSettings(const QVariantMap &data) const 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); const int version = versionFromMap(data);
if (!isValidVersionAndId(version, settingsIdFromMap(data))) if (!isValidVersionAndId(version, settingsIdFromMap(data)))
return data; return data;
@@ -362,7 +371,7 @@ QVariantMap SettingsAccessor::upgradeSettings(const QVariantMap &data) const
else else
result = data; result = data;
for (int i = version; i < currentVersion(); ++i) { for (int i = version; i < targetVersion; ++i) {
VersionUpgrader *upgrader = d->upgrader(i); VersionUpgrader *upgrader = d->upgrader(i);
QTC_CHECK(upgrader && upgrader->version() == i); QTC_CHECK(upgrader && upgrader->version() == i);
result = upgrader->upgrade(result); result = upgrader->upgrade(result);

View File

@@ -118,6 +118,7 @@ protected:
void setApplicationDisplayName(const QString &dn); void setApplicationDisplayName(const QString &dn);
QVariantMap readFile(const Utils::FileName &path) const; QVariantMap readFile(const Utils::FileName &path) const;
QVariantMap upgradeSettings(const QVariantMap &data) 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; ProceedInfo reportIssues(const QVariantMap &data, const Utils::FileName &path, QWidget *parent) const;

View File

@@ -131,6 +131,9 @@ private slots:
void upgradeSettings_tooNew(); void upgradeSettings_tooNew();
void upgradeSettings_oneStep(); void upgradeSettings_oneStep();
void upgradeSettings_twoSteps(); void upgradeSettings_twoSteps();
void upgradeSettings_partialUpdate();
void upgradeSettings_targetVersionTooOld();
void upgradeSettings_targetVersionTooNew();
}; };
static QVariantMap versionedMap(int version, const QByteArray &id = QByteArray(), static QVariantMap versionedMap(int version, const QByteArray &id = QByteArray(),
@@ -310,7 +313,7 @@ void tst_SettingsAccessor::upgradeSettings_noUpgradeNecessary()
const int startVersion = 8; const int startVersion = 8;
const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); 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) { for (auto it = result.cbegin(); it != result.cend(); ++it) {
if (it.key() == "OriginalVersion") if (it.key() == "OriginalVersion")
@@ -329,7 +332,7 @@ void tst_SettingsAccessor::upgradeSettings_invalidId()
const int startVersion = 8; const int startVersion = 8;
const QVariantMap input = versionedMap(startVersion, "foo", generateExtraData()); const QVariantMap input = versionedMap(startVersion, "foo", generateExtraData());
const QVariantMap result = accessor.upgradeSettings(input); const QVariantMap result = accessor.upgradeSettings(input, 8);
// Data is unchanged // Data is unchanged
QCOMPARE(result, input); QCOMPARE(result, input);
@@ -341,7 +344,7 @@ void tst_SettingsAccessor::upgradeSettings_tooOld()
const int startVersion = 1; const int startVersion = 1;
const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); 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 // Data is unchanged
QCOMPARE(result, input); QCOMPARE(result, input);
@@ -353,7 +356,7 @@ void tst_SettingsAccessor::upgradeSettings_tooNew()
const int startVersion = 42; const int startVersion = 42;
const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); 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 // Data is unchanged
QCOMPARE(result, input); QCOMPARE(result, input);
@@ -365,7 +368,7 @@ void tst_SettingsAccessor::upgradeSettings_oneStep()
const int startVersion = 7; const int startVersion = 7;
const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); 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) { for (auto it = result.cbegin(); it != result.cend(); ++it) {
if (it.key() == "OriginalVersion") // was added if (it.key() == "OriginalVersion") // was added
@@ -388,7 +391,7 @@ void tst_SettingsAccessor::upgradeSettings_twoSteps()
const int startVersion = 6; const int startVersion = 6;
const QVariantMap input = versionedMap(startVersion, TESTACCESSOR_DEFAULT_ID, generateExtraData()); 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) { for (auto it = result.cbegin(); it != result.cend(); ++it) {
if (it.key() == "OriginalVersion") // was added 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 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) QTEST_MAIN(tst_SettingsAccessor)
#include "tst_settings.moc" #include "tst_settings.moc"