summaryrefslogtreecommitdiffstats
path: root/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp')
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp198
1 files changed, 185 insertions, 13 deletions
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 2d784fcbbc..824f5fc507 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -405,6 +405,10 @@ private Q_SLOTS:
void backgroundRequest_data();
void backgroundRequest();
+ void backgroundRequestInterruption_data();
+ void backgroundRequestInterruption();
+ void backgroundRequestConnectInBackground_data();
+ void backgroundRequestConnectInBackground();
// NOTE: This test must be last!
void parentingRepliesToTheApp();
@@ -1402,6 +1406,11 @@ void tst_QNetworkReply::cleanup()
// clear cookies
cookieJar->setAllCookies(QList<QNetworkCookie>());
+
+ // disconnect manager signals
+ manager.disconnect(SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)));
+ manager.disconnect(SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)));
+ manager.disconnect(SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
}
void tst_QNetworkReply::stateChecking()
@@ -3812,9 +3821,13 @@ void tst_QNetworkReply::ioPutToFileFromSocket()
QFETCH(QByteArray, data);
SocketPair socketpair;
- socketpair.create();
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
+#ifdef Q_OS_WIN
+ //128k and 2M tests regularly fail. Assumed same characteristics as ioPostToHttpFromSocket
+ if (data.size() > 1000)
+ QSKIP("unstable on windows - QTBUG-25386");
+#endif
socketpair.endPoints[0]->write(data);
QNetworkReplyPtr reply(manager.put(QNetworkRequest(url), socketpair.endPoints[1]));
socketpair.endPoints[0]->close();
@@ -4100,9 +4113,13 @@ void tst_QNetworkReply::ioPostToHttpFromSocket()
QFETCH(QByteArray, data);
QFETCH(QUrl, url);
QFETCH(QNetworkProxy, proxy);
+#ifdef Q_OS_WIN
+ //QTBUG-25386 hits one of the 128k tests 50% of the time, one of the 4k tests rarely (but at least 1%)
+ if (data.size() > 1000)
+ QSKIP("unstable on windows - QTBUG-25386");
+#endif
SocketPair socketpair;
- socketpair.create();
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
socketpair.endPoints[0]->write(data);
@@ -4173,8 +4190,7 @@ void tst_QNetworkReply::ioPostToHttpFromSocketSynchronous()
QFETCH(QByteArray, data);
SocketPair socketpair;
- QVERIFY(socketpair.create());
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
socketpair.endPoints[0]->write(data);
socketpair.endPoints[0]->waitForBytesWritten(5000);
// ### for 4.8: make the socket pair unbuffered, to not read everything in one go in QNetworkReplyImplPrivate::setup()
@@ -4292,8 +4308,7 @@ void tst_QNetworkReply::ioPostToHttpNoBufferFlag()
QByteArray data = QByteArray("daaaaaaataaaaaaa");
// create a sequential QIODevice by feeding the data into a local TCP server
SocketPair socketpair;
- socketpair.create();
- QVERIFY(socketpair.endPoints[0] && socketpair.endPoints[1]);
+ QTRY_VERIFY(socketpair.create()); //QTRY_VERIFY as a workaround for QTBUG-24451
socketpair.endPoints[0]->write(data);
QUrl url = "http://" + QtNetworkSettings::serverName() + "/qtest/protected/cgi-bin/md5sum.cgi";
@@ -6811,25 +6826,45 @@ void tst_QNetworkReply::ftpAuthentication()
void tst_QNetworkReply::backgroundRequest_data()
{
+ QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("background");
QTest::addColumn<int>("policy");
QTest::addColumn<QNetworkReply::NetworkError>("error");
- QTest::newRow("fg, normal") << false << 0 << QNetworkReply::NoError;
- QTest::newRow("bg, normal") << true << 0 << QNetworkReply::NoError;
- QTest::newRow("fg, nobg") << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
- QTest::newRow("bg, nobg") << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
+ QUrl httpurl("http://" + QtNetworkSettings::serverName());
+ QUrl httpsurl("https://" + QtNetworkSettings::serverName());
+ QUrl ftpurl("ftp://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
+
+ QTest::newRow("http, fg, normal") << httpurl << false << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("http, bg, normal") << httpurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("http, fg, nobg") << httpurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
+ QTest::newRow("http, bg, nobg") << httpurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
+
+#ifndef QT_NO_SSL
+ QTest::newRow("https, fg, normal") << httpsurl << false << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("https, bg, normal") << httpsurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("https, fg, nobg") << httpsurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
+ QTest::newRow("https, bg, nobg") << httpsurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
+#endif
+
+ QTest::newRow("ftp, fg, normal") << ftpurl << false << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("ftp, bg, normal") << ftpurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
+ QTest::newRow("ftp, fg, nobg") << ftpurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
+ QTest::newRow("ftp, bg, nobg") << ftpurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
}
+//test purpose: background requests can't be started when not allowed
void tst_QNetworkReply::backgroundRequest()
{
#ifdef QT_BUILD_INTERNAL
+#ifndef QT_NO_BEARERMANAGEMENT
+ QFETCH(QUrl, url);
QFETCH(bool, background);
QFETCH(int, policy);
QFETCH(QNetworkReply::NetworkError, error);
- QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName()));
+ QNetworkRequest request(url);
if (background)
request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(true));
@@ -6837,6 +6872,11 @@ void tst_QNetworkReply::backgroundRequest()
//this preconstructs the session so we can change policies in advance
manager.setConfiguration(networkConfiguration);
+#ifndef QT_NO_SSL
+ connect(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
+ SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
+#endif
+
const QWeakPointer<const QNetworkSession> session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
QVERIFY(session);
QNetworkSession::UsagePolicies original = session.data()->usagePolicies();
@@ -6851,6 +6891,138 @@ void tst_QNetworkReply::backgroundRequest()
QVERIFY(reply->isFinished());
QCOMPARE(reply->error(), error);
#endif
+#endif
+}
+
+void tst_QNetworkReply::backgroundRequestInterruption_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<bool>("background");
+ QTest::addColumn<QNetworkReply::NetworkError>("error");
+
+ QUrl httpurl("http://" + QtNetworkSettings::serverName() + "/qtest/mediumfile");
+ QUrl httpsurl("https://" + QtNetworkSettings::serverName() + "/qtest/mediumfile");
+ QUrl ftpurl("ftp://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
+
+ QTest::newRow("http, fg, nobg") << httpurl << false << QNetworkReply::NoError;
+ QTest::newRow("http, bg, nobg") << httpurl << true << QNetworkReply::BackgroundRequestNotAllowedError;
+
+#ifndef QT_NO_SSL
+ QTest::newRow("https, fg, nobg") << httpsurl << false << QNetworkReply::NoError;
+ QTest::newRow("https, bg, nobg") << httpsurl << true << QNetworkReply::BackgroundRequestNotAllowedError;
+#endif
+
+ QTest::newRow("ftp, fg, nobg") << ftpurl << false << QNetworkReply::NoError;
+ QTest::newRow("ftp, bg, nobg") << ftpurl << true << QNetworkReply::BackgroundRequestNotAllowedError;
+
+}
+
+//test purpose: background requests in progress are aborted when policy changes to disallow them
+void tst_QNetworkReply::backgroundRequestInterruption()
+{
+#ifdef QT_BUILD_INTERNAL
+#ifndef QT_NO_BEARERMANAGEMENT
+ QFETCH(QUrl, url);
+ QFETCH(bool, background);
+ QFETCH(QNetworkReply::NetworkError, error);
+
+ QNetworkRequest request(url);
+
+ if (background)
+ request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(true));
+
+ //this preconstructs the session so we can change policies in advance
+ manager.setConfiguration(networkConfiguration);
+
+#ifndef QT_NO_SSL
+ connect(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
+ SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
+#endif
+
+ const QWeakPointer<const QNetworkSession> session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ QVERIFY(session);
+ QNetworkSession::UsagePolicies original = session.data()->usagePolicies();
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), QNetworkSession::NoPolicy);
+
+ request.setAttribute(QNetworkRequest::MaximumDownloadBufferSizeAttribute, 8192);
+ QNetworkReplyPtr reply(manager.get(request));
+ reply->setReadBufferSize(1024);
+
+ QSignalSpy spy(reply.data(), SIGNAL(readyRead()));
+ QTRY_VERIFY(spy.count() > 0);
+
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), QNetworkSession::NoBackgroundTrafficPolicy);
+
+ QVERIFY(waitForFinish(reply) != Timeout);
+ if (session)
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), original);
+
+ QVERIFY(reply->isFinished());
+ QCOMPARE(reply->error(), error);
+#endif
+#endif
+}
+
+void tst_QNetworkReply::backgroundRequestConnectInBackground_data()
+{
+ QTest::addColumn<QUrl>("url");
+ QTest::addColumn<bool>("background");
+
+ QUrl httpurl("http://" + QtNetworkSettings::serverName());
+ QUrl ftpurl("ftp://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
+
+ QTest::newRow("http, fg") << httpurl << false;
+ QTest::newRow("http, bg") << httpurl << true;
+
+ QTest::newRow("ftp, fg") << ftpurl << false;
+ QTest::newRow("ftp, bg") << ftpurl << true;
+}
+
+//test purpose: check that backgroundness is propagated to the network session
+void tst_QNetworkReply::backgroundRequestConnectInBackground()
+{
+#ifdef QT_BUILD_INTERNAL
+#ifndef QT_NO_BEARERMANAGEMENT
+ QFETCH(QUrl, url);
+ QFETCH(bool, background);
+
+ QNetworkRequest request(url);
+
+ if (background)
+ request.setAttribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(true));
+
+ QWeakPointer<const QNetworkSession> session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ //force QNAM to reopen the session.
+ if (session && session.data()->isOpen()) {
+ const_cast<QNetworkSession *>(session.data())->close();
+ QCoreApplication::processEvents(); //let signals propagate inside QNAM
+ }
+
+ //this preconstructs the session so we can change policies in advance
+ manager.setConfiguration(networkConfiguration);
+
+ session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ QVERIFY(session);
+ QNetworkSession::UsagePolicies original = session.data()->usagePolicies();
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), QNetworkSession::NoPolicy);
+
+ QNetworkReplyPtr reply(manager.get(request));
+
+ QVERIFY(waitForFinish(reply) != Timeout);
+ session = QNetworkAccessManagerPrivate::getNetworkSession(&manager);
+ if (session) {
+ QVariant cib = session.data()->sessionProperty(QStringLiteral("ConnectInBackground"));
+ if (!cib.isValid())
+ QSKIP("inconclusive - ConnectInBackground session property not supported by the bearer plugin");
+ QCOMPARE(cib.toBool(), background);
+ QNetworkSessionPrivate::setUsagePolicies(*const_cast<QNetworkSession *>(session.data()), original);
+ } else {
+ QSKIP("inconclusive - network session has been destroyed");
+ }
+
+ QVERIFY(reply->isFinished());
+#endif
+#endif
}
// NOTE: This test must be last testcase in tst_qnetworkreply!