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"