From a29320b18d01f80cb083760004f64554decaf218 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 18 Dec 2018 11:59:37 +0100 Subject: [PATCH] Discovery: Set right direction when restoring deleted discovery because it has modified files (Catched by a faillure of t1.pl) --- src/libsync/discovery.cpp | 1 + test/CMakeLists.txt | 1 + test/testsyncdelete.cpp | 47 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 test/testsyncdelete.cpp diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index db690ae8d..1a1f5fad7 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -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 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 031333721..bba9ed998 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -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 index 000000000..d167274d3 --- /dev/null +++ b/test/testsyncdelete.cpp @@ -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 +#include "syncenginetestutils.h" +#include + +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" -- 2.30.2