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
diff options
context:
space:
mode:
authorChristian Kamm <mail@ckamm.de>2017-09-15 14:30:29 +0300
committerckamm <mail@ckamm.de>2017-09-18 13:52:09 +0300
commit78212e03d6269a7e248529ddb132fd436e58e316 (patch)
tree645ad436d8fdd12533d65a15b8904800ac0c9361
parenta8ea7b08587b058589c11cd869b0bcc6f44c9b7d (diff)
Checksums: Clearer behavior and added testing
-rw-r--r--src/libsync/syncengine.cpp10
-rw-r--r--src/libsync/syncfileitem.h4
-rw-r--r--test/syncenginetestutils.h1
-rw-r--r--test/testsyncengine.cpp19
4 files changed, 24 insertions, 10 deletions
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index f42b5d2d7..a2afbedde 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -391,6 +391,7 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
item->_instruction = instruction;
item->_modtime = file->modtime;
item->_size = file->size;
+ item->_checksumHeader = file->checksumHeader;
} else {
if (instruction != CSYNC_INSTRUCTION_NONE) {
qCWarning(lcEngine) << "ERROR: Instruction" << item->_instruction << "vs" << instruction << "for" << fileUtf8;
@@ -429,15 +430,6 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other,
item->_serverHasIgnoredFiles = file->has_ignored_files;
}
- // Sometimes the discovery computes checksums for local files
- if (!remote && !file->checksumHeader.isEmpty()) {
- item->_checksumHeader = file->checksumHeader;
- }
- // For conflicts, store the remote checksum there
- if (remote && item->_instruction == CSYNC_INSTRUCTION_CONFLICT && !file->checksumHeader.isEmpty()) {
- item->_checksumHeader = file->checksumHeader;
- }
-
// record the seen files to be able to clean the journal later
_seenFiles.insert(item->_file);
if (!renameTarget.isEmpty()) {
diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h
index 88ef5ee6d..8c546038a 100644
--- a/src/libsync/syncfileitem.h
+++ b/src/libsync/syncfileitem.h
@@ -216,10 +216,12 @@ public:
QByteArray _fileId;
QByteArray _remotePerm;
+ // This is the value for the 'new' side, matching with _size and _modtime.
+ //
// When is this set, and is it the local or the remote checksum?
// - if mtime or size changed locally for *.eml files (local checksum)
// - for potential renames of local files (local checksum)
- // - for conflicts (remote checksum) (what about eval_rename/new reconcile?)
+ // - for conflicts (remote checksum)
QByteArray _checksumHeader;
// The size and modtime of the file getting overwritten (on the disk for downloads, on the server for uploads).
diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h
index c2a0c0c8b..3fb03324f 100644
--- a/test/syncenginetestutils.h
+++ b/test/syncenginetestutils.h
@@ -828,6 +828,7 @@ public:
}
OCC::SyncEngine &syncEngine() const { return *_syncEngine; }
+ OCC::SyncJournalDb &syncJournal() const { return *_journalDb; }
FileModifier &localModifier() { return _localModifier; }
FileInfo &remoteModifier() { return _fakeQnam->currentRemoteState(); }
diff --git a/test/testsyncengine.cpp b/test/testsyncengine.cpp
index d96c40695..9de20a015 100644
--- a/test/testsyncengine.cpp
+++ b/test/testsyncengine.cpp
@@ -103,18 +103,37 @@ private slots:
fakeFolder.localModifier().insert("a1.eml", 64, 'A');
fakeFolder.localModifier().insert("a2.eml", 64, 'A');
fakeFolder.localModifier().insert("a3.eml", 64, 'A');
+ fakeFolder.localModifier().insert("b3.txt", 64, 'A');
// Upload and calculate the checksums
// fakeFolder.syncOnce();
fakeFolder.syncOnce();
+ auto getDbChecksum = [&](QString path) {
+ auto record = fakeFolder.syncJournal().getFileRecord(path);
+ return record._checksumHeader;
+ };
+
+ // printf 'A%.0s' {1..64} | sha1sum -
+ QByteArray referenceChecksum("SHA1:30b86e44e6001403827a62c58b08893e77cf121f");
+ QCOMPARE(getDbChecksum("a1.eml"), referenceChecksum);
+ QCOMPARE(getDbChecksum("a2.eml"), referenceChecksum);
+ QCOMPARE(getDbChecksum("a3.eml"), referenceChecksum);
+ QCOMPARE(getDbChecksum("b3.txt"), referenceChecksum);
+
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
// Touch the file without changing the content, shouldn't upload
fakeFolder.localModifier().setContents("a1.eml", 'A');
// Change the content/size
fakeFolder.localModifier().setContents("a2.eml", 'B');
fakeFolder.localModifier().appendByte("a3.eml");
+ fakeFolder.localModifier().appendByte("b3.txt");
fakeFolder.syncOnce();
+ QCOMPARE(getDbChecksum("a1.eml"), referenceChecksum);
+ QCOMPARE(getDbChecksum("a2.eml"), QByteArray("SHA1:84951fc23a4dafd10020ac349da1f5530fa65949"));
+ QCOMPARE(getDbChecksum("a3.eml"), QByteArray("SHA1:826b7e7a7af8a529ae1c7443c23bf185c0ad440c"));
+ QCOMPARE(getDbChecksum("b3.eml"), getDbChecksum("a3.txt"));
+
QVERIFY(!itemDidComplete(completeSpy, "a1.eml"));
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "a2.eml"));
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "a3.eml"));