Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2018-11-05 15:27:08 +0300
committerOlivier Goffart <olivier@woboq.com>2018-11-08 13:22:03 +0300
commit1463f8a78f0f923eabde554854b5d6fbfdb4606d (patch)
treea52f8394c2e8ea7dce7c28f9ab0ce224e363b9ed /test
parent69251ed83e6892b6923af820b515ae9aa02a261d (diff)
Test that the sync behave well if there are errors while reading the database
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt1
-rw-r--r--test/syncenginetestutils.h3
-rw-r--r--test/testdatabaseerror.cpp80
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"