diff options
author | Erik Verbruggen <erik@verbruggen.consulting> | 2022-06-09 17:54:27 +0300 |
---|---|---|
committer | Erik Verbruggen <Erik.Verbruggen@Me.com> | 2022-06-09 18:58:27 +0300 |
commit | 59c58022d2115d444c4a3b294448338ca78892b3 (patch) | |
tree | 7f6b5b1a5f06bb205871476824b3b1b34e8a2e4a /test/testutils | |
parent | 7b742d2f38146e1546ed2b5919d9db297a3a2486 (diff) |
Fix FakeGetReply for non-existing files
The old code didn't take into account the case where a file was removed
on the server. It just Q_ASSERT-ed that it should always exist. However,
the CI does release builds, so the assert never triggered.
The problem is that in TestSyncVirtualFiles::testVirtualFileDownload the
file "A/a3" *is* removed from the server while a download is scheduled.
The fix is to handle this case separately as a valid response.
Diffstat (limited to 'test/testutils')
-rw-r--r-- | test/testutils/syncenginetestutils.cpp | 50 | ||||
-rw-r--r-- | test/testutils/syncenginetestutils.h | 8 |
2 files changed, 38 insertions, 20 deletions
diff --git a/test/testutils/syncenginetestutils.cpp b/test/testutils/syncenginetestutils.cpp index 04d1f28cb..4a9fdab5c 100644 --- a/test/testutils/syncenginetestutils.cpp +++ b/test/testutils/syncenginetestutils.cpp @@ -560,45 +560,57 @@ FakeGetReply::FakeGetReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager:: Q_ASSERT(!fileName.isEmpty()); fileInfo = remoteRootFileInfo.find(fileName); if (!fileInfo) { - qDebug() << "meh;"; + qDebug() << "Could not find file" << fileName << "on the remote"; + state = State::FileNotFound; } - Q_ASSERT_X(fileInfo, Q_FUNC_INFO, "Could not find file on the remote"); QMetaObject::invokeMethod(this, &FakeGetReply::respond, Qt::QueuedConnection); } void FakeGetReply::respond() { - if (aborted) { + switch (state) { + case State::Aborted: setError(OperationCanceledError, QStringLiteral("Operation Canceled")); emit metaDataChanged(); - emit finished(); - return; + break; + case State::FileNotFound: + setError(ContentNotFoundError, QStringLiteral("File Not Found")); + emit metaDataChanged(); + break; + case State::Ok: + payload = fileInfo->contentChar; + size = fileInfo->contentSize; + setHeader(QNetworkRequest::ContentLengthHeader, size); + setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 200); + setRawHeader("OC-ETag", fileInfo->etag); + setRawHeader("ETag", fileInfo->etag); + setRawHeader("OC-FileId", fileInfo->fileId); + setRawHeader("X-OC-Mtime", QByteArray::number(fileInfo->lastModifiedInSecondsUTC())); + emit metaDataChanged(); + if (bytesAvailable()) { + emit readyRead(); + } } - payload = fileInfo->contentChar; - size = fileInfo->contentSize; - setHeader(QNetworkRequest::ContentLengthHeader, size); - setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 200); - setRawHeader("OC-ETag", fileInfo->etag); - setRawHeader("ETag", fileInfo->etag); - setRawHeader("OC-FileId", fileInfo->fileId); - setRawHeader("X-OC-Mtime", QByteArray::number(fileInfo->lastModifiedInSecondsUTC())); - emit metaDataChanged(); - if (bytesAvailable()) - emit readyRead(); emit finished(); } void FakeGetReply::abort() { setError(OperationCanceledError, QStringLiteral("Operation Canceled")); - aborted = true; + state = State::Aborted; } qint64 FakeGetReply::bytesAvailable() const { - if (aborted) + switch (state) { + case State::Ok: + return size + QIODevice::bytesAvailable(); + case State::Aborted: + Q_FALLTHROUGH(); + case State::FileNotFound: return 0; - return size + QIODevice::bytesAvailable(); + } + Q_UNREACHABLE(); // Unreachable, but GCC on CentOS 7 does not understand that. } qint64 FakeGetReply::readData(char *data, qint64 maxlen) diff --git a/test/testutils/syncenginetestutils.h b/test/testutils/syncenginetestutils.h index cab2c6c08..119099fc3 100644 --- a/test/testutils/syncenginetestutils.h +++ b/test/testutils/syncenginetestutils.h @@ -342,10 +342,16 @@ class FakeGetReply : public FakeReply { Q_OBJECT public: + enum class State { + Ok, + Aborted, + FileNotFound, + }; + const FileInfo *fileInfo; char payload; int size; - bool aborted = false; + State state = State::Ok; FakeGetReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent); |