Improve code coverage and debug server handler

This commit is contained in:
Simon Stürz 2018-02-10 17:08:58 +01:00 committed by Michael Zanetti
parent 568cb749b1
commit eafa59b32f
5 changed files with 161 additions and 94 deletions

View File

@ -223,6 +223,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Log database"));
writer.writeTextElement("td", GuhSettings::logPath());
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
@ -236,7 +237,8 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeEndElement(); // tr
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Syslog"));
writer.writeTextElement("th", QCoreApplication::translate("main", "System logs"));
writer.writeTextElement("td", "/var/log/syslog");
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
@ -262,6 +264,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Guhd settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleGlobal).fileName());
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
@ -276,6 +279,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Device settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleDevices).fileName());
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
@ -290,6 +294,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Device state settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleDeviceStates).fileName());
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
@ -305,6 +310,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Rules settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleRules).fileName());
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
@ -317,6 +323,21 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Plugins settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRolePlugins).fileName());
writer.writeStartElement("td");
writer.writeStartElement("form");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/settings/plugins");
writer.writeStartElement("button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // table
writer.writeEmptyElement("hr");
@ -385,17 +406,52 @@ QByteArray DebugServerHandler::loadResourceFile(const QString &resourceFileName)
return inputStream.readAll().toUtf8();
}
bool DebugServerHandler::resourceFileExits(const QString &resourceFileName)
QString DebugServerHandler::getResourceFileName(const QString &requestPath)
{
QFile resourceFile(QString(":%1").arg(resourceFileName));
return QString(requestPath).remove("/debug");
}
bool DebugServerHandler::resourceFileExits(const QString &requestPath)
{
QFile resourceFile(QString(":%1").arg(getResourceFileName(requestPath)));
return resourceFile.exists();
}
HttpReply *DebugServerHandler::processDebugFileRequest(const QString &requestPath)
{
// Here we already know that the resource file exists
QString resourceFileName = getResourceFileName(requestPath);
QByteArray data = loadResourceFile(resourceFileName);
// Create reply for resource file
HttpReply *reply = RestResource::createSuccessReply();
reply->setPayload(data);
// Check content type
if (resourceFileName.endsWith(".css")) {
reply->setHeader(HttpReply::ContentTypeHeader, "text/css; charset=\"utf-8\";");
} else if (resourceFileName.endsWith(".svg")) {
reply->setHeader(HttpReply::ContentTypeHeader, "image/svg+xml; charset=\"utf-8\";");
}
return reply;
}
HttpReply *DebugServerHandler::processDebugRequest(const QString &requestPath)
{
qCDebug(dcWebServer()) << "Debug request for" << requestPath;
// Check if debug page request
if (requestPath == "/debug" || requestPath == "/debug/") {
qCDebug(dcWebServer()) << "Create debug interface page";
// Fallback default debug page
HttpReply *reply = RestResource::createSuccessReply();
reply->setHeader(HttpReply::ContentTypeHeader, "text/html");
reply->setPayload(createDebugXmlDocument());
return reply;
}
// Check if this is a logdb requested
if (requestPath.startsWith("/debug/logdb.sql")) {
qCDebug(dcWebServer()) << "Loading" << GuhSettings::logPath();
@ -573,66 +629,46 @@ HttpReply *DebugServerHandler::processDebugRequest(const QString &requestPath)
reply->setPayload(settingsFileData);
return reply;
}
}
// Check if a resource file was requested
if (requestPath.startsWith("/debug/settings/plugins")) {
QString settingsFileName = GuhSettings(GuhSettings::SettingsRolePlugins).fileName();
qCDebug(dcWebServer()) << "Loading" << settingsFileName;
QFile settingsFile(settingsFileName);
if (!settingsFile.exists()) {
qCWarning(dcWebServer()) << "Could not read file for debug download" << settingsFileName << "file does not exist.";
HttpReply *reply = RestResource::createErrorReply(HttpReply::NotFound);
reply->setHeader(HttpReply::ContentTypeHeader, "text/html");
reply->setPayload(createErrorXmlDocument(HttpReply::NotFound, QCoreApplication::translate("main", "Could not find file") + " " + settingsFileName));
return reply;
}
if (requestPath.startsWith("/debug/styles.css")) {
QString resourceFileName = "/styles.css";
// Check if exists
if (!resourceFileExits(resourceFileName)) {
qCWarning(dcWebServer()) << "The requested resource file" << resourceFileName << "does not exist";
HttpReply *reply = RestResource::createErrorReply(HttpReply::NotFound);
if (!settingsFile.open(QFile::ReadOnly)) {
qCWarning(dcWebServer()) << "Could not read file for debug download" << settingsFileName;
HttpReply *reply = RestResource::createErrorReply(HttpReply::Forbidden);
reply->setHeader(HttpReply::ContentTypeHeader, "text/html");
reply->setPayload(createErrorXmlDocument(HttpReply::NotFound, QCoreApplication::translate("main", "Could not open file") + " " + settingsFileName));
return reply;
}
QByteArray settingsFileData = settingsFile.readAll();
settingsFile.close();
HttpReply *reply = RestResource::createSuccessReply();
reply->setHeader(HttpReply::ContentTypeHeader, "text/plain");
reply->setPayload(createErrorXmlDocument(HttpReply::NotFound, QCoreApplication::translate("main", "Could not find find") + " " + resourceFileName));
reply->setPayload(settingsFileData);
return reply;
}
QByteArray data = loadResourceFile(resourceFileName);
// Check if content loaded
if (data.isEmpty()) {
qCWarning(dcWebServer()) << "Empty resource file" << resourceFileName;
HttpReply *reply = RestResource::createErrorReply(HttpReply::NoContent);
reply->setHeader(HttpReply::ContentTypeHeader, "text/plain");
reply->setPayload(createErrorXmlDocument(HttpReply::NotFound, QCoreApplication::translate("main", "Could not find find") + " " + resourceFileName));
return reply;
}
HttpReply *reply = RestResource::createSuccessReply();
reply->setHeader(HttpReply::ContentTypeHeader, "text/css; charset=\"utf-8\";");
reply->setPayload(data);
return reply;
}
// Check if this is a resource file request
if (resourceFileExits(requestPath)) {
return processDebugFileRequest(requestPath);
}
// if (!fileName.endsWith(".png"))
// return RestResource::createErrorReply(HttpReply::NotFound);
// QByteArray imageData;
// QImage image(":" + fileName);
// QBuffer buffer(&imageData);
// buffer.open(QIODevice::WriteOnly);
// image.save(&buffer, "png");
// if (!imageData.isEmpty()) {
// HttpReply *reply = RestResource::createSuccessReply();
// reply->setHeader(HttpReply::ContentTypeHeader, "image/png");
// reply->setPayload(imageData);
// return reply;
// }
// return RestResource::createErrorReply(HttpReply::NotFound);
qCDebug(dcWebServer()) << "Create debug interface page";
// Fallback default debug page
HttpReply *reply = RestResource::createSuccessReply();
reply->setHeader(HttpReply::ContentTypeHeader, "text/html");
reply->setPayload(createDebugXmlDocument());
// If nothing matches, redirect to /debug page
qCWarning(dcWebServer()) << "Resource for debug interface not found. Redirecting to /debug";
HttpReply *reply = RestResource::createErrorReply(HttpReply::PermanentRedirect);
reply->setHeader(HttpReply::LocationHeader, "/debug");
return reply;
}

