Skip to content

Commit 92bc817

Browse files
fix(gh-9345): enhance E2E folder restoration tests and improve blacklist handling
Signed-off-by: Kevin Andrews <kevin@nforced.uk>
1 parent 2ed7668 commit 92bc817

3 files changed

Lines changed: 95 additions & 208 deletions

File tree

test/teste2eefoldermanager.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -250,14 +250,10 @@ private slots:
250250

251251
void testScenario1_FoldersRestoreAfterRestart()
252252
{
253-
// Verify E2E folders marked for restoration are processed when E2E initializes
254-
QTemporaryDir dir;
255-
ConfigFile::setConfDir(dir.path());
256-
257-
auto account = Account::create();
258-
account->setCredentials(new FakeCredentials{new FakeQNAM({})});
259-
account->setUrl(QUrl("http://example.com"));
260-
253+
// Set up FakeFolder for a realistic sync environment
254+
FakeFolder fakeFolder{FileInfo{}};
255+
auto account = fakeFolder.account();
256+
261257
const QVariantMap capabilities {
262258
{QStringLiteral("end-to-end-encryption"), QVariantMap {
263259
{QStringLiteral("enabled"), true},
@@ -266,16 +262,15 @@ private slots:
266262
};
267263
account->setCapabilities(capabilities);
268264

265+
// Add the FakeFolder's account to the AccountManager to be tracked
269266
auto accountState = new AccountState(account);
270267
accountState->setParent(this);
271268
AccountManager::instance()->addAccount(account);
272269

273270
// Simulate folders blacklisted during startup (before E2E initialized)
274-
// This mimics what happens when client restarts and E2E isn't ready yet
275-
QTemporaryDir syncDir;
276-
QString dbPath = syncDir.path() + "/.sync_test.db";
277-
SyncJournalDb db(dbPath);
278-
271+
// Access via the real Journal DB wrapper
272+
auto &db = fakeFolder.syncJournal();
273+
279274
QStringList e2eFoldersToRestore = {"/encrypted1/", "/encrypted2/"};
280275
db.setSelectiveSyncList(
281276
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
@@ -297,9 +292,8 @@ private slots:
297292
void testScenario5_MultipleFoldersTrackedForRestoration()
298293
{
299294
// Verify multiple E2E folders can be tracked and restored
300-
QTemporaryDir dir;
301-
QString dbPath = dir.path() + "/.sync_test.db";
302-
SyncJournalDb db(dbPath);
295+
FakeFolder fakeFolder{FileInfo{}};
296+
auto &db = fakeFolder.syncJournal();
303297

304298
// Simulate multiple E2E folders being blacklisted during startup
305299
QStringList multipleFolders = {
@@ -338,9 +332,8 @@ private slots:
338332
void testScenario6_UserBlacklistPreserved()
339333
{
340334
// Verify user-blacklisted folders are NOT added to restoration list
341-
QTemporaryDir dir;
342-
QString dbPath = dir.path() + "/.sync_test.db";
343-
SyncJournalDb db(dbPath);
335+
FakeFolder fakeFolder{FileInfo{}};
336+
auto &db = fakeFolder.syncJournal();
344337

345338
// User manually blacklists an E2E folder via selective sync
346339
QStringList userBlacklist = {"/User/Excluded/"};

test/testfolderman.cpp

Lines changed: 0 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -553,195 +553,6 @@ private slots:
553553
verifyFolderSyncChangesOnReceivedFileIdNotification(user2, {50}, {"2"});
554554
verifyFolderSyncChangesOnReceivedFileIdNotification(user2, {10, 11, 17, 18, 404}, {});
555555
}
556-
557-
void testE2EFolderBlacklistRestoration()
558-
{
559-
// Test that E2E folders can be tracked in the database for restoration
560-
// This test verifies the database operations work without requiring full FolderMan setup
561-
QTemporaryDir dir;
562-
QString dbPath = dir.path() + "/.sync_test.db";
563-
564-
// Create a database directly
565-
SyncJournalDb db(dbPath);
566-
567-
// Simulate E2E folders being blacklisted during initialization
568-
QStringList e2eFoldersToRestore = {"/encrypted1/", "/encrypted2/"};
569-
QStringList blacklist = {"/regular_blacklisted/", "/encrypted1/", "/encrypted2/"};
570-
571-
db.setSelectiveSyncList(
572-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
573-
e2eFoldersToRestore);
574-
db.setSelectiveSyncList(
575-
SyncJournalDb::SelectiveSyncBlackList,
576-
blacklist);
577-
578-
// Verify restoration list is set
579-
bool ok = false;
580-
auto restorationList = db.getSelectiveSyncList(
581-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
582-
QVERIFY(ok);
583-
QCOMPARE(restorationList.size(), 2);
584-
QVERIFY(restorationList.contains("/encrypted1/"));
585-
QVERIFY(restorationList.contains("/encrypted2/"));
586-
587-
// Verify blacklist includes E2E folders
588-
auto currentBlacklist = db.getSelectiveSyncList(
589-
SyncJournalDb::SelectiveSyncBlackList, &ok);
590-
QVERIFY(ok);
591-
QCOMPARE(currentBlacklist.size(), 3);
592-
QVERIFY(currentBlacklist.contains("/encrypted1/"));
593-
QVERIFY(currentBlacklist.contains("/encrypted2/"));
594-
QVERIFY(currentBlacklist.contains("/regular_blacklisted/"));
595-
}
596-
597-
void testE2EFolderNotTrackedIfUserBlacklisted()
598-
{
599-
// Test that manually blacklisted E2E folders are not tracked for restoration
600-
// This is a simplified database test
601-
QTemporaryDir dir;
602-
QString dbPath = dir.path() + "/.sync_test.db";
603-
604-
// Create a database directly
605-
SyncJournalDb db(dbPath);
606-
607-
// User manually blacklisted an E2E folder
608-
QStringList userBlacklist = {"/user_blacklisted_e2e/"};
609-
db.setSelectiveSyncList(
610-
SyncJournalDb::SelectiveSyncBlackList,
611-
userBlacklist);
612-
613-
// Verify it's blacklisted
614-
bool ok = false;
615-
auto blacklist = db.getSelectiveSyncList(
616-
SyncJournalDb::SelectiveSyncBlackList, &ok);
617-
QVERIFY(ok);
618-
QCOMPARE(blacklist.size(), 1);
619-
620-
// Verify it's NOT in restoration list (user choice should be preserved)
621-
auto restorationList = db.getSelectiveSyncList(
622-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
623-
QVERIFY(ok);
624-
QVERIFY(restorationList.isEmpty());
625-
}
626-
627-
void testE2ERestorationClearsTrackingList()
628-
{
629-
// Test that restoration tracking list can be cleared
630-
// This is a simplified database test
631-
632-
QTemporaryDir dir;
633-
QString dbPath = dir.path() + "/.sync_test.db";
634-
635-
// Create a database directly
636-
SyncJournalDb db(dbPath);
637-
638-
// Set up E2E folders for restoration
639-
QStringList e2eFoldersToRestore = {"/encrypted/"};
640-
db.setSelectiveSyncList(
641-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
642-
e2eFoldersToRestore);
643-
db.setSelectiveSyncList(
644-
SyncJournalDb::SelectiveSyncBlackList,
645-
e2eFoldersToRestore);
646-
647-
// Verify restoration list exists
648-
bool ok = false;
649-
auto restorationList = db.getSelectiveSyncList(
650-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
651-
QVERIFY(ok);
652-
QCOMPARE(restorationList.size(), 1);
653-
654-
// Clear the restoration list (simulating what happens after restoration)
655-
db.setSelectiveSyncList(
656-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
657-
{});
658-
659-
// Verify it's cleared
660-
restorationList = db.getSelectiveSyncList(
661-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
662-
QVERIFY(ok);
663-
QVERIFY(restorationList.isEmpty());
664-
}
665-
666-
void testScenario1_RestartSimulation()
667-
{
668-
QTemporaryDir dir;
669-
QString dbPath = dir.path() + "/.sync_test.db";
670-
SyncJournalDb db(dbPath);
671-
672-
// Phase 1: Simulate client startup BEFORE E2E is initialized
673-
// E2E folders get temporarily blacklisted
674-
QStringList e2eFolders = {"/encrypted-folder/"};
675-
QStringList blacklist = {"/encrypted-folder/"};
676-
677-
db.setSelectiveSyncList(
678-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
679-
e2eFolders);
680-
db.setSelectiveSyncList(
681-
SyncJournalDb::SelectiveSyncBlackList,
682-
blacklist);
683-
684-
// Verify folders are tracked for restoration
685-
bool ok = false;
686-
auto restorationList = db.getSelectiveSyncList(
687-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
688-
QVERIFY(ok);
689-
QCOMPARE(restorationList.size(), 1);
690-
QVERIFY(restorationList.contains("/encrypted-folder/"));
691-
692-
// Phase 2: E2E initialization completes
693-
// FolderMan::restoreFoldersWhenE2EInitialized() would be called
694-
// It should remove folders from blacklist and clear tracking list
695-
696-
// Simulate restoration: remove from blacklist
697-
db.setSelectiveSyncList(
698-
SyncJournalDb::SelectiveSyncBlackList,
699-
{});
700-
701-
// Clear tracking list
702-
db.setSelectiveSyncList(
703-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
704-
{});
705-
706-
// Phase 3: Verify restoration complete
707-
auto finalBlacklist = db.getSelectiveSyncList(
708-
SyncJournalDb::SelectiveSyncBlackList, &ok);
709-
QVERIFY(ok);
710-
QVERIFY(finalBlacklist.isEmpty());
711-
712-
auto finalRestorationList = db.getSelectiveSyncList(
713-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
714-
QVERIFY(ok);
715-
QVERIFY(finalRestorationList.isEmpty());
716-
717-
// Success: Folder is no longer blacklisted and tracking is cleared
718-
// This is what allows E2E folders to survive restart
719-
}
720-
721-
void testScenario4_FreshSetupNoBlacklist()
722-
{
723-
QTemporaryDir dir;
724-
QString dbPath = dir.path() + "/.sync_test.db";
725-
SyncJournalDb db(dbPath);
726-
727-
// On fresh account setup with E2E already initialized,
728-
// folders should NOT be added to blacklist or restoration list
729-
730-
// Verify restoration list is empty (no folders were blacklisted)
731-
bool ok = false;
732-
auto restorationList = db.getSelectiveSyncList(
733-
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
734-
QVERIFY(ok);
735-
QVERIFY(restorationList.isEmpty());
736-
737-
// Verify blacklist is empty
738-
auto blacklist = db.getSelectiveSyncList(
739-
SyncJournalDb::SelectiveSyncBlackList, &ok);
740-
QVERIFY(ok);
741-
QVERIFY(blacklist.isEmpty());
742-
743-
// This ensures fresh setups work correctly without temporary blacklisting
744-
}
745556
};
746557

747558
QTEST_GUILESS_MAIN(TestFolderMan)

test/testsyncjournaldb.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,89 @@ private slots:
577577
}
578578
}
579579

580+
void testE2EFolderBlacklistRestoration()
581+
{
582+
_db.setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, QStringList());
583+
_db.setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, QStringList());
584+
585+
QStringList e2eFoldersToRestore = {"/encrypted1/", "/encrypted2/"};
586+
QStringList blacklist = {"/regular_blacklisted/", "/encrypted1/", "/encrypted2/"};
587+
588+
_db.setSelectiveSyncList(
589+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
590+
e2eFoldersToRestore);
591+
_db.setSelectiveSyncList(
592+
SyncJournalDb::SelectiveSyncBlackList,
593+
blacklist);
594+
595+
bool ok = false;
596+
auto restorationList = _db.getSelectiveSyncList(
597+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
598+
QVERIFY(ok);
599+
QCOMPARE(restorationList.size(), 2);
600+
QVERIFY(restorationList.contains("/encrypted1/"));
601+
QVERIFY(restorationList.contains("/encrypted2/"));
602+
603+
auto currentBlacklist = _db.getSelectiveSyncList(
604+
SyncJournalDb::SelectiveSyncBlackList, &ok);
605+
QVERIFY(ok);
606+
QCOMPARE(currentBlacklist.size(), 3);
607+
QVERIFY(currentBlacklist.contains("/encrypted1/"));
608+
QVERIFY(currentBlacklist.contains("/encrypted2/"));
609+
QVERIFY(currentBlacklist.contains("/regular_blacklisted/"));
610+
}
611+
612+
void testE2EFolderNotTrackedIfUserBlacklisted()
613+
{
614+
_db.setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, QStringList());
615+
_db.setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, QStringList());
616+
617+
QStringList userBlacklist = {"/user_blacklisted_e2e/"};
618+
_db.setSelectiveSyncList(
619+
SyncJournalDb::SelectiveSyncBlackList,
620+
userBlacklist);
621+
622+
bool ok = false;
623+
auto blacklist = _db.getSelectiveSyncList(
624+
SyncJournalDb::SelectiveSyncBlackList, &ok);
625+
QVERIFY(ok);
626+
QCOMPARE(blacklist.size(), 1);
627+
628+
auto restorationList = _db.getSelectiveSyncList(
629+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
630+
QVERIFY(ok);
631+
QVERIFY(restorationList.isEmpty());
632+
}
633+
634+
void testE2ERestorationClearsTrackingList()
635+
{
636+
_db.setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, QStringList());
637+
_db.setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, QStringList());
638+
639+
QStringList e2eFoldersToRestore = {"/encrypted/"};
640+
_db.setSelectiveSyncList(
641+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
642+
e2eFoldersToRestore);
643+
_db.setSelectiveSyncList(
644+
SyncJournalDb::SelectiveSyncBlackList,
645+
e2eFoldersToRestore);
646+
647+
bool ok = false;
648+
auto restorationList = _db.getSelectiveSyncList(
649+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
650+
QVERIFY(ok);
651+
QCOMPARE(restorationList.size(), 1);
652+
653+
_db.setSelectiveSyncList(
654+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
655+
{});
656+
657+
restorationList = _db.getSelectiveSyncList(
658+
SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
659+
QVERIFY(ok);
660+
QVERIFY(restorationList.isEmpty());
661+
}
662+
580663
private:
581664
SyncJournalDb _db;
582665
};

0 commit comments

Comments
 (0)