From cacab453f749e9dc44df90f6ade0b44e88b8d507 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 20 Nov 2017 16:13:34 +0100 Subject: [PATCH] SettingsAccessor: Add test for version upgrader registration Change-Id: I04195b84b551333ef34f0f193d5c2237ad1c86c6 Reviewed-by: Eike Ziller --- tests/auto/utils/settings/tst_settings.cpp | 180 +++++++++++++++++---- 1 file changed, 153 insertions(+), 27 deletions(-) diff --git a/tests/auto/utils/settings/tst_settings.cpp b/tests/auto/utils/settings/tst_settings.cpp index b7c345ca965..12cec1a44d7 100644 --- a/tests/auto/utils/settings/tst_settings.cpp +++ b/tests/auto/utils/settings/tst_settings.cpp @@ -29,6 +29,32 @@ using namespace Utils; +const char TESTACCESSOR_DN[] = "Test Settings Accessor"; +const char TESTACCESSOR_APPLICATION_DN[] = "SettingsAccessor Test (Basic)"; +const char TESTACCESSOR_DEFAULT_ID[] = "testId"; + +// -------------------------------------------------------------------- +// TestVersionUpgrader: +// -------------------------------------------------------------------- + +class TestVersionUpgrader : public Utils::VersionUpgrader +{ +public: + TestVersionUpgrader(int version) : m_version(version) { } + + int version() const final { return m_version; } + QString backupExtension() const final { return QString("v") + QString::number(m_version); } + QVariantMap upgrade(const QVariantMap &data) final + { + QVariantMap result = data; + result.insert(QString("VERSION_") + QString::number(m_version), m_version); + return result; + } + +private: + const int m_version = -1; +}; + // -------------------------------------------------------------------- // BasicTestSettingsAccessor: // -------------------------------------------------------------------- @@ -36,19 +62,33 @@ using namespace Utils; class BasicTestSettingsAccessor : public Utils::SettingsAccessor { public: - BasicTestSettingsAccessor(const QByteArray &id = QByteArray("test")); - - using Utils::SettingsAccessor::isBetterMatch; - using Utils::SettingsAccessor::addVersionUpgrader; + BasicTestSettingsAccessor(const QByteArray &id = QByteArray(TESTACCESSOR_DEFAULT_ID)) : + Utils::SettingsAccessor(Utils::FileName::fromString("/foo/bar")) + { + setDisplayName(TESTACCESSOR_DN); + setApplicationDisplayName(TESTACCESSOR_APPLICATION_DN); + setSettingsId(id); + } }; -BasicTestSettingsAccessor::BasicTestSettingsAccessor(const QByteArray &id) : - Utils::SettingsAccessor(Utils::FileName::fromString("/foo/bar")) +// -------------------------------------------------------------------- +// TestSettingsAccessor: +// -------------------------------------------------------------------- + +class TestSettingsAccessor : public BasicTestSettingsAccessor { - setDisplayName("Basic Test Settings Accessor"); - setApplicationDisplayName("SettingsAccessor Test (Basic)"); - setSettingsId(id); -} +public: + TestSettingsAccessor(const QByteArray &id = QByteArray(TESTACCESSOR_DEFAULT_ID)) : + BasicTestSettingsAccessor(id) + { + addVersionUpgrader(std::make_unique(5)); + addVersionUpgrader(std::make_unique(6)); + addVersionUpgrader(std::make_unique(7)); + } + + // Make methods public for the tests: + using Utils::SettingsAccessor::isBetterMatch; +}; // -------------------------------------------------------------------- // tst_SettingsAccessor: @@ -59,6 +99,13 @@ class tst_SettingsAccessor : public QObject Q_OBJECT private slots: + void addVersionUpgrader(); + void addVersionUpgrader_negativeVersion(); + void addVersionUpgrader_v3v2(); + void addVersionUpgrader_v3v5(); + void addVersionUpgrader_v3v4v5(); + void addVersionUpgrader_v0v1(); + void isBetterMatch(); void isBetterMatch_idMismatch(); void isBetterMatch_noId(); @@ -79,12 +126,86 @@ static QVariantMap versionedMap(int version, const QByteArray &id = QByteArray() return result; } +void tst_SettingsAccessor::addVersionUpgrader() +{ + BasicTestSettingsAccessor accessor; + + QCOMPARE(accessor.firstSupportedVersion(), -1); + QCOMPARE(accessor.currentVersion(), 0); + +} + +void tst_SettingsAccessor::addVersionUpgrader_negativeVersion() +{ + BasicTestSettingsAccessor accessor; + + QVERIFY(!accessor.addVersionUpgrader(std::make_unique(-1))); + QCOMPARE(accessor.firstSupportedVersion(), -1); + QCOMPARE(accessor.currentVersion(), 0); +} + +void tst_SettingsAccessor::addVersionUpgrader_v3v2() +{ + BasicTestSettingsAccessor accessor; + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(3))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 4); + + QVERIFY(!accessor.addVersionUpgrader(std::make_unique(2))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 4); +} + +void tst_SettingsAccessor::addVersionUpgrader_v3v5() +{ + BasicTestSettingsAccessor accessor; + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(3))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 4); + + QVERIFY(!accessor.addVersionUpgrader(std::make_unique(5))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 4); +} + +void tst_SettingsAccessor::addVersionUpgrader_v3v4v5() +{ + BasicTestSettingsAccessor accessor; + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(3))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 4); + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(4))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 5); + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(5))); + QCOMPARE(accessor.firstSupportedVersion(), 3); + QCOMPARE(accessor.currentVersion(), 6); +} + +void tst_SettingsAccessor::addVersionUpgrader_v0v1() +{ + BasicTestSettingsAccessor accessor; + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(0))); + QCOMPARE(accessor.firstSupportedVersion(), 0); + QCOMPARE(accessor.currentVersion(), 1); + + QVERIFY(accessor.addVersionUpgrader(std::make_unique(1))); + QCOMPARE(accessor.firstSupportedVersion(), 0); + QCOMPARE(accessor.currentVersion(), 2); +} + void tst_SettingsAccessor::isBetterMatch() { - const BasicTestSettingsAccessor accessor; + const TestSettingsAccessor accessor; - const QVariantMap a = versionedMap(1, "test"); - const QVariantMap b = versionedMap(2, "test"); + const QVariantMap a = versionedMap(5, TESTACCESSOR_DEFAULT_ID); + const QVariantMap b = versionedMap(6, TESTACCESSOR_DEFAULT_ID); QVERIFY(accessor.isBetterMatch(a, b)); QVERIFY(!accessor.isBetterMatch(b, a)); @@ -92,10 +213,10 @@ void tst_SettingsAccessor::isBetterMatch() void tst_SettingsAccessor::isBetterMatch_idMismatch() { - const BasicTestSettingsAccessor accessor; + const TestSettingsAccessor accessor; - const QVariantMap a = versionedMap(1, "test"); - const QVariantMap b = versionedMap(2, "foo"); + const QVariantMap a = versionedMap(5, TESTACCESSOR_DEFAULT_ID); + const QVariantMap b = versionedMap(6, "foo"); QVERIFY(!accessor.isBetterMatch(a, b)); QVERIFY(accessor.isBetterMatch(b, a)); @@ -103,10 +224,10 @@ void tst_SettingsAccessor::isBetterMatch_idMismatch() void tst_SettingsAccessor::isBetterMatch_noId() { - const BasicTestSettingsAccessor accessor((QByteArray())); + const TestSettingsAccessor accessor((QByteArray())); - const QVariantMap a = versionedMap(1, "test"); - const QVariantMap b = versionedMap(2, "foo"); + const QVariantMap a = versionedMap(5, TESTACCESSOR_DEFAULT_ID); + const QVariantMap b = versionedMap(6, "foo"); QVERIFY(accessor.isBetterMatch(a, b)); QVERIFY(!accessor.isBetterMatch(b, a)); @@ -114,10 +235,10 @@ void tst_SettingsAccessor::isBetterMatch_noId() void tst_SettingsAccessor::isBetterMatch_sameVersion() { - const BasicTestSettingsAccessor accessor; + const TestSettingsAccessor accessor; - const QVariantMap a = versionedMap(10, "test"); - const QVariantMap b = versionedMap(10, "test"); + const QVariantMap a = versionedMap(7, TESTACCESSOR_DEFAULT_ID); + const QVariantMap b = versionedMap(7, TESTACCESSOR_DEFAULT_ID); QVERIFY(!accessor.isBetterMatch(a, b)); QVERIFY(!accessor.isBetterMatch(b, a)); @@ -125,10 +246,10 @@ void tst_SettingsAccessor::isBetterMatch_sameVersion() void tst_SettingsAccessor::isBetterMatch_emptyMap() { - const BasicTestSettingsAccessor accessor; + const TestSettingsAccessor accessor; const QVariantMap a; - const QVariantMap b = versionedMap(10, "test"); + const QVariantMap b = versionedMap(7, TESTACCESSOR_DEFAULT_ID); QVERIFY(accessor.isBetterMatch(a, b)); QVERIFY(!accessor.isBetterMatch(b, a)); @@ -136,13 +257,18 @@ void tst_SettingsAccessor::isBetterMatch_emptyMap() void tst_SettingsAccessor::isBetterMatch_twoEmptyMaps() { - const BasicTestSettingsAccessor accessor; + const TestSettingsAccessor accessor; const QVariantMap a; const QVariantMap b; - QVERIFY(accessor.isBetterMatch(a, b)); - QVERIFY(accessor.isBetterMatch(b, a)); + // The following two fails are harmless: They claim an empty map is better than another empty + // map, so it will trigger a useless copy of one empty map over another. + // This copy will be avoided when reworking isBetterMatch later. + QEXPECT_FAIL("", "harmless but unexpected behavior", Continue); + QVERIFY(!accessor.isBetterMatch(a, b)); + QEXPECT_FAIL("", "harmless but unexpected behavior", Continue); + QVERIFY(!accessor.isBetterMatch(b, a)); } QTEST_MAIN(tst_SettingsAccessor)