Discovery: Set right direction when restoring deleted discovery because it has modifi...
authorOlivier Goffart <ogoffart@woboq.com>
Tue, 18 Dec 2018 10:59:37 +0000 (11:59 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:29 +0000 (10:58 +0100)
(Catched by a faillure of t1.pl)

src/libsync/discovery.cpp
test/CMakeLists.txt
test/testsyncdelete.cpp [new file with mode: 0644]

index db690ae8d77e977580fe1698c8ddf99432ccec15..1a1f5fad7d2f64953272c8c94a2ece5e05b59be6 100644 (file)
@@ -1140,6 +1140,7 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs)
             if (_childModified && _dirItem->_instruction == CSYNC_INSTRUCTION_REMOVE) {
                 // re-create directory that has modified contents
                 _dirItem->_instruction = CSYNC_INSTRUCTION_NEW;
+                _dirItem->_direction = _dirItem->_direction == SyncFileItem::Up ? SyncFileItem::Down : SyncFileItem::Up;
             }
             if (_childModified && _dirItem->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE && !_dirItem->isDirectory()) {
                 // Replacing a directory by a file is a conflict, if the directory had modified children
index 031333721c0f00d26c7f77f6594686bd14bf84fa..bba9ed9983dced89d0fc3dccafc5563588a77a10 100644 (file)
@@ -47,6 +47,7 @@ nextcloud_add_test(Utility "")
 nextcloud_add_test(SyncEngine "syncenginetestutils.h")
 nextcloud_add_test(SyncVirtualFiles "syncenginetestutils.h")
 nextcloud_add_test(SyncMove "syncenginetestutils.h")
+nextcloud_add_test(SyncDelete "syncenginetestutils.h")
 nextcloud_add_test(SyncConflict "syncenginetestutils.h")
 nextcloud_add_test(SyncFileStatusTracker "syncenginetestutils.h")
 nextcloud_add_test(Download "syncenginetestutils.h")
diff --git a/test/testsyncdelete.cpp b/test/testsyncdelete.cpp
new file mode 100644 (file)
index 0000000..d167274
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ *    This software is in the public domain, furnished "as is", without technical
+ *    support, and with no warranty, express or implied, as to its usefulness for
+ *    any purpose.
+ *
+ */
+
+#include <QtTest>
+#include "syncenginetestutils.h"
+#include <syncengine.h>
+
+using namespace OCC;
+
+class TestSyncDelete : public QObject
+{
+    Q_OBJECT
+
+private slots:
+
+    void testDeleteDirectoryWithNewFile()
+    {
+        FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
+
+        // Remove a directory on the server with new files on the client
+        fakeFolder.remoteModifier().remove("A");
+        fakeFolder.localModifier().insert("A/hello.txt");
+
+        // Symetry
+        fakeFolder.localModifier().remove("B");
+        fakeFolder.remoteModifier().insert("B/hello.txt");
+
+        QVERIFY(fakeFolder.syncOnce());
+
+        // A/a1 must be gone because the directory was removed on the server, but hello.txt must be there
+        QVERIFY(!fakeFolder.currentRemoteState().find("A/a1"));
+        QVERIFY(fakeFolder.currentRemoteState().find("A/hello.txt"));
+
+        // Symetry
+        QVERIFY(!fakeFolder.currentRemoteState().find("B/b1"));
+        QVERIFY(fakeFolder.currentRemoteState().find("B/hello.txt"));
+
+        QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+    }
+};
+
+QTEST_GUILESS_MAIN(TestSyncDelete)
+#include "testsyncdelete.moc"