/*! * \brief Unit tests for \ref HttpResponse * * \copyright Copyright (c) 2016-2018 Governikus GmbH & Co. KG, Germany */ #include "HttpServer.h" #include "Env.h" #include "LogHandler.h" #include #include #include #include #include using namespace governikus; class test_HttpServer : public QObject { Q_OBJECT private: QNetworkAccessManager mAccessManager; private Q_SLOTS: void initTestCase() { Env::getSingleton()->init(); } void init() { HttpServer::cPort = 0; } void cleanup() { Env::getSingleton()->resetBacklog(); } void startUpShutDown() { QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); auto server = Env::getShared(); QVERIFY(server->isListening()); QCOMPARE(spy.count(), 2); auto param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Spawn shared instance: governikus::HttpServer")); param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Listening on port:")); server.reset(); QCOMPARE(spy.count(), 1); param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Shutdown server")); } void cannotStart() { #ifdef Q_OS_WIN QSKIP("Windows does not block privileged ports"); #endif HttpServer::cPort = 80; QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); HttpServer server; QVERIFY(!server.isListening()); QCOMPARE(spy.count(), 1); auto param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Cannot start server: \"The address is protected\"")); } void sendRequest() { HttpServer server; QVERIFY(server.isListening()); QSignalSpy spyServer(&server, &HttpServer::fireNewHttpRequest); auto url = QUrl("http://127.0.0.1:" + QString::number(server.getServerPort()) + "/eID-Client?tcTokenURL=https%3A%2F%2Fdummy.de"); auto reply = mAccessManager.get(QNetworkRequest(url)); QSignalSpy spyClient(reply, &QNetworkReply::finished); QTRY_COMPARE(spyServer.count(), 1); auto param = spyServer.takeFirst(); auto httpRequest = qvariant_cast >(param.at(0)); QCOMPARE(httpRequest->getMethod(), QByteArray("GET")); QCOMPARE(httpRequest->getUrl(), QUrl("/eID-Client?tcTokenURL=https%3A%2F%2Fdummy.de")); QVERIFY(httpRequest->send(HTTP_STATUS_NOT_FOUND)); QTRY_COMPARE(spyClient.count(), 1); QCOMPARE(reply->error(), QNetworkReply::ContentNotFoundError); QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 404); } void websocketUpgrade() { HttpServer server; QVERIFY(server.isListening()); QSignalSpy spyServer(&server, &HttpServer::fireNewWebSocketRequest); QNetworkRequest request(QUrl("http://127.0.0.1:" + QString::number(server.getServerPort()))); request.setRawHeader("upgrade", "websocket"); request.setRawHeader("connection", "upgrade"); mAccessManager.get(request); QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QTRY_COMPARE(spyServer.count(), 1); auto param = spyServer.takeFirst(); auto socket = qvariant_cast >(param.at(0))->take(); QVERIFY(socket->bytesAvailable() > 0); // check rollbackTransaction const auto& requestData = socket->readAll(); QVERIFY(requestData.contains("GET / HTTP/1.1")); QVERIFY(requestData.contains("connection: upgrade")); QVERIFY(requestData.contains("upgrade: websocket")); QVERIFY(requestData.contains("\r\n\r\n")); param = spy.takeLast(); QVERIFY(param.at(0).toString().contains("Upgrade to websocket requested")); } void unknownUpgrade() { HttpServer server; QVERIFY(server.isListening()); QNetworkRequest request(QUrl("http://127.0.0.1:" + QString::number(server.getServerPort()))); request.setRawHeader("upgrade", "unknown"); request.setRawHeader("connection", "upgrade"); auto reply = mAccessManager.get(request); QSignalSpy spyClient(reply, &QNetworkReply::finished); QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QTRY_COMPARE(spyClient.count(), 1); QCOMPARE(reply->error(), QNetworkReply::ContentNotFoundError); QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 404); auto param = spy.takeLast(); QVERIFY(param.at(0).toString().contains("Unknown upgrade requested")); } void methodWithoutReceiver_data() { QTest::addColumn("request"); QTest::addColumn("signal"); QNetworkRequest request; QTest::newRow("http") << request << QStringLiteral("fireNewHttpRequest"); request.setRawHeader("upgrade", "websocket"); request.setRawHeader("connection", "upgrade"); QTest::newRow("ws") << request << QStringLiteral("fireNewWebSocketRequest"); } void methodWithoutReceiver() { QFETCH(QNetworkRequest, request); QFETCH(QString, signal); HttpServer server; QVERIFY(server.isListening()); request.setUrl(QUrl("http://127.0.0.1:" + QString::number(server.getServerPort()))); auto reply = mAccessManager.get(request); QSignalSpy spyClient(reply, &QNetworkReply::finished); QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QTRY_COMPARE(spyClient.count(), 1); QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 503); auto noSignalFound = QStringLiteral("No registration found: \"%1\"").arg(signal); QVERIFY(spy.takeLast().at(0).toString().contains(noSignalFound)); } }; QTEST_GUILESS_MAIN(test_HttpServer) #include "test_HttpServer.moc"