diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -19,6 +19,12 @@ LINK_LIBRARIES KF5::DAV Qt5::Test Qt5::Core ) +ecm_add_test(davcollectionsmultifetchjobtest.cpp fakeserver.cpp + TEST_NAME davcollectionsmultifetchjobtest + NAME_PREFIX "kdav-" + LINK_LIBRARIES KF5::DAV Qt5::Test Qt5::Core Qt5::Network +) + ecm_add_test(davitemfetchjobtest.cpp fakeserver.cpp TEST_NAME davitemfetchjob NAME_PREFIX "kdav-" diff --git a/autotests/data/dataitemmultifetchjob-caldav-collections.txt b/autotests/data/dataitemmultifetchjob-caldav-collections.txt new file mode 100644 --- /dev/null +++ b/autotests/data/dataitemmultifetchjob-caldav-collections.txt @@ -0,0 +1,37 @@ +C: PROPFIND /caldav/dfaure%40example.com/ HTTP/1.1 +S: HTTP/1.1 207 Multi-Status +S: Date: Wed, 04 Jan 2017 18:26:48 GMT +S: Last-Modified: Wed, 04 Jan 2017 18:26:47 GMT +S: DAV: 1, 3, extended-mkcol, access-control, calendarserver-principal-property-search, calendar-access, calendar-proxy, calendar-schedule, calendar-auto-schedule, addressbook, 2 +S: Content-Type: application/xml; charset=utf-8 +D: +D: +D: +D: /caldav.php/test1.user/home/ +D: +D: +D: +D: +D: +D: +D: +D: +D: +D: +D: +D: +D: +D: +D: Test1 User +D: +D: +D: +D: +D: +D: 12345 +D: +D: HTTP/1.1 200 OK +D: +D: +D: +X diff --git a/autotests/data/dataitemmultifetchjob-caldav.txt b/autotests/data/dataitemmultifetchjob-caldav.txt new file mode 100644 --- /dev/null +++ b/autotests/data/dataitemmultifetchjob-caldav.txt @@ -0,0 +1,21 @@ +C: PROPFIND /caldav HTTP/1.1 +S: HTTP/1.1 207 Multi-Status +S: Date: Wed, 04 Jan 2017 18:26:48 GMT +S: Last-Modified: Wed, 04 Jan 2017 18:26:47 GMT +S: DAV: 1, 3, extended-mkcol, access-control, calendarserver-principal-property-search, calendar-access, calendar-proxy, calendar-schedule, calendar-auto-schedule, addressbook, 2 +S: Content-Type: application/xml; charset=utf-8 +D: +D: +D: +D: /principals/users/dfaure%40example.com/ +D: +D: +D: +D: /caldav/dfaure%40example.com/ +D: +D: +D: HTTP/1.1 200 OK +D: +D: +D: +X diff --git a/autotests/data/dataitemmultifetchjob-carddav-collections.txt b/autotests/data/dataitemmultifetchjob-carddav-collections.txt new file mode 100644 --- /dev/null +++ b/autotests/data/dataitemmultifetchjob-carddav-collections.txt @@ -0,0 +1,24 @@ +C: PROPFIND /carddav/dfaure%40example.com/ HTTP/1.1 +S: HTTP/1.1 207 Multi-Status +S: Date: Wed, 04 Jan 2017 18:26:48 GMT +S: Last-Modified: Wed, 04 Jan 2017 18:26:47 GMT +S: DAV: 1, 3, extended-mkcol, access-control, calendarserver-principal-property-search, calendar-access, calendar-proxy, calendar-schedule, calendar-auto-schedule, addressbook, 2 +S: Content-Type: application/xml; charset=utf-8 +D: +D: +D: +D: /carddav.php/test1.user/home/ +D: +D: +D: +D: +D: +D: +D: My Address Book +D: 3145 +D: +D: HTTP/1.1 200 OK +D: +D: +D: +X diff --git a/autotests/data/dataitemmultifetchjob-carddav.txt b/autotests/data/dataitemmultifetchjob-carddav.txt new file mode 100644 --- /dev/null +++ b/autotests/data/dataitemmultifetchjob-carddav.txt @@ -0,0 +1,21 @@ +C: PROPFIND /carddav HTTP/1.1 +S: HTTP/1.1 207 Multi-Status +S: Date: Wed, 04 Jan 2017 18:26:48 GMT +S: Last-Modified: Wed, 04 Jan 2017 18:26:47 GMT +S: DAV: 1, 3, extended-mkcol, access-control, calendarserver-principal-property-search, calendar-access, calendar-proxy, calendar-schedule, calendar-auto-schedule, addressbook, 2 +S: Content-Type: application/xml; charset=utf-8 +D: +D: +D: +D: /principals/users/dfaure%40example.com/ +D: +D: +D: +D: /carddav/dfaure%40example.com/ +D: +D: +D: HTTP/1.1 200 OK +D: +D: +D: +X diff --git a/autotests/davcollectionsmultifetchjobtest.h b/autotests/davcollectionsmultifetchjobtest.h new file mode 100644 --- /dev/null +++ b/autotests/davcollectionsmultifetchjobtest.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2020 David Faure + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef DAVITEMFETCHJOB_TEST_H +#define DAVITEMFETCHJOB_TEST_H + +#include + +class DavCollectionsMultiFetchJobTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void initTestCase(); + void runSuccessfullTest(); +}; + +#endif diff --git a/autotests/davcollectionsmultifetchjobtest.cpp b/autotests/davcollectionsmultifetchjobtest.cpp new file mode 100644 --- /dev/null +++ b/autotests/davcollectionsmultifetchjobtest.cpp @@ -0,0 +1,66 @@ +/* + SPDX-FileCopyrightText: 2020 David Faure + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "davcollectionsmultifetchjobtest.h" +#include "fakeserver.h" + +#include + +#include + +using KDAV::DavCollection; + +void DavCollectionsMultiFetchJobTest::initTestCase() +{ + // To avoid a runtime dependency on klauncher + qputenv("KDE_FORK_SLAVES", "yes"); + // To let ctest exit, we shouldn't start kio_http_cache_cleaner + qputenv("KIO_DISABLE_CACHE_CLEANER", "yes"); +} + +void DavCollectionsMultiFetchJobTest::runSuccessfullTest() +{ + FakeServer fakeServer; + QUrl url(QStringLiteral("http://localhost/caldav")); + url.setPort(fakeServer.port()); + KDAV::DavUrl davUrl1(url, KDAV::CalDav); + QUrl url2(url); + url2.setPath(QStringLiteral("/carddav")); + KDAV::DavUrl davUrl2(url2, KDAV::CardDav); + + auto job = new KDAV::DavCollectionsMultiFetchJob({davUrl1, davUrl2}); + // TODO QSignalSpy spy(job, &KDAV::DavCollectionsMultiFetchJob::collectionDiscovered); + + fakeServer.addScenarioFromFile(QLatin1String(AUTOTEST_DATA_DIR)+QStringLiteral("/dataitemmultifetchjob-caldav.txt")); + fakeServer.addScenarioFromFile(QLatin1String(AUTOTEST_DATA_DIR)+QStringLiteral("/dataitemmultifetchjob-caldav-collections.txt")); + fakeServer.addScenarioFromFile(QLatin1String(AUTOTEST_DATA_DIR)+QStringLiteral("/dataitemmultifetchjob-carddav.txt")); + fakeServer.addScenarioFromFile(QLatin1String(AUTOTEST_DATA_DIR)+QStringLiteral("/dataitemmultifetchjob-carddav-collections.txt")); + fakeServer.startAndWait(); + job->exec(); + fakeServer.quit(); + + QVERIFY(fakeServer.isAllScenarioDone()); + QCOMPARE(job->error(), 0); + + const KDAV::DavCollection::List collections = job->collections(); + QCOMPARE(collections.count(), 2); + + const KDAV::DavCollection calendar = collections.at(0); + QCOMPARE(calendar.displayName(), QStringLiteral("Test1 User")); + QCOMPARE(calendar.contentTypes(), DavCollection::Events | DavCollection::Todos | DavCollection::FreeBusy | DavCollection::Journal); + QCOMPARE(calendar.url().url().path(), QStringLiteral("/caldav.php/test1.user/home/")); + QCOMPARE(calendar.CTag(), QStringLiteral("12345")); + QCOMPARE(calendar.privileges(), KDAV::Read); + + const KDAV::DavCollection addressbook = collections.at(1); + QCOMPARE(addressbook.displayName(), QStringLiteral("My Address Book")); + QCOMPARE(addressbook.contentTypes(), DavCollection::Contacts); + QCOMPARE(addressbook.url().url().path(), QStringLiteral("/carddav.php/test1.user/home/")); + QCOMPARE(addressbook.CTag(), QStringLiteral("3145")); + QCOMPARE(addressbook.privileges(), KDAV::All); +} + +QTEST_MAIN(DavCollectionsMultiFetchJobTest) diff --git a/autotests/fakeserver.cpp b/autotests/fakeserver.cpp --- a/autotests/fakeserver.cpp +++ b/autotests/fakeserver.cpp @@ -45,6 +45,10 @@ int scenarioNumber = m_clientSockets.indexOf(socket); + if (scenarioNumber >= m_scenarios.size()) { + qWarning() << "There is no scenario for socket" << scenarioNumber << ", we got more connections than expected"; + } + readClientPart(scenarioNumber); writeServerPart(scenarioNumber); } @@ -178,19 +182,26 @@ QList scenario = m_scenarios[scenarioNumber]; QTcpSocket *socket = m_clientSockets[scenarioNumber]; QByteArray line = socket->readLine(); + qDebug() << "Read client request" << line; QVector header; - while(line != "\r\n") { + while (line != "\r\n") { header << line; + if (socket->bytesAvailable() == 0 && !socket->waitForReadyRead()) { + qDebug() << header; + QFAIL("could not read all headers"); + return; + } line = socket->readLine(); } while (!scenario.isEmpty() && scenario.first().startsWith("C: ")) { QByteArray expected = scenario.takeFirst().mid(3) + "\r\n"; if (!header.contains(expected)) { - qWarning() << expected << "not found in header"; + qWarning() << expected << "not found in header. Here's what we got:"; + qWarning() << header; QVERIFY(false); break; } diff --git a/src/common/davcollectionsfetchjob.cpp b/src/common/davcollectionsfetchjob.cpp --- a/src/common/davcollectionsfetchjob.cpp +++ b/src/common/davcollectionsfetchjob.cpp @@ -98,7 +98,7 @@ } const QStringList homeSets = davJob->homeSets(); - qCDebug(KDAV_LOG) << "Found " << homeSets.size() << " homesets"; + qCDebug(KDAV_LOG) << "Found" << homeSets.size() << "homesets"; qCDebug(KDAV_LOG) << homeSets; if (homeSets.isEmpty()) {