File indexing completed on 2024-04-28 03:54:48

0001 /*
0002 
0003     SPDX-FileCopyrightText: 2023 Nicolas Fella <nicolas.fella@gmx.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include <KIO/TransferJob>
0009 
0010 #include <QSignalSpy>
0011 #include <QTest>
0012 
0013 class CookiesTest : public QObject
0014 {
0015     Q_OBJECT
0016 private Q_SLOTS:
0017     void testReceiveCookies();
0018     void testReceiveCookies_data();
0019     void testSendCookies();
0020     void testSendCookies_data();
0021 };
0022 
0023 void CookiesTest::testReceiveCookies_data()
0024 {
0025     QTest::addColumn<QString>("url");
0026     QTest::addColumn<QString>("mode");
0027     QTest::addColumn<QString>("expectedCookieString");
0028 
0029     QTest::addRow("none") << "http://localhost:5000/cookies/none"
0030                           << ""
0031                           << "";
0032 
0033     QTest::addRow("one") << "http://localhost:5000/cookies/somecookie"
0034                          << ""
0035                          << "";
0036     QTest::addRow("two") << "http://localhost:5000/cookies/twocookies"
0037                          << ""
0038                          << "";
0039 
0040     QTest::addRow("none_disabled") << "http://localhost:5000/cookies/none"
0041                                    << "none"
0042                                    << "";
0043 
0044     QTest::addRow("one_disabled") << "http://localhost:5000/cookies/somecookie"
0045                                   << "none"
0046                                   << "";
0047     QTest::addRow("two_disabled") << "http://localhost:5000/cookies/twocookies"
0048                                   << "none"
0049                                   << "";
0050 
0051     QTest::addRow("none_manual") << "http://localhost:5000/cookies/none"
0052                                  << "manual"
0053                                  << "";
0054 
0055     QTest::addRow("one_manual") << "http://localhost:5000/cookies/somecookie"
0056                                 << "manual"
0057                                 << "Set-Cookie: userID=1234; Domain=localhost; Expires=Sat, 13 May 2045 18:52:00 GMT; HttpOnly; Path=/get/calendar\n";
0058     QTest::addRow("two_manual")
0059         << "http://localhost:5000/cookies/twocookies"
0060         << "manual"
0061         << "Set-Cookie: userID=1234; Domain=localhost; Expires=Sat, 13 May 2045 18:52:00 GMT; HttpOnly; Path=/get/calendar\nSet-Cookie: "
0062            "konqi=Yo; Domain=localhost; Expires=Sat, 13 May 2045 18:52:00 GMT; HttpOnly; Path=/get/text\n";
0063 }
0064 
0065 void CookiesTest::testReceiveCookies()
0066 {
0067     QFETCH(QString, url);
0068     QFETCH(QString, mode);
0069     QFETCH(QString, expectedCookieString);
0070 
0071     auto *job = KIO::get(QUrl(url), KIO::NoReload, KIO::HideProgressInfo);
0072     job->addMetaData("cookies", mode);
0073 
0074     QSignalSpy spy(job, &KJob::finished);
0075     spy.wait();
0076     QVERIFY(spy.size());
0077     QCOMPARE(job->error(), KJob::NoError);
0078 
0079     auto cookiesFromString = [](const QString &input) -> std::optional<QList<QNetworkCookie>> {
0080         const QStringList splittedCookiesStrings = input.split('\n', Qt::SkipEmptyParts);
0081 
0082         QList<QNetworkCookie> result;
0083 
0084         if (input.isEmpty()) {
0085             return result;
0086         }
0087 
0088         for (const QString &cookieStringWithPrefix : splittedCookiesStrings) {
0089             if (!cookieStringWithPrefix.startsWith("Set-Cookie: ")) {
0090                 return {};
0091             }
0092 
0093             const QString cookieString = cookieStringWithPrefix.mid(12).replace("-", " ");
0094             const auto parsedCookies = QNetworkCookie::parseCookies(cookieString.toUtf8());
0095 
0096             if (!parsedCookies.isEmpty()) {
0097                 result << parsedCookies.first();
0098             }
0099         }
0100 
0101         return result;
0102     };
0103 
0104     const auto expectedCookies = cookiesFromString(expectedCookieString);
0105 
0106     const QString receivedCookieString = job->queryMetaData("setcookies");
0107     const auto receivedCookies = cookiesFromString(receivedCookieString);
0108 
0109     QCOMPARE(receivedCookies.value(), expectedCookies.value());
0110 }
0111 
0112 void CookiesTest::testSendCookies_data()
0113 {
0114     QTest::addColumn<QString>("url");
0115     QTest::addColumn<QString>("mode");
0116     QTest::addColumn<QString>("inputCookies");
0117     QTest::addColumn<QByteArray>("expectedData");
0118 
0119     QTest::addRow("none") << "http://localhost:5000/cookies/showsent"
0120                           << ""
0121                           << "" << QByteArray();
0122 
0123     QTest::addRow("one") << "http://localhost:5000/cookies/showsent"
0124                          << ""
0125                          << "Cookie: tasty_cookie=strawberry" << QByteArray();
0126 
0127     QTest::addRow("two") << "http://localhost:5000/cookies/showsent"
0128                          << ""
0129                          << "Cookie: tasty_cookie=strawberry;cake=cheesecake" << QByteArray();
0130 
0131     QTest::addRow("none_disabled") << "http://localhost:5000/cookies/showsent"
0132                                    << "none"
0133                                    << "" << QByteArray();
0134 
0135     QTest::addRow("one_disabled") << "http://localhost:5000/cookies/showsent"
0136                                   << "none"
0137                                   << "Cookie: tasty_cookie=strawberry" << QByteArray();
0138 
0139     QTest::addRow("two_disabled") << "http://localhost:5000/cookies/showsent"
0140                                   << "none"
0141                                   << "Cookie: tasty_cookie=strawberry;cake=cheesecake" << QByteArray();
0142 
0143     QTest::addRow("none_manual") << "http://localhost:5000/cookies/showsent"
0144                                  << "manual"
0145                                  << "" << QByteArray();
0146 
0147     QTest::addRow("one_manual") << "http://localhost:5000/cookies/showsent"
0148                                 << "manual"
0149                                 << "Cookie: tasty_cookie=strawberry" << QByteArray("tasty_cookie:strawberry\n");
0150 
0151     QTest::addRow("two_manual") << "http://localhost:5000/cookies/showsent"
0152                                 << "manual"
0153                                 << "Cookie: tasty_cookie=strawberry;cake=cheesecake" << QByteArray("tasty_cookie:strawberry\ncake:cheesecake\n");
0154 }
0155 
0156 void CookiesTest::testSendCookies()
0157 {
0158     QFETCH(QString, url);
0159     QFETCH(QString, mode);
0160     QFETCH(QString, inputCookies);
0161     QFETCH(QByteArray, expectedData);
0162 
0163     auto *job = KIO::get(QUrl(url), KIO::NoReload, KIO::HideProgressInfo);
0164     job->addMetaData("cookies", mode);
0165     job->addMetaData("setcookies", inputCookies);
0166 
0167     QSignalSpy dataSpy(job, &KIO::TransferJob::data);
0168     QSignalSpy spy(job, &KJob::finished);
0169     spy.wait();
0170     QVERIFY(spy.size());
0171     QCOMPARE(job->error(), KJob::NoError);
0172 
0173     QVERIFY(dataSpy.count());
0174     const QByteArray actualData = dataSpy.first().at(1).toByteArray();
0175     QCOMPARE(actualData, expectedData);
0176 }
0177 
0178 QTEST_GUILESS_MAIN(CookiesTest)
0179 
0180 #include "cookiestest.moc"