From 771dd6f9abe29c1d24c5ea8f0e7ca949bc24f84d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 14 Apr 2016 01:23:54 +0200 Subject: NOISSUE reorganize unit tests to be placed next to the code they test. Nuke more dead tests. --- api/logic/updater/DownloadTask_test.cpp | 214 +++++++++++++++++++++ api/logic/updater/UpdateChecker_test.cpp | 146 ++++++++++++++ api/logic/updater/testdata/1.json | 43 +++++ api/logic/updater/testdata/2.json | 31 +++ api/logic/updater/testdata/channels.json | 23 +++ api/logic/updater/testdata/errorChannels.json | 23 +++ api/logic/updater/testdata/fileOneA | 1 + api/logic/updater/testdata/fileOneB | 3 + api/logic/updater/testdata/fileThree | 1 + api/logic/updater/testdata/fileTwo | 1 + api/logic/updater/testdata/garbageChannels.json | 22 +++ api/logic/updater/testdata/index.json | 9 + api/logic/updater/testdata/noChannels.json | 5 + api/logic/updater/testdata/oneChannel.json | 11 ++ .../tst_DownloadTask-test_writeInstallScript.xml | 17 ++ 15 files changed, 550 insertions(+) create mode 100644 api/logic/updater/DownloadTask_test.cpp create mode 100644 api/logic/updater/UpdateChecker_test.cpp create mode 100644 api/logic/updater/testdata/1.json create mode 100644 api/logic/updater/testdata/2.json create mode 100644 api/logic/updater/testdata/channels.json create mode 100644 api/logic/updater/testdata/errorChannels.json create mode 100644 api/logic/updater/testdata/fileOneA create mode 100644 api/logic/updater/testdata/fileOneB create mode 100644 api/logic/updater/testdata/fileThree create mode 100644 api/logic/updater/testdata/fileTwo create mode 100644 api/logic/updater/testdata/garbageChannels.json create mode 100644 api/logic/updater/testdata/index.json create mode 100644 api/logic/updater/testdata/noChannels.json create mode 100644 api/logic/updater/testdata/oneChannel.json create mode 100644 api/logic/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml (limited to 'api/logic/updater') diff --git a/api/logic/updater/DownloadTask_test.cpp b/api/logic/updater/DownloadTask_test.cpp new file mode 100644 index 00000000..edf0f507 --- /dev/null +++ b/api/logic/updater/DownloadTask_test.cpp @@ -0,0 +1,214 @@ +#include +#include + +#include "TestUtil.h" + +#include "updater/GoUpdate.h" +#include "updater/DownloadTask.h" +#include "updater/UpdateChecker.h" +#include + +using namespace GoUpdate; + +FileSourceList encodeBaseFile(const char *suffix) +{ + auto base = qApp->applicationDirPath(); + QUrl localFile = QUrl::fromLocalFile(base + suffix); + QString localUrlString = localFile.toString(QUrl::FullyEncoded); + auto item = FileSource("http", localUrlString); + return FileSourceList({item}); +} + +Q_DECLARE_METATYPE(VersionFileList) +Q_DECLARE_METATYPE(Operation) + +QDebug operator<<(QDebug dbg, const FileSource &f) +{ + dbg.nospace() << "FileSource(type=" << f.type << " url=" << f.url + << " comp=" << f.compressionType << ")"; + return dbg.maybeSpace(); +} + +QDebug operator<<(QDebug dbg, const VersionFileEntry &v) +{ + dbg.nospace() << "VersionFileEntry(path=" << v.path << " mode=" << v.mode + << " md5=" << v.md5 << " sources=" << v.sources << ")"; + return dbg.maybeSpace(); +} + +QDebug operator<<(QDebug dbg, const Operation::Type &t) +{ + switch (t) + { + case Operation::OP_REPLACE: + dbg << "OP_COPY"; + break; + case Operation::OP_DELETE: + dbg << "OP_DELETE"; + break; + } + return dbg.maybeSpace(); +} + +QDebug operator<<(QDebug dbg, const Operation &u) +{ + dbg.nospace() << "Operation(type=" << u.type << " file=" << u.file + << " dest=" << u.dest << " mode=" << u.mode << ")"; + return dbg.maybeSpace(); +} + +class DownloadTaskTest : public QObject +{ + Q_OBJECT +private +slots: + void initTestCase() + { + } + void cleanupTestCase() + { + } + + void test_parseVersionInfo_data() + { + QTest::addColumn("data"); + QTest::addColumn("list"); + QTest::addColumn("error"); + QTest::addColumn("ret"); + + QTest::newRow("one") + << MULTIMC_GET_TEST_FILE("data/1.json") + << (VersionFileList() + << VersionFileEntry{"fileOne", + 493, + encodeBaseFile("/data/fileOneA"), + "9eb84090956c484e32cb6c08455a667b"} + << VersionFileEntry{"fileTwo", + 644, + encodeBaseFile("/data/fileTwo"), + "38f94f54fa3eb72b0ea836538c10b043"} + << VersionFileEntry{"fileThree", + 750, + encodeBaseFile("/data/fileThree"), + "f12df554b21e320be6471d7154130e70"}) + << QString() << true; + QTest::newRow("two") + << MULTIMC_GET_TEST_FILE("data/2.json") + << (VersionFileList() + << VersionFileEntry{"fileOne", + 493, + encodeBaseFile("/data/fileOneB"), + "42915a71277c9016668cce7b82c6b577"} + << VersionFileEntry{"fileTwo", + 644, + encodeBaseFile("/data/fileTwo"), + "38f94f54fa3eb72b0ea836538c10b043"}) + << QString() << true; + } + void test_parseVersionInfo() + { + QFETCH(QByteArray, data); + QFETCH(VersionFileList, list); + QFETCH(QString, error); + QFETCH(bool, ret); + + VersionFileList outList; + QString outError; + bool outRet = parseVersionInfo(data, outList, outError); + QCOMPARE(outRet, ret); + QCOMPARE(outList, list); + QCOMPARE(outError, error); + } + + void test_processFileLists_data() + { + QTest::addColumn("tempFolder"); + QTest::addColumn("currentVersion"); + QTest::addColumn("newVersion"); + QTest::addColumn("expectedOperations"); + + QTemporaryDir tempFolderObj; + QString tempFolder = tempFolderObj.path(); + // update fileOne, keep fileTwo, remove fileThree + QTest::newRow("test 1") + << tempFolder << (VersionFileList() + << VersionFileEntry{ + "data/fileOne", 493, + FileSourceList() + << FileSource( + "http", "http://host/path/fileOne-1"), + "9eb84090956c484e32cb6c08455a667b"} + << VersionFileEntry{ + "data/fileTwo", 644, + FileSourceList() + << FileSource( + "http", "http://host/path/fileTwo-1"), + "38f94f54fa3eb72b0ea836538c10b043"} + << VersionFileEntry{ + "data/fileThree", 420, + FileSourceList() + << FileSource( + "http", "http://host/path/fileThree-1"), + "f12df554b21e320be6471d7154130e70"}) + << (VersionFileList() + << VersionFileEntry{ + "data/fileOne", 493, + FileSourceList() + << FileSource("http", + "http://host/path/fileOne-2"), + "42915a71277c9016668cce7b82c6b577"} + << VersionFileEntry{ + "data/fileTwo", 644, + FileSourceList() + << FileSource("http", + "http://host/path/fileTwo-2"), + "38f94f54fa3eb72b0ea836538c10b043"}) + << (OperationList() + << Operation::DeleteOp("data/fileThree") + << Operation::CopyOp( + FS::PathCombine(tempFolder, + QString("data/fileOne").replace("/", "_")), + "data/fileOne", 493)); + } + void test_processFileLists() + { + QFETCH(QString, tempFolder); + QFETCH(VersionFileList, currentVersion); + QFETCH(VersionFileList, newVersion); + QFETCH(OperationList, expectedOperations); + + OperationList operations; + + processFileLists(currentVersion, newVersion, QCoreApplication::applicationDirPath(), tempFolder, new NetJob("Dummy"), operations); + qDebug() << (operations == expectedOperations); + qDebug() << operations; + qDebug() << expectedOperations; + QCOMPARE(operations, expectedOperations); + } + + void test_OSXPathFixup() + { + QString path, pathOrig; + bool result; + // Proper OSX path + pathOrig = path = "MultiMC.app/Foo/Bar/Baz"; + qDebug() << "Proper OSX path: " << path; + result = fixPathForOSX(path); + QCOMPARE(path, QString("Foo/Bar/Baz")); + QCOMPARE(result, true); + + // Bad OSX path + pathOrig = path = "translations/klingon.lol"; + qDebug() << "Bad OSX path: " << path; + result = fixPathForOSX(path); + QCOMPARE(path, pathOrig); + QCOMPARE(result, false); + } +}; + +extern "C" +{ + QTEST_GUILESS_MAIN(DownloadTaskTest) +} + +#include "DownloadTask_test.moc" diff --git a/api/logic/updater/UpdateChecker_test.cpp b/api/logic/updater/UpdateChecker_test.cpp new file mode 100644 index 00000000..16b21614 --- /dev/null +++ b/api/logic/updater/UpdateChecker_test.cpp @@ -0,0 +1,146 @@ +#include +#include + +#include "TestUtil.h" +#include "updater/UpdateChecker.h" + +Q_DECLARE_METATYPE(UpdateChecker::ChannelListEntry) + +bool operator==(const UpdateChecker::ChannelListEntry &e1, const UpdateChecker::ChannelListEntry &e2) +{ + qDebug() << e1.url << "vs" << e2.url; + return e1.id == e2.id && + e1.name == e2.name && + e1.description == e2.description && + e1.url == e2.url; +} + +QDebug operator<<(QDebug dbg, const UpdateChecker::ChannelListEntry &c) +{ + dbg.nospace() << "ChannelListEntry(id=" << c.id << " name=" << c.name << " description=" << c.description << " url=" << c.url << ")"; + return dbg.maybeSpace(); +} + +class UpdateCheckerTest : public QObject +{ + Q_OBJECT +private +slots: + void initTestCase() + { + + } + void cleanupTestCase() + { + + } + + static QString findTestDataUrl(const char *file) + { + return QUrl::fromLocalFile(QFINDTESTDATA(file)).toString(); + } + void tst_ChannelListParsing_data() + { + QTest::addColumn("channel"); + QTest::addColumn("channelUrl"); + QTest::addColumn("hasChannels"); + QTest::addColumn("valid"); + QTest::addColumn >("result"); + + QTest::newRow("garbage") + << QString() + << findTestDataUrl("data/garbageChannels.json") + << false + << false + << QList(); + QTest::newRow("errors") + << QString() + << findTestDataUrl("data/errorChannels.json") + << false + << true + << QList(); + QTest::newRow("no channels") + << QString() + << findTestDataUrl("data/noChannels.json") + << false + << true + << QList(); + QTest::newRow("one channel") + << QString("develop") + << findTestDataUrl("data/oneChannel.json") + << true + << true + << (QList() << UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", "http://example.org/stuff"}); + QTest::newRow("several channels") + << QString("develop") + << findTestDataUrl("data/channels.json") + << true + << true + << (QList() + << UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", findTestDataUrl("data")} + << UpdateChecker::ChannelListEntry{"stable", "Stable", "It's stable at least", findTestDataUrl("data")} + << UpdateChecker::ChannelListEntry{"42", "The Channel", "This is the channel that is going to answer all of your questions", "https://dent.me/tea"}); + } + void tst_ChannelListParsing() + { + + QFETCH(QString, channel); + QFETCH(QString, channelUrl); + QFETCH(bool, hasChannels); + QFETCH(bool, valid); + QFETCH(QList, result); + + UpdateChecker checker(channelUrl, channel, 0); + + QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded())); + QVERIFY(channelListLoadedSpy.isValid()); + + checker.updateChanList(false); + + if (valid) + { + QVERIFY(channelListLoadedSpy.wait()); + QCOMPARE(channelListLoadedSpy.size(), 1); + } + else + { + channelListLoadedSpy.wait(); + QCOMPARE(channelListLoadedSpy.size(), 0); + } + + QCOMPARE(checker.hasChannels(), hasChannels); + QCOMPARE(checker.getChannelList(), result); + } + + void tst_UpdateChecking() + { + QString channel = "develop"; + QString channelUrl = findTestDataUrl("data/channels.json"); + int currentBuild = 2; + + UpdateChecker checker(channelUrl, channel, currentBuild); + + QSignalSpy updateAvailableSpy(&checker, SIGNAL(updateAvailable(GoUpdate::Status))); + QVERIFY(updateAvailableSpy.isValid()); + QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded())); + QVERIFY(channelListLoadedSpy.isValid()); + + checker.updateChanList(false); + QVERIFY(channelListLoadedSpy.wait()); + + qDebug() << "CWD:" << QDir::current().absolutePath(); + checker.m_channels[0].url = findTestDataUrl("data/"); + checker.checkForUpdate(channel, false); + + QVERIFY(updateAvailableSpy.wait()); + + auto status = updateAvailableSpy.first().first().value(); + QCOMPARE(checker.m_channels[0].url, status.newRepoUrl); + QCOMPARE(3, status.newVersionId); + QCOMPARE(currentBuild, status.currentVersionId); + } +}; + +QTEST_GUILESS_MAIN(UpdateCheckerTest) + +#include "UpdateChecker_test.moc" diff --git a/api/logic/updater/testdata/1.json b/api/logic/updater/testdata/1.json new file mode 100644 index 00000000..3dd189e5 --- /dev/null +++ b/api/logic/updater/testdata/1.json @@ -0,0 +1,43 @@ +{ + "ApiVersion": 0, + "Id": 1, + "Name": "1.0.1", + "Files": [ + { + "Path": "fileOne", + "Sources": [ + { + "SourceType": "http", + "Url": "@TEST_DATA_URL@/fileOneA" + } + ], + "Executable": true, + "Perms": 493, + "MD5": "9eb84090956c484e32cb6c08455a667b" + }, + { + "Path": "fileTwo", + "Sources": [ + { + "SourceType": "http", + "Url": "@TEST_DATA_URL@/fileTwo" + } + ], + "Executable": false, + "Perms": 644, + "MD5": "38f94f54fa3eb72b0ea836538c10b043" + }, + { + "Path": "fileThree", + "Sources": [ + { + "SourceType": "http", + "Url": "@TEST_DATA_URL@/fileThree" + } + ], + "Executable": false, + "Perms": "750", + "MD5": "f12df554b21e320be6471d7154130e70" + } + ] +} diff --git a/api/logic/updater/testdata/2.json b/api/logic/updater/testdata/2.json new file mode 100644 index 00000000..a7ba7029 --- /dev/null +++ b/api/logic/updater/testdata/2.json @@ -0,0 +1,31 @@ +{ + "ApiVersion": 0, + "Id": 1, + "Name": "1.0.1", + "Files": [ + { + "Path": "fileOne", + "Sources": [ + { + "SourceType": "http", + "Url": "@TEST_DATA_URL@/fileOneB" + } + ], + "Executable": true, + "Perms": 493, + "MD5": "42915a71277c9016668cce7b82c6b577" + }, + { + "Path": "fileTwo", + "Sources": [ + { + "SourceType": "http", + "Url": "@TEST_DATA_URL@/fileTwo" + } + ], + "Executable": false, + "Perms": 644, + "MD5": "38f94f54fa3eb72b0ea836538c10b043" + } + ] +} diff --git a/api/logic/updater/testdata/channels.json b/api/logic/updater/testdata/channels.json new file mode 100644 index 00000000..b46c64c8 --- /dev/null +++ b/api/logic/updater/testdata/channels.json @@ -0,0 +1,23 @@ +{ + "format_version": 0, + "channels": [ + { + "id": "develop", + "name": "Develop", + "description": "The channel called \"develop\"", + "url": "@TEST_DATA_URL@" + }, + { + "id": "stable", + "name": "Stable", + "description": "It's stable at least", + "url": "@TEST_DATA_URL@" + }, + { + "id": "42", + "name": "The Channel", + "description": "This is the channel that is going to answer all of your questions", + "url": "https://dent.me/tea" + } + ] +} diff --git a/api/logic/updater/testdata/errorChannels.json b/api/logic/updater/testdata/errorChannels.json new file mode 100644 index 00000000..333cd445 --- /dev/null +++ b/api/logic/updater/testdata/errorChannels.json @@ -0,0 +1,23 @@ +{ + "format_version": 0, + "channels": [ + { + "id": "", + "name": "Develop", + "description": "The channel called \"develop\"", + "url": "http://example.org/stuff" + }, + { + "id": "stable", + "name": "", + "description": "It's stable at least", + "url": "ftp://username@host/path/to/stuff" + }, + { + "id": "42", + "name": "The Channel", + "description": "This is the channel that is going to answer all of your questions", + "url": "" + } + ] +} diff --git a/api/logic/updater/testdata/fileOneA b/api/logic/updater/testdata/fileOneA new file mode 100644 index 00000000..f2e41136 --- /dev/null +++ b/api/logic/updater/testdata/fileOneA @@ -0,0 +1 @@ +stuff diff --git a/api/logic/updater/testdata/fileOneB b/api/logic/updater/testdata/fileOneB new file mode 100644 index 00000000..f9aba922 --- /dev/null +++ b/api/logic/updater/testdata/fileOneB @@ -0,0 +1,3 @@ +stuff + +more stuff that came in the new version diff --git a/api/logic/updater/testdata/fileThree b/api/logic/updater/testdata/fileThree new file mode 100644 index 00000000..6353ff16 --- /dev/null +++ b/api/logic/updater/testdata/fileThree @@ -0,0 +1 @@ +this is yet another file diff --git a/api/logic/updater/testdata/fileTwo b/api/logic/updater/testdata/fileTwo new file mode 100644 index 00000000..aad9a93a --- /dev/null +++ b/api/logic/updater/testdata/fileTwo @@ -0,0 +1 @@ +some other stuff diff --git a/api/logic/updater/testdata/garbageChannels.json b/api/logic/updater/testdata/garbageChannels.json new file mode 100644 index 00000000..1450fb9c --- /dev/null +++ b/api/logic/updater/testdata/garbageChannels.json @@ -0,0 +1,22 @@ +{ + "format_version": 0, + "channels": [ + { + "id": "develop", + "name": "Develop", + "description": "The channel called \"develop\"", +aa "url": "http://example.org/stuff" + }, +a "id": "stable", + "name": "Stable", + "description": "It's stable at least", + "url": "ftp://username@host/path/to/stuff" + }, + { + "id": "42"f + "name": "The Channel", + "description": "This is the channel that is going to answer all of your questions", + "url": "https://dent.me/tea" + } + ] +} diff --git a/api/logic/updater/testdata/index.json b/api/logic/updater/testdata/index.json new file mode 100644 index 00000000..20ceb9f4 --- /dev/null +++ b/api/logic/updater/testdata/index.json @@ -0,0 +1,9 @@ +{ + "ApiVersion": 0, + "Versions": [ + { "Id": 0, "Name": "1.0.0" }, + { "Id": 1, "Name": "1.0.1" }, + { "Id": 2, "Name": "1.0.2" }, + { "Id": 3, "Name": "1.0.3" } + ] +} diff --git a/api/logic/updater/testdata/noChannels.json b/api/logic/updater/testdata/noChannels.json new file mode 100644 index 00000000..bbb2cb70 --- /dev/null +++ b/api/logic/updater/testdata/noChannels.json @@ -0,0 +1,5 @@ +{ + "format_version": 0, + "channels": [ + ] +} diff --git a/api/logic/updater/testdata/oneChannel.json b/api/logic/updater/testdata/oneChannel.json new file mode 100644 index 00000000..84727ac7 --- /dev/null +++ b/api/logic/updater/testdata/oneChannel.json @@ -0,0 +1,11 @@ +{ + "format_version": 0, + "channels": [ + { + "id": "develop", + "name": "Develop", + "description": "The channel called \"develop\"", + "url": "http://example.org/stuff" + } + ] +} diff --git a/api/logic/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml b/api/logic/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml new file mode 100644 index 00000000..09c162ca --- /dev/null +++ b/api/logic/updater/testdata/tst_DownloadTask-test_writeInstallScript.xml @@ -0,0 +1,17 @@ + + + + sourceOne + destOne + 0777 + + + MultiMC.exe + M/u/l/t/i/M/C/e/x/e + 0644 + + + + toDelete.abc + + -- cgit v1.2.3