Add JSON utility functions to QObjectHandler.

This commit is contained in:
Nathan Osman
2016-10-13 15:33:55 -07:00
parent c1fc8a115d
commit 5968739f03
7 changed files with 149 additions and 34 deletions

View File

@@ -20,6 +20,8 @@
* IN THE SOFTWARE.
*/
#include <QJsonDocument>
#include <QJsonObject>
#include <QObject>
#include <QTest>
@@ -40,6 +42,12 @@ public Q_SLOTS:
void valid(QHttpSocket *socket) {
socket->writeError(QHttpSocket::OK);
}
void echo(QHttpSocket *socket) {
QJsonDocument document;
if (QObjectHandler::readJson(socket, document)) {
QObjectHandler::writeJson(socket, document);
}
}
};
class TestQObjectHandler : public QObject
@@ -55,24 +63,46 @@ private Q_SLOTS:
void TestQObjectHandler::testOldConnection_data()
{
QTest::addColumn<bool>("sendObject");
QTest::addColumn<QJsonObject>("object");
QTest::addColumn<QByteArray>("slot");
QTest::addColumn<int>("statusCode");
QTest::newRow("invalid slot")
<< false
<< QJsonObject()
<< QByteArray(SLOT(invalid()))
<< static_cast<int>(QHttpSocket::InternalServerError);
QTest::newRow("wrong argument count")
<< false
<< QJsonObject()
<< QByteArray(SLOT(wrongArgumentCount()))
<< static_cast<int>(QHttpSocket::InternalServerError);
QTest::newRow("wrong argument type")
<< false
<< QJsonObject()
<< QByteArray(SLOT(wrongArgumentType(int)))
<< static_cast<int>(QHttpSocket::InternalServerError);
QTest::newRow("valid")
<< false
<< QJsonObject()
<< QByteArray(SLOT(valid(QHttpSocket*)))
<< static_cast<int>(QHttpSocket::OK);
QTest::newRow("json")
<< true
<< QJsonObject{{"a", "b"}, {"c", 1}}
<< QByteArray(SLOT(echo(QHttpSocket*)))
<< static_cast<int>(QHttpSocket::OK);
}
void TestQObjectHandler::testOldConnection()
{
QFETCH(bool, sendObject);
QFETCH(QJsonObject, object);
QFETCH(QByteArray, slot);
QFETCH(int, statusCode);
@@ -87,11 +117,28 @@ void TestQObjectHandler::testOldConnection()
QSimpleHttpClient client(pair.client());
QHttpSocket socket(pair.server(), &pair);
client.sendHeaders("GET", "test");
if (sendObject) {
QByteArray data = QJsonDocument(object).toJson();
client.sendHeaders("POST", "test", QHttpSocket::QHttpHeaderMap{
{"Content-Length", QByteArray::number(data.length())},
{"Content-Type", "application/json"}
});
client.sendData(data);
} else {
client.sendHeaders("GET", "test");
}
QTRY_VERIFY(socket.isHeadersParsed());
handler.route(&socket, socket.path());
QTRY_COMPARE(client.statusCode(), statusCode);
if (sendObject) {
QTRY_VERIFY(client.isDataReceived());
QJsonObject outObject = QJsonDocument::fromJson(client.data()).object();
QCOMPARE(object, outObject);
}
}
void TestQObjectHandler::testNewConnection()

View File

@@ -66,3 +66,9 @@ void QSimpleHttpClient::onReadyRead()
}
}
}
bool QSimpleHttpClient::isDataReceived() const
{
return mHeaders.contains("Content-Length") &&
mData.length() >= mHeaders.value("Content-Length").toInt();
}

View File

@@ -64,6 +64,8 @@ public:
return mData;
}
bool isDataReceived() const;
private Q_SLOTS:
void onReadyRead();