Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/libsync/syncengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1261,7 +1261,7 @@ void SyncEngine::setLocalDiscoveryOptions(LocalDiscoveryStyle style, std::set<QS
// only execute if logging is enabled
auto debug = qDebug(lcEngine);
debug << "paths to discover locally";
for (auto path : _localDiscoveryPaths) {
for (const auto &path : _localDiscoveryPaths) {
debug << path;
}
}
Expand Down Expand Up @@ -1354,8 +1354,9 @@ void SyncEngine::wipeVirtualFiles(const QString &localPath, SyncJournalDb &journ
{
qCInfo(lcEngine) << "Wiping virtual files inside" << localPath;
const auto resGetFilesBelowPath = journal.getFilesBelowPath(QByteArray(), [&](const SyncJournalFileRecord &rec) {
if (rec._type != ItemTypeVirtualFile && rec._type != ItemTypeVirtualFileDownload)
if (rec._type != ItemTypeVirtualFile && rec._type != ItemTypeVirtualFileDownload && rec._type != ItemTypeVirtualDirectory) {
return;
}

qCDebug(lcEngine) << "Removing db record for" << rec.path();
if (!journal.deleteFileRecord(rec._path)) {
Expand Down
134 changes: 130 additions & 4 deletions test/testsynccfapi.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
Expand All @@ -7,14 +7,15 @@
* any purpose.
*/

#include <QtTest>
#include "syncenginetestutils.h"
#include "common/vfs.h"
#include "config.h"
#include <syncengine.h>

#include "common/vfs.h"
#include "openfilemanager.h"
#include "syncengine.h"
#include "vfs/cfapi/cfapiwrapper.h"

#include <QtTest>

namespace cfapi {
using namespace OCC::CfApiWrapper;
}
Expand Down Expand Up @@ -1582,6 +1583,131 @@
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<Vfs>(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)
Expand Down
Loading