|
|
@@ -386,6 +386,204 @@ private slots:
|
|
|
qDebug() << expectedState;
|
|
|
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
|
|
|
}
|
|
|
+
|
|
|
+ void testBlockInvalidMtimeSyncRemote()
|
|
|
+ {
|
|
|
+ constexpr auto INVALID_MODTIME1 = 0;
|
|
|
+ constexpr auto INVALID_MODTIME2 = -3600;
|
|
|
+
|
|
|
+ FakeFolder fakeFolder{FileInfo{}};
|
|
|
+ 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());
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+ QVERIFY(fakeFolder.syncOnce());
|
|
|
+ QCOMPARE(nGET, 0);
|
|
|
+
|
|
|
+ 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());
|
|
|
+ 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());
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
QTEST_GUILESS_MAIN(TestLocalDiscovery)
|