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()) {