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"