QCOMPARE(nPOST, 0);
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}
+
+ void testRemoteMoveFailedInsufficientStorageLocalMoveRolledBack()
+ {
+ FakeFolder fakeFolder{FileInfo{}};
+
+ // create a big shared folder with some files
+ fakeFolder.remoteModifier().mkdir("big_shared_folder");
+ fakeFolder.remoteModifier().mkdir("big_shared_folder/shared_files");
+ fakeFolder.remoteModifier().insert("big_shared_folder/shared_files/big_shared_file_A.data", 1000);
+ fakeFolder.remoteModifier().insert("big_shared_folder/shared_files/big_shared_file_B.data", 1000);
+
+ // make sure big shared folder is synced
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_A.data"));
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_B.data"));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // try to move from a big shared folder to your own folder
+ fakeFolder.localModifier().mkdir("own_folder");
+ fakeFolder.localModifier().rename(
+ "big_shared_folder/shared_files/big_shared_file_A.data", "own_folder/big_shared_file_A.data");
+ fakeFolder.localModifier().rename(
+ "big_shared_folder/shared_files/big_shared_file_B.data", "own_folder/big_shared_file_B.data");
+
+ // emulate server MOVE 507 error
+ QObject parent;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request,
+ QIODevice *outgoingData) -> QNetworkReply * {
+ Q_UNUSED(outgoingData)
+
+ if (op == QNetworkAccessManager::CustomOperation
+ && request.attribute(QNetworkRequest::CustomVerbAttribute).toString() == QStringLiteral("MOVE")) {
+ return new FakeErrorReply(op, request, &parent, 507);
+ }
+ return nullptr;
+ });
+
+ // make sure the first sync failes and files get restored to original folder
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_A.data"));
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_B.data"));
+ QVERIFY(!fakeFolder.currentLocalState().find("own_folder/big_shared_file_A.data"));
+ QVERIFY(!fakeFolder.currentLocalState().find("own_folder/big_shared_file_B.data"));
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
+
+ void testRemoteMoveFailedForbiddenLocalMoveRolledBack()
+ {
+ FakeFolder fakeFolder{FileInfo{}};
+
+ // create a big shared folder with some files
+ fakeFolder.remoteModifier().mkdir("big_shared_folder");
+ fakeFolder.remoteModifier().mkdir("big_shared_folder/shared_files");
+ fakeFolder.remoteModifier().insert("big_shared_folder/shared_files/big_shared_file_A.data", 1000);
+ fakeFolder.remoteModifier().insert("big_shared_folder/shared_files/big_shared_file_B.data", 1000);
+
+ // make sure big shared folder is synced
+ QVERIFY(fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_A.data"));
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_B.data"));
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // try to move from a big shared folder to your own folder
+ fakeFolder.localModifier().mkdir("own_folder");
+ fakeFolder.localModifier().rename(
+ "big_shared_folder/shared_files/big_shared_file_A.data", "own_folder/big_shared_file_A.data");
+ fakeFolder.localModifier().rename(
+ "big_shared_folder/shared_files/big_shared_file_B.data", "own_folder/big_shared_file_B.data");
+
+ // emulate server MOVE 507 error
+ QObject parent;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request,
+ QIODevice *outgoingData) -> QNetworkReply * {
+ Q_UNUSED(outgoingData)
+
+ auto attributeCustomVerb = request.attribute(QNetworkRequest::CustomVerbAttribute).toString();
+
+ if (op == QNetworkAccessManager::CustomOperation
+ && request.attribute(QNetworkRequest::CustomVerbAttribute).toString() == QStringLiteral("MOVE")) {
+ return new FakeErrorReply(op, request, &parent, 403);
+ }
+ return nullptr;
+ });
+
+ // make sure the first sync failes and files get restored to original folder
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_A.data"));
+ QVERIFY(fakeFolder.currentLocalState().find("big_shared_folder/shared_files/big_shared_file_B.data"));
+ QVERIFY(!fakeFolder.currentLocalState().find("own_folder/big_shared_file_A.data"));
+ QVERIFY(!fakeFolder.currentLocalState().find("own_folder/big_shared_file_B.data"));
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ }
};
QTEST_GUILESS_MAIN(TestSyncEngine)
SyncFileStatus statusOf(const QString &relativePath) const {
QFileInfo file(_syncEngine.localPath(), relativePath);
+ auto locPath = _syncEngine.localPath();
// Start from the end to get the latest status
for (int i = size() - 1; i >= 0; --i) {
if (QFileInfo(at(i)[0].toString()) == file)
}
void renameError() {
+ // when rename has failed - the old file name must be restored
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
fakeFolder.serverErrorPaths().append("A/a1");
fakeFolder.localModifier().rename("A/a1", "A/a1m");
fakeFolder.execUntilFinished();
verifyThatPushMatchesPull(fakeFolder, statusSpy);
QCOMPARE(statusSpy.statusOf("A/a1m"), SyncFileStatus(SyncFileStatus::StatusError));
- QCOMPARE(statusSpy.statusOf("A/a1"), statusSpy.statusOf("A/a1notexist"));
+ QCOMPARE(statusSpy.statusOf("A/a1"), SyncFileStatus(SyncFileStatus::StatusUpToDate));
QCOMPARE(statusSpy.statusOf("A"), SyncFileStatus(SyncFileStatus::StatusWarning));
QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusWarning));
QCOMPARE(statusSpy.statusOf("B"), SyncFileStatus(SyncFileStatus::StatusUpToDate));
QCOMPARE(statusSpy.statusOf("B/b1m"), SyncFileStatus(SyncFileStatus::StatusUpToDate));
statusSpy.clear();
- QVERIFY(!fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.syncOnce());
verifyThatPushMatchesPull(fakeFolder, statusSpy);
statusSpy.clear();
- QVERIFY(!fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.syncOnce());
verifyThatPushMatchesPull(fakeFolder, statusSpy);
- QCOMPARE(statusSpy.statusOf("A/a1m"), SyncFileStatus(SyncFileStatus::StatusError));
+ QCOMPARE(statusSpy.statusOf("A/a1m"), SyncFileStatus(SyncFileStatus::StatusNone));
QCOMPARE(statusSpy.statusOf("A/a1"), statusSpy.statusOf("A/a1notexist"));
- QCOMPARE(statusSpy.statusOf("A"), SyncFileStatus(SyncFileStatus::StatusWarning));
- QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusWarning));
+ QCOMPARE(statusSpy.statusOf("A"), SyncFileStatus(SyncFileStatus::StatusNone));
+ QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusUpToDate));
QCOMPARE(statusSpy.statusOf("B"), SyncFileStatus(SyncFileStatus::StatusNone));
QCOMPARE(statusSpy.statusOf("B/b1m"), SyncFileStatus(SyncFileStatus::StatusNone));
statusSpy.clear();