forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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"
|
||||||
|
Reference in New Issue
Block a user