1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
/*
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "endtoendtestutils.h"
#include <QNetworkProxy>
#include <QJsonObject>
#include <QSignalSpy>
#include "cmd/simplesslerrorhandler.h"
#include "creds/httpcredentials.h"
#include "gui/accountmanager.h"
#include "libsync/theme.h"
#include "accessmanager.h"
#include "httplogger.h"
#include "syncenginetestutils.h"
#include "testhelper.h"
constexpr auto serverUrl = "https://server";
Q_LOGGING_CATEGORY(lcEndToEndTestUtils, "nextcloud.gui.endtoendtestutils", QtInfoMsg)
/** End to end test credentials access manager class **/
class EndToEndTestCredentialsAccessManager : public OCC::AccessManager
{
public:
EndToEndTestCredentialsAccessManager(const EndToEndTestCredentials *cred, QObject *parent = nullptr)
: OCC::AccessManager(parent)
, _cred(cred)
{
}
protected:
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) override
{
if(!_cred) {
qCWarning(lcEndToEndTestUtils) << "Could not create request -- null creds!";
return {};
}
QNetworkRequest req(request);
QByteArray credHash = QByteArray(_cred->user().toUtf8() + ":" + _cred->password().toUtf8()).toBase64();
req.setRawHeader("Authorization", "Basic " + credHash);
return OCC::AccessManager::createRequest(op, req, outgoingData);
}
private:
// The credentials object dies along with the account, while the QNAM might
// outlive both.
QPointer<const EndToEndTestCredentials> _cred;
};
/** End to end test credentials class **/
QNetworkAccessManager *EndToEndTestCredentials::createQNAM() const
{
return new EndToEndTestCredentialsAccessManager(this);
}
/** End to end test helper class **/
EndToEndTestHelper::~EndToEndTestHelper()
{
removeConfiguredSyncFolder();
removeConfiguredAccount();
OCC::AccountManager::instance()->shutdown();
}
void EndToEndTestHelper::startAccountConfig()
{
const auto accountManager = OCC::AccountManager::instance();
_account = accountManager->createAccount();
_account->setCredentials(new EndToEndTestCredentials);
_account->setUrl(OCC::Theme::instance()->overrideServerUrl());
const auto serverUrlString = QString(serverUrl);
_account->setUrl(serverUrlString);
_account->networkAccessManager()->setProxy(QNetworkProxy(QNetworkProxy::NoProxy));
_account->setSslConfiguration(QSslConfiguration::defaultConfiguration());
_account->setSslErrorHandler(new OCC::SimpleSslErrorHandler);
_account->setTrustCertificates(true);
slotConnectToNCUrl(serverUrlString);
}
void EndToEndTestHelper::slotConnectToNCUrl(const QString &url)
{
qCDebug(lcEndToEndTestUtils) << "Connect to url: " << url;
const auto fetchUserNameJob = new OCC::JsonApiJob(_account->sharedFromThis(), QStringLiteral("/ocs/v1.php/cloud/user"));
connect(fetchUserNameJob, &OCC::JsonApiJob::jsonReceived, this, [this, url](const QJsonDocument &json, const int statusCode) {
if (statusCode != 100) {
qCDebug(lcEndToEndTestUtils) << "Could not fetch username.";
}
const auto objData = json.object().value("ocs").toObject().value("data").toObject();
const auto userId = objData.value("id").toString("");
const auto displayName = objData.value("display-name").toString("");
_account->setDavUser(userId);
_account->setDavDisplayName(displayName);
_accountState = new OCC::AccountState(_account);
emit accountReady(_account);
});
fetchUserNameJob->start();
}
void EndToEndTestHelper::removeConfiguredAccount()
{
OCC::AccountManager::instance()->deleteAccount(_accountState.data());
}
OCC::Folder *EndToEndTestHelper::configureSyncFolder(const QString &targetPath)
{
if(_syncFolder) {
removeConfiguredSyncFolder();
}
qCDebug(lcEndToEndTestUtils) << "Creating temp end-to-end test folder.";
Q_ASSERT(_tempDir.isValid());
OCC::FileSystem::setFolderMinimumPermissions(_tempDir.path());
qCDebug(lcEndToEndTestUtils) << "Created temp end-to-end test folder at:" << _tempDir.path();
setupFolderMan();
OCC::FolderDefinition definition;
definition.localPath = _tempDir.path();
definition.targetPath = targetPath;
_syncFolder = _folderMan->addFolder(_accountState.data(), definition);
return _syncFolder;
}
void EndToEndTestHelper::removeConfiguredSyncFolder()
{
if(!_syncFolder || !_folderMan) {
return;
}
QSignalSpy folderSyncFinished(_syncFolder, &OCC::Folder::syncFinished);
_folderMan->forceSyncForFolder(_syncFolder);
Q_ASSERT(folderSyncFinished.wait(3000));
_folderMan->unloadAndDeleteAllFolders();
_syncFolder = nullptr;
}
void EndToEndTestHelper::setupFolderMan()
{
if(_folderMan) {
return;
}
auto folderMan = new OCC::FolderMan;
Q_ASSERT(folderMan);
folderMan->setSyncEnabled(true);
_folderMan.reset(folderMan);
}
|