View File

@ -39,7 +39,11 @@ private:
QByteArray createDebugXmlDocument();
QByteArray createErrorXmlDocument(HttpReply::HttpStatusCode statusCode, const QString &errorMessage);
QByteArray loadResourceFile(const QString &resourceFileName);
bool resourceFileExits(const QString &resourceFileName);
QString getResourceFileName(const QString &requestPath);
bool resourceFileExits(const QString &requestPath);
HttpReply *processDebugFileRequest(const QString &requestPath);
};
}

View File

@ -47,6 +47,8 @@
The request has no content but it was expected.
\value Found
The resource was found.
\value PermanentRedirect
The resource redirects permanent to given url.
\value BadRequest
The request was bad formatted. Also if a \l{Param} was not understood or the header is not correct.
\value Forbidden
@ -352,6 +354,8 @@ QByteArray HttpReply::getHttpReasonPhrase(const HttpReply::HttpStatusCode &statu
return "No Content";
case Found:
return "Found";
case PermanentRedirect:
return "Permanent Redirect";
case BadRequest:
return "Bad Request";
case Forbidden:

View File

@ -42,6 +42,7 @@ public:
Accepted = 202,
NoContent = 204,
Found = 302,
PermanentRedirect = 308,
BadRequest = 400,
Forbidden = 403,
NotFound = 404,

View File

@ -482,6 +482,13 @@ void TestWebserver::getDebugServer_data()
QTest::addColumn<bool>("serverEnabled");
QTest::addColumn<int>("expectedStatusCode");
// Resource files
QTest::newRow("GET /debug/styles.css | server enabled | 200") << "get" << "/debug/styles.css" << true << 200;
QTest::newRow("GET /debug/logo.svg | server enabled | 200") << "get" << "/debug/logo.svg" << true << 200;
// Check redirection
QTest::newRow("GET /debug/thisresourcedoesnotexist | server enabled | 308-200") << "get" << "/debug/thisresourcedoesnotexist" << true << 308;
// debug enabled
QTest::newRow("GET /debug | server enabled | 200") << "get" << "/debug" << true << 200;
QTest::newRow("OPTIONS /debug | server enabled | 200") << "options" << "/debug" << true << 200;
@ -496,19 +503,33 @@ void TestWebserver::getDebugServer_data()
QTest::newRow("POST /debug | server disabled | 404") << "post" << "/debug" << false << 404;
QTest::newRow("DELETE /debug | server disabled | 404") << "delete" << "/debug" << false << 404;
// styles.css enabled
QTest::newRow("GET /debug/styles.css | server enabled | 200") << "get" << "/debug/styles.css" << true << 200;
QTest::newRow("OPTIONS /debug/styles.css | server enabled | 200") << "options" << "/debug/styles.css" << true << 200;
QTest::newRow("PUT /debug/styles.css | server enabled | 405") << "put" << "/debug/styles.css" << true << 405;
QTest::newRow("POST /debug/styles.css | server enabled | 405") << "post" << "/debug/styles.css" << true << 405;
QTest::newRow("DELETE /debug/styles.css | server enabled | 405") << "delete" << "/debug/styles.css" << true << 405;
// styles.css disabled
QTest::newRow("GET /debug/styles.css | server disabled | 404") << "get" << "/debug/styles.css" << false << 404;
QTest::newRow("OPTIONS /debug/styles.css | server disabled | 404") << "options" << "/debug/styles.css" << false << 404;
QTest::newRow("PUT /debug/styles.css | server disabled | 404") << "put" << "/debug/styles.css" << false << 404;
QTest::newRow("POST /debug/styles.css | server disabled | 404") << "post" << "/debug/styles.css" << false << 404;
QTest::newRow("DELETE /debug/styles.css | server disabled | 404") << "delete" << "/debug/styles.css" << false << 404;
// logdb enabled
QTest::newRow("GET /debug/logdb | server enabled | 200") << "get" << "/debug/logdb" << true << 200;
QTest::newRow("OPTIONS /debug/logdb | server enabled | 200") << "options" << "/debug/logdb" << true << 200;
QTest::newRow("PUT /debug/logdb | server enabled | 405") << "put" << "/debug/logdb" << true << 405;
QTest::newRow("POST /debug/logdb | server enabled | 405") << "post" << "/debug/logdb" << true << 405;
QTest::newRow("DELETE /debug/logdb | server enabled | 405") << "delete" << "/debug/logdb" << true << 405;
QTest::newRow("GET /debug/logdb.sql | server enabled | 200") << "get" << "/debug/logdb.sql" << true << 200;
QTest::newRow("OPTIONS /debug/logdb.sql | server enabled | 200") << "options" << "/debug/logdb.sql" << true << 200;
QTest::newRow("PUT /debug/logdb.sql | server enabled | 405") << "put" << "/debug/logdb.sql" << true << 405;
QTest::newRow("POST /debug/logdb.sql | server enabled | 405") << "post" << "/debug/logdb.sql" << true << 405;
QTest::newRow("DELETE /debug/logdb.sql | server enabled | 405") << "delete" << "/debug/logdb.sql" << true << 405;
// logdb disabled
QTest::newRow("GET /debug/logdb | server enabled | 404") << "get" << "/debug/logdb" << false << 404;
QTest::newRow("OPTIONS /debug/logdb | server enabled | 404") << "options" << "/debug/logdb" << false << 404;
QTest::newRow("PUT /debug/logdb | server enabled | 404") << "put" << "/debug/logdb" << false << 404;
QTest::newRow("POST /debug/logdb | server enabled | 404") << "post" << "/debug/logdb" << false << 404;
QTest::newRow("DELETE /debug/logdb | server enabled | 404") << "delete" << "/debug/logdb" << false << 404;
QTest::newRow("GET /debug/logdb.sql | server disabled | 404") << "get" << "/debug/logdb.sql" << false << 404;
QTest::newRow("OPTIONS /debug/logdb.sql | server disabled | 404") << "options" << "/debug/logdb.sql" << false << 404;
QTest::newRow("PUT /debug/logdb.sql | server disabled | 404") << "put" << "/debug/logdb.sql" << false << 404;
QTest::newRow("POST /debug/logdb.sql | server disabled | 404") << "post" << "/debug/logdb.sql" << false << 404;
QTest::newRow("DELETE /debug/logdb.sql | server disabled | 404") << "delete" << "/debug/logdb.sql" << false << 404;
// Check if syslog is accessable
QFileInfo syslogFileInfo("/var/log/syslog");
@ -516,17 +537,17 @@ void TestWebserver::getDebugServer_data()
if (syslogFileInfo.exists() && syslogFileInfo.isReadable()) {
// syslog enabled
QTest::newRow("GET /debug/syslog | server enabled | 200") << "get" << "/debug/syslog" << true << 200;
QTest::newRow("OPTIONS /debug/syslog | server enabled | 200") << "options" << "/debug/logdb" << true << 200;
QTest::newRow("PUT /debug/syslog | server enabled | 405") << "put" << "/debug/logdb" << true << 405;
QTest::newRow("POST /debug/syslog | server enabled | 405") << "post" << "/debug/logdb" << true << 405;
QTest::newRow("DELETE /debug/syslog | server enabled | 405") << "delete" << "/debug/logdb" << true << 405;
QTest::newRow("OPTIONS /debug/syslog | server enabled | 200") << "options" << "/debug/syslog" << true << 200;
QTest::newRow("PUT /debug/syslog | server enabled | 405") << "put" << "/debug/syslog" << true << 405;
QTest::newRow("POST /debug/syslog | server enabled | 405") << "post" << "/debug/syslog" << true << 405;
QTest::newRow("DELETE /debug/syslog | server enabled | 405") << "delete" << "/debug/syslog" << true << 405;
} else {
// syslog enabled, but not readable
QTest::newRow("GET /debug/syslog | server enabled | 200") << "get" << "/debug/syslog" << true << 403;
QTest::newRow("OPTIONS /debug/syslog | server enabled | 200") << "options" << "/debug/logdb" << true << 200;
QTest::newRow("PUT /debug/syslog | server enabled | 405") << "put" << "/debug/logdb" << true << 405;
QTest::newRow("POST /debug/syslog | server enabled | 405") << "post" << "/debug/logdb" << true << 405;
QTest::newRow("DELETE /debug/syslog | server enabled | 405") << "delete" << "/debug/logdb" << true << 405;
QTest::newRow("OPTIONS /debug/syslog | server enabled | 200") << "options" << "/debug/syslog" << true << 200;
QTest::newRow("PUT /debug/syslog | server enabled | 405") << "put" << "/debug/syslog" << true << 405;
QTest::newRow("POST /debug/syslog | server enabled | 405") << "post" << "/debug/syslog" << true << 405;
QTest::newRow("DELETE /debug/syslog | server enabled | 405") << "delete" << "/debug/syslog" << true << 405;
}
// syslog disabled
@ -544,11 +565,11 @@ void TestWebserver::getDebugServer_data()
QTest::newRow("DELETE /debug/settings/guhd | server enabled | 405") << "delete" << "/debug/settings/guhd" << true << 405;
// settings/guhd disabled
QTest::newRow("GET /debug/settings/guhd | server enabled | 404") << "get" << "/debug/settings/guhd" << false << 404;
QTest::newRow("OPTIONS /debug/settings/guhd | server enabled | 404") << "options" << "/debug/settings/guhd" << false << 404;
QTest::newRow("PUT /debug/settings/guhd | server enabled | 404") << "put" << "/debug/settings/guhd" << false << 404;
QTest::newRow("POST /debug/settings/guhd | server enabled | 404") << "post" << "/debug/settings/guhd" << false << 404;
QTest::newRow("DELETE /debug/settings/guhd | server enabled | 404") << "delete" << "/debug/settings/guhd" << false << 404;
QTest::newRow("GET /debug/settings/guhd | server disabled | 404") << "get" << "/debug/settings/guhd" << false << 404;
QTest::newRow("OPTIONS /debug/settings/guhd | server disabled | 404") << "options" << "/debug/settings/guhd" << false << 404;
QTest::newRow("PUT /debug/settings/guhd | server disabled | 404") << "put" << "/debug/settings/guhd" << false << 404;
QTest::newRow("POST /debug/settings/guhd | server disabled | 404") << "post" << "/debug/settings/guhd" << false << 404;
QTest::newRow("DELETE /debug/settings/guhd | server disabled | 404") << "delete" << "/debug/settings/guhd" << false << 404;
// settings/devices enabled
QTest::newRow("GET /debug/settings/devices | server enabled | 200") << "get" << "/debug/settings/devices" << true << 200;
@ -558,11 +579,11 @@ void TestWebserver::getDebugServer_data()
QTest::newRow("DELETE /debug/settings/devices | server enabled | 405") << "delete" << "/debug/settings/devices" << true << 405;
// settings/devices disabled
QTest::newRow("GET /debug/settings/devices | server enabled | 404") << "get" << "/debug/settings/devices" << false << 404;
QTest::newRow("OPTIONS /debug/settings/devices | server enabled | 404") << "options" << "/debug/settings/devices" << false << 404;
QTest::newRow("PUT /debug/settings/devices | server enabled | 404") << "put" << "/debug/settings/devices" << false << 404;
QTest::newRow("POST /debug/settings/devices | server enabled | 404") << "post" << "/debug/settings/devices" << false << 404;
QTest::newRow("DELETE /debug/settings/devices | server enabled | 404") << "delete" << "/debug/settings/devices" << false << 404;
QTest::newRow("GET /debug/settings/devices | server disabled | 404") << "get" << "/debug/settings/devices" << false << 404;
QTest::newRow("OPTIONS /debug/settings/devices | server disabled | 404") << "options" << "/debug/settings/devices" << false << 404;
QTest::newRow("PUT /debug/settings/devices | server disabled | 404") << "put" << "/debug/settings/devices" << false << 404;
QTest::newRow("POST /debug/settings/devices | server disabled | 404") << "post" << "/debug/settings/devices" << false << 404;
QTest::newRow("DELETE /debug/settings/devices | server disabled | 404") << "delete" << "/debug/settings/devices" << false << 404;
// settings/rules enabled
QTest::newRow("GET /debug/settings/rules | server enabled | 200") << "get" << "/debug/settings/rules" << true << 200;
@ -572,11 +593,11 @@ void TestWebserver::getDebugServer_data()
QTest::newRow("DELETE /debug/settings/rules | server enabled | 405") << "delete" << "/debug/settings/rules" << true << 405;
// settings/rules disabled
QTest::newRow("GET /debug/settings/rules | server enabled | 404") << "get" << "/debug/settings/rules" << false << 404;
QTest::newRow("OPTIONS /debug/settings/rules | server enabled | 404") << "options" << "/debug/settings/rules" << false << 404;
QTest::newRow("PUT /debug/settings/rules | server enabled | 404") << "put" << "/debug/settings/rules" << false << 404;
QTest::newRow("POST /debug/settings/rules | server enabled | 404") << "post" << "/debug/settings/rules" << false << 404;
QTest::newRow("DELETE /debug/settings/rules | server enabled | 404") << "delete" << "/debug/settings/rules" << false << 404;
QTest::newRow("GET /debug/settings/rules | server disabled | 404") << "get" << "/debug/settings/rules" << false << 404;
QTest::newRow("OPTIONS /debug/settings/rules | server disabled | 404") << "options" << "/debug/settings/rules" << false << 404;
QTest::newRow("PUT /debug/settings/rules | server disabled | 404") << "put" << "/debug/settings/rules" << false << 404;
QTest::newRow("POST /debug/settings/rules | server disabled | 404") << "post" << "/debug/settings/rules" << false << 404;
QTest::newRow("DELETE /debug/settings/rules | server disabled | 404") << "delete" << "/debug/settings/rules" << false << 404;
// settings/devicestates enabled
QTest::newRow("GET /debug/settings/devicestates | server enabled | 200") << "get" << "/debug/settings/devicestates" << true << 200;
@ -586,11 +607,12 @@ void TestWebserver::getDebugServer_data()
QTest::newRow("DELETE /debug/settings/devicestates | server enabled | 405") << "delete" << "/debug/settings/devicestates" << true << 405;
// settings/devicestates disabled
QTest::newRow("GET /debug/settings/devicestates | server enabled | 404") << "get" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("OPTIONS /debug/settings/devicestates | server enabled | 404") << "options" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("PUT /debug/settings/devicestates | server enabled | 404") << "put" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("POST /debug/settings/devicestates | server enabled | 404") << "post" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("DELETE /debug/settings/devicestates | server enabled | 404") << "delete" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("GET /debug/settings/devicestates | server disabled | 404") << "get" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("OPTIONS /debug/settings/devicestates | server disabled | 404") << "options" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("PUT /debug/settings/devicestates | server disabled | 404") << "put" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("POST /debug/settings/devicestates | server disabled | 404") << "post" << "/debug/settings/devicestates" << false << 404;
QTest::newRow("DELETE /debug/settings/devicestates | server disabled | 404") << "delete" << "/debug/settings/devicestates" << false << 404;
}
void TestWebserver::getDebugServer()