/* * 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 TestSelectiveSync : public QObject { Q_OBJECT private slots: void initTestCase() { Logger::instance()->setLogFlush(true); Logger::instance()->setLogDebug(true); QStandardPaths::setTestModeEnabled(true); } void testSelectiveSyncBigFolders() { FakeFolder fakeFolder { FileInfo::A12_B12_C12_S12() }; SyncOptions options; options._newBigFolderSizeLimit = 20000; // 20 K fakeFolder.syncEngine().setSyncOptions(options); QStringList sizeRequests; fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation, const QNetworkRequest &req, QIODevice *device) -> QNetworkReply * { // Record what path we are querying for the size if (req.attribute(QNetworkRequest::CustomVerbAttribute).toString() == "PROPFIND") { if (device->readAll().contains("extraDavProperties = "20020"; fakeFolder.remoteModifier().find("A/newBigDir/subDir")->extraDavProperties = "20020"; fakeFolder.remoteModifier().find("B/newSmallDir")->extraDavProperties = "10"; fakeFolder.remoteModifier().find("B/newSmallDir/subDir")->extraDavProperties = "10"; QVERIFY(fakeFolder.syncOnce()); QCOMPARE(newBigFolder.count(), 1); QCOMPARE(newBigFolder.first()[0].toString(), QString("A/newBigDir")); QCOMPARE(newBigFolder.first()[1].toBool(), false); newBigFolder.clear(); QCOMPARE(sizeRequests.count(), 2); // "A/newBigDir" and "B/newSmallDir"; QCOMPARE(sizeRequests.filter("/subDir").count(), 0); // at no point we should request the size of the subdirs sizeRequests.clear(); auto oldSync = fakeFolder.currentLocalState(); // syncing again should do the same fakeFolder.syncEngine().journal()->schedulePathForRemoteDiscovery(QString("A/newBigDir")); QVERIFY(fakeFolder.syncOnce()); QCOMPARE(fakeFolder.currentLocalState(), oldSync); QCOMPARE(newBigFolder.count(), 1); // (since we don't have a real Folder, the files were not added to any list) newBigFolder.clear(); QCOMPARE(sizeRequests.count(), 1); // "A/newBigDir"; sizeRequests.clear(); // Simulate that we accept all files by setting a wildcard white list fakeFolder.syncEngine().journal()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList() << QLatin1String("/")); fakeFolder.syncEngine().journal()->schedulePathForRemoteDiscovery(QString("A/newBigDir")); QVERIFY(fakeFolder.syncOnce()); QCOMPARE(newBigFolder.count(), 0); QCOMPARE(sizeRequests.count(), 0); QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); } void testRestoreSubFolderForDataFingerPrint() { const auto mkcolVerb = QByteArray{"MKCOL"}; FakeFolder fakeFolder{{}}; fakeFolder.localModifier().mkdir("topFolder"); fakeFolder.localModifier().mkdir("topFolder/subFolder"); fakeFolder.localModifier().insert("topFolder/subFolder/a"); fakeFolder.remoteModifier().extraDavProperties = "initial_finger_print"; QVERIFY(fakeFolder.syncOnce()); auto mkdirRequestsCounter = 0; fakeFolder.setServerOverride([&mkdirRequestsCounter, mkcolVerb](QNetworkAccessManager::Operation, const QNetworkRequest &req, QIODevice *device) -> QNetworkReply * { Q_UNUSED(device) if (req.attribute(QNetworkRequest::CustomVerbAttribute) == mkcolVerb) { ++mkdirRequestsCounter; } qDebug() << req.attribute(QNetworkRequest::CustomVerbAttribute); return nullptr; }); fakeFolder.syncEngine().journal()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, QStringList() << QLatin1String("topFolder")); fakeFolder.remoteModifier().extraDavProperties = "changed_finger_print"; QVERIFY(fakeFolder.syncOnce()); QCOMPARE(mkdirRequestsCounter, 0); } }; QTEST_GUILESS_MAIN(TestSelectiveSync) #include "testselectivesync.moc"