2017-12-20 14:54:05 +01:00
|
|
|
/*!
|
|
|
|
* \brief Unit tests for class \ref Downloader
|
|
|
|
*
|
2019-05-22 10:08:38 +02:00
|
|
|
* \copyright Copyright (c) 2017-2019 Governikus GmbH & Co. KG, Germany
|
2017-12-20 14:54:05 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "Downloader.h"
|
|
|
|
|
|
|
|
#include "Env.h"
|
|
|
|
#include "MockNetworkManager.h"
|
|
|
|
|
|
|
|
#include <QtTest>
|
|
|
|
|
|
|
|
using namespace governikus;
|
|
|
|
|
|
|
|
class test_Downloader
|
|
|
|
: public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
private:
|
|
|
|
QTemporaryDir mCacheDir;
|
2019-01-03 15:06:22 +01:00
|
|
|
MockNetworkManager mMockNetworkManager;
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
void verifySuccessReply(const QSignalSpy& pSpy, const QUrl& pUrl, const QDateTime& pTimestamp, const QByteArray& pData)
|
|
|
|
{
|
|
|
|
QCOMPARE(pSpy.count(), 1);
|
|
|
|
|
|
|
|
const QList<QVariant>& arguments = pSpy.first();
|
|
|
|
const QVariant updateUrlVariant = arguments.at(0);
|
|
|
|
QVERIFY(updateUrlVariant.userType() == QMetaType::QUrl);
|
|
|
|
const QUrl url = updateUrlVariant.toUrl();
|
|
|
|
QCOMPARE(url, pUrl);
|
|
|
|
|
|
|
|
const QVariant timestampVariant = arguments.at(1);
|
|
|
|
QVERIFY(timestampVariant.userType() == QMetaType::QDateTime);
|
|
|
|
QCOMPARE(timestampVariant.toDateTime(), pTimestamp);
|
|
|
|
|
|
|
|
const QVariant dataVariant = arguments.at(2);
|
|
|
|
QVERIFY(dataVariant.userType() == QMetaType::QByteArray);
|
|
|
|
QCOMPARE(dataVariant.toByteArray(), pData);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void verifyFailedReply(const QSignalSpy& pSpy, const QUrl& pUrl, GlobalStatus::Code pErrorCode)
|
|
|
|
{
|
|
|
|
QCOMPARE(pSpy.count(), 1);
|
|
|
|
|
|
|
|
const QList<QVariant>& arguments = pSpy.first();
|
|
|
|
const QVariant updateUrlVariant = arguments.at(0);
|
|
|
|
QVERIFY(updateUrlVariant.userType() == QMetaType::QUrl);
|
|
|
|
const QUrl url = updateUrlVariant.toUrl();
|
|
|
|
QCOMPARE(url, pUrl);
|
|
|
|
|
|
|
|
const QVariant errorCodeVariant = arguments.at(1);
|
|
|
|
QVERIFY(errorCodeVariant.canConvert<GlobalStatus::Code>());
|
|
|
|
QCOMPARE(errorCodeVariant.value<GlobalStatus::Code>(), pErrorCode);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void verifyUnnecessaryDownloadReply(const QSignalSpy& pSpy, const QUrl& pUrl)
|
|
|
|
{
|
|
|
|
QCOMPARE(pSpy.count(), 1);
|
|
|
|
|
|
|
|
const QList<QVariant>& arguments = pSpy.first();
|
|
|
|
const QVariant updateUrlVariant = arguments.at(0);
|
|
|
|
QVERIFY(updateUrlVariant.userType() == QMetaType::QUrl);
|
|
|
|
const QUrl url = updateUrlVariant.toUrl();
|
|
|
|
QCOMPARE(url, pUrl);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Q_SLOTS:
|
|
|
|
void initTestCase()
|
|
|
|
{
|
|
|
|
mCacheDir.setAutoRemove(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void init()
|
|
|
|
{
|
2019-01-03 15:06:22 +01:00
|
|
|
Env::set(NetworkManager::staticMetaObject, &mMockNetworkManager);
|
2017-12-20 14:54:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cleanup()
|
|
|
|
{
|
|
|
|
Env::clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void downloadExistingFile()
|
|
|
|
{
|
|
|
|
const QByteArray fileContent("Some icon data");
|
|
|
|
const QDateTime timestampOnServer(QDate(2017, 6, 1), QTime(12, 00, 0, 0));
|
2019-01-03 15:06:22 +01:00
|
|
|
MockNetworkReply* const reply = new MockNetworkReply(fileContent, HTTP_STATUS_OK);
|
2017-12-20 14:54:05 +01:00
|
|
|
reply->setFileModificationTimestamp(timestampOnServer);
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.setNextReply(reply);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
Downloader* const downloader = Env::getSingleton<Downloader>();
|
|
|
|
QSignalSpy spy(downloader, &Downloader::fireDownloadSuccess);
|
|
|
|
|
|
|
|
const QUrl url("http://server/reader/icons/icon.png");
|
|
|
|
downloader->download(url);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.fireFinished();
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
verifySuccessReply(spy, url, timestampOnServer, fileContent);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void downloadNonExistingFile()
|
|
|
|
{
|
2019-01-03 15:06:22 +01:00
|
|
|
MockNetworkReply* const reply = new MockNetworkReply(QByteArray(), HTTP_STATUS_NOT_FOUND);
|
|
|
|
mMockNetworkManager.setNextReply(reply);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
Downloader* const downloader = Env::getSingleton<Downloader>();
|
|
|
|
QSignalSpy spy(downloader, &Downloader::fireDownloadFailed);
|
|
|
|
|
|
|
|
const QUrl url("http://server/reader/icons/icon.png");
|
|
|
|
downloader->download(url);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.fireFinished();
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
verifyFailedReply(spy, url, GlobalStatus::Code::Downloader_File_Not_Found);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void conditionalDownloadOfNewerFile()
|
|
|
|
{
|
|
|
|
const QByteArray fileContent("Some icon data");
|
2019-01-03 15:06:22 +01:00
|
|
|
MockNetworkReply* const reply = new MockNetworkReply(fileContent, HTTP_STATUS_OK);
|
2017-12-20 14:54:05 +01:00
|
|
|
const QDateTime timestampOnServer(QDate(2017, 7, 1), QTime(12, 00, 0, 0));
|
|
|
|
reply->setFileModificationTimestamp(timestampOnServer);
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.setNextReply(reply);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
Downloader* const downloader = Env::getSingleton<Downloader>();
|
|
|
|
QSignalSpy spy(downloader, &Downloader::fireDownloadSuccess);
|
|
|
|
|
|
|
|
const QUrl url("http://server/reader/icons/icon.png");
|
|
|
|
const QDateTime timestampInCache(QDate(2017, 6, 1), QTime(12, 00, 0, 0));
|
|
|
|
downloader->downloadIfNew(url, timestampInCache);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.fireFinished();
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
verifySuccessReply(spy, url, timestampOnServer, fileContent);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
QNetworkRequest* const lastRequest = mMockNetworkManager.getLastRequest();
|
2017-12-20 14:54:05 +01:00
|
|
|
QVERIFY(lastRequest);
|
|
|
|
QCOMPARE(lastRequest->rawHeader(QByteArray("If-Modified-Since")), QLocale::c().toString(timestampInCache, QStringLiteral("ddd, dd MMM yyyy hh:mm:ss 'GMT'")).toLatin1());
|
|
|
|
QCOMPARE(lastRequest->rawHeader(QByteArray("If-Modified-Since")), QByteArray("Thu, 01 Jun 2017 12:00:00 GMT"));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void conditionalDownloadOfOlderFile()
|
|
|
|
{
|
2019-01-03 15:06:22 +01:00
|
|
|
MockNetworkReply* const reply = new MockNetworkReply(QByteArray(), HTTP_STATUS_NOT_MODIFIED);
|
2017-12-20 14:54:05 +01:00
|
|
|
const QDateTime timestampOnServer(QDate(2017, 6, 1), QTime(12, 00, 0, 0));
|
|
|
|
reply->setFileModificationTimestamp(timestampOnServer);
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.setNextReply(reply);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
Downloader* const downloader = Env::getSingleton<Downloader>();
|
|
|
|
QSignalSpy spy(downloader, &Downloader::fireDownloadUnnecessary);
|
|
|
|
|
|
|
|
const QUrl url("http://server/reader/icons/icon.png");
|
|
|
|
const QDateTime timestampInCache(QDate(2017, 7, 1), QTime(12, 00, 0, 0));
|
|
|
|
downloader->downloadIfNew(url, timestampInCache);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
mMockNetworkManager.fireFinished();
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
verifyUnnecessaryDownloadReply(spy, url);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
QNetworkRequest* const lastRequest = mMockNetworkManager.getLastRequest();
|
2017-12-20 14:54:05 +01:00
|
|
|
QVERIFY(lastRequest);
|
|
|
|
QCOMPARE(lastRequest->rawHeader(QByteArray("If-Modified-Since")), QLocale::c().toString(timestampInCache, QStringLiteral("ddd, dd MMM yyyy hh:mm:ss 'GMT'")).toLatin1());
|
|
|
|
QCOMPARE(lastRequest->rawHeader(QByteArray("If-Modified-Since")), QByteArray("Sat, 01 Jul 2017 12:00:00 GMT"));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
QTEST_GUILESS_MAIN(test_Downloader)
|
|
|
|
#include "test_Downloader.moc"
|