Skip to content

Commit

Permalink
Add a fork() test
Browse files Browse the repository at this point in the history
Change-Id: Ic7c797f9757ad14803154f6125298bfc8fe03baa
Reviewed-by: Mårten Nordheim <[email protected]>
Reviewed-by: Edward Welbourne <[email protected]>
  • Loading branch information
jsfdez committed Apr 29, 2019
1 parent 4f64330 commit d542f7e
Showing 1 changed file with 58 additions and 0 deletions.
58 changes: 58 additions & 0 deletions tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ private slots:
void checkListenWarns();
void websocket();
void servers();
void fork();
};

void tst_QAbstractHttpServer::request_data()
Expand Down Expand Up @@ -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:https://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)
Expand Down

0 comments on commit d542f7e

Please sign in to comment.