QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
}
- void testInvalidMtimeRecovery()
+ void testBlockInvalidMtimeSyncRemote()
{
+ constexpr auto INVALID_MODTIME1 = 0;
+ constexpr auto INVALID_MODTIME2 = -3600;
+
FakeFolder fakeFolder{FileInfo{}};
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
const QString fooFileRootFolder("foo");
QVERIFY(fakeFolder.syncOnce());
- fakeFolder.remoteModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.remoteModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.remoteModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.remoteModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.remoteModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.remoteModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.localModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.localModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.localModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.localModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.localModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(0));
- fakeFolder.localModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(0));
+ fakeFolder.remoteModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.remoteModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.remoteModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.remoteModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.remoteModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.remoteModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(!fakeFolder.syncOnce());
+
+ fakeFolder.remoteModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.remoteModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.remoteModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.remoteModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.remoteModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.remoteModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(!fakeFolder.syncOnce());
+ }
+
+ void testBlockInvalidMtimeSyncLocal()
+ {
+ constexpr auto INVALID_MODTIME1 = 0;
+ constexpr auto INVALID_MODTIME2 = -3600;
+
+ FakeFolder fakeFolder{FileInfo{}};
+
+ int nGET = 0;
+ fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &, QIODevice *) {
+ if (op == QNetworkAccessManager::GetOperation)
+ ++nGET;
+ return nullptr;
+ });
+
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+ const QString fooFileRootFolder("foo");
+ const QString barFileRootFolder("bar");
+ const QString blaFileRootFolder("bla");
+ const QString fooFileSubFolder("subfolder/foo");
+ const QString barFileSubFolder("subfolder/bar");
+ const QString blaFileSubFolder("subfolder/bla");
+
+ fakeFolder.remoteModifier().insert(fooFileRootFolder);
+ fakeFolder.remoteModifier().insert(barFileRootFolder);
+ fakeFolder.remoteModifier().insert(blaFileRootFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileSubFolder);
+ fakeFolder.remoteModifier().insert(barFileSubFolder);
+ fakeFolder.remoteModifier().insert(blaFileSubFolder);
QVERIFY(fakeFolder.syncOnce());
+ nGET = 0;
+
+ fakeFolder.localModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.localModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.localModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.localModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.localModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
+ fakeFolder.localModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME1));
QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(nGET, 0);
- auto expectedState = fakeFolder.currentLocalState();
- QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(nGET, 0);
- fakeFolder.remoteModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.remoteModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.remoteModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.remoteModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.remoteModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.remoteModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.localModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.localModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.localModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.localModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.localModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(-3600));
- fakeFolder.localModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(-3600));
+ fakeFolder.localModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.localModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.localModifier().setModTime(blaFileRootFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.localModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.localModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
+ fakeFolder.localModifier().setModTime(blaFileSubFolder, QDateTime::fromSecsSinceEpoch(INVALID_MODTIME2));
- QVERIFY(!fakeFolder.syncOnce());
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(nGET, 0);
+
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(nGET, 0);
+ }
+
+ void testDoNotSyncInvalidFutureMtime()
+ {
+ constexpr auto FUTURE_MTIME = 0xFFFFFFFF;
+ constexpr auto CURRENT_MTIME = 1646057277;
+
+ FakeFolder fakeFolder{FileInfo{}};
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ const QString fooFileRootFolder("foo");
+ const QString barFileRootFolder("bar");
+ const QString fooFileSubFolder("subfolder/foo");
+ const QString barFileSubFolder("subfolder/bar");
+ const QString fooFileAaaSubFolder("aaa/subfolder/foo");
+ const QString barFileAaaSubFolder("aaa/subfolder/bar");
+
+ fakeFolder.remoteModifier().insert(fooFileRootFolder);
+ fakeFolder.remoteModifier().insert(barFileRootFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileSubFolder);
+ fakeFolder.remoteModifier().insert(barFileSubFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa"));
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa/subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileAaaSubFolder);
+ fakeFolder.remoteModifier().insert(barFileAaaSubFolder);
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ fakeFolder.remoteModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.remoteModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.remoteModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.remoteModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.remoteModifier().setModTime(fooFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.remoteModifier().setModTime(barFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(barFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
QVERIFY(!fakeFolder.syncOnce());
+ }
+
+ void testInvalidFutureMtimeRecovery()
+ {
+ constexpr auto FUTURE_MTIME = 0xFFFFFFFF;
+ constexpr auto CURRENT_MTIME = 1646057277;
+
+ FakeFolder fakeFolder{FileInfo{}};
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
- expectedState = fakeFolder.currentLocalState();
+ const QString fooFileRootFolder("foo");
+ const QString barFileRootFolder("bar");
+ const QString fooFileSubFolder("subfolder/foo");
+ const QString barFileSubFolder("subfolder/bar");
+ const QString fooFileAaaSubFolder("aaa/subfolder/foo");
+ const QString barFileAaaSubFolder("aaa/subfolder/bar");
+
+ fakeFolder.remoteModifier().insert(fooFileRootFolder);
+ fakeFolder.remoteModifier().insert(barFileRootFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileSubFolder);
+ fakeFolder.remoteModifier().insert(barFileSubFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa"));
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa/subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileAaaSubFolder);
+ fakeFolder.remoteModifier().insert(barFileAaaSubFolder);
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ fakeFolder.remoteModifier().setModTimeKeepEtag(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(barFileRootFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(barFileSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(fooFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(barFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(barFileRootFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(barFileSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(barFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ auto expectedState = fakeFolder.currentLocalState();
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
}
};
QCOMPARE(fakeFolder.currentLocalState().find("A/hello" DVSUFFIX)->size, 222);
QCOMPARE(fakeFolder.currentLocalState().find("A/igno" DVSUFFIX)->size, 123);
}
+
+ void testUpdateMetadataErrorManagement()
+ {
+ FakeFolder fakeFolder{FileInfo{}};
+ setupVfs(fakeFolder);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ // Existing files are propagated just fine in both directions
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa"));
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa/subfolder"));
+ fakeFolder.remoteModifier().insert(QStringLiteral("aaa/subfolder/bar"));
+ QVERIFY(fakeFolder.syncOnce());
+
+ // New files on the remote create virtual files
+ fakeFolder.remoteModifier().setModTime(QStringLiteral("aaa/subfolder/bar"), QDateTime::fromSecsSinceEpoch(0));
+ QVERIFY(!fakeFolder.syncOnce());
+
+ QVERIFY(!fakeFolder.syncOnce());
+ }
+
+ void testInvalidFutureMtimeRecovery()
+ {
+ constexpr auto FUTURE_MTIME = 0xFFFFFFFF;
+ constexpr auto CURRENT_MTIME = 1646057277;
+
+ FakeFolder fakeFolder{FileInfo{}};
+ setupVfs(fakeFolder);
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ const QString fooFileRootFolder("foo");
+ const QString barFileRootFolder("bar");
+ const QString fooFileSubFolder("subfolder/foo");
+ const QString barFileSubFolder("subfolder/bar");
+ const QString fooFileAaaSubFolder("aaa/subfolder/foo");
+ const QString barFileAaaSubFolder("aaa/subfolder/bar");
+
+ fakeFolder.remoteModifier().insert(fooFileRootFolder);
+ fakeFolder.remoteModifier().insert(barFileRootFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileSubFolder);
+ fakeFolder.remoteModifier().insert(barFileSubFolder);
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa"));
+ fakeFolder.remoteModifier().mkdir(QStringLiteral("aaa/subfolder"));
+ fakeFolder.remoteModifier().insert(fooFileAaaSubFolder);
+ fakeFolder.remoteModifier().insert(barFileAaaSubFolder);
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ fakeFolder.remoteModifier().setModTimeKeepEtag(fooFileRootFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(barFileRootFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(fooFileSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(barFileSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(fooFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.remoteModifier().setModTimeKeepEtag(barFileAaaSubFolder, QDateTime::fromSecsSinceEpoch(CURRENT_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileRootFolder + DVSUFFIX, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(barFileRootFolder + DVSUFFIX, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileSubFolder + DVSUFFIX, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(barFileSubFolder + DVSUFFIX, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(fooFileAaaSubFolder + DVSUFFIX, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+ fakeFolder.localModifier().setModTime(barFileAaaSubFolder + DVSUFFIX, QDateTime::fromSecsSinceEpoch(FUTURE_MTIME));
+
+ QVERIFY(fakeFolder.syncOnce());
+
+ QVERIFY(fakeFolder.syncOnce());
+ }
};
QTEST_GUILESS_MAIN(TestSyncVirtualFiles)