зеркало из https://github.com/nextcloud/desktop.git
Fix folderman delete encrypted files test
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Родитель
6f4c7849f3
Коммит
b7311278a8
|
@ -21,6 +21,10 @@
|
|||
|
||||
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)) {
|
||||
|
@ -39,6 +43,94 @@ signals:
|
|||
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;
|
||||
|
@ -320,91 +412,7 @@ private slots:
|
|||
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"
|
||||
|
|
Загрузка…
Ссылка в новой задаче