diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index a9ca164038fb0..db8ed9c2dd4c7 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -1261,7 +1261,7 @@ void SyncEngine::setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set #include "syncenginetestutils.h" -#include "common/vfs.h" -#include "config.h" -#include +#include "common/vfs.h" +#include "openfilemanager.h" +#include "syncengine.h" #include "vfs/cfapi/cfapiwrapper.h" +#include + namespace cfapi { using namespace OCC::CfApiWrapper; } @@ -1582,6 +1583,131 @@ private slots: const auto directoryItem = fakeFolder.remoteModifier().find("directory"); QCOMPARE(directoryItem, nullptr); } + + void syncFoldersOnDemand() + { + FakeFolder fakeFolder {FileInfo{}}; + auto vfs = setupVfs(fakeFolder); + + ItemCompletedSpy completeSpy(fakeFolder); + + const auto cleanup = [&]() { + completeSpy.clear(); + }; + + cleanup(); + + fakeFolder.remoteModifier().insert("rootfile1"); + fakeFolder.remoteModifier().mkdir("first folder"); + fakeFolder.remoteModifier().insert("first folder/file1"); + fakeFolder.remoteModifier().insert("first folder/file2"); + fakeFolder.remoteModifier().insert("first folder/file3"); + fakeFolder.remoteModifier().mkdir("first folder/second folder"); + fakeFolder.remoteModifier().insert("first folder/second folder/second file1"); + fakeFolder.remoteModifier().insert("first folder/second folder/second file2"); + fakeFolder.remoteModifier().insert("first folder/second folder/second file3"); + + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(completeSpy.size(), 9); + QVERIFY(itemInstruction(completeSpy, "rootfile1", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "first folder", CSYNC_INSTRUCTION_NEW)); + + cleanup(); + + OCC::showInFileManager(fakeFolder.localPath() + "first folder"); + + QTest::qWait(5000); + + QVERIFY(fakeFolder.syncOnce()); + + OCC::showInFileManager(fakeFolder.localPath() + "first folder"); + + QTest::qWait(5000); + + const auto file3Info = fakeFolder.localModifier().find("first folder/file3"); + QVERIFY(file3Info.exists()); + const auto secondFolderInfo = fakeFolder.localModifier().find("first folder/second folder"); + QVERIFY(secondFolderInfo.exists()); + const auto wrongFirstFolderInfo = fakeFolder.localModifier().find("first folder/first folder"); + QVERIFY(!wrongFirstFolderInfo.exists()); + + QVERIFY(fakeFolder.syncOnce()); + + OCC::showInFileManager(fakeFolder.localPath() + "first folder/second folder"); + + QTest::qWait(5000); + + const auto secondFile3Info = fakeFolder.localModifier().find("first folder/second folder/second file3"); + QVERIFY(secondFile3Info.exists()); + const auto wrongSecondFolderInfo = fakeFolder.localModifier().find("first folder/second folder/second folder"); + QVERIFY(!wrongSecondFolderInfo.exists()); + + QVERIFY(fakeFolder.syncOnce()); + } + + void switchVfsOffWithOnDemandFolder() + { + FakeFolder fakeFolder{FileInfo{}}; + setupVfs(fakeFolder); + + ItemCompletedSpy completeSpy(fakeFolder); + + fakeFolder.remoteModifier().insert("firstFile1.txt"); + fakeFolder.remoteModifier().insert("firstFile2.txt"); + fakeFolder.remoteModifier().insert("firstFile3.txt"); + fakeFolder.remoteModifier().mkdir("directory"); + fakeFolder.remoteModifier().mkdir("directory/subdir"); + fakeFolder.remoteModifier().insert("directory/file1"); + fakeFolder.remoteModifier().insert("directory/file2"); + fakeFolder.remoteModifier().insert("directory/file3"); + fakeFolder.remoteModifier().insert("directory/subdir/fileTxt1.txt"); + fakeFolder.remoteModifier().insert("directory/subdir/fileTxt2.txt"); + fakeFolder.remoteModifier().insert("directory/subdir/fileTxt3.txt"); + + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(completeSpy.size(), 11); + QVERIFY(itemInstruction(completeSpy, "directory", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "firstFile1.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "firstFile2.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "firstFile3.txt", CSYNC_INSTRUCTION_NEW)); + completeSpy.clear(); + + SyncEngine::wipeVirtualFiles(fakeFolder.localPath(), fakeFolder.syncJournal(), *fakeFolder.syncEngine().syncOptions()._vfs); + + fakeFolder.syncEngine().syncOptions()._vfs->stop(); + fakeFolder.syncEngine().syncOptions()._vfs->unregisterFolder(); + + auto noVfsPlugin = QSharedPointer(createVfsFromPlugin(Vfs::Off).release()); + QObject::connect(&fakeFolder.syncEngine().syncFileStatusTracker(), &SyncFileStatusTracker::fileStatusChanged, + noVfsPlugin.data(), &Vfs::fileStatusChanged); + fakeFolder.switchToVfs(noVfsPlugin); + + ::setPinState(fakeFolder.localPath(), PinState::Unspecified, cfapi::NoRecurse); + + fakeFolder.syncJournal().setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, {}); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly); + QVERIFY(fakeFolder.syncOnce()); + + QCOMPARE(completeSpy.size(), 9); + QVERIFY(itemInstruction(completeSpy, "directory", CSYNC_INSTRUCTION_NONE)); + QVERIFY(itemInstruction(completeSpy, "firstFile1.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "firstFile2.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "firstFile3.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "directory/subdir", CSYNC_INSTRUCTION_NONE)); + QVERIFY(itemInstruction(completeSpy, "directory/file1", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "directory/file2", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "directory/file3", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "directory/subdir/fileTxt1.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "directory/subdir/fileTxt2.txt", CSYNC_INSTRUCTION_NEW)); + QVERIFY(itemInstruction(completeSpy, "directory/subdir/fileTxt3.txt", CSYNC_INSTRUCTION_NEW)); + completeSpy.clear(); + + fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::FilesystemOnly); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(completeSpy.size(), 0); + } }; QTEST_GUILESS_MAIN(TestSyncCfApi)