diff options
author | Hannah von Reth <hannah.vonreth@owncloud.com> | 2021-01-27 16:15:38 +0300 |
---|---|---|
committer | Hannah von Reth <vonreth@kde.org> | 2021-02-11 17:32:28 +0300 |
commit | 8e824073f93c592b058dafa42c7c92c2a4d26f8c (patch) | |
tree | dd2de81a830250ac06c7b2811d9eb5c772ebac81 /test | |
parent | f5ae5eb5feff05f1227ad365919b1068aecc3b2b (diff) |
Remove PollJob support
Diffstat (limited to 'test')
-rw-r--r-- | test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | test/testasyncop.cpp | 242 |
2 files changed, 0 insertions, 243 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 557de20e3..327b1d8a2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -25,7 +25,6 @@ owncloud_add_test(SyncConflict) owncloud_add_test(SyncFileStatusTracker) owncloud_add_test(Download) owncloud_add_test(ChunkingNg) -owncloud_add_test(AsyncOp) owncloud_add_test(UploadReset) owncloud_add_test(AllFilesDeleted) owncloud_add_test(Blacklist) diff --git a/test/testasyncop.cpp b/test/testasyncop.cpp deleted file mode 100644 index 1f296c8f5..000000000 --- a/test/testasyncop.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/* - * This software is in the public domain, furnished "as is", without technical - * support, and with no warranty, express or implied, as to its usefulness for - * any purpose. - * - */ - -#include <QtTest> -#include "syncenginetestutils.h" -#include <syncengine.h> - -using namespace OCC; - -class FakeAsyncReply : public FakeReply -{ - Q_OBJECT - QByteArray _pollLocation; - -public: - FakeAsyncReply(const QByteArray &pollLocation, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent) - : FakeReply { parent } - , _pollLocation(pollLocation) - { - setRequest(request); - setUrl(request.url()); - setOperation(op); - open(QIODevice::ReadOnly); - - QMetaObject::invokeMethod(this, "respond", Qt::QueuedConnection); - } - - Q_INVOKABLE void respond() - { - setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 202); - setRawHeader("OC-JobStatus-Location", _pollLocation); - emit metaDataChanged(); - emit finished(); - } - - void abort() override {} - qint64 readData(char *, qint64) override { return 0; } -}; - - -class TestAsyncOp : public QObject -{ - Q_OBJECT - -private slots: - - void asyncUploadOperations() - { - FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() }; - fakeFolder.syncEngine().account()->setCapabilities({ { "dav", QVariantMap{ { "chunking", "1.0" } } } }); - // Reduce max chunk size a bit so we get more chunks - SyncOptions options; - options._maxChunkSize = 20 * 1000; - fakeFolder.syncEngine().setSyncOptions(options); - int nGET = 0; - - // This test is made of several testcases. - // the testCases maps a filename to a couple of callback. - // When a file is uploaded, the fake server will always return the 202 code, and will set - // the `perform` functor to what needs to be done to complete the transaction. - // The testcase consist of the `pollRequest` which will be called when the sync engine - // calls the poll url. - struct TestCase - { - using PollRequest_t = std::function<QNetworkReply *(TestCase *, const QNetworkRequest &request)>; - - // for older compilers like on Debian 8 - explicit TestCase(PollRequest_t request = nullptr) - : pollRequest(request) - {} - - PollRequest_t pollRequest; - std::function<FileInfo *()> perform = nullptr; - }; - QHash<QString, TestCase> testCases; - - fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) -> QNetworkReply * { - auto path = request.url().path(); - - if (op == QNetworkAccessManager::GetOperation && path.startsWith("/async-poll/")) { - auto file = path.mid(sizeof("/async-poll/") - 1); - Q_ASSERT(testCases.contains(file)); - auto &testCase = testCases[file]; - return testCase.pollRequest(&testCase, request); - } - - if (op == QNetworkAccessManager::PutOperation && !path.contains("/uploads/")) { - // Not chunking - auto file = getFilePathFromUrl(request.url()); - Q_ASSERT(testCases.contains(file)); - auto &testCase = testCases[file]; - Q_ASSERT(!testCase.perform); - auto putPayload = outgoingData->readAll(); - testCase.perform = [putPayload, request, &fakeFolder] { - return FakePutReply::perform(fakeFolder.remoteModifier(), request, putPayload); - }; - return new FakeAsyncReply("/async-poll/" + file.toUtf8(), op, request, &fakeFolder.syncEngine()); - } else if (request.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE") { - QString file = getFilePathFromUrl(QUrl::fromEncoded(request.rawHeader("Destination"))); - Q_ASSERT(testCases.contains(file)); - auto &testCase = testCases[file]; - Q_ASSERT(!testCase.perform); - testCase.perform = [request, &fakeFolder] { - return FakeChunkMoveReply::perform(fakeFolder.uploadState(), fakeFolder.remoteModifier(), request); - }; - return new FakeAsyncReply("/async-poll/" + file.toUtf8(), op, request, &fakeFolder.syncEngine()); - } else if (op == QNetworkAccessManager::GetOperation) { - nGET++; - } - return nullptr; - }); - - - // Callback to be used to finalize the transaction and return the success - auto successCallback = [](TestCase *tc, const QNetworkRequest &request) { - tc->pollRequest = [](TestCase *, const QNetworkRequest &) -> QNetworkReply * { std::abort(); }; // shall no longer be called - FileInfo *info = tc->perform(); - QByteArray body = "{ \"status\":\"finished\", \"ETag\":\"\\\"" + info->etag + "\\\"\", \"fileId\":\"" + info->fileId + "\"}\n"; - return new FakePayloadReply(QNetworkAccessManager::GetOperation, request, body, nullptr); - }; - // Callback that never finishes - auto waitForeverCallback = [](TestCase *, const QNetworkRequest &request) { - QByteArray body = "{\"status\":\"started\"}\n"; - return new FakePayloadReply(QNetworkAccessManager::GetOperation, request, body, nullptr); - }; - // Callback that simulate an error. - auto errorCallback = [](TestCase *tc, const QNetworkRequest &request) { - tc->pollRequest = [](TestCase *, const QNetworkRequest &) -> QNetworkReply * { std::abort(); }; // shall no longer be called; - QByteArray body = "{\"status\":\"error\",\"errorCode\":500,\"errorMessage\":\"TestingErrors\"}\n"; - return new FakePayloadReply(QNetworkAccessManager::GetOperation, request, body, nullptr); - }; - // This lambda takes another functor as a parameter, and returns a callback that will - // tell the client needs to poll again, and further call to the poll url will call the - // given callback - auto waitAndChain = [](const TestCase::PollRequest_t &chain) { - return [chain](TestCase *tc, const QNetworkRequest &request) { - tc->pollRequest = chain; - QByteArray body = "{\"status\":\"started\"}\n"; - return new FakePayloadReply(QNetworkAccessManager::GetOperation, request, body, nullptr); - }; - }; - - // Create a testcase by creating a file of a given size locally and assigning it a callback - auto insertFile = [&](const QString &file, int size, TestCase::PollRequest_t cb) { - fakeFolder.localModifier().insert(file, size); - testCases[file] = TestCase(std::move(cb)); - }; - fakeFolder.localModifier().mkdir("success"); - insertFile("success/chunked_success", options._maxChunkSize * 3, successCallback); - insertFile("success/single_success", 300, successCallback); - insertFile("success/chunked_patience", options._maxChunkSize * 3, - waitAndChain(waitAndChain(successCallback))); - insertFile("success/single_patience", 300, - waitAndChain(waitAndChain(successCallback))); - fakeFolder.localModifier().mkdir("err"); - insertFile("err/chunked_error", options._maxChunkSize * 3, errorCallback); - insertFile("err/single_error", 300, errorCallback); - insertFile("err/chunked_error2", options._maxChunkSize * 3, waitAndChain(errorCallback)); - insertFile("err/single_error2", 300, waitAndChain(errorCallback)); - - // First sync should finish by itself. - // All the things in "success/" should be transfered, the things in "err/" not - QVERIFY(!fakeFolder.syncOnce()); - QCOMPARE(nGET, 0); - QCOMPARE(*fakeFolder.currentLocalState().find("success"), - *fakeFolder.currentRemoteState().find("success")); - testCases.clear(); - testCases["err/chunked_error"] = TestCase(successCallback); - testCases["err/chunked_error2"] = TestCase(successCallback); - testCases["err/single_error"] = TestCase(successCallback); - testCases["err/single_error2"] = TestCase(successCallback); - - fakeFolder.localModifier().mkdir("waiting"); - insertFile("waiting/small", 300, waitForeverCallback); - insertFile("waiting/willNotConflict", 300, waitForeverCallback); - insertFile("waiting/big", options._maxChunkSize * 3, - waitAndChain(waitAndChain([&](TestCase *tc, const QNetworkRequest &request) { - QTimer::singleShot(0, &fakeFolder.syncEngine(), &SyncEngine::abort); - return waitAndChain(waitForeverCallback)(tc, request); - }))); - - fakeFolder.syncJournal().wipeErrorBlacklist(); - - // This second sync will redo the files that had errors - // But the waiting folder will not complete before it is aborted. - QVERIFY(!fakeFolder.syncOnce()); - QCOMPARE(nGET, 0); - QCOMPARE(*fakeFolder.currentLocalState().find("err"), - *fakeFolder.currentRemoteState().find("err")); - - testCases["waiting/small"].pollRequest = waitAndChain(waitAndChain(successCallback)); - testCases["waiting/big"].pollRequest = waitAndChain(successCallback); - testCases["waiting/willNotConflict"].pollRequest = - [&fakeFolder, &successCallback](TestCase *tc, const QNetworkRequest &request) { - auto &remoteModifier = fakeFolder.remoteModifier(); // successCallback destroys the capture - auto reply = successCallback(tc, request); - // This is going to succeed, and after we just change the file. - // This should not be a conflict, but this should be downloaded in the - // next sync - remoteModifier.appendByte("waiting/willNotConflict"); - return reply; - }; - - - int nPUT = 0; - int nMOVE = 0; - int nDELETE = 0; - fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * { - auto path = request.url().path(); - if (op == QNetworkAccessManager::GetOperation && path.startsWith("/async-poll/")) { - auto file = path.mid(sizeof("/async-poll/") - 1); - Q_ASSERT(testCases.contains(file)); - auto &testCase = testCases[file]; - return testCase.pollRequest(&testCase, request); - } else if (op == QNetworkAccessManager::PutOperation) { - nPUT++; - } else if (op == QNetworkAccessManager::GetOperation) { - nGET++; - } else if (op == QNetworkAccessManager::DeleteOperation) { - nDELETE++; - } else if (request.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE") { - nMOVE++; - } - return nullptr; - }); - - // This last sync will do the waiting stuff - QVERIFY(fakeFolder.syncOnce()); - QCOMPARE(nGET, 1); // "waiting/willNotConflict" - QCOMPARE(nPUT, 0); - QCOMPARE(nMOVE, 0); - QCOMPARE(nDELETE, 0); - QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); - } -}; - -QTEST_GUILESS_MAIN(TestAsyncOp) -#include "testasyncop.moc" |