automated test: block rename of the top folder of a mount point
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 25 Jun 2024 08:28:20 +0000 (10:28 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 25 Jun 2024 13:37:44 +0000 (15:37 +0200)
encode current behavior in a new automated test

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
test/testsyncmove.cpp

index f4926722f681ff7aeae20603666e85c0e0ec8de3..25cd674dd9988866510b20f9cc333143b768ef4a 100644 (file)
@@ -18,19 +18,26 @@ struct OperationCounter {
     int nPUT = 0;
     int nMOVE = 0;
     int nDELETE = 0;
+    int nPROPFIND = 0;
+    int nMKCOL = 0;
 
     void reset() { *this = {}; }
 
     auto functor() {
         return [&](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *) {
-            if (op == QNetworkAccessManager::GetOperation)
+            if (op == QNetworkAccessManager::GetOperation) {
                 ++nGET;
-            if (op == QNetworkAccessManager::PutOperation)
+            } else if (op == QNetworkAccessManager::PutOperation) {
                 ++nPUT;
-            if (op == QNetworkAccessManager::DeleteOperation)
+            } else if (op == QNetworkAccessManager::DeleteOperation) {
                 ++nDELETE;
-            if (req.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE")
+            } else if (req.attribute(QNetworkRequest::CustomVerbAttribute).toString() == "MOVE") {
                 ++nMOVE;
+            } else if (req.attribute(QNetworkRequest::CustomVerbAttribute).toString() == "PROPFIND") {
+                ++nPROPFIND;
+            } else if (req.attribute(QNetworkRequest::CustomVerbAttribute).toString() == "MKCOL") {
+                ++nMKCOL;
+            }
             return nullptr;
         };
     }
@@ -79,6 +86,13 @@ bool expectAndWipeConflict(FileModifier &local, FileInfo state, const QString pa
     return false;
 }
 
+static void setAllPerm(FileInfo *fi, OCC::RemotePermissions perm)
+{
+    fi->permissions = perm;
+    for (auto &subFi : fi->children)
+        setAllPerm(&subFi, perm);
+}
+
 class TestSyncMove : public QObject
 {
     Q_OBJECT
@@ -1123,6 +1137,43 @@ private slots:
 
         QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
     }
+
+    void testBlockRenameTopFolderFromGroupFolder()
+    {
+        FakeFolder fakeFolder{{}};
+        fakeFolder.syncEngine().account()->setServerVersion("29.0.2.0");
+
+        fakeFolder.remoteModifier().mkdir("FolA");
+        auto groupFolderRoot = fakeFolder.remoteModifier().find("FolA");
+        groupFolderRoot->extraDavProperties = "<nc:is-mount-root>true</nc:is-mount-root>";
+        setAllPerm(groupFolderRoot, RemotePermissions::fromServerString("WDNVCKRM"));
+        fakeFolder.remoteModifier().mkdir("FolA/FolB");
+        fakeFolder.remoteModifier().mkdir("FolA/FolB/FolC");
+        fakeFolder.remoteModifier().mkdir("FolA/FolB/FolC/FolD");
+        fakeFolder.remoteModifier().mkdir("FolA/FolB/FolC/FolD/FolE");
+        fakeFolder.remoteModifier().insert("FolA/FileA.txt");
+        fakeFolder.remoteModifier().insert("FolA/FolB/FileB.txt");
+        fakeFolder.remoteModifier().insert("FolA/FolB/FolC/FileC.txt");
+        fakeFolder.remoteModifier().insert("FolA/FolB/FolC/FolD/FileD.txt");
+        fakeFolder.remoteModifier().insert("FolA/FolB/FolC/FolD/FolE/FileE.txt");
+        QVERIFY(fakeFolder.syncOnce());
+
+        OperationCounter counter;
+        fakeFolder.setServerOverride(counter.functor());
+
+        fakeFolder.localModifier().insert("FolA/FileA2.txt");
+        fakeFolder.localModifier().insert("FolA/FolB/FileB2.txt");
+        fakeFolder.localModifier().insert("FolA/FolB/FolC/FileC2.txt");
+        fakeFolder.localModifier().insert("FolA/FolB/FolC/FolD/FileD2.txt");
+        fakeFolder.localModifier().insert("FolA/FolB/FolC/FolD/FolE/FileE2.txt");
+        fakeFolder.localModifier().rename("FolA", "FolA_Renamed");
+        QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(counter.nDELETE, 0);
+        QCOMPARE(counter.nGET, 0);
+        QCOMPARE(counter.nPUT, 10);
+        QCOMPARE(counter.nMOVE, 0);
+        QCOMPARE(counter.nMKCOL, 5);
+    }
 };
 
 QTEST_GUILESS_MAIN(TestSyncMove)