Discovery: Query data-fingerprint on root item
authorChristian Kamm <mail@ckamm.de>
Fri, 12 Apr 2019 08:59:24 +0000 (10:59 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:48 +0000 (10:58 +0100)
Previously the property wasn't queried, meaning the fingerprint logic
couldn't get triggered.

src/libsync/discovery.cpp
test/testallfilesdeleted.cpp

index 6a3d04f36c1279d894780259e02310a6d94e01b2..60226d4042a65db964f2325867e2ff195f586483 100644 (file)
@@ -1328,6 +1328,8 @@ DiscoverySingleDirectoryJob *ProcessDirectoryJob::startAsyncServerQuery()
 {
     auto serverJob = new DiscoverySingleDirectoryJob(_discoveryData->_account,
         _discoveryData->_remoteFolder + _currentFolder._server, this);
+    if (!_dirItem)
+        serverJob->setIsRootPath(); // query the fingerprint on the root
     connect(serverJob, &DiscoverySingleDirectoryJob::etag, this, &ProcessDirectoryJob::etag);
     _discoveryData->_currentlyActiveJobs++;
     _pendingAsyncJobs++;
index f85debef39645c6a66d43a1a58bd4f2eb229b1bc..894503f104742a705681a0ae25ba41a27473004d 100644 (file)
@@ -207,7 +207,24 @@ private slots:
             //Server support finger print, but none is set.
             fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint></oc:data-fingerprint>";
         }
+
+        int fingerprintRequests = 0;
+        fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation, const QNetworkRequest &request, QIODevice *stream) -> QNetworkReply * {
+            auto verb = request.attribute(QNetworkRequest::CustomVerbAttribute);
+            if (verb == "PROPFIND") {
+                auto data = stream->readAll();
+                if (data.contains("data-fingerprint")) {
+                    if (request.url().path().endsWith("webdav/"))
+                        ++fingerprintRequests;
+                    else
+                        fingerprintRequests = -10000; // fingerprint queried on incorrect path
+                }
+            }
+            return nullptr;
+        });
+
         QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(fingerprintRequests, 1);
         // First sync, we did not change the finger print, so the file should be downloaded as normal
         QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
         QCOMPARE(fakeFolder.currentRemoteState().find("C/c1")->contentChar, 'N');
@@ -233,6 +250,7 @@ private slots:
         fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint>new_finger_print</oc:data-fingerprint>";
 
         QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(fingerprintRequests, 2);
         auto currentState = fakeFolder.currentLocalState();
         // Altough the local file is kept as a conflict, the server file is downloaded
         QCOMPARE(currentState.find("A/a1")->contentChar, 'O');