diff --git a/server/rest/restresource.cpp b/server/rest/restresource.cpp index edc1c88a..a61ded20 100644 --- a/server/rest/restresource.cpp +++ b/server/rest/restresource.cpp @@ -78,7 +78,6 @@ HttpReply *RestResource::proccessPostRequest(const HttpRequest &request, const Q { Q_UNUSED(request) Q_UNUSED(urlTokens) - return createErrorReply(HttpReply::NotImplemented); } @@ -86,7 +85,6 @@ HttpReply *RestResource::proccessPutRequest(const HttpRequest &request, const QS { Q_UNUSED(request) Q_UNUSED(urlTokens) - return createErrorReply(HttpReply::NotImplemented); } @@ -94,7 +92,6 @@ HttpReply *RestResource::proccessDeleteRequest(const HttpRequest &request, const { Q_UNUSED(request) Q_UNUSED(urlTokens) - return createErrorReply(HttpReply::NotImplemented); } @@ -102,7 +99,6 @@ HttpReply *RestResource::proccessGetRequest(const HttpRequest &request, const QS { Q_UNUSED(request) Q_UNUSED(urlTokens) - return createErrorReply(HttpReply::NotImplemented); } diff --git a/server/webserver.cpp b/server/webserver.cpp index 78d78b9f..1fa9c9e2 100644 --- a/server/webserver.cpp +++ b/server/webserver.cpp @@ -102,7 +102,7 @@ bool WebServer::verifyFile(QTcpSocket *socket, const QString &fileName) // make shore the file exists if (!file.exists()) { - qCWarning(dcWebServer) << "requested file" << file.fileName() << "does not exist."; + qCWarning(dcWebServer) << "requested file" << file.filePath() << "does not exist."; HttpReply reply(HttpReply::NotFound); reply.setPayload("404 Not found."); reply.packReply(); @@ -195,6 +195,7 @@ void WebServer::readClient() HttpRequest request; if (m_incompleteRequests.contains(socket)) { + qCWarning(dcWebServer) << "Append data to incomlete request"; request = m_incompleteRequests.take(socket); request.appendData(data); } else { @@ -202,7 +203,6 @@ void WebServer::readClient() } if (!request.isComplete()) { - qCWarning(dcWebServer) << "Hash incomplete message."; m_incompleteRequests.insert(socket, request); return; } diff --git a/tests/auto/restdevices/testrestdevices.cpp b/tests/auto/restdevices/testrestdevices.cpp index 7fbc3cdd..f5042da7 100644 --- a/tests/auto/restdevices/testrestdevices.cpp +++ b/tests/auto/restdevices/testrestdevices.cpp @@ -53,6 +53,12 @@ private slots: void getStateValue_data(); void getStateValue(); + void editDevices_data(); + void editDevices(); + + void editByDiscovery_data(); + void editByDiscovery(); + private: // for debugging void printResponse(QNetworkReply *reply, const QByteArray &data); @@ -333,6 +339,157 @@ void TestRestDevices::getStateValue() reply->deleteLater(); } +void TestRestDevices::editDevices_data() +{ + QVariantList asyncChangeDeviceParams; + QVariantMap asyncParamDifferent; + asyncParamDifferent.insert("name", "async"); + asyncParamDifferent.insert("value", true); + asyncChangeDeviceParams.append(asyncParamDifferent); + + QVariantList httpportChangeDeviceParams; + QVariantMap httpportParamDifferent; + httpportParamDifferent.insert("name", "httpport"); + httpportParamDifferent.insert("value", 8893); // if change -> change also newPort in editDevices() + httpportChangeDeviceParams.append(httpportParamDifferent); + + QVariantList brokenChangedDeviceParams; + QVariantMap brokenParamDifferent; + brokenParamDifferent.insert("name", "broken"); + brokenParamDifferent.insert("value", true); + brokenChangedDeviceParams.append(brokenParamDifferent); + + QVariantList nameChangedDeviceParams; + QVariantMap nameParam; + nameParam.insert("name", "name"); + nameParam.insert("value", "Awesome Mockdevice"); + nameChangedDeviceParams.append(nameParam); + + + QVariantList asyncAndPortChangeDeviceParams; + asyncAndPortChangeDeviceParams.append(asyncParamDifferent); + asyncAndPortChangeDeviceParams.append(httpportParamDifferent); + + + QVariantList changeAllWritableDeviceParams; + changeAllWritableDeviceParams.append(nameParam); + changeAllWritableDeviceParams.append(asyncParamDifferent); + changeAllWritableDeviceParams.append(httpportParamDifferent); + + + QTest::addColumn("broken"); + QTest::addColumn("newDeviceParams"); + QTest::addColumn("expectedStatusCode"); + + QTest::newRow("valid - change async param") << false << asyncChangeDeviceParams << 200; + QTest::newRow("valid - change httpport param") << false << httpportChangeDeviceParams << 200; + QTest::newRow("valid - change httpport and async param") << false << asyncAndPortChangeDeviceParams << 200; + QTest::newRow("invalid - change name param (not writable)") << false << nameChangedDeviceParams << 500; + QTest::newRow("invalid - change all params (except broken)") << false << changeAllWritableDeviceParams << 500; +} + +void TestRestDevices::editDevices() +{ + QFETCH(bool, broken); + QFETCH(QVariantList, newDeviceParams); + QFETCH(int, expectedStatusCode); + + // add device + QVariantMap params; + params.insert("deviceClassId", mockDeviceClassId); + QVariantList deviceParams; + QVariantMap nameParam; + nameParam.insert("name", "name"); + nameParam.insert("value", "Test edit mockdevice"); + deviceParams.append(nameParam); + QVariantMap asyncParam; + asyncParam.insert("name", "async"); + asyncParam.insert("value", false); + deviceParams.append(asyncParam); + QVariantMap brokenParam; + brokenParam.insert("name", "broken"); + brokenParam.insert("value", broken); + deviceParams.append(brokenParam); + QVariantMap httpportParam; + httpportParam.insert("name", "httpport"); + httpportParam.insert("value", 8892); + deviceParams.append(httpportParam); + params.insert("deviceParams", deviceParams); + + // add a mockdevice + QNetworkAccessManager *nam = new QNetworkAccessManager(); + QSignalSpy clientSpy(nam, SIGNAL(finished(QNetworkReply*))); + + QNetworkRequest request(QUrl(QString("http://localhost:3000/api/v1/devices"))); + + QNetworkReply *reply = nam->post(request, QJsonDocument::fromVariant(params).toJson(QJsonDocument::Compact)); + clientSpy.wait(); + QCOMPARE(clientSpy.count(), 1); + + QByteArray data = reply->readAll(); + int statusCode; + + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); + reply->deleteLater(); + QVariantMap responseMap = QJsonDocument::fromJson(data).toVariant().toMap(); + DeviceId deviceId = DeviceId(responseMap.value("deviceId").toString()); + qDebug() << deviceId.toString(); + QVERIFY2(deviceId != DeviceId(), "DeviceId not returned"); + + + // now EDIT the added device + QVariantMap editParams; + editParams.insert("deviceId", deviceId); + editParams.insert("deviceParams", newDeviceParams); + + request.setUrl(QUrl(QString("http://localhost:3000/api/v1/devices/%1").arg(deviceId.toString()))); + clientSpy.clear(); + reply = nam->put(request, QJsonDocument::fromVariant(editParams).toJson(QJsonDocument::Compact)); + clientSpy.wait(); + QVERIFY2(clientSpy.count() == 1, "expected exactly 1 response from webserver"); + statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + QCOMPARE(statusCode, expectedStatusCode); + reply->deleteLater(); + + // if the edit should have been successfull + if (expectedStatusCode == 200) { + + request.setUrl(QUrl(QString("http://localhost:3000/api/v1/devices/%1").arg(deviceId.toString()))); + clientSpy.clear(); + reply = nam->get(request); + clientSpy.wait(); + QVERIFY2(clientSpy.count() == 1, "expected exactly 1 response from webserver"); + statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + QVariantMap deviceMap = QJsonDocument::fromJson(reply->readAll()).toVariant().toMap(); + + verifyParams(newDeviceParams, deviceMap.value("params").toList(), false); + + QCOMPARE(statusCode, 200); + reply->deleteLater(); + } + + // delete it + request.setUrl(QUrl(QString("http://localhost:3000/api/v1/devices/%1").arg(deviceId.toString()))); + clientSpy.clear(); + reply = nam->deleteResource(request); + clientSpy.wait(); + QVERIFY2(clientSpy.count() == 1, "expected exactly 1 response from webserver"); + statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + reply->deleteLater(); + QCOMPARE(statusCode, 200); +} + +void TestRestDevices::editByDiscovery_data() +{ + +} + +void TestRestDevices::editByDiscovery() +{ + +} + void TestRestDevices::printResponse(QNetworkReply *reply, const QByteArray &data) { qDebug() << "-------------------------------"; diff --git a/tests/auto/webserver/testwebserver.cpp b/tests/auto/webserver/testwebserver.cpp index 501bb084..8aaf5b48 100644 --- a/tests/auto/webserver/testwebserver.cpp +++ b/tests/auto/webserver/testwebserver.cpp @@ -216,10 +216,20 @@ void TestWebserver::badRequests_data() wrongContentLength.append("\r\n"); wrongContentLength.append("longer content than told in the header"); + QByteArray wrongHeaderFormatting; + wrongHeaderFormatting.append("PUT / HTTP/1.1\r\n"); + wrongHeaderFormatting.append("User-Agent webserver test\r\n"); + wrongHeaderFormatting.append("Content-Length: 1\r\n"); + wrongHeaderFormatting.append("\r\n"); + QByteArray userAgentMissing; + userAgentMissing.append("GET / HTTP/1.1\r\n"); + userAgentMissing.append("\r\n"); QTest::newRow("wrong content length") << wrongContentLength << 400; + QTest::newRow("invalid header formatting") << wrongHeaderFormatting << 400; + QTest::newRow("user agent missing") << userAgentMissing << 400; }