diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2018-11-05 15:27:08 +0300 |
---|---|---|
committer | Olivier Goffart <olivier@woboq.com> | 2018-11-08 13:22:03 +0300 |
commit | 1463f8a78f0f923eabde554854b5d6fbfdb4606d (patch) | |
tree | a52f8394c2e8ea7dce7c28f9ab0ce224e363b9ed /test | |
parent | 69251ed83e6892b6923af820b515ae9aa02a261d (diff) |
Test that the sync behave well if there are errors while reading the database
Diffstat (limited to 'test')
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/syncenginetestutils.h | 3 | ||||
-rw-r--r-- | test/testdatabaseerror.cpp | 80 |
3 files changed, 84 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1a26ace2e..ef9e019b9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -56,6 +56,7 @@ owncloud_add_test(LocalDiscovery "syncenginetestutils.h") owncloud_add_test(RemoteDiscovery "syncenginetestutils.h") owncloud_add_test(Permissions "syncenginetestutils.h") owncloud_add_test(SelectiveSync "syncenginetestutils.h") +owncloud_add_test(DatabaseError "syncenginetestutils.h") owncloud_add_test(LockedFiles "syncenginetestutils.h;../src/gui/lockwatcher.cpp") owncloud_add_test(FolderWatcher "${FolderWatcher_SRC}") diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h index fbd0a2158..ab2b2777d 100644 --- a/test/syncenginetestutils.h +++ b/test/syncenginetestutils.h @@ -12,6 +12,7 @@ #include "filesystem.h" #include "syncengine.h" #include "common/syncjournaldb.h" +#include "csync_exclude.h" #include <cstring> #include <QDir> @@ -1134,6 +1135,8 @@ public: _journalDb.reset(new OCC::SyncJournalDb(localPath() + "._sync_test.db")); _syncEngine.reset(new OCC::SyncEngine(_account, localPath(), "", _journalDb.get())); + // Ignore temporary files from the download. (This is in the default exclude list, but we don't load it) + _syncEngine->excludedFiles().addManualExclude("]*.~*"); // A new folder will update the local file state database on first sync. // To have a state matching what users will encounter, we have to a sync diff --git a/test/testdatabaseerror.cpp b/test/testdatabaseerror.cpp new file mode 100644 index 000000000..4c2ad5de2 --- /dev/null +++ b/test/testdatabaseerror.cpp @@ -0,0 +1,80 @@ +/* + * 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 <QtTest> +#include "syncenginetestutils.h" +#include <syncengine.h> + +using namespace OCC; + + +class TestDatabaseError : public QObject +{ + Q_OBJECT + +private slots: + void testDatabaseError() { + /* This test will make many iteration, at each iteration, the iᵗʰ database access will fail. + * The test ensure that if there is a failure, the next sync recovers. And if there was + * no error, then everything was sync'ed properly. + */ + + FileInfo finalState; + for (int count = 0; true; ++count) { + qInfo() << "Starting Iteration" << count; + + FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()}; + + // Do a couple of changes + fakeFolder.remoteModifier().insert("A/a0"); + fakeFolder.remoteModifier().appendByte("A/a1"); + fakeFolder.remoteModifier().remove("A/a2"); + fakeFolder.remoteModifier().rename("S/s1", "S/s1_renamed"); + fakeFolder.remoteModifier().mkdir("D"); + fakeFolder.remoteModifier().mkdir("D/subdir"); + fakeFolder.remoteModifier().insert("D/subdir/file"); + fakeFolder.localModifier().insert("B/b0"); + fakeFolder.localModifier().appendByte("B/b1"); + fakeFolder.remoteModifier().remove("B/b2"); + fakeFolder.localModifier().mkdir("NewDir"); + fakeFolder.localModifier().rename("C", "NewDir/C"); + + // Set the counter + fakeFolder.syncJournal().autotestFailCounter = count; + + // run the sync + bool result = fakeFolder.syncOnce(); + + qInfo() << "Result of iteration" << count << "was" << result; + + if (fakeFolder.syncJournal().autotestFailCounter >= 0) { + // No error was thrown, we are finished + QVERIFY(result); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + QCOMPARE(fakeFolder.currentRemoteState(), finalState); + return; + } + + if (!result) { + fakeFolder.syncJournal().autotestFailCounter = -1; + // Try again + QVERIFY(fakeFolder.syncOnce()); + } + + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + if (count == 0) { + finalState = fakeFolder.currentRemoteState(); + } else { + // the final state should be the same for every iteration + QCOMPARE(fakeFolder.currentRemoteState(), finalState); + } + } + } +}; + +QTEST_GUILESS_MAIN(TestDatabaseError) +#include "testdatabaseerror.moc" |