Test: Add check for permission propagation
authorChristian Kamm <mail@ckamm.de>
Mon, 11 Feb 2019 12:25:56 +0000 (13:25 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:41 +0000 (10:58 +0100)
Also covering propagation to the downloaded file when a conflict-rename
is done at the same time, which used to not work.

test/testsyncengine.cpp

index cc557baa36d8e2ebc92458b00169d723a399102a..b69588ec5df3ceb6852f6ff96919d6f40b07c02a 100644 (file)
@@ -676,6 +676,33 @@ private slots:
 
         QCOMPARE(nPUT, 3);
     }
+
+#ifndef Q_OS_WIN
+    void testPropagatePermissions()
+    {
+        FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+        auto perm = QFileDevice::Permission(0x7704); // user/owner: rwx, group: r, other: -
+        QFile::setPermissions(fakeFolder.localPath() + "A/a1", perm);
+        QFile::setPermissions(fakeFolder.localPath() + "A/a2", perm);
+        fakeFolder.syncOnce(); // get the metadata-only change out of the way
+        fakeFolder.remoteModifier().appendByte("A/a1");
+        fakeFolder.remoteModifier().appendByte("A/a2");
+        fakeFolder.localModifier().appendByte("A/a2");
+        fakeFolder.localModifier().appendByte("A/a2");
+        fakeFolder.syncOnce(); // perms should be preserved
+        QCOMPARE(QFileInfo(fakeFolder.localPath() + "A/a1").permissions(), perm);
+        QCOMPARE(QFileInfo(fakeFolder.localPath() + "A/a2").permissions(), perm);
+
+        // Currently the umask applies to conflict files
+        auto octmask = umask(0);
+        umask(octmask);
+        // Qt uses 0x1, 0x2, 0x4 for "other"; 0x10, 0x20, 0x40 for "group" etc
+        auto qtmask = (octmask & 07) + 0x10 * ((octmask & 070) >> 3) + 0x100 * ((octmask & 0700) >> 6);
+        auto maskedPerm = QFileDevice::Permission(perm & (~qtmask));
+        auto conflictName = fakeFolder.syncJournal().conflictRecord("A/a2").path;
+        QCOMPARE(QFileInfo(fakeFolder.localPath() + conflictName).permissions(), maskedPerm);
+    }
+#endif
 };
 
 QTEST_GUILESS_MAIN(TestSyncEngine)