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:
parent
fad8f34033
commit
39355daa40
@ -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));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user