tst_QNetworkReply: Try to stabilize qtbug68821proxyError

The test is a bit silly, it was originally written to make sure that
we produce meaningful errors when trying to connect to a proxy server
where the connection is refused or the server doesn't respond at all.

To test that, it creates a local QTcpServer and starts listening to any
free port (by specifying port 0) and then it closed the server and
uses the address-port of localhost:serverPort as the proxy to use, since
we know it _was_ unused, since we were able to bind to it.

However, just calling close() doesn't immediately tear down the internal
socket descriptor, so the OS may still have the port reserved for
some time.

By moving the QTcpServer to a narrower scope we will quickly destroy it
and the internal socket engine, which is parented to the server, and
this in turn releases the socket descriptor.

Pick-to: 6.7 6.6 6.5
Change-Id: If12128fc21d1f545df152f08f0d52c1b14ac6037
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
Mårten Nordheim 2024-01-23 17:32:39 +01:00
parent de3d5dd73b
commit 775a57f266
1 changed files with 12 additions and 5 deletions

View File

@ -10392,13 +10392,20 @@ void tst_QNetworkReply::qtbug68821proxyError_data()
void tst_QNetworkReply::qtbug68821proxyError()
{
QTcpServer proxyServer;
QVERIFY(proxyServer.listen());
quint16 proxyPort = proxyServer.serverPort();
proxyServer.close();
auto getUnusedPort = []() -> std::optional<quint16> {
QTcpServer probeServer;
if (!probeServer.listen())
return std::nullopt;
// If we can listen on it, it was unused, and hopefully is also
// still unused after we stop listening.
return probeServer.serverPort();
};
auto proxyPort = getUnusedPort();
QVERIFY(proxyPort);
QFETCH(QString, proxyHost);
QNetworkProxy proxy(QNetworkProxy::HttpProxy, proxyHost, proxyPort);
QNetworkProxy proxy(QNetworkProxy::HttpProxy, proxyHost, proxyPort.value());
manager.setProxy(proxy);