From 4730f54df7edf4775dfddf45f77c60edd86c32d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 8 Feb 2015 17:56:14 +0100 Subject: SCRATCH separate the generic updater logic from the application --- tests/CMakeLists.txt | 2 +- .../tst_DownloadTask-test_writeInstallScript.xml | 17 ++ ..._DownloadUpdateTask-test_writeInstallScript.xml | 17 -- tests/tst_DownloadTask.cpp | 256 +++++++++++++++++++ tests/tst_DownloadUpdateTask.cpp | 273 --------------------- tests/tst_UpdateChecker.cpp | 34 +-- 6 files changed, 285 insertions(+), 314 deletions(-) create mode 100644 tests/data/tst_DownloadTask-test_writeInstallScript.xml delete mode 100644 tests/data/tst_DownloadUpdateTask-test_writeInstallScript.xml create mode 100644 tests/tst_DownloadTask.cpp delete mode 100644 tests/tst_DownloadUpdateTask.cpp (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2f6b1a63..e891c379 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,7 +27,7 @@ add_unit_test(userutils tst_userutils.cpp) add_unit_test(modutils tst_modutils.cpp) add_unit_test(inifile tst_inifile.cpp) add_unit_test(UpdateChecker tst_UpdateChecker.cpp) -add_unit_test(DownloadUpdateTask tst_DownloadUpdateTask.cpp) +add_unit_test(DownloadTask tst_DownloadTask.cpp) # Tests END # diff --git a/tests/data/tst_DownloadTask-test_writeInstallScript.xml b/tests/data/tst_DownloadTask-test_writeInstallScript.xml new file mode 100644 index 00000000..09c162ca --- /dev/null +++ b/tests/data/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 + + diff --git a/tests/data/tst_DownloadUpdateTask-test_writeInstallScript.xml b/tests/data/tst_DownloadUpdateTask-test_writeInstallScript.xml deleted file mode 100644 index 09c162ca..00000000 --- a/tests/data/tst_DownloadUpdateTask-test_writeInstallScript.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - sourceOne - destOne - 0777 - - - MultiMC.exe - M/u/l/t/i/M/C/e/x/e - 0644 - - - - toDelete.abc - - diff --git a/tests/tst_DownloadTask.cpp b/tests/tst_DownloadTask.cpp new file mode 100644 index 00000000..9c87b027 --- /dev/null +++ b/tests/tst_DownloadTask.cpp @@ -0,0 +1,256 @@ +#include +#include + +#include "TestUtil.h" + +#include "logic/updater/GoUpdate.h" +#include "logic/updater/DownloadTask.h" +#include "logic/updater/UpdateChecker.h" +#include "depends/util/include/pathutils.h" + +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_COPY: + dbg << "OP_COPY"; + break; + case Operation::OP_DELETE: + dbg << "OP_DELETE"; + break; + case Operation::OP_MOVE: + dbg << "OP_MOVE"; + break; + case Operation::OP_CHMOD: + dbg << "OP_CHMOD"; + 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_writeInstallScript() + { + OperationList ops; + + ops << Operation::CopyOp("sourceOne", "destOne", 0777) + << Operation::CopyOp("MultiMC.exe", "M/u/l/t/i/M/C/e/x/e") + << Operation::DeleteOp("toDelete.abc"); + auto testFile = "tests/data/tst_DownloadTask-test_writeInstallScript.xml"; + const QString script = QDir::temp().absoluteFilePath("MultiMCUpdateScript.xml"); + QVERIFY(writeInstallScript(ops, script)); + QCOMPARE(TestsInternal::readFileUtf8(script).replace(QRegExp("[\r\n]+"), "\n"), + MULTIMC_GET_TEST_FILE_UTF8(testFile).replace(QRegExp("[\r\n]+"), "\n")); + } + + void test_parseVersionInfo_data() + { + QTest::addColumn("data"); + QTest::addColumn("list"); + QTest::addColumn("error"); + QTest::addColumn("ret"); + + QTest::newRow("one") + << MULTIMC_GET_TEST_FILE("tests/data/1.json") + << (VersionFileList() + << VersionFileEntry{"fileOne", + 493, + encodeBaseFile("/tests/data/fileOneA"), + "9eb84090956c484e32cb6c08455a667b"} + << VersionFileEntry{"fileTwo", + 644, + encodeBaseFile("/tests/data/fileTwo"), + "38f94f54fa3eb72b0ea836538c10b043"} + << VersionFileEntry{"fileThree", + 750, + encodeBaseFile("/tests/data/fileThree"), + "f12df554b21e320be6471d7154130e70"}) + << QString() << true; + QTest::newRow("two") + << MULTIMC_GET_TEST_FILE("tests/data/2.json") + << (VersionFileList() + << VersionFileEntry{"fileOne", + 493, + encodeBaseFile("/tests/data/fileOneB"), + "42915a71277c9016668cce7b82c6b577"} + << VersionFileEntry{"fileTwo", + 644, + encodeBaseFile("/tests/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{ + "tests/data/fileOne", 493, + FileSourceList() + << FileSource( + "http", "http://host/path/fileOne-1"), + "9eb84090956c484e32cb6c08455a667b"} + << VersionFileEntry{ + "tests/data/fileTwo", 644, + FileSourceList() + << FileSource( + "http", "http://host/path/fileTwo-1"), + "38f94f54fa3eb72b0ea836538c10b043"} + << VersionFileEntry{ + "tests/data/fileThree", 420, + FileSourceList() + << FileSource( + "http", "http://host/path/fileThree-1"), + "f12df554b21e320be6471d7154130e70"}) + << (VersionFileList() + << VersionFileEntry{ + "tests/data/fileOne", 493, + FileSourceList() + << FileSource("http", + "http://host/path/fileOne-2"), + "42915a71277c9016668cce7b82c6b577"} + << VersionFileEntry{ + "tests/data/fileTwo", 644, + FileSourceList() + << FileSource("http", + "http://host/path/fileTwo-2"), + "38f94f54fa3eb72b0ea836538c10b043"}) + << (OperationList() + << Operation::DeleteOp("tests/data/fileThree") + << Operation::CopyOp( + PathCombine(tempFolder, + QString("tests/data/fileOne").replace("/", "_")), + "tests/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, false); + qDebug() << (operations == expectedOperations); + qDebug() << operations; + qDebug() << expectedOperations; + QCOMPARE(operations, expectedOperations); + } +/* + void test_masterTest() + { + qDebug() << "#####################"; + MMC->m_version.build = 1; + MMC->m_version.channel = "develop"; + auto channels = + QUrl::fromLocalFile(QDir::current().absoluteFilePath("tests/data/channels.json")); + auto root = QUrl::fromLocalFile(QDir::current().absoluteFilePath("tests/data/")); + qDebug() << "channels: " << channels; + qDebug() << "root: " << root; + MMC->updateChecker()->setChannelListUrl(channels.toString()); + MMC->updateChecker()->setCurrentChannel("develop"); + + DownloadTask task(root.toString(), 2); + + QSignalSpy succeededSpy(&task, SIGNAL(succeeded())); + + task.start(); + + QVERIFY(succeededSpy.wait()); + } +*/ + 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 "tst_DownloadTask.moc" diff --git a/tests/tst_DownloadUpdateTask.cpp b/tests/tst_DownloadUpdateTask.cpp deleted file mode 100644 index 524095ed..00000000 --- a/tests/tst_DownloadUpdateTask.cpp +++ /dev/null @@ -1,273 +0,0 @@ -#include -#include - -#include "TestUtil.h" - -#include "logic/updater/DownloadUpdateTask.h" -#include "logic/updater/UpdateChecker.h" -#include "depends/util/include/pathutils.h" - -DownloadUpdateTask::FileSourceList encodeBaseFile(const char *suffix) -{ - auto base = qApp->applicationDirPath(); - QUrl localFile = QUrl::fromLocalFile(base + suffix); - QString localUrlString = localFile.toString(QUrl::FullyEncoded); - auto item = DownloadUpdateTask::FileSource("http", localUrlString); - return DownloadUpdateTask::FileSourceList({item}); -} - -Q_DECLARE_METATYPE(DownloadUpdateTask::VersionFileList) -Q_DECLARE_METATYPE(DownloadUpdateTask::UpdateOperation) - -bool operator==(const DownloadUpdateTask::FileSource &f1, - const DownloadUpdateTask::FileSource &f2) -{ - return f1.type == f2.type && f1.url == f2.url && f1.compressionType == f2.compressionType; -} -bool operator==(const DownloadUpdateTask::VersionFileEntry &v1, - const DownloadUpdateTask::VersionFileEntry &v2) -{ - return v1.path == v2.path && v1.mode == v2.mode && v1.sources == v2.sources && - v1.md5 == v2.md5; -} -bool operator==(const DownloadUpdateTask::UpdateOperation &u1, - const DownloadUpdateTask::UpdateOperation &u2) -{ - return u1.type == u2.type && u1.file == u2.file && u1.dest == u2.dest && u1.mode == u2.mode; -} - -QDebug operator<<(QDebug dbg, const DownloadUpdateTask::FileSource &f) -{ - dbg.nospace() << "FileSource(type=" << f.type << " url=" << f.url - << " comp=" << f.compressionType << ")"; - return dbg.maybeSpace(); -} - -QDebug operator<<(QDebug dbg, const DownloadUpdateTask::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 DownloadUpdateTask::UpdateOperation::Type &t) -{ - switch (t) - { - case DownloadUpdateTask::UpdateOperation::OP_COPY: - dbg << "OP_COPY"; - break; - case DownloadUpdateTask::UpdateOperation::OP_DELETE: - dbg << "OP_DELETE"; - break; - case DownloadUpdateTask::UpdateOperation::OP_MOVE: - dbg << "OP_MOVE"; - break; - case DownloadUpdateTask::UpdateOperation::OP_CHMOD: - dbg << "OP_CHMOD"; - break; - } - return dbg.maybeSpace(); -} - -QDebug operator<<(QDebug dbg, const DownloadUpdateTask::UpdateOperation &u) -{ - dbg.nospace() << "UpdateOperation(type=" << u.type << " file=" << u.file - << " dest=" << u.dest << " mode=" << u.mode << ")"; - return dbg.maybeSpace(); -} - -class DownloadUpdateTaskTest : public QObject -{ - Q_OBJECT -private -slots: - void initTestCase() - { - } - void cleanupTestCase() - { - } - - void test_writeInstallScript() - { - DownloadUpdateTask task(QCoreApplication::applicationDirPath(), - QUrl::fromLocalFile(QDir::current().absoluteFilePath("tests/data/")).toString(), 0); - - DownloadUpdateTask::UpdateOperationList ops; - - ops << DownloadUpdateTask::UpdateOperation::CopyOp("sourceOne", "destOne", 0777) - << DownloadUpdateTask::UpdateOperation::CopyOp("MultiMC.exe", "M/u/l/t/i/M/C/e/x/e") - << DownloadUpdateTask::UpdateOperation::DeleteOp("toDelete.abc"); - auto testFile = "tests/data/tst_DownloadUpdateTask-test_writeInstallScript.xml"; - const QString script = QDir::temp().absoluteFilePath("MultiMCUpdateScript.xml"); - QVERIFY(task.writeInstallScript(ops, script)); - QCOMPARE(TestsInternal::readFileUtf8(script).replace(QRegExp("[\r\n]+"), "\n"), - MULTIMC_GET_TEST_FILE_UTF8(testFile).replace(QRegExp("[\r\n]+"), "\n")); - } - -// DISABLED: fails. -/* - void test_parseVersionInfo_data() - { - QTest::addColumn("data"); - QTest::addColumn("list"); - QTest::addColumn("error"); - QTest::addColumn("ret"); - - QTest::newRow("one") - << MULTIMC_GET_TEST_FILE("tests/data/1.json") - << (DownloadUpdateTask::VersionFileList() - << DownloadUpdateTask::VersionFileEntry{"fileOne", - 493, - encodeBaseFile("/tests/data/fileOneA"), - "9eb84090956c484e32cb6c08455a667b"} - << DownloadUpdateTask::VersionFileEntry{"fileTwo", - 644, - encodeBaseFile("/tests/data/fileTwo"), - "38f94f54fa3eb72b0ea836538c10b043"} - << DownloadUpdateTask::VersionFileEntry{"fileThree", - 750, - encodeBaseFile("/tests/data/fileThree"), - "f12df554b21e320be6471d7154130e70"}) - << QString() << true; - QTest::newRow("two") - << MULTIMC_GET_TEST_FILE("tests/data/2.json") - << (DownloadUpdateTask::VersionFileList() - << DownloadUpdateTask::VersionFileEntry{"fileOne", - 493, - encodeBaseFile("/tests/data/fileOneB"), - "42915a71277c9016668cce7b82c6b577"} - << DownloadUpdateTask::VersionFileEntry{"fileTwo", - 644, - encodeBaseFile("/tests/data/fileTwo"), - "38f94f54fa3eb72b0ea836538c10b043"}) - << QString() << true; - } - void test_parseVersionInfo() - { - QFETCH(QByteArray, data); - QFETCH(DownloadUpdateTask::VersionFileList, list); - QFETCH(QString, error); - QFETCH(bool, ret); - - DownloadUpdateTask::VersionFileList outList; - QString outError; - bool outRet = DownloadUpdateTask("", 0).parseVersionInfo(data, &outList, &outError); - QCOMPARE(outRet, ret); - QCOMPARE(outList, list); - QCOMPARE(outError, error); - } -*/ - void test_processFileLists_data() - { - QTest::addColumn("downloader"); - QTest::addColumn("currentVersion"); - QTest::addColumn("newVersion"); - QTest::addColumn("expectedOperations"); - - DownloadUpdateTask *downloader = new DownloadUpdateTask(QCoreApplication::applicationDirPath(), QString(), -1); - - // update fileOne, keep fileTwo, remove fileThree - QTest::newRow("test 1") - << downloader << (DownloadUpdateTask::VersionFileList() - << DownloadUpdateTask::VersionFileEntry{ - "tests/data/fileOne", 493, - DownloadUpdateTask::FileSourceList() - << DownloadUpdateTask::FileSource( - "http", "http://host/path/fileOne-1"), - "9eb84090956c484e32cb6c08455a667b"} - << DownloadUpdateTask::VersionFileEntry{ - "tests/data/fileTwo", 644, - DownloadUpdateTask::FileSourceList() - << DownloadUpdateTask::FileSource( - "http", "http://host/path/fileTwo-1"), - "38f94f54fa3eb72b0ea836538c10b043"} - << DownloadUpdateTask::VersionFileEntry{ - "tests/data/fileThree", 420, - DownloadUpdateTask::FileSourceList() - << DownloadUpdateTask::FileSource( - "http", "http://host/path/fileThree-1"), - "f12df554b21e320be6471d7154130e70"}) - << (DownloadUpdateTask::VersionFileList() - << DownloadUpdateTask::VersionFileEntry{ - "tests/data/fileOne", 493, - DownloadUpdateTask::FileSourceList() - << DownloadUpdateTask::FileSource("http", - "http://host/path/fileOne-2"), - "42915a71277c9016668cce7b82c6b577"} - << DownloadUpdateTask::VersionFileEntry{ - "tests/data/fileTwo", 644, - DownloadUpdateTask::FileSourceList() - << DownloadUpdateTask::FileSource("http", - "http://host/path/fileTwo-2"), - "38f94f54fa3eb72b0ea836538c10b043"}) - << (DownloadUpdateTask::UpdateOperationList() - << DownloadUpdateTask::UpdateOperation::DeleteOp("tests/data/fileThree") - << DownloadUpdateTask::UpdateOperation::CopyOp( - PathCombine(downloader->updateFilesDir(), - QString("tests/data/fileOne").replace("/", "_")), - "tests/data/fileOne", 493)); - } - void test_processFileLists() - { - QFETCH(DownloadUpdateTask *, downloader); - QFETCH(DownloadUpdateTask::VersionFileList, currentVersion); - QFETCH(DownloadUpdateTask::VersionFileList, newVersion); - QFETCH(DownloadUpdateTask::UpdateOperationList, expectedOperations); - - DownloadUpdateTask::UpdateOperationList operations; - - downloader->processFileLists(new NetJob("Dummy"), currentVersion, newVersion, - operations); - qDebug() << (operations == expectedOperations); - qDebug() << operations; - qDebug() << expectedOperations; - QCOMPARE(operations, expectedOperations); - } -/* - void test_masterTest() - { - qDebug() << "#####################"; - MMC->m_version.build = 1; - MMC->m_version.channel = "develop"; - auto channels = - QUrl::fromLocalFile(QDir::current().absoluteFilePath("tests/data/channels.json")); - auto root = QUrl::fromLocalFile(QDir::current().absoluteFilePath("tests/data/")); - qDebug() << "channels: " << channels; - qDebug() << "root: " << root; - MMC->updateChecker()->setChannelListUrl(channels.toString()); - MMC->updateChecker()->setCurrentChannel("develop"); - - DownloadUpdateTask task(root.toString(), 2); - - QSignalSpy succeededSpy(&task, SIGNAL(succeeded())); - - task.start(); - - QVERIFY(succeededSpy.wait()); - } -*/ - void test_OSXPathFixup() - { - QString path, pathOrig; - bool result; - // Proper OSX path - pathOrig = path = "MultiMC.app/Foo/Bar/Baz"; - qDebug() << "Proper OSX path: " << path; - result = DownloadUpdateTask::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 = DownloadUpdateTask::fixPathForOSX(path); - QCOMPARE(path, pathOrig); - QCOMPARE(result, false); - } -}; - -QTEST_GUILESS_MAIN(DownloadUpdateTaskTest) - -#include "tst_DownloadUpdateTask.moc" diff --git a/tests/tst_UpdateChecker.cpp b/tests/tst_UpdateChecker.cpp index 75c5dcdd..d212f79b 100644 --- a/tests/tst_UpdateChecker.cpp +++ b/tests/tst_UpdateChecker.cpp @@ -89,7 +89,7 @@ slots: QFETCH(bool, valid); QFETCH(QList, result); - UpdateChecker checker(channelUrl, 0); + UpdateChecker checker(channelUrl, channel, 0); QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded())); QVERIFY(channelListLoadedSpy.isValid()); @@ -111,28 +111,15 @@ slots: QCOMPARE(checker.getChannelList(), result); } - void tst_UpdateChecking_data() - { - QTest::addColumn("channel"); - QTest::addColumn("channelUrl"); - QTest::addColumn("currentBuild"); - QTest::addColumn >("result"); - - QTest::newRow("valid channel") - << "develop" << findTestDataUrl("tests/data/channels.json") - << 2 - << (QList() << QString() << "1.0.3" << 3); - } void tst_UpdateChecking() { - QFETCH(QString, channel); - QFETCH(QString, channelUrl); - QFETCH(int, currentBuild); - QFETCH(QList, result); + QString channel = "develop"; + QString channelUrl = findTestDataUrl("tests/data/channels.json"); + int currentBuild = 2; - UpdateChecker checker(channelUrl, currentBuild); + UpdateChecker checker(channelUrl, channel, currentBuild); - QSignalSpy updateAvailableSpy(&checker, SIGNAL(updateAvailable(QString,QString,int))); + QSignalSpy updateAvailableSpy(&checker, SIGNAL(updateAvailable(GoUpdate::Status))); QVERIFY(updateAvailableSpy.isValid()); QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded())); QVERIFY(channelListLoadedSpy.isValid()); @@ -142,13 +129,14 @@ slots: qDebug() << "CWD:" << QDir::current().absolutePath(); checker.m_channels[0].url = findTestDataUrl("tests/data/"); - checker.checkForUpdate(channel, false); QVERIFY(updateAvailableSpy.wait()); - QList res = result; - res[0] = checker.m_channels[0].url; - QCOMPARE(updateAvailableSpy.first(), res); + + auto status = updateAvailableSpy.first().first().value(); + QCOMPARE(checker.m_channels[0].url, status.newRepoUrl); + QCOMPARE(3, status.newVersionId); + QCOMPARE(currentBuild, status.currentVersionId); } }; -- cgit v1.2.3