using namespace OCC;
+static QByteArray fake400Response = R"(
+{"ocs":{"meta":{"status":"failure","statuscode":400,"message":"Parameter is incorrect.\n"},"data":[]}}
+)";
+
bool itemDidCompleteSuccessfully(const ItemCompletedSpy &spy, const QString &path)
{
if (auto item = spy.findItem(path)) {
void incomingShareDeleted();
private slots:
+ void testDeleteEncryptedFiles()
+ {
+ FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+ QCOMPARE(fakeFolder.currentLocalState().children.count(), 4);
+
+ ItemCompletedSpy completeSpy(fakeFolder);
+ fakeFolder.localModifier().mkdir("encrypted");
+ fakeFolder.localModifier().setE2EE("encrypted", true);
+ fakeFolder.remoteModifier().mkdir("encrypted");
+ fakeFolder.remoteModifier().setE2EE("encrypted", true);
+
+ const auto fakeFileInfo = fakeFolder.remoteModifier().find("encrypted");
+ QVERIFY(fakeFileInfo);
+ QCOMPARE(fakeFolder.currentLocalState().children.count(), 5);
+
+ const auto fakeFileId = fakeFileInfo->fileId;
+ const auto fakeQnam = new FakeQNAM({});
+ // Let's avoid the null filename assert in the default FakeQNAM request creation
+ const auto fakeQnamOverride = [this, fakeFileId](const QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) {
+ Q_UNUSED(device)
+ QNetworkReply *reply = nullptr;
+
+ const auto reqUrl = req.url();
+ const auto reqRawPath = reqUrl.path();
+ const auto reqPath = reqRawPath.startsWith("/owncloud/") ? reqRawPath.mid(10) : reqRawPath;
+
+ if (reqPath.startsWith(QStringLiteral("ocs/v2.php/apps/end_to_end_encryption/api/v1/meta-data/"))) {
+ const auto splitUrlPath = reqPath.split('/');
+ const auto fileId = splitUrlPath.last();
+
+ const QUrlQuery urlQuery(req.url());
+ const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format"));
+
+ if(fileId == fakeFileId && formatParam == QStringLiteral("json")) {
+ reply = new FakePayloadReply(op, req, QJsonDocument().toJson(), this);
+ } else {
+ reply = new FakeErrorReply(op, req, this, 400, fake400Response);
+ }
+ } else {
+ reply = new FakeErrorReply(op, req, this, 400, fake400Response);
+ }
+ return reply;
+ };
+ fakeFolder.setServerOverride(fakeQnamOverride);
+ fakeQnam->setOverride(fakeQnamOverride);
+
+ const auto account = Account::create();
+ const auto capabilities = QVariantMap {
+ {QStringLiteral("end-to-end-encryption"), QVariantMap {
+ {QStringLiteral("enabled"), true},
+ {QStringLiteral("api-version"), QString::number(2.0)},
+ }},
+ };
+ account->setCapabilities(capabilities);
+ account->setCredentials(new FakeCredentials{fakeQnam});
+ account->setUrl(QUrl(("owncloud://somehost/owncloud")));
+ const auto accountState = new FakeAccountState(account);
+ QVERIFY(accountState->isConnected());
+
+ QVERIFY(fakeFolder.syncOnce());
+ QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+ const auto folder = FolderMan::instance()->addFolder(accountState, folderDefinition(fakeFolder.localPath()));
+ QVERIFY(folder);
+ QSignalSpy folderSyncDone(folder, &Folder::syncFinished);
+
+ QDir dir(folder->path() + QStringLiteral("encrypted"));
+ QVERIFY(dir.exists());
+ QVERIFY(fakeFolder.remoteModifier().find("encrypted"));
+ QVERIFY(fakeFolder.currentLocalState().find("encrypted"));
+ QCOMPARE(fakeFolder.currentLocalState().children.count(), 5);
+
+ // Rather than go through the pain of trying to replicate the E2EE response from
+ // the server, let's just manually set the encryption bool in the folder journal
+ SyncJournalFileRecord rec;
+ QVERIFY(folder->journalDb()->getFileRecord(QStringLiteral("encrypted"), &rec));
+ rec._isE2eEncrypted = true;
+ rec._path = QStringLiteral("encrypted").toUtf8();
+ QVERIFY(folder->journalDb()->setFileRecord(rec));
+ FolderMan::instance()->removeE2eFiles(account);
+
+ QVERIFY(folderSyncDone.wait());
+
+ QVERIFY(fakeFolder.currentRemoteState().find("encrypted"));
+ QVERIFY(!fakeFolder.currentLocalState().find("encrypted"));
+ QCOMPARE(fakeFolder.currentLocalState().children.count(), 4);
+ }
+
void testLeaveShare()
{
QTemporaryDir dir;
QCOMPARE(folderman->findGoodPathForNewSyncFolder(dirPath + "/ownCloud2", url),
QString(dirPath + "/ownCloud22"));
}
-
- void testDeleteEncryptedFiles()
- {
- FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
- QCOMPARE(fakeFolder.currentLocalState().children.count(), 4);
-
- ItemCompletedSpy completeSpy(fakeFolder);
- fakeFolder.localModifier().mkdir("encrypted");
- fakeFolder.localModifier().setE2EE("encrypted", true);
- fakeFolder.remoteModifier().mkdir("encrypted");
- fakeFolder.remoteModifier().setE2EE("encrypted", true);
-
- const auto fakeFileInfo = fakeFolder.remoteModifier().find("encrypted");
- QVERIFY(fakeFileInfo);
- QCOMPARE(fakeFolder.currentLocalState().children.count(), 5);
-
- const auto fakeFileId = fakeFileInfo->fileId;
- const auto fakeQnam = new FakeQNAM({});
- // Let's avoid the null filename assert in the default FakeQNAM request creation
- const auto fakeQnamOverride = [this, fakeFileId](const QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) {
- Q_UNUSED(device)
- QNetworkReply *reply = nullptr;
-
- const auto reqUrl = req.url();
- const auto reqRawPath = reqUrl.path();
- const auto reqPath = reqRawPath.startsWith("/owncloud/") ? reqRawPath.mid(10) : reqRawPath;
-
- if (reqPath.startsWith(QStringLiteral("ocs/v2.php/apps/end_to_end_encryption/api/v1/meta-data/"))) {
- const auto splitUrlPath = reqPath.split('/');
- const auto fileId = splitUrlPath.last();
-
- const QUrlQuery urlQuery(req.url());
- const auto formatParam = urlQuery.queryItemValue(QStringLiteral("format"));
-
- if(fileId == fakeFileId && formatParam == QStringLiteral("json")) {
- reply = new FakePayloadReply(op, req, QJsonDocument().toJson(), this);
- }
- }
- return reply;
- };
- fakeFolder.setServerOverride(fakeQnamOverride);
- fakeQnam->setOverride(fakeQnamOverride);
-
- const auto account = Account::create();
- const auto capabilities = QVariantMap {
- {QStringLiteral("end-to-end-encryption"), QVariantMap {
- {QStringLiteral("enabled"), true},
- {QStringLiteral("api-version"), QString::number(2.0)},
- }},
- };
- account->setCapabilities(capabilities);
- account->setCredentials(new FakeCredentials{fakeQnam});
- account->setUrl(QUrl(("owncloud://somehost/owncloud")));
- const auto accountState = new FakeAccountState(account);
- QVERIFY(accountState->isConnected());
-
- QVERIFY(fakeFolder.syncOnce());
- QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
-
- const auto folder = FolderMan::instance()->addFolder(accountState, folderDefinition(fakeFolder.localPath()));
- QVERIFY(folder);
- QSignalSpy folderSyncDone(folder, &Folder::syncFinished);
-
- QDir dir(folder->path() + QStringLiteral("encrypted"));
- QVERIFY(dir.exists());
- QVERIFY(fakeFolder.remoteModifier().find("encrypted"));
- QVERIFY(fakeFolder.currentLocalState().find("encrypted"));
- QCOMPARE(fakeFolder.currentLocalState().children.count(), 5);
-
- // Rather than go through the pain of trying to replicate the E2EE response from
- // the server, let's just manually set the encryption bool in the folder journal
- SyncJournalFileRecord rec;
- QVERIFY(folder->journalDb()->getFileRecord(QStringLiteral("encrypted"), &rec));
- rec._isE2eEncrypted = true;
- rec._path = QStringLiteral("encrypted").toUtf8();
- QVERIFY(folder->journalDb()->setFileRecord(rec));
- FolderMan::instance()->removeE2eFiles(account);
-
- QVERIFY(folderSyncDone.wait());
-
- QVERIFY(fakeFolder.currentRemoteState().find("encrypted"));
- QVERIFY(!fakeFolder.currentLocalState().find("encrypted"));
- QCOMPARE(fakeFolder.currentLocalState().children.count(), 4);
- }
};
-QTEST_MAIN(TestFolderMan)
+QTEST_GUILESS_MAIN(TestFolderMan)
#include "testfolderman.moc"