diff options
author | Hannah von Reth <hannah.vonreth@owncloud.com> | 2021-07-02 11:21:01 +0300 |
---|---|---|
committer | Hannah von Reth <vonreth@kde.org> | 2021-07-13 11:14:00 +0300 |
commit | 3f5163a4f30cf5978ffd7ee363e0d81065eb29c0 (patch) | |
tree | 43be5adbc8934993f79df4fa931d07450dae7dfe /test | |
parent | f1ee3e18e858cd2816dbf588e35cb7f1441f8511 (diff) |
Delay the deletion of Folder objects
This removes the need to check for the existance of the pointers
Fixes: #8690
Diffstat (limited to 'test')
29 files changed, 218 insertions, 126 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index eb2c669bf..b27278825 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,6 @@ include(owncloud_add_test.cmake) -add_library(syncenginetestutils STATIC syncenginetestutils.cpp) +add_library(syncenginetestutils STATIC testutils/syncenginetestutils.cpp testutils/testutils.cpp) target_link_libraries(syncenginetestutils PUBLIC owncloudCore Qt5::Test) owncloud_add_test(OwncloudPropagator) diff --git a/test/benchmarks/benchlargesync.cpp b/test/benchmarks/benchlargesync.cpp index 9e78b9d5c..05b7c1b9d 100644 --- a/test/benchmarks/benchlargesync.cpp +++ b/test/benchmarks/benchlargesync.cpp @@ -5,7 +5,7 @@ * */ -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/modeltests/testactivitymodel.cpp b/test/modeltests/testactivitymodel.cpp index ef7899257..fa9b7d2d6 100644 --- a/test/modeltests/testactivitymodel.cpp +++ b/test/modeltests/testactivitymodel.cpp @@ -9,6 +9,8 @@ #include "gui/models/activitylistmodel.h" #include "gui/accountmanager.h" +#include "testutils/testutils.h" + #include <QTest> #include <QAbstractItemModelTester> @@ -25,19 +27,8 @@ private Q_SLOTS: new QAbstractItemModelTester(model, this); - auto manager = AccountManager::instance(); - - auto createAcc = [&] { - // don't use the account manager to create the account, it would try to use widgets - auto acc = Account::create(); - acc->setUrl(QUrl(QStringLiteral("http://admin:admin@localhost/owncloud"))); - acc->setDavDisplayName(QStringLiteral("fakename") + acc->uuid().toString()); - acc->setServerVersion(QStringLiteral("10.0.0")); - manager->addAccount(acc); - return acc; - }; - auto acc1 = createAcc(); - auto acc2 = createAcc(); + auto acc1 = TestUtils::createDummyAccount(); + auto acc2 = TestUtils::createDummyAccount(); model->setActivityList({ Activity { Activity::ActivityType, 1, acc1, "test", "test", "foo.cpp", QUrl::fromUserInput("https://owncloud.com"), QDateTime::currentDateTime() }, @@ -49,7 +40,7 @@ private Q_SLOTS: Activity { Activity::ActivityType, 2, acc1, "test", "test", "foo.cpp", QUrl::fromUserInput("https://owncloud.com"), QDateTime::currentDateTime() }, Activity { Activity::ActivityType, 4, acc2, "test", "test", "foo.cpp", QUrl::fromUserInput("https://owncloud.com"), QDateTime::currentDateTime() }, }); - model->slotRemoveAccount(manager->accounts().first().data()); + model->slotRemoveAccount(AccountManager::instance()->accounts().first().data()); } }; } diff --git a/test/modeltests/testprotocolmodel.cpp b/test/modeltests/testprotocolmodel.cpp index 8132f9f63..e2c194c2f 100644 --- a/test/modeltests/testprotocolmodel.cpp +++ b/test/modeltests/testprotocolmodel.cpp @@ -7,9 +7,15 @@ */ #include "gui/models/protocolitemmodel.h" +#include "gui/accountmanager.h" +#include "gui/accountstate.h" +#include "gui/folderman.h" + +#include "testutils/testutils.h" #include <QTest> #include <QAbstractItemModelTester> +#include <folder.h> namespace OCC { @@ -24,6 +30,20 @@ private Q_SLOTS: new QAbstractItemModelTester(model, this); + QTemporaryDir dir; + + auto account = TestUtils::createDummyAccount(); + + AccountStatePtr newAccountState(new AccountState(account)); + const QDir d(dir.path()); + QVERIFY(d.mkdir("foo")); + QVERIFY(d.mkdir("bar")); + const QString foo = dir.path() + QStringLiteral("/foo"); + const QString bar = dir.path() + QStringLiteral("/bar"); + QVERIFY(TestUtils::folderMan()->addFolder(newAccountState.data(), TestUtils::createDummyFolderDefinition(foo))); + QVERIFY(TestUtils::folderMan()->addFolder(newAccountState.data(), TestUtils::createDummyFolderDefinition(bar))); + + // populate with dummy data // -1 to test the ring buffer window roll over const auto size = model->rawData().capacity() - 1; @@ -31,13 +51,15 @@ private Q_SLOTS: std::vector<ProtocolItem> tmp; tmp.reserve(size); for (size_t i = 0; i < size; ++i) { - tmp.emplace_back(QStringLiteral("foo") + QString::number(i), item); + item->_file = QString::number(i); + tmp.emplace_back(foo, item); } model->reset(std::move(tmp)); // test some inserts for (int i = 0; i < 5; ++i) { - model->addProtocolItem(ProtocolItem { QStringLiteral("bar") + QString::number(i), item }); + item->_file = QString::number(i); + model->addProtocolItem(ProtocolItem { bar, item }); } const auto oldSize = model->rowCount(); @@ -45,8 +67,8 @@ private Q_SLOTS: // pick one from the middle const auto toBeRemoved = { model->protocolItem(model->index(0, 0)), - model->protocolItem(model->index(model->rawData().capacity() / 2, 0)), - model->protocolItem(model->index(model->rawData().capacity() / 3, 0)) + model->protocolItem(model->index(static_cast<int>(model->rawData().capacity()) / 2, 0)), + model->protocolItem(model->index(static_cast<int>(model->rawData().capacity()) / 3, 0)) }; std::vector<ProtocolItem> copy; @@ -58,7 +80,7 @@ private Q_SLOTS: int matches = 0; const auto filter = [&toBeRemoved, &matches](const ProtocolItem &pi) { for (const auto &tb : toBeRemoved) { - if (pi.folderName() == tb.folderName()) { + if (pi.folder() == tb.folder() && pi.path() == tb.path()) { matches++; return true; } @@ -74,7 +96,7 @@ private Q_SLOTS: // ensure we kept the original order for (int i = 0; i < model->rowCount(); ++i) { - QCOMPARE(model->protocolItem(model->index(i, 0)).folderName(), copy[i].folderName()); + QCOMPARE(model->protocolItem(model->index(i, 0)).folder(), copy[i].folder()); } } }; diff --git a/test/testallfilesdeleted.cpp b/test/testallfilesdeleted.cpp index e7b89cfec..e3ad69995 100644 --- a/test/testallfilesdeleted.cpp +++ b/test/testallfilesdeleted.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testblacklist.cpp b/test/testblacklist.cpp index d71326560..3a4fe93be 100644 --- a/test/testblacklist.cpp +++ b/test/testblacklist.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testchunkingng.cpp b/test/testchunkingng.cpp index 24e248d09..401a21c13 100644 --- a/test/testchunkingng.cpp +++ b/test/testchunkingng.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testcredentialmanager.cpp b/test/testcredentialmanager.cpp index f0ac646b2..9afea5ef0 100644 --- a/test/testcredentialmanager.cpp +++ b/test/testcredentialmanager.cpp @@ -7,7 +7,7 @@ #include "account.h" #include "libsync/creds/credentialmanager.h" -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <QTest> diff --git a/test/testdatabaseerror.cpp b/test/testdatabaseerror.cpp index 4c2ad5de2..bb19c6477 100644 --- a/test/testdatabaseerror.cpp +++ b/test/testdatabaseerror.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testdownload.cpp b/test/testdownload.cpp index ec451e07b..cd0635ad6 100644 --- a/test/testdownload.cpp +++ b/test/testdownload.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> #include <owncloudpropagator.h> diff --git a/test/testfolderman.cpp b/test/testfolderman.cpp index 6cbc0e03c..4e9437b09 100644 --- a/test/testfolderman.cpp +++ b/test/testfolderman.cpp @@ -14,36 +14,15 @@ #include "account.h" #include "accountstate.h" #include "configfile.h" -#include "creds/httpcredentials.h" -using namespace OCC; - -class HttpCredentialsTest : public HttpCredentials { -public: - HttpCredentialsTest(const QString& user, const QString& password) - : HttpCredentials(DetermineAuthTypeJob::AuthType::Basic, user, password) - {} - - void askFromUser() override { - - } -}; +#include "testutils/testutils.h" -static FolderDefinition folderDefinition(const QString &path) { - FolderDefinition d; - d.localPath = path; - d.targetPath = path; - d.alias = path; - return d; -} +using namespace OCC; class TestFolderMan: public QObject { Q_OBJECT - - FolderMan _fm; - private slots: void testCheckPathValidityForNewFolder() { @@ -64,17 +43,12 @@ private slots: } QString dirPath = dir2.canonicalPath(); - AccountPtr account = Account::create(); - QUrl url("http://example.de"); - HttpCredentialsTest *cred = new HttpCredentialsTest("testuser", "secret"); - account->setCredentials(cred); - account->setUrl( url ); - + AccountPtr account = TestUtils::createDummyAccount(); AccountStatePtr newAccountState(new AccountState(account)); - FolderMan *folderman = FolderMan::instance(); - QCOMPARE(folderman, &_fm); - QVERIFY(folderman->addFolder(newAccountState.data(), folderDefinition(dirPath + "/sub/ownCloud1"))); - QVERIFY(folderman->addFolder(newAccountState.data(), folderDefinition(dirPath + "/ownCloud2"))); + FolderMan *folderman = TestUtils::folderMan(); + QCOMPARE(folderman, FolderMan::instance()); + QVERIFY(folderman->addFolder(newAccountState.data(), TestUtils::createDummyFolderDefinition(dirPath + "/sub/ownCloud1"))); + QVERIFY(folderman->addFolder(newAccountState.data(), TestUtils::createDummyFolderDefinition(dirPath + "/ownCloud2"))); // those should be allowed @@ -91,7 +65,7 @@ private slots: QVERIFY(!folderman->checkPathValidityForNewFolder(dirPath + "/sub/file.txt").isNull()); // There are folders configured in those folders, url needs to be taken into account: -> ERROR - QUrl url2(url); + QUrl url2(account->url()); const QString user = account->credentials()->user(); url2.setUserName(user); @@ -174,7 +148,6 @@ private slots: // SETUP QTemporaryDir dir; - ConfigFile::setConfDir(dir.path()); // we don't want to pollute the user's config file QVERIFY(dir.isValid()); QDir dir2(dir.path()); QVERIFY(dir2.mkpath("sub/ownCloud1/folder/f")); @@ -185,18 +158,14 @@ private slots: QVERIFY(dir2.mkpath("free2/sub")); QString dirPath = dir2.canonicalPath(); - AccountPtr account = Account::create(); - QUrl url("http://example.de"); - HttpCredentialsTest *cred = new HttpCredentialsTest("testuser", "secret"); - account->setCredentials(cred); - account->setUrl( url ); - url.setUserName(cred->user()); + AccountPtr account = TestUtils::createDummyAccount(); + QUrl url(account->url()); + url.setUserName(account->credentials()->user()); AccountStatePtr newAccountState(new AccountState(account)); - FolderMan *folderman = FolderMan::instance(); - QCOMPARE(folderman, &_fm); - QVERIFY(folderman->addFolder(newAccountState.data(), folderDefinition(dirPath + "/sub/ownCloud/"))); - QVERIFY(folderman->addFolder(newAccountState.data(), folderDefinition(dirPath + "/ownCloud2/"))); + FolderMan *folderman = TestUtils::folderMan(); + QVERIFY(folderman->addFolder(newAccountState.data(), TestUtils::createDummyFolderDefinition(dirPath + "/sub/ownCloud/"))); + QVERIFY(folderman->addFolder(newAccountState.data(), TestUtils::createDummyFolderDefinition(dirPath + "/ownCloud2/"))); // TEST diff --git a/test/testjobqueue.cpp b/test/testjobqueue.cpp index aeb2063cb..7fca54082 100644 --- a/test/testjobqueue.cpp +++ b/test/testjobqueue.cpp @@ -9,7 +9,7 @@ #include "abstractnetworkjob.h" #include "account.h" -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <QTest> diff --git a/test/testlocaldiscovery.cpp b/test/testlocaldiscovery.cpp index 18e1c1b9d..643a3c96a 100644 --- a/test/testlocaldiscovery.cpp +++ b/test/testlocaldiscovery.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> #include <localdiscoverytracker.h> diff --git a/test/testlockedfiles.cpp b/test/testlockedfiles.cpp index 2ffedb8e3..a96dbea64 100644 --- a/test/testlockedfiles.cpp +++ b/test/testlockedfiles.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include "lockwatcher.h" #include <syncengine.h> #include <localdiscoverytracker.h> diff --git a/test/testoauth.cpp b/test/testoauth.cpp index 42de3a3cf..a8b0dbaaf 100644 --- a/test/testoauth.cpp +++ b/test/testoauth.cpp @@ -9,7 +9,7 @@ #include <QDesktopServices> #include "libsync/creds/oauth.h" -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include "theme.h" #include "common/asserts.h" diff --git a/test/testpermissions.cpp b/test/testpermissions.cpp index 6836c331f..012c91a71 100644 --- a/test/testpermissions.cpp +++ b/test/testpermissions.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> #include "common/ownsql.h" diff --git a/test/testremotediscovery.cpp b/test/testremotediscovery.cpp index a93c16039..b6b696bb3 100644 --- a/test/testremotediscovery.cpp +++ b/test/testremotediscovery.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> #include <localdiscoverytracker.h> diff --git a/test/testselectivesync.cpp b/test/testselectivesync.cpp index c91bd8b76..67f44d3fc 100644 --- a/test/testselectivesync.cpp +++ b/test/testselectivesync.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testsyncconflict.cpp b/test/testsyncconflict.cpp index 1a1becdc9..dde1eb751 100644 --- a/test/testsyncconflict.cpp +++ b/test/testsyncconflict.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testsyncdelete.cpp b/test/testsyncdelete.cpp index c2633ba4b..780b5e684 100644 --- a/test/testsyncdelete.cpp +++ b/test/testsyncdelete.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testsyncengine.cpp b/test/testsyncengine.cpp index 1ee5bdb84..89fe33420 100644 --- a/test/testsyncengine.cpp +++ b/test/testsyncengine.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testsyncfilestatustracker.cpp b/test/testsyncfilestatustracker.cpp index f1b27447c..823910514 100644 --- a/test/testsyncfilestatustracker.cpp +++ b/test/testsyncfilestatustracker.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include "csync_exclude.h" using namespace OCC; diff --git a/test/testsyncmove.cpp b/test/testsyncmove.cpp index 8e09ba693..047e5149b 100644 --- a/test/testsyncmove.cpp +++ b/test/testsyncmove.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> using namespace OCC; diff --git a/test/testsyncvirtualfiles.cpp b/test/testsyncvirtualfiles.cpp index f46888518..ffcf1c1fa 100644 --- a/test/testsyncvirtualfiles.cpp +++ b/test/testsyncvirtualfiles.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include "common/vfs.h" #include "config.h" #include <syncengine.h> diff --git a/test/testuploadreset.cpp b/test/testuploadreset.cpp index cc7d4c5ae..d954e7553 100644 --- a/test/testuploadreset.cpp +++ b/test/testuploadreset.cpp @@ -6,7 +6,7 @@ */ #include <QtTest> -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include <syncengine.h> #include <common/syncjournaldb.h> diff --git a/test/syncenginetestutils.cpp b/test/testutils/syncenginetestutils.cpp index a4b1a1c37..c3422b131 100644 --- a/test/syncenginetestutils.cpp +++ b/test/testutils/syncenginetestutils.cpp @@ -5,7 +5,7 @@ * */ -#include "syncenginetestutils.h" +#include "testutils/syncenginetestutils.h" #include "httplogger.h" #include "accessmanager.h" #include "libsync/configfile.h" @@ -346,7 +346,8 @@ FakePropfindReply::FakePropfindReply(FileInfo &remoteRootFileInfo, QNetworkAcces xml.writeTextElement(davUri, QStringLiteral("getlastmodified"), stringDate); xml.writeTextElement(davUri, QStringLiteral("getcontentlength"), QString::number(fileInfo.size)); xml.writeTextElement(davUri, QStringLiteral("getetag"), QStringLiteral("\"%1\"").arg(QString::fromLatin1(fileInfo.etag))); - xml.writeTextElement(ocUri, QStringLiteral("permissions"), !fileInfo.permissions.isNull() ? QString(fileInfo.permissions.toString()) : fileInfo.isShared ? QStringLiteral("SRDNVCKW") : QStringLiteral("RDNVCKW")); + xml.writeTextElement(ocUri, QStringLiteral("permissions"), !fileInfo.permissions.isNull() ? QString(fileInfo.permissions.toString()) : fileInfo.isShared ? QStringLiteral("SRDNVCKW") + : QStringLiteral("RDNVCKW")); xml.writeTextElement(ocUri, QStringLiteral("id"), QString::fromUtf8(fileInfo.fileId)); xml.writeTextElement(ocUri, QStringLiteral("checksums"), QString::fromUtf8(fileInfo.checksums)); buffer.write(fileInfo.extraDavProperties); diff --git a/test/syncenginetestutils.h b/test/testutils/syncenginetestutils.h index 72ef5d91a..98c0759ec 100644 --- a/test/syncenginetestutils.h +++ b/test/testutils/syncenginetestutils.h @@ -10,6 +10,7 @@ #include "creds/abstractcredentials.h" #include "logger.h" #include "filesystem.h" +#include "folder.h" #include "syncengine.h" #include "common/syncjournaldb.h" #include "common/syncjournalfilerecord.h" @@ -34,7 +35,8 @@ static const QUrl sRootUrl = QUrl::fromEncoded("owncloud://somehost/owncloud/rem static const QUrl sRootUrl2 = QUrl::fromEncoded("owncloud://somehost/owncloud/remote.php/dav/files/admin/"); static const QUrl sUploadUrl = QUrl::fromEncoded("owncloud://somehost/owncloud/remote.php/dav/uploads/admin/"); -inline QString getFilePathFromUrl(const QUrl &url) { +inline QString getFilePathFromUrl(const QUrl &url) +{ QString path = url.path(); if (path.startsWith(sRootUrl.path())) return path.mid(sRootUrl.path().length()); @@ -46,14 +48,17 @@ inline QString getFilePathFromUrl(const QUrl &url) { } -inline QByteArray generateEtag() { +inline QByteArray generateEtag() +{ return QByteArray::number(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(), 16) + QByteArray::number(qrand(), 16); } -inline QByteArray generateFileId() { +inline QByteArray generateFileId() +{ return QByteArray::number(qrand(), 16); } -class PathComponents : public QStringList { +class PathComponents : public QStringList +{ public: PathComponents(const char *path); PathComponents(const QString &path); @@ -61,7 +66,11 @@ public: PathComponents parentDirComponents() const; PathComponents subComponents() const &; - PathComponents subComponents() && { removeFirst(); return std::move(*this); } + PathComponents subComponents() && + { + removeFirst(); + return std::move(*this); + } QString pathRoot() const { return first(); } QString fileName() const { return last(); } }; @@ -83,8 +92,12 @@ public: class DiskFileModifier : public FileModifier { QDir _rootDir; + public: - DiskFileModifier(const QString &rootDirPath) : _rootDir(rootDirPath) { } + DiskFileModifier(const QString &rootDirPath) + : _rootDir(rootDirPath) + { + } void remove(const QString &relativePath) override; void insert(const QString &relativePath, qint64 size = 64, char contentChar = 'W') override; void setContents(const QString &relativePath, char contentChar) override; @@ -102,9 +115,23 @@ public: static FileInfo A12_B12_C12_S12(); FileInfo() = default; - FileInfo(const QString &name) : name{name} { } - FileInfo(const QString &name, qint64 size) : name{name}, isDir{false}, size{size} { } - FileInfo(const QString &name, qint64 size, char contentChar) : name{name}, isDir{false}, size{size}, contentChar{contentChar} { } + FileInfo(const QString &name) + : name { name } + { + } + FileInfo(const QString &name, qint64 size) + : name { name } + , isDir { false } + , size { size } + { + } + FileInfo(const QString &name, qint64 size, char contentChar) + : name { name } + , isDir { false } + , size { size } + , contentChar { contentChar } + { + } FileInfo(const QString &name, const std::initializer_list<FileInfo> &children); void addChild(const FileInfo &info); @@ -131,13 +158,15 @@ public: FileInfo *create(const QString &relativePath, qint64 size, char contentChar); - bool operator<(const FileInfo &other) const { + bool operator<(const FileInfo &other) const + { return name < other.name; } bool operator==(const FileInfo &other) const; - bool operator!=(const FileInfo &other) const { + bool operator!=(const FileInfo &other) const + { return !operator==(other); } @@ -164,7 +193,8 @@ public: FileInfo *findInvalidatingEtags(PathComponents pathComponents); - friend inline QDebug operator<<(QDebug dbg, const FileInfo& fi) { + friend inline QDebug operator<<(QDebug dbg, const FileInfo &fi) + { return dbg << "{ " << fi.path() << ": " << fi.children; } }; @@ -202,6 +232,7 @@ class FakePutReply : public FakeReply { Q_OBJECT FileInfo *fileInfo; + public: FakePutReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &putPayload, QObject *parent); @@ -217,6 +248,7 @@ class FakeMkcolReply : public FakeReply { Q_OBJECT FileInfo *fileInfo; + public: FakeMkcolReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent); @@ -292,6 +324,7 @@ class FakeChunkMoveReply : public FakeReply { Q_OBJECT FileInfo *fileInfo; + public: FakeChunkMoveReply(FileInfo &uploadsFileInfo, FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, @@ -317,7 +350,7 @@ public: void respond(); - void abort() override {} + void abort() override { } qint64 readData(char *buf, qint64 max) override; qint64 bytesAvailable() const override; QByteArray _body; @@ -334,8 +367,8 @@ public: Q_INVOKABLE virtual void respond(); // make public to give tests easy interface - using QNetworkReply::setError; using QNetworkReply::setAttribute; + using QNetworkReply::setError; public slots: void slotSetFinished(); @@ -365,7 +398,7 @@ class DelayedReply : public OriginalReply { public: template <typename... Args> - explicit DelayedReply(quint64 delayMS, Args &&... args) + explicit DelayedReply(quint64 delayMS, Args &&...args) : OriginalReply(std::forward<Args>(args)...) , _delayMs(delayMS) { @@ -411,8 +444,12 @@ protected: class FakeCredentials : public OCC::AbstractCredentials { QNetworkAccessManager *_qnam; + public: - FakeCredentials(QNetworkAccessManager *qnam) : _qnam{qnam} { } + FakeCredentials(QNetworkAccessManager *qnam) + : _qnam { qnam } + { + } QString authType() const override { return QStringLiteral("test"); } QString user() const override { return QStringLiteral("admin"); } QNetworkAccessManager *createQNAM() const override { return _qnam; } @@ -452,13 +489,16 @@ public: FileInfo &uploadState() { return _fakeQnam->uploadState(); } FileInfo dbState() const; - struct ErrorList { + struct ErrorList + { FakeQNAM *_qnam; void append(const QString &path, int error = 500) - { _qnam->errorPaths().insert(path, error); } + { + _qnam->errorPaths().insert(path, error); + } void clear() { _qnam->errorPaths().clear(); } }; - ErrorList serverErrorPaths() { return {_fakeQnam}; } + ErrorList serverErrorPaths() { return { _fakeQnam }; } void setServerOverride(const FakeQNAM::Override &override) { _fakeQnam->setOverride(override); } QString localPath() const; @@ -469,14 +509,16 @@ public: void execUntilItemCompleted(const QString &relativePath); - bool execUntilFinished() { + bool execUntilFinished() + { QSignalSpy spy(_syncEngine.get(), SIGNAL(finished(bool))); bool ok = spy.wait(3600000); Q_ASSERT(ok && "Sync timed out"); return spy[0][0].toBool(); } - bool syncOnce() { + bool syncOnce() + { scheduleSync(); return execUntilFinished(); } @@ -504,19 +546,22 @@ inline const FileInfo *findConflict(FileInfo &dir, const QString &filename) return nullptr; } -struct ItemCompletedSpy : QSignalSpy { +struct ItemCompletedSpy : QSignalSpy +{ explicit ItemCompletedSpy(FakeFolder &folder) : QSignalSpy(&folder.syncEngine(), &OCC::SyncEngine::itemCompleted) - {} + { + } OCC::SyncFileItemPtr findItem(const QString &path) const; }; // QTest::toString overloads namespace OCC { - inline char *toString(const SyncFileStatus &s) { - return QTest::toString(QStringLiteral("SyncFileStatus(%1)").arg(s.toSocketAPIString())); - } +inline char *toString(const SyncFileStatus &s) +{ + return QTest::toString(QStringLiteral("SyncFileStatus(%1)").arg(s.toSocketAPIString())); +} } inline void addFiles(QStringList &dest, const FileInfo &fi) @@ -548,20 +593,11 @@ inline void addFilesDbData(QStringList &dest, const FileInfo &fi) { // could include etag, permissions etc, but would need extra work if (fi.isDir) { - dest += QStringLiteral("%1 - %2 %3 %4").arg( - fi.name, - fi.isDir ? QStringLiteral("dir") : QStringLiteral("file"), - QString::number(fi.lastModified.toSecsSinceEpoch()), - QString::fromUtf8(fi.fileId)); + dest += QStringLiteral("%1 - %2 %3 %4").arg(fi.name, fi.isDir ? QStringLiteral("dir") : QStringLiteral("file"), QString::number(fi.lastModified.toSecsSinceEpoch()), QString::fromUtf8(fi.fileId)); for (const auto &fi : fi.children) addFilesDbData(dest, fi); } else { - dest += QStringLiteral("%1 - %2 %3 %4 %5").arg( - fi.name, - fi.isDir ? QStringLiteral("dir") : QStringLiteral("file"), - QString::number(fi.size), - QString::number(fi.lastModified.toSecsSinceEpoch()), - QString::fromUtf8(fi.fileId)); + dest += QStringLiteral("%1 - %2 %3 %4 %5").arg(fi.name, fi.isDir ? QStringLiteral("dir") : QStringLiteral("file"), QString::number(fi.size), QString::number(fi.lastModified.toSecsSinceEpoch()), QString::fromUtf8(fi.fileId)); } } diff --git a/test/testutils/testutils.cpp b/test/testutils/testutils.cpp new file mode 100644 index 000000000..281323073 --- /dev/null +++ b/test/testutils/testutils.cpp @@ -0,0 +1,59 @@ +#include "testutils.h" + +#include "creds/httpcredentials.h" +#include "gui/accountmanager.h" + +#include <QCoreApplication> + +namespace { +class HttpCredentialsTest : public OCC::HttpCredentials +{ +public: + HttpCredentialsTest(const QString &user, const QString &password) + : HttpCredentials(OCC::DetermineAuthTypeJob::AuthType::Basic, user, password) + { + } + + void askFromUser() override + { + } +}; +} + +namespace OCC { + +namespace TestUtils { + AccountPtr createDummyAccount() + { + // don't use the account manager to create the account, it would try to use widgets + auto acc = Account::create(); + HttpCredentialsTest *cred = new HttpCredentialsTest("testuser", "secret"); + acc->setCredentials(cred); + acc->setUrl(QUrl(QStringLiteral("http://localhost/owncloud"))); + acc->setDavDisplayName(QStringLiteral("fakename") + acc->uuid().toString()); + acc->setServerVersion(QStringLiteral("10.0.0")); + OCC::AccountManager::instance()->addAccount(acc); + return acc; + } + + FolderDefinition createDummyFolderDefinition(const QString &path) + { + OCC::FolderDefinition d; + d.localPath = path; + d.targetPath = path; + d.alias = path; + return d; + } + + FolderMan *folderMan() + { + static FolderMan *man = [] { + auto man = new FolderMan; + QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, man, &FolderMan::deleteLater); + return man; + }(); + return man; + } + +} +} diff --git a/test/testutils/testutils.h b/test/testutils/testutils.h new file mode 100644 index 000000000..c9e8c64e5 --- /dev/null +++ b/test/testutils/testutils.h @@ -0,0 +1,14 @@ +#pragma once + +#include "account.h" +#include "folder.h" +#include "folderman.h" + +namespace OCC { + +namespace TestUtils { + FolderMan *folderMan(); + FolderDefinition createDummyFolderDefinition(const QString &path); + AccountPtr createDummyAccount(); +} +} |