QRestReply: add a few more content-type parsing tests

... incl. some that fail.

This is in preparation of a patch that makes the parser more
compliant.

Manual conflict resolution:
 - Rebased to before conflicting change
   15b0bd69ff2a3ac967ddb98b5fc3c3ce8c3d5b4b

Task-number: QTBUG-120307
Change-Id: Ic47b23132f2a7ea81b6c480bfb036bc2daff05da
Reviewed-by: Juha Vuolle <juha.vuolle@qt.io>
(cherry picked from commit 2822b226109bc2e537e810b7c885baa2cb369588)
This commit is contained in:
Marc Mutz 2024-04-17 12:33:11 +02:00
parent 0aa0d505b1
commit 5eecb650f6

View File

@ -13,6 +13,7 @@
#include <QTest>
#include <QtTest/qsignalspy.h>
#include <QtCore/private/qglobal_p.h> // for access to Qt's feature system
#include <QtCore/qbuffer.h>
#include <QtCore/qjsonobject.h>
#include <QtCore/qjsondocument.h>
@ -665,7 +666,7 @@ void tst_QRestAccessManager::json()
}
}
#define VERIFY_TEXT_REPLY_OK \
#define VERIFY_TEXT_REPLY_OK_IMPL(...) \
{ \
manager.get(request, this, [&](QRestReply &reply) { networkReply = reply.networkReply(); }); \
QTRY_VERIFY(networkReply); \
@ -673,8 +674,11 @@ void tst_QRestAccessManager::json()
responseString = restReply.readText(); \
networkReply->deleteLater(); \
networkReply = nullptr; \
__VA_ARGS__ ; \
QCOMPARE(responseString, sourceString); \
}
#define VERIFY_TEXT_REPLY_OK VERIFY_TEXT_REPLY_OK_IMPL(do {} while (false))
#define VERIFY_TEXT_REPLY_XFAIL(JIRA) VERIFY_TEXT_REPLY_OK_IMPL(QEXPECT_FAIL("", #JIRA, Continue))
#define VERIFY_TEXT_REPLY_ERROR(WARNING_MESSAGE) \
{ \
@ -721,11 +725,30 @@ void tst_QRestAccessManager::text()
// should consider the indicated charset and convert it to an UTF-16 QString => the returned
// QString from text() should match with the original (UTF-16) QString.
// Successful UTF-8
// Successful UTF-8 (explicit)
serverSideResponse.headers.insert("Content-Type:"_ba, "text/plain; charset=UTF-8"_ba);
serverSideResponse.body = encUTF8(sourceString);
VERIFY_TEXT_REPLY_OK;
// Successful UTF-8 (obfuscated)
serverSideResponse.headers["Content-Type:"_ba] = "text/plain; charset=\"UT\\F-8\""_ba;
serverSideResponse.body = encUTF8(sourceString);
#if QT_CONFIG(icu) // ICU ignores `\` during name lookup, making this test succeed when it shouldn't
VERIFY_TEXT_REPLY_OK;
#else
VERIFY_TEXT_REPLY_XFAIL(QTBUG-120307);
#endif
// Successful UTF-8 (empty charset)
serverSideResponse.headers["Content-Type:"_ba] = "text/plain; charset=\"\""_ba;
serverSideResponse.body = encUTF8(sourceString);
VERIFY_TEXT_REPLY_XFAIL(QTBUG-120307);
// Successful UTF-8 (implicit)
serverSideResponse.headers["Content-Type:"_ba] = "text/plain"_ba;
serverSideResponse.body = encUTF8(sourceString);
VERIFY_TEXT_REPLY_OK;
// Successful UTF-16
serverSideResponse.headers.insert("Content-Type:"_ba, "text/plain; charset=UTF-16"_ba);
serverSideResponse.body = encUTF16(sourceString);
@ -741,12 +764,18 @@ void tst_QRestAccessManager::text()
serverSideResponse.body = encUTF32(sourceString);
VERIFY_TEXT_REPLY_OK;
// Successful UTF-32 with spec-wise allowed extra content in the Content-Type header value
// Successful UTF-32 with spec-wise allowed extra trailing content in the Content-Type header value
serverSideResponse.headers.insert("Content-Type:"_ba,
"text/plain; charset = \"UTF-32\";extraparameter=bar"_ba);
serverSideResponse.body = encUTF32(sourceString);
VERIFY_TEXT_REPLY_OK;
// Successful UTF-32 with spec-wise allowed extra leading content in the Content-Type header value
serverSideResponse.headers.insert("Content-Type:"_ba,
"text/plain; extraparameter=bar;charset = \"UT\\F-32\""_ba);
serverSideResponse.body = encUTF32(sourceString);
VERIFY_TEXT_REPLY_XFAIL(QTBUG-120307);
{
// Unsuccessful UTF-32, wrong encoding indicated (indicated UTF-32 but data is UTF-8)
serverSideResponse.headers.insert("Content-Type:"_ba, "text/plain; charset=UTF-32"_ba);