Warning, file /utilities/telly-skout/benchmarks/tvspielfilmfetcherbenchmark.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 // SPDX-FileCopyrightText: 2023 Plata Hill <plata.hill@kdemail.net> 0002 // SPDX-License-Identifier: LGPL-2.1-or-later 0003 0004 #include "../src/tvspielfilmfetcher.h" 0005 0006 #include <QTest> 0007 0008 #include <QFile> 0009 #include <QHash> 0010 #include <QNetworkAccessManager> 0011 #include <QNetworkReply> 0012 #include <QStandardPaths> 0013 #include <QString> 0014 0015 #include <algorithm> 0016 0017 namespace 0018 { 0019 class MockQNetworkReply : public QNetworkReply 0020 { 0021 Q_OBJECT 0022 public: 0023 explicit MockQNetworkReply(const QString &dataFileName, QObject *parent = nullptr) 0024 : QNetworkReply(parent) 0025 { 0026 setError(NetworkError::NoError, QString()); 0027 setFinished(true); 0028 0029 m_data.setFileName(QFINDTESTDATA(dataFileName)); 0030 m_data.open(QIODevice::ReadOnly); 0031 } 0032 0033 qint64 readData(char *data, qint64 maxlen) override 0034 { 0035 return m_data.read(data, maxlen); 0036 } 0037 0038 void abort() override 0039 { 0040 } 0041 0042 private: 0043 QFile m_data; 0044 }; 0045 0046 class MockQNetworkAccessManager : public QNetworkAccessManager 0047 { 0048 Q_OBJECT 0049 public: 0050 explicit MockQNetworkAccessManager(QObject *parent = nullptr) 0051 : QNetworkAccessManager(parent) 0052 { 0053 } 0054 0055 QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = nullptr) override 0056 { 0057 Q_UNUSED(op); 0058 Q_UNUSED(outgoingData); 0059 if (m_replies.contains(request.url().toString())) { 0060 QNetworkReply *reply = m_replies[request.url().toString()]; 0061 reply->open(QIODevice::ReadOnly); 0062 return reply; 0063 } else { 0064 qWarning() << request.url() << m_replies; 0065 } 0066 return nullptr; 0067 } 0068 0069 void registerReply(const QString &url, QNetworkReply *reply) 0070 { 0071 m_replies[url] = reply; 0072 } 0073 0074 private: 0075 QHash<QString, QNetworkReply *> m_replies; 0076 }; 0077 } 0078 0079 class TvSpielfilmFetcherBenchmark : public QObject 0080 { 0081 Q_OBJECT 0082 private Q_SLOTS: 0083 void initTestCase() 0084 { 0085 // TV Spielfilm: Europe/Berlin (UTC+1), DB: UTC 0086 // check that start/stop times are displayed correctly in Europe/Athens (UTC+2 = EET-2) 0087 qputenv("TZ", "EET-2"); 0088 QStandardPaths::setTestModeEnabled(true); 0089 } 0090 0091 void testFetchGroups() 0092 { 0093 MockQNetworkAccessManager nam; 0094 TvSpielfilmFetcher fetcher(&nam); 0095 QVector<GroupData> data; 0096 QBENCHMARK { 0097 fetcher.fetchGroups([&data](const QVector<GroupData> &groups) { 0098 data = groups; 0099 }); 0100 } 0101 QCOMPARE(data.size(), 1); 0102 } 0103 0104 void testFetchGroup() 0105 { 0106 QNetworkReply *reply = new MockQNetworkReply("data/tvspielfilmfetcher/channels.html"); 0107 MockQNetworkAccessManager nam; 0108 nam.registerReply("https://www.tvspielfilm.de/tv-programm/sendungen", reply); 0109 TvSpielfilmFetcher fetcher(&nam); 0110 const GroupData group{GroupId("tvspielfilm.germany"), "Germany", "https://www.tvspielfilm.de/tv-programm/sendungen"}; 0111 QList<ChannelData> data; 0112 QBENCHMARK { 0113 fetcher.fetchGroup(group.m_url, group.m_id, [&data](const QList<ChannelData> &channels) { 0114 data = channels; 0115 }); 0116 Q_EMIT reply->finished(); 0117 } 0118 QCOMPARE(data.size(), 212); 0119 } 0120 0121 void testFetchProgram() 0122 { 0123 const ChannelId channelId("SWR"); 0124 0125 QNetworkReply *replyYesterday = new MockQNetworkReply("data/tvspielfilmfetcher/empty.html"); 0126 QNetworkReply *replyToday = new MockQNetworkReply("data/tvspielfilmfetcher/swr.html"); 0127 QNetworkReply *replyTomorrow = new MockQNetworkReply("data/tvspielfilmfetcher/empty.html"); 0128 MockQNetworkAccessManager nam; 0129 0130 const QString yesterday = QDate::currentDate().addDays(-1).toString("yyyy-MM-dd"); 0131 const QString today = QDate::currentDate().toString("yyyy-MM-dd"); 0132 const QString tomorrow = QDate::currentDate().addDays(1).toString("yyyy-MM-dd"); 0133 0134 const QString url = "https://www.tvspielfilm.de/tv-programm/sendungen/?time=day&channel=" + channelId.value(); 0135 nam.registerReply(url + "&date=" + yesterday + "&page=1", replyYesterday); 0136 nam.registerReply(url + "&date=" + today + "&page=1", replyToday); 0137 nam.registerReply(url + "&date=" + tomorrow + "&page=1", replyTomorrow); 0138 0139 TvSpielfilmFetcher fetcher(&nam); 0140 size_t numPrograms = 0; 0141 QBENCHMARK { 0142 fetcher.fetchProgram(channelId, [&numPrograms](const QVector<ProgramData> &programs) { 0143 numPrograms = std::max(numPrograms, static_cast<size_t>(programs.size())); 0144 }); 0145 Q_EMIT replyTomorrow->finished(); 0146 Q_EMIT replyToday->finished(); 0147 Q_EMIT replyYesterday->finished(); 0148 } 0149 QCOMPARE(numPrograms, 60 * 24 - 1); 0150 } 0151 0152 void testFetchProgramDescription() 0153 { 0154 const ChannelId channelId("SWR"); 0155 ProgramId programId; 0156 0157 QNetworkReply *reply = new MockQNetworkReply("data/tvspielfilmfetcher/description.html"); 0158 MockQNetworkAccessManager nam; 0159 nam.registerReply("https://www.tvspielfilm.de/tv-programm/sendung/description1.html", reply); 0160 TvSpielfilmFetcher fetcher(&nam); 0161 QBENCHMARK { 0162 fetcher.fetchProgramDescription(channelId, ProgramId("channel1_1672182000"), "https://www.tvspielfilm.de/tv-programm/sendung/description1.html"); 0163 Q_EMIT reply->finished(); 0164 } 0165 } 0166 }; 0167 0168 QTEST_GUILESS_MAIN(TvSpielfilmFetcherBenchmark) 0169 0170 #include "tvspielfilmfetcherbenchmark.moc"