summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesus Fernandez <jesus.fernandez@qt.io>2018-07-05 15:29:59 +0200
committerJesus Fernandez <Jesus.Fernandez@qt.io>2019-04-29 13:00:23 +0000
commitd542f7e13d18f8fa0af1d5191e89254846984c48 (patch)
tree313b8ea41e8d2cacc8b25d7a0a40038966b989e8
parent4f64330b39bd528a84241e976baa464c6dc89de1 (diff)
Add a fork() test
Change-Id: Ic7c797f9757ad14803154f6125298bfc8fe03baa Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
-rw-r--r--tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp b/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
index addfeeb..4f7f10e 100644
--- a/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
+++ b/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
@@ -61,6 +61,7 @@ private slots:
void checkListenWarns();
void websocket();
void servers();
+ void fork();
};
void tst_QAbstractHttpServer::request_data()
@@ -172,6 +173,63 @@ void tst_QAbstractHttpServer::servers()
QTRY_COMPARE(server.servers().last(), tcpServer2);
}
+void tst_QAbstractHttpServer::fork()
+{
+#if defined(Q_OS_UNIX)
+ const auto message = QByteArrayLiteral("Hello world!");
+ struct HttpServer : QAbstractHttpServer
+ {
+ const QByteArray &message;
+ HttpServer(const QByteArray &message) : message(message) {}
+ bool handleRequest(const QHttpServerRequest &, QTcpSocket *socket) override
+ {
+ socket->write(QByteArrayLiteral("HTTP/1.1 200 OK"));
+ socket->write(QByteArrayLiteral("\r\n"));
+ socket->write(QByteArrayLiteral("Content-Length: "));
+ socket->write(QByteArray::number(message.size()));
+ socket->write(QByteArrayLiteral("\r\n"));
+ socket->write(QByteArrayLiteral("Connection: close"));
+ socket->write(QByteArrayLiteral("\r\n"));
+ socket->write(QByteArrayLiteral("Content-Type: text/html"));
+ socket->write(QByteArrayLiteral("\r\n\r\n"));
+ socket->write(message);
+ socket->flush();
+ ::kill(::getpid(), SIGKILL); // Avoids continuing running tests in the child process
+ return true;
+ }
+ } server = { message };
+
+ struct TcpServer : QTcpServer
+ {
+ void incomingConnection(qintptr socketDescriptor) override
+ {
+ if (::fork() != 0) {
+ // Parent process: Create a QTcpSocket with the descriptor to close it properly
+ QTcpSocket socket;
+ socket.setSocketDescriptor(socketDescriptor);
+ socket.close();
+ } else {
+ // Child process: It will parse the request and call HttpServer::handleRequest
+ QTcpServer::incomingConnection(socketDescriptor);
+ }
+ }
+ };
+ auto tcpServer = new TcpServer;
+ tcpServer->listen();
+ server.bind(tcpServer);
+ QNetworkAccessManager networkAccessManager;
+ const QUrl url(QString::fromLatin1("http://localhost:%1").arg(tcpServer->serverPort()));
+ auto reply = networkAccessManager.get(QNetworkRequest(url));
+ QSignalSpy finishedSpy(reply, &QNetworkReply::finished);
+ QTRY_VERIFY(finishedSpy.count());
+ QCOMPARE(reply->readAll(), message);
+ reply->close();
+ reply->deleteLater();
+#else
+ QSKIP("fork() not supported by this platform");
+#endif
+}
+
QT_END_NAMESPACE
QTEST_MAIN(tst_QAbstractHttpServer)