From b35a26091b3db06db52b51b90cc9b8b3fcc7b3ba Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Tue, 5 Mar 2024 08:55:13 +0100 Subject: [PATCH] add new test to simulate the data loss scenario this new test trigger the assert that a file is either in the old place or the new place when we execute a MOVE instruction for a local file in the test one file is discovered as in need of a local MOVE but will be missing from the old and new places when running the propagation due to a bug Signed-off-by: Matthieu Gallien --- test/testsyncmove.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/test/testsyncmove.cpp b/test/testsyncmove.cpp index 8ad198155..f4926722f 100644 --- a/test/testsyncmove.cpp +++ b/test/testsyncmove.cpp @@ -1063,6 +1063,66 @@ private slots: QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); } + + void testRenameSameFileInMultiplePaths() + { + FakeFolder fakeFolder{FileInfo{}}; + + fakeFolder.remoteModifier().mkdir("FolderA"); + fakeFolder.remoteModifier().mkdir("FolderA/folderParent"); + fakeFolder.remoteModifier().mkdir("FolderB"); + fakeFolder.remoteModifier().mkdir("FolderB/folderChild"); + fakeFolder.remoteModifier().insert("FolderB/folderChild/FileA.txt"); + fakeFolder.remoteModifier().mkdir("FolderC"); + + const auto folderParentFileInfo = fakeFolder.remoteModifier().find("FolderA/folderParent"); + const auto folderParentSharedFolderFileId = folderParentFileInfo->fileId; + const auto folderParentSharedFolderEtag = folderParentFileInfo->etag; + const auto folderChildFileInfo = fakeFolder.remoteModifier().find("FolderB/folderChild"); + const auto folderChildInFolderAFolderFileId = folderChildFileInfo->fileId; + const auto folderChildInFolderAEtag = folderChildFileInfo->etag; + const auto fileAFileInfo = fakeFolder.remoteModifier().find("FolderB/folderChild/FileA.txt"); + const auto fileAInFolderAFolderFileId = fileAFileInfo->fileId; + const auto fileAInFolderAEtag = fileAFileInfo->etag; + + auto folderCFileInfo = fakeFolder.remoteModifier().find("FolderC"); + folderCFileInfo->fileId = folderParentSharedFolderFileId; + folderCFileInfo->etag = folderParentSharedFolderEtag; + + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + + fakeFolder.remoteModifier().remove("FolderB/folderChild"); + fakeFolder.remoteModifier().mkdir("FolderA/folderParent/folderChild"); + fakeFolder.remoteModifier().insert("FolderA/folderParent/folderChild/FileA.txt"); + fakeFolder.remoteModifier().mkdir("FolderC/folderChild"); + fakeFolder.remoteModifier().insert("FolderC/folderChild/FileA.txt"); + + auto folderChildInFolderParentFileInfo = fakeFolder.remoteModifier().find("FolderA/folderParent/folderChild"); + folderChildInFolderParentFileInfo->fileId = folderChildInFolderAFolderFileId; + folderChildInFolderParentFileInfo->etag = folderChildInFolderAEtag; + + auto fileAInFolderParentFileInfo = fakeFolder.remoteModifier().find("FolderA/folderParent/folderChild/FileA.txt"); + fileAInFolderParentFileInfo->fileId = fileAInFolderAFolderFileId; + fileAInFolderParentFileInfo->etag = fileAInFolderAEtag; + + auto folderChildInFolderCFileInfo = fakeFolder.remoteModifier().find("FolderC/folderChild"); + folderChildInFolderCFileInfo->fileId = folderChildInFolderAFolderFileId; + folderChildInFolderCFileInfo->etag = folderChildInFolderAEtag; + + auto fileAInFolderCFileInfo = fakeFolder.remoteModifier().find("FolderC/folderChild/FileA.txt"); + fileAInFolderCFileInfo->fileId = fileAInFolderAFolderFileId; + fileAInFolderCFileInfo->etag = fileAInFolderAEtag; + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::FilesystemOnly); + QVERIFY(fakeFolder.syncOnce()); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(OCC::LocalDiscoveryStyle::FilesystemOnly); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + } }; QTEST_GUILESS_MAIN(TestSyncMove)