#include #include #include "TestUtil.h" #include "logic/updater/UpdateChecker.h" Q_DECLARE_METATYPE(UpdateChecker::ChannelListEntry) bool operator==(const UpdateChecker::ChannelListEntry &e1, const UpdateChecker::ChannelListEntry &e2) { 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("tests/data/garbageChannels.json") << false << false << QList(); QTest::newRow("errors") << QString() << findTestDataUrl("tests/data/errorChannels.json") << false << true << QList(); QTest::newRow("no channels") << QString() << findTestDataUrl("tests/data/noChannels.json") << false << true << QList(); QTest::newRow("one channel") << QString("develop") << findTestDataUrl("tests/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("tests/data/channels.json") << true << true << (QList() << UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", MultiMC_TEST_DATA_PATH} << UpdateChecker::ChannelListEntry{"stable", "Stable", "It's stable at least", MultiMC_TEST_DATA_PATH} << 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, 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_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); UpdateChecker checker(channelUrl, currentBuild); QSignalSpy updateAvailableSpy(&checker, SIGNAL(updateAvailable(QString,QString,int))); 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("tests/data/"); checker.checkForUpdate(channel, false); QVERIFY(updateAvailableSpy.wait()); QList res = result; res[0] = checker.m_channels[0].url; QCOMPARE(updateAvailableSpy.first(), res); } }; QTEST_GUILESS_MAIN(UpdateCheckerTest) #include "tst_UpdateChecker.moc"