tst_QNetworkReply::getFromUnreachableIp - fix a failing test

This patch works around Windows X86 on QEMU antics.

It appears on this platform the test behaves in some unpredictable manner:
- WSAConnect with 255.255.255.255 does not always immediately fail with
  some error, so socket engine waits for a connection timeout (30 s.),
  but the test itself
- only waits for 5 seconds and then tests that a request has finished with
  error, which is not true (we are still connecting).

To make it work - whenever we have bearermanager feature enabled, set
a connection timeout to something reasonable, not 30 s.
Since we try to connect to each address twice, make timeout 1.5 s
(so it's 3 s. in total and still is < 5 s.).

Task-number: QTBUG-64264
Change-Id: I1d40c140667fca8402ec9344e66d313b6df54256
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Timur Pocheptsov 2017-11-07 11:51:57 +01:00
parent fad8f34033
commit 39355daa40

View File

@ -6766,6 +6766,48 @@ void tst_QNetworkReply::getFromUnreachableIp()
{
QNetworkAccessManager manager;
#ifdef Q_OS_WIN32
// This test assumes that attempt to connect to 255.255.255.255 fails more
// or less fast/immediately. This is not what we observe on Windows x86:
// WSAConnect on non-blocking socket returns SOCKET_ERROR, WSAGetLastError
// returns WSAEWOULDBLOCK (expected) and getsockopt most of the time returns
// NOERROR; so socket engine starts a timer (30 s.) and waits for a timeout/
// error/success. Unfortunately, the test itself is waiting only for 5 s.
// So we have to adjust the connection timeout or skip the test completely
// if the 'bearermanagement' feature is not available.
#if QT_CONFIG(bearermanagement)
class ConfigurationGuard
{
public:
explicit ConfigurationGuard(QNetworkAccessManager *m)
: manager(m)
{
Q_ASSERT(m);
auto conf = manager->configuration();
previousTimeout = conf.connectTimeout();
conf.setConnectTimeout(1500);
manager->setConfiguration(conf);
}
~ConfigurationGuard()
{
Q_ASSERT(manager);
auto conf = manager->configuration();
conf.setConnectTimeout(previousTimeout);
manager->setConfiguration(conf);
}
private:
QNetworkAccessManager *manager = nullptr;
int previousTimeout = 0;
Q_DISABLE_COPY(ConfigurationGuard)
};
const ConfigurationGuard restorer(&manager);
#else // bearermanagement
QSKIP("This test is non-deterministic on Windows x86");
#endif // !bearermanagement
#endif // Q_OS_WIN32
QNetworkRequest request(QUrl("http://255.255.255.255/42/23/narf/narf/narf"));
QNetworkReplyPtr reply(manager.get(request));