diff --git a/test/testsyncmove.cpp b/test/testsyncmove.cpp index f4926722f681f..25cd674dd9988 100644 --- a/test/testsyncmove.cpp +++ b/test/testsyncmove.cpp @@ -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 = "true"; + 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)