|
|
@@ -383,7 +383,7 @@ private slots:
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/a4m", CSYNC_INSTRUCTION_NEW));
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/a4" DVSUFFIX, CSYNC_INSTRUCTION_REMOVE));
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/a5", CSYNC_INSTRUCTION_CONFLICT));
|
|
|
- QVERIFY(itemInstruction(completeSpy, "A/a5" DVSUFFIX, CSYNC_INSTRUCTION_NONE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/a5" DVSUFFIX, CSYNC_INSTRUCTION_REMOVE));
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/a6", CSYNC_INSTRUCTION_CONFLICT));
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/a7", CSYNC_INSTRUCTION_SYNC));
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/b1", CSYNC_INSTRUCTION_SYNC));
|
|
|
@@ -977,8 +977,9 @@ private slots:
|
|
|
QVERIFY(fakeFolder.currentLocalState().find("unspec/file1" DVSUFFIX));
|
|
|
}
|
|
|
|
|
|
- // Check what happens if vfs-suffixed files exist on the server or in the db
|
|
|
- void testSuffixOnServerOrDb()
|
|
|
+ // Check what happens if vfs-suffixed files exist on the server or locally
|
|
|
+ // while the file is hydrated
|
|
|
+ void testSuffixFilesWhileLocalHydrated()
|
|
|
{
|
|
|
FakeFolder fakeFolder{ FileInfo() };
|
|
|
|
|
|
@@ -988,9 +989,22 @@ private slots:
|
|
|
};
|
|
|
cleanup();
|
|
|
|
|
|
- // file1.nextcloud is happily synced with Vfs::Off
|
|
|
+ // suffixed files are happily synced with Vfs::Off
|
|
|
fakeFolder.remoteModifier().mkdir("A");
|
|
|
- fakeFolder.remoteModifier().insert("A/file1" DVSUFFIX);
|
|
|
+ fakeFolder.remoteModifier().insert("A/test1" DVSUFFIX, 10, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/test2" DVSUFFIX, 20, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file1" DVSUFFIX, 30, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file2", 40, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file2" DVSUFFIX, 50, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file3", 60, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file3" DVSUFFIX, 70, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file3" DVSUFFIX DVSUFFIX, 80, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/remote1" DVSUFFIX, 30, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/remote2", 40, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/remote2" DVSUFFIX, 50, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/remote3", 60, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/remote3" DVSUFFIX, 70, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/remote3" DVSUFFIX DVSUFFIX, 80, 'A');
|
|
|
QVERIFY(fakeFolder.syncOnce());
|
|
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
|
|
cleanup();
|
|
|
@@ -998,26 +1012,148 @@ private slots:
|
|
|
// Enable suffix vfs
|
|
|
setupVfs(fakeFolder);
|
|
|
|
|
|
+ // A simple sync removes the files that are now ignored (?)
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file1" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file2" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ cleanup();
|
|
|
+
|
|
|
+ // Add a real file where the suffixed file exists
|
|
|
+ fakeFolder.localModifier().insert("A/test1", 11, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/test2", 21, 'A');
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/test1", CSYNC_INSTRUCTION_NEW));
|
|
|
+ // this isn't fully good since some code requires size == 1 for placeholders
|
|
|
+ // (when renaming placeholder to real file). But the alternative would mean
|
|
|
+ // special casing this to allow CONFLICT at virtual file creation level. Ew.
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/test2" DVSUFFIX, CSYNC_INSTRUCTION_UPDATE_METADATA));
|
|
|
+ cleanup();
|
|
|
+
|
|
|
// Local changes of suffixed file do nothing
|
|
|
- fakeFolder.localModifier().appendByte("A/file1" DVSUFFIX);
|
|
|
+ fakeFolder.localModifier().setContents("A/file1" DVSUFFIX, 'B');
|
|
|
+ fakeFolder.localModifier().setContents("A/file2" DVSUFFIX, 'B');
|
|
|
+ fakeFolder.localModifier().setContents("A/file3" DVSUFFIX, 'B');
|
|
|
+ fakeFolder.localModifier().setContents("A/file3" DVSUFFIX DVSUFFIX, 'B');
|
|
|
QVERIFY(fakeFolder.syncOnce());
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/file1" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file2" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
cleanup();
|
|
|
|
|
|
- // Remote don't do anything either
|
|
|
- fakeFolder.remoteModifier().appendByte("A/file1" DVSUFFIX);
|
|
|
+ // Remote changes don't do anything either
|
|
|
+ fakeFolder.remoteModifier().setContents("A/file1" DVSUFFIX, 'C');
|
|
|
+ fakeFolder.remoteModifier().setContents("A/file2" DVSUFFIX, 'C');
|
|
|
+ fakeFolder.remoteModifier().setContents("A/file3" DVSUFFIX, 'C');
|
|
|
+ fakeFolder.remoteModifier().setContents("A/file3" DVSUFFIX DVSUFFIX, 'C');
|
|
|
QVERIFY(fakeFolder.syncOnce());
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/file1" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file2" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
cleanup();
|
|
|
|
|
|
- // New files with a suffix aren't propagated downwards in the first place
|
|
|
- fakeFolder.remoteModifier().insert("A/file2" DVSUFFIX);
|
|
|
+ // Local removal: when not querying server
|
|
|
+ fakeFolder.localModifier().remove("A/file1" DVSUFFIX);
|
|
|
+ fakeFolder.localModifier().remove("A/file2" DVSUFFIX);
|
|
|
+ fakeFolder.localModifier().remove("A/file3" DVSUFFIX);
|
|
|
+ fakeFolder.localModifier().remove("A/file3" DVSUFFIX DVSUFFIX);
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(findItem(completeSpy, "A/file1" DVSUFFIX)->isEmpty());
|
|
|
+ QVERIFY(findItem(completeSpy, "A/file2" DVSUFFIX)->isEmpty());
|
|
|
+ QVERIFY(findItem(completeSpy, "A/file3" DVSUFFIX)->isEmpty());
|
|
|
+ QVERIFY(findItem(completeSpy, "A/file3" DVSUFFIX DVSUFFIX)->isEmpty());
|
|
|
+ cleanup();
|
|
|
+
|
|
|
+ // Local removal: when querying server
|
|
|
+ fakeFolder.remoteModifier().setContents("A/file1" DVSUFFIX, 'D');
|
|
|
QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file1" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
QVERIFY(itemInstruction(completeSpy, "A/file2" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
- QVERIFY(fakeFolder.currentRemoteState().find("A/file2" DVSUFFIX));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ cleanup();
|
|
|
+
|
|
|
+ // Remote removal
|
|
|
+ fakeFolder.remoteModifier().remove("A/remote1" DVSUFFIX);
|
|
|
+ fakeFolder.remoteModifier().remove("A/remote2" DVSUFFIX);
|
|
|
+ fakeFolder.remoteModifier().remove("A/remote3" DVSUFFIX);
|
|
|
+ fakeFolder.remoteModifier().remove("A/remote3" DVSUFFIX DVSUFFIX);
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/remote1" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/remote2" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/remote3" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/remote3" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ cleanup();
|
|
|
+
|
|
|
+ // New files with a suffix aren't propagated downwards in the first place
|
|
|
+ fakeFolder.remoteModifier().insert("A/new1" DVSUFFIX);
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/new1" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(fakeFolder.currentRemoteState().find("A/new1" DVSUFFIX));
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/new1"));
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/new1" DVSUFFIX));
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/new1" DVSUFFIX DVSUFFIX));
|
|
|
+ cleanup();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check what happens if vfs-suffixed files exist on the server or in the db
|
|
|
+ void testExtraFilesLocalDehydrated()
|
|
|
+ {
|
|
|
+ FakeFolder fakeFolder{ FileInfo() };
|
|
|
+ setupVfs(fakeFolder);
|
|
|
+
|
|
|
+ QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
|
|
|
+ auto cleanup = [&]() {
|
|
|
+ completeSpy.clear();
|
|
|
+ };
|
|
|
+ cleanup();
|
|
|
+
|
|
|
+ // create a bunch of local virtual files, in some instances
|
|
|
+ // ignore remote files
|
|
|
+ fakeFolder.remoteModifier().mkdir("A");
|
|
|
+ fakeFolder.remoteModifier().insert("A/file1", 30, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file2", 40, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file3", 60, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file3" DVSUFFIX, 70, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file4", 80, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file4" DVSUFFIX, 90, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file4" DVSUFFIX DVSUFFIX, 100, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file5", 110, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file6", 120, 'A');
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/file1"));
|
|
|
+ QVERIFY(fakeFolder.currentLocalState().find("A/file1" DVSUFFIX));
|
|
|
QVERIFY(!fakeFolder.currentLocalState().find("A/file2"));
|
|
|
- QVERIFY(!fakeFolder.currentLocalState().find("A/file2" DVSUFFIX));
|
|
|
- QVERIFY(!fakeFolder.currentLocalState().find("A/file2" DVSUFFIX DVSUFFIX));
|
|
|
+ QVERIFY(fakeFolder.currentLocalState().find("A/file2" DVSUFFIX));
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/file3"));
|
|
|
+ QVERIFY(fakeFolder.currentLocalState().find("A/file3" DVSUFFIX));
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/file4"));
|
|
|
+ QVERIFY(fakeFolder.currentLocalState().find("A/file4" DVSUFFIX));
|
|
|
+ QVERIFY(!fakeFolder.currentLocalState().find("A/file4" DVSUFFIX DVSUFFIX));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file1" DVSUFFIX, CSYNC_INSTRUCTION_NEW));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file2" DVSUFFIX, CSYNC_INSTRUCTION_NEW));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file3" DVSUFFIX, CSYNC_INSTRUCTION_NEW));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file4" DVSUFFIX, CSYNC_INSTRUCTION_NEW));
|
|
|
+ // technically file3.owncloud and file4.owncloud are also ignored
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file4" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ cleanup();
|
|
|
+
|
|
|
+ // Create odd extra files locally and remotely
|
|
|
+ fakeFolder.localModifier().insert("A/file1", 10, 'A');
|
|
|
+ fakeFolder.localModifier().insert("A/file2" DVSUFFIX DVSUFFIX, 10, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file5" DVSUFFIX, 10, 'A');
|
|
|
+ fakeFolder.localModifier().insert("A/file6", 10, 'A');
|
|
|
+ fakeFolder.remoteModifier().insert("A/file6" DVSUFFIX, 10, 'A');
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file1", CSYNC_INSTRUCTION_CONFLICT));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file1" DVSUFFIX, CSYNC_INSTRUCTION_REMOVE)); // it's now a pointless real virtual file
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file2" DVSUFFIX DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file5" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file6", CSYNC_INSTRUCTION_CONFLICT));
|
|
|
+ QVERIFY(itemInstruction(completeSpy, "A/file6" DVSUFFIX, CSYNC_INSTRUCTION_IGNORE));
|
|
|
cleanup();
|
|
|
}
|
|
|
|