summaryrefslogtreecommitdiffstats
path: root/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp')
-rw-r--r--tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp1131
1 files changed, 0 insertions, 1131 deletions
diff --git a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
deleted file mode 100644
index ceb0a074da..0000000000
--- a/tests/auto/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
+++ /dev/null
@@ -1,1131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include <QtTest/QtTest>
-#include "private/qhttpnetworkconnection_p.h"
-#include "private/qnoncontiguousbytedevice_p.h"
-#include <QAuthenticator>
-
-#include "../network-settings.h"
-
-class tst_QHttpNetworkConnection: public QObject
-{
- Q_OBJECT
-
-public:
- tst_QHttpNetworkConnection();
-
-public Q_SLOTS:
- void finishedReply();
- void finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail);
- void challenge401(const QHttpNetworkRequest &request, QAuthenticator *authenticator);
-#ifndef QT_NO_OPENSSL
- void sslErrors(const QList<QSslError> &errors);
-#endif
-private:
- bool finishedCalled;
- bool finishedWithErrorCalled;
- QNetworkReply::NetworkError netErrorCode;
-
-private Q_SLOTS:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
-
- void options_data();
- void options();
- void get_data();
- void get();
- void head_data();
- void head();
- void post_data();
- void post();
- void put_data();
- void put();
- void _delete_data();
- void _delete();
- void trace_data();
- void trace();
- void _connect_data();
- void _connect();
-#ifndef QT_NO_COMPRESS
- void compression_data();
- void compression();
-#endif
-#ifndef QT_NO_OPENSSL
- void ignoresslerror_data();
- void ignoresslerror();
-#endif
-#ifdef QT_NO_OPENSSL
- void nossl_data();
- void nossl();
-#endif
- void get401_data();
- void get401();
-
- void getMultiple_data();
- void getMultiple();
- void getMultipleWithPipeliningAndMultiplePriorities();
- void getMultipleWithPriorities();
-
- void getEmptyWithPipelining();
-
- void getAndEverythingShouldBePipelined();
-
- void getAndThenDeleteObject();
- void getAndThenDeleteObject_data();
-};
-
-tst_QHttpNetworkConnection::tst_QHttpNetworkConnection()
-{
- Q_SET_DEFAULT_IAP
-}
-
-void tst_QHttpNetworkConnection::initTestCase()
-{
-}
-
-void tst_QHttpNetworkConnection::cleanupTestCase()
-{
-}
-
-void tst_QHttpNetworkConnection::init()
-{
-}
-
-void tst_QHttpNetworkConnection::cleanup()
-{
-}
-
-void tst_QHttpNetworkConnection::options_data()
-{
- // not tested yet
-}
-
-void tst_QHttpNetworkConnection::options()
-{
- QEXPECT_FAIL("", "not tested yet", Continue);
- QVERIFY(false);
-}
-
-void tst_QHttpNetworkConnection::head_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<int>("statusCode");
- QTest::addColumn<QString>("statusString");
- QTest::addColumn<int>("contentLength");
-
- QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962;
- QTest::newRow("success-external") << "http://" << "www.ietf.org" << "/rfc/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962;
-
- QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1;
- QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1;
-}
-
-void tst_QHttpNetworkConnection::head()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(int, statusCode);
- QFETCH(QString, statusString);
- QFETCH(int, contentLength);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- QCOMPARE(connection.isSsl(), encrypt);
-
- QHttpNetworkRequest request(protocol + host + path, QHttpNetworkRequest::Head);
- QHttpNetworkReply *reply = connection.sendRequest(request);
-
- QTime stopWatch;
- stopWatch.start();
- do {
- QCoreApplication::instance()->processEvents();
- if (stopWatch.elapsed() >= 30000)
- break;
- } while (!reply->isFinished());
-
- QCOMPARE(reply->statusCode(), statusCode);
- QCOMPARE(reply->reasonPhrase(), statusString);
- // only check it if it is set and expected
- if (reply->contentLength() != -1 && contentLength != -1)
- QCOMPARE(reply->contentLength(), qint64(contentLength));
-
- QVERIFY(reply->isFinished());
-
- delete reply;
-}
-
-void tst_QHttpNetworkConnection::get_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<int>("statusCode");
- QTest::addColumn<QString>("statusString");
- QTest::addColumn<int>("contentLength");
- QTest::addColumn<int>("downloadSize");
-
- QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
- QTest::newRow("success-external") << "http://" << "www.ietf.org" << "/rfc/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
-
- QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1 << -1;
- QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1 << -1;
-}
-
-void tst_QHttpNetworkConnection::get()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(int, statusCode);
- QFETCH(QString, statusString);
- QFETCH(int, contentLength);
- QFETCH(int, downloadSize);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- QCOMPARE(connection.isSsl(), encrypt);
-
- QHttpNetworkRequest request(protocol + host + path);
- QHttpNetworkReply *reply = connection.sendRequest(request);
-
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (reply->bytesAvailable())
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
-
- QCOMPARE(reply->statusCode(), statusCode);
- QCOMPARE(reply->reasonPhrase(), statusString);
- // only check it if it is set and expected
- if (reply->contentLength() != -1 && contentLength != -1)
- QCOMPARE(reply->contentLength(), qint64(contentLength));
-
- stopWatch.start();
- QByteArray ba;
- do {
- QCoreApplication::instance()->processEvents();
- while (reply->bytesAvailable())
- ba += reply->readAny();
- if (stopWatch.elapsed() >= 30000)
- break;
- } while (!reply->isFinished());
-
- QVERIFY(reply->isFinished());
- //do not require server generated error pages to be a fixed size
- if (downloadSize != -1)
- QCOMPARE(ba.size(), downloadSize);
- //but check against content length if it was sent
- if (reply->contentLength() != -1)
- QCOMPARE(ba.size(), (int)reply->contentLength());
-
- delete reply;
-}
-
-void tst_QHttpNetworkConnection::finishedReply()
-{
- finishedCalled = true;
-}
-
-void tst_QHttpNetworkConnection::finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail)
-{
- Q_UNUSED(detail)
- finishedWithErrorCalled = true;
- netErrorCode = errorCode;
-}
-
-void tst_QHttpNetworkConnection::put_data()
-{
-
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<QString>("data");
- QTest::addColumn<bool>("succeed");
-
- QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/dav/file1.txt" << ushort(80) << false << "Hello World\nEnd of file\n"<<true;
- QTest::newRow("fail-internal") << "http://" << QtNetworkSettings::serverName() << "/dav2/file1.txt" << ushort(80) << false << "Hello World\nEnd of file\n"<<false;
- QTest::newRow("fail-host") << "http://" << "fluke-nosuchhost.troll.no" << "/dav2/file1.txt" << ushort(80) << false << "Hello World\nEnd of file\n"<<false;
-}
-
-void tst_QHttpNetworkConnection::put()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(QString, data);
- QFETCH(bool, succeed);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- QCOMPARE(connection.isSsl(), encrypt);
-
- QHttpNetworkRequest request(protocol + host + path, QHttpNetworkRequest::Put);
-
- QByteArray array = data.toLatin1();
- QNonContiguousByteDevice *bd = QNonContiguousByteDeviceFactory::create(&array);
- bd->setParent(this);
- request.setUploadByteDevice(bd);
-
- finishedCalled = false;
- finishedWithErrorCalled = false;
-
- QHttpNetworkReply *reply = connection.sendRequest(request);
- connect(reply, SIGNAL(finished()), SLOT(finishedReply()));
- connect(reply, SIGNAL(finishedWithError(QNetworkReply::NetworkError, const QString &)),
- SLOT(finishedWithError(QNetworkReply::NetworkError, const QString &)));
-
- QTime stopWatch;
- stopWatch.start();
- do {
- QCoreApplication::instance()->processEvents();
- if (stopWatch.elapsed() >= 30000)
- break;
- } while (!reply->isFinished() && !finishedCalled && !finishedWithErrorCalled);
-
- if (reply->isFinished()) {
- QByteArray ba;
- while (reply->bytesAvailable())
- ba += reply->readAny();
- } else if(finishedWithErrorCalled) {
- if(!succeed) {
- delete reply;
- return;
- } else {
- QFAIL("Error in PUT");
- }
- } else {
- QFAIL("PUT timed out");
- }
-
- int status = reply->statusCode();
- if (status != 200 && status != 201 && status != 204) {
- if (succeed) {
- qDebug()<<"PUT failed, Status Code:" <<status;
- QFAIL("Error in PUT");
- }
- } else {
- if (!succeed) {
- qDebug()<<"PUT Should fail, Status Code:" <<status;
- QFAIL("Error in PUT");
- }
- }
- delete reply;
-}
-
-void tst_QHttpNetworkConnection::post_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<QString>("data");
- QTest::addColumn<int>("statusCode");
- QTest::addColumn<QString>("statusString");
- QTest::addColumn<int>("contentLength");
- QTest::addColumn<int>("downloadSize");
-
- QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/cgi-bin/echo.cgi" << ushort(80) << false << "7 bytes" << 200 << "OK" << 7 << 7;
- QTest::newRow("failure-internal") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << "Hello World" << 404 << "Not Found" << -1 << -1;
-}
-
-void tst_QHttpNetworkConnection::post()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(QString, data);
- QFETCH(int, statusCode);
- QFETCH(QString, statusString);
- QFETCH(int, contentLength);
- QFETCH(int, downloadSize);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- QCOMPARE(connection.isSsl(), encrypt);
-
- QHttpNetworkRequest request(protocol + host + path, QHttpNetworkRequest::Post);
-
- QByteArray array = data.toLatin1();
- QNonContiguousByteDevice *bd = QNonContiguousByteDeviceFactory::create(&array);
- bd->setParent(this);
- request.setUploadByteDevice(bd);
-
- QHttpNetworkReply *reply = connection.sendRequest(request);
-
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (reply->bytesAvailable())
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
-
- QCOMPARE(reply->statusCode(), statusCode);
- QCOMPARE(reply->reasonPhrase(), statusString);
-
- qint64 cLen = reply->contentLength();
- if (contentLength != -1) {
- // only check the content length if test expected it to be set
- if (cLen==-1) {
- // HTTP 1.1 server may respond with chunked encoding and in that
- // case contentLength is not present in reply -> verify that it is the case
- QByteArray transferEnc = reply->headerField("Transfer-Encoding");
- QCOMPARE(transferEnc, QByteArray("chunked"));
- } else {
- QCOMPARE(cLen, qint64(contentLength));
- }
- }
-
- stopWatch.start();
- QByteArray ba;
- do {
- QCoreApplication::instance()->processEvents();
- while (reply->bytesAvailable())
- ba += reply->readAny();
- if (stopWatch.elapsed() >= 30000)
- break;
- } while (!reply->isFinished());
-
- QVERIFY(reply->isFinished());
- //don't require fixed size for generated error pages
- if (downloadSize != -1)
- QCOMPARE(ba.size(), downloadSize);
- //but do compare with content length if possible
- if (cLen != -1)
- QCOMPARE(ba.size(), (int)cLen);
-
- delete reply;
-}
-
-void tst_QHttpNetworkConnection::_delete_data()
-{
- // not tested yet
-}
-
-void tst_QHttpNetworkConnection::_delete()
-{
- QEXPECT_FAIL("", "not tested yet", Continue);
- QVERIFY(false);
-}
-
-void tst_QHttpNetworkConnection::trace_data()
-{
- // not tested yet
-}
-
-void tst_QHttpNetworkConnection::trace()
-{
- QEXPECT_FAIL("", "not tested yet", Continue);
- QVERIFY(false);
-}
-
-void tst_QHttpNetworkConnection::_connect_data()
-{
- // not tested yet
-}
-
-void tst_QHttpNetworkConnection::_connect()
-{
- QEXPECT_FAIL("", "not tested yet", Continue);
- QVERIFY(false);
-}
-
-void tst_QHttpNetworkConnection::challenge401(const QHttpNetworkRequest &request,
- QAuthenticator *authenticator)
-{
- Q_UNUSED(request)
-
- QHttpNetworkReply *reply = qobject_cast<QHttpNetworkReply*>(sender());
- if (reply) {
- QHttpNetworkConnection *c = reply->connection();
-
- QVariant val = c->property("setCredentials");
- if (val.toBool()) {
- QVariant user = c->property("username");
- QVariant password = c->property("password");
- authenticator->setUser(user.toString());
- authenticator->setPassword(password.toString());
- c->setProperty("setCredentials", false);
- }
- }
-}
-
-void tst_QHttpNetworkConnection::get401_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<bool>("setCredentials");
- QTest::addColumn<QString>("username");
- QTest::addColumn<QString>("password");
- QTest::addColumn<int>("statusCode");
-
- QTest::newRow("no-credentials") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfcs-auth/index.html" << ushort(80) << false << false << "" << ""<<401;
- QTest::newRow("invalid-credentials") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfcs-auth/index.html" << ushort(80) << false << true << "test" << "test"<<401;
- QTest::newRow("valid-credentials") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfcs-auth/index.html" << ushort(80) << false << true << "httptest" << "httptest"<<200;
- QTest::newRow("digest-authentication-invalid") << "http://" << QtNetworkSettings::serverName() << "/qtest/auth-digest/index.html" << ushort(80) << false << true << "wrong" << "wrong"<<401;
- QTest::newRow("digest-authentication-valid") << "http://" << QtNetworkSettings::serverName() << "/qtest/auth-digest/index.html" << ushort(80) << false << true << "httptest" << "httptest"<<200;
-}
-
-void tst_QHttpNetworkConnection::get401()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(bool, setCredentials);
- QFETCH(QString, username);
- QFETCH(QString, password);
- QFETCH(int, statusCode);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- QCOMPARE(connection.isSsl(), encrypt);
- connection.setProperty("setCredentials", setCredentials);
- connection.setProperty("username", username);
- connection.setProperty("password", password);
-
- QHttpNetworkRequest request(protocol + host + path);
- QHttpNetworkReply *reply = connection.sendRequest(request);
- connect(reply, SIGNAL(authenticationRequired(const QHttpNetworkRequest&, QAuthenticator *)),
- SLOT(challenge401(const QHttpNetworkRequest&, QAuthenticator *)));
-
- finishedCalled = false;
- finishedWithErrorCalled = false;
-
- connect(reply, SIGNAL(finished()), SLOT(finishedReply()));
- connect(reply, SIGNAL(finishedWithError(QNetworkReply::NetworkError, const QString &)),
- SLOT(finishedWithError(QNetworkReply::NetworkError, const QString &)));
-
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (finishedCalled)
- break;
- if (finishedWithErrorCalled)
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
- QCOMPARE(reply->statusCode(), statusCode);
- delete reply;
-}
-
-#ifndef QT_NO_COMPRESS
-void tst_QHttpNetworkConnection::compression_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<int>("statusCode");
- QTest::addColumn<QString>("statusString");
- QTest::addColumn<int>("contentLength");
- QTest::addColumn<int>("downloadSize");
- QTest::addColumn<bool>("autoCompress");
- QTest::addColumn<QString>("contentCoding");
-
- QTest::newRow("success-autogzip-temp") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfcs/rfc2616.html" << ushort(80) << false << 200 << "OK" << -1 << 418321 << true << "";
- QTest::newRow("success-nogzip-temp") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfcs/rfc2616.html" << ushort(80) << false << 200 << "OK" << 418321 << 418321 << false << "identity";
- QTest::newRow("success-manualgzip-temp") << "http://" << QtNetworkSettings::serverName() << "/qtest/deflate/rfc2616.html" << ushort(80) << false << 200 << "OK" << 119124 << 119124 << false << "gzip";
-
-}
-
-void tst_QHttpNetworkConnection::compression()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(int, statusCode);
- QFETCH(QString, statusString);
- QFETCH(int, contentLength);
- QFETCH(int, downloadSize);
- QFETCH(bool, autoCompress);
- QFETCH(QString, contentCoding);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- QCOMPARE(connection.isSsl(), encrypt);
-
- QHttpNetworkRequest request(protocol + host + path);
- if (!autoCompress)
- request.setHeaderField("Accept-Encoding", contentCoding.toLatin1());
- QHttpNetworkReply *reply = connection.sendRequest(request);
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (reply->bytesAvailable())
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
-
- QCOMPARE(reply->statusCode(), statusCode);
- QCOMPARE(reply->reasonPhrase(), statusString);
- bool isLengthOk = (reply->contentLength() == qint64(contentLength)
- || reply->contentLength() == qint64(downloadSize)
- || reply->contentLength() == -1); //apache2 does not send content-length for compressed pages
-
- QVERIFY(isLengthOk);
-
- stopWatch.start();
- QByteArray ba;
- do {
- QCoreApplication::instance()->processEvents();
- while (reply->bytesAvailable())
- ba += reply->readAny();
- if (stopWatch.elapsed() >= 30000)
- break;
- } while (!reply->isFinished());
-
- QVERIFY(reply->isFinished());
- QCOMPARE(ba.size(), downloadSize);
-
- delete reply;
-}
-#endif
-
-#ifndef QT_NO_OPENSSL
-void tst_QHttpNetworkConnection::sslErrors(const QList<QSslError> &errors)
-{
- Q_UNUSED(errors)
-
- QHttpNetworkReply *reply = qobject_cast<QHttpNetworkReply*>(sender());
- if (reply) {
- QHttpNetworkConnection *connection = reply->connection();
-
- QVariant val = connection->property("ignoreFromSignal");
- if (val.toBool())
- connection->ignoreSslErrors();
- finishedWithErrorCalled = true;
- }
-}
-
-void tst_QHttpNetworkConnection::ignoresslerror_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<bool>("ignoreInit");
- QTest::addColumn<bool>("ignoreFromSignal");
- QTest::addColumn<int>("statusCode");
-
- // This test will work only if the website has ssl errors.
- // fluke's certificate is signed by a non-standard authority.
- // Since we don't introduce that CA into the SSL verification chain,
- // connecting should fail.
- QTest::newRow("success-init") << "https://" << QtNetworkSettings::serverName() << "/" << ushort(443) << true << true << false << 200;
- QTest::newRow("success-fromSignal") << "https://" << QtNetworkSettings::serverName() << "/" << ushort(443) << true << false << true << 200;
- QTest::newRow("failure") << "https://" << QtNetworkSettings::serverName() << "/" << ushort(443) << true << false << false << 100;
-}
-
-void tst_QHttpNetworkConnection::ignoresslerror()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(bool, ignoreInit);
- QFETCH(bool, ignoreFromSignal);
- QFETCH(int, statusCode);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
- if (ignoreInit)
- connection.ignoreSslErrors();
- QCOMPARE(connection.isSsl(), encrypt);
- connection.setProperty("ignoreFromSignal", ignoreFromSignal);
-
- QHttpNetworkRequest request(protocol + host + path);
- QHttpNetworkReply *reply = connection.sendRequest(request);
- connect(reply, SIGNAL(sslErrors(const QList<QSslError>&)),
- SLOT(sslErrors(const QList<QSslError>&)));
-
- finishedWithErrorCalled = false;
-
- connect(reply, SIGNAL(finished()), SLOT(finishedReply()));
-
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (reply->bytesAvailable())
- break;
- if (statusCode == 100 && finishedWithErrorCalled)
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
- QCOMPARE(reply->statusCode(), statusCode);
- delete reply;
-}
-#endif
-
-#ifdef QT_NO_OPENSSL
-Q_DECLARE_METATYPE(QNetworkReply::NetworkError)
-void tst_QHttpNetworkConnection::nossl_data()
-{
- QTest::addColumn<QString>("protocol");
- QTest::addColumn<QString>("host");
- QTest::addColumn<QString>("path");
- QTest::addColumn<ushort>("port");
- QTest::addColumn<bool>("encrypt");
- QTest::addColumn<QNetworkReply::NetworkError>("networkError");
-
- QTest::newRow("protocol-error") << "https://" << QtNetworkSettings::serverName() << "/" << ushort(443) << true <<QNetworkReply::ProtocolUnknownError;
-}
-
-void tst_QHttpNetworkConnection::nossl()
-{
- QFETCH(QString, protocol);
- QFETCH(QString, host);
- QFETCH(QString, path);
- QFETCH(ushort, port);
- QFETCH(bool, encrypt);
- QFETCH(QNetworkReply::NetworkError, networkError);
-
- QHttpNetworkConnection connection(host, port, encrypt);
- QCOMPARE(connection.port(), port);
- QCOMPARE(connection.hostName(), host);
-
- QHttpNetworkRequest request(protocol + host + path);
- QHttpNetworkReply *reply = connection.sendRequest(request);
-
- finishedWithErrorCalled = false;
- netErrorCode = QNetworkReply::NoError;
-
- connect(reply, SIGNAL(finished()), SLOT(finishedReply()));
- connect(reply, SIGNAL(finishedWithError(QNetworkReply::NetworkError, const QString &)),
- SLOT(finishedWithError(QNetworkReply::NetworkError, const QString &)));
-
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (finishedWithErrorCalled)
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
- QCOMPARE(netErrorCode, networkError);
- delete reply;
-}
-#endif
-
-
-void tst_QHttpNetworkConnection::getMultiple_data()
-{
- QTest::addColumn<quint16>("connectionCount");
- QTest::addColumn<bool>("pipeliningAllowed");
- // send 100 requests. apache will usually force-close after 100 requests in a single tcp connection
- QTest::addColumn<int>("requestCount");
-
- QTest::newRow("6 connections, no pipelining, 100 requests") << quint16(6) << false << 100;
- QTest::newRow("1 connection, no pipelining, 100 requests") << quint16(1) << false << 100;
- QTest::newRow("6 connections, pipelining allowed, 100 requests") << quint16(6) << true << 100;
- QTest::newRow("1 connection, pipelining allowed, 100 requests") << quint16(1) << true << 100;
-}
-
-void tst_QHttpNetworkConnection::getMultiple()
-{
- QFETCH(quint16, connectionCount);
- QFETCH(bool, pipeliningAllowed);
- QFETCH(int, requestCount);
-
- QHttpNetworkConnection connection(connectionCount, QtNetworkSettings::serverName());
-
- QList<QHttpNetworkRequest*> requests;
- QList<QHttpNetworkReply*> replies;
-
- for (int i = 0; i < requestCount; i++) {
- // depending on what you use the results will vary.
- // for the "real" results, use a URL that has "internet latency" for you. Then (6 connections, pipelining) will win.
- // for LAN latency, you will possibly get that (1 connection, no pipelining) is the fastest
- QHttpNetworkRequest *request = new QHttpNetworkRequest("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
- // located in Berlin:
- //QHttpNetworkRequest *request = new QHttpNetworkRequest(QUrl("http://klinsmann.nokia.trolltech.de/~berlin/qtcreatorad.gif"));
- if (pipeliningAllowed)
- request->setPipeliningAllowed(true);
- requests.append(request);
- QHttpNetworkReply *reply = connection.sendRequest(*request);
- replies.append(reply);
- }
-
- QTime stopWatch;
- stopWatch.start();
- int finishedCount = 0;
- do {
- QCoreApplication::instance()->processEvents();
- if (stopWatch.elapsed() >= 60000)
- break;
-
- finishedCount = 0;
- for (int i = 0; i < replies.length(); i++)
- if (replies.at(i)->isFinished())
- finishedCount++;
-
- } while (finishedCount != replies.length());
-
- // redundant
- for (int i = 0; i < replies.length(); i++)
- QVERIFY(replies.at(i)->isFinished());
-
- qDebug() << "===" << stopWatch.elapsed() << "msec ===";
-
- qDeleteAll(requests);
- qDeleteAll(replies);
-}
-
-void tst_QHttpNetworkConnection::getMultipleWithPipeliningAndMultiplePriorities()
-{
- quint16 requestCount = 100;
-
- // use 2 connections.
- QHttpNetworkConnection connection(2, QtNetworkSettings::serverName());
-
- QList<QHttpNetworkRequest*> requests;
- QList<QHttpNetworkReply*> replies;
-
- for (int i = 0; i < requestCount; i++) {
- QHttpNetworkRequest *request = 0;
- if (i % 3)
- request = new QHttpNetworkRequest("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt", QHttpNetworkRequest::Get);
- else
- request = new QHttpNetworkRequest("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt", QHttpNetworkRequest::Head);
-
- if (i % 2 || i % 3)
- request->setPipeliningAllowed(true);
-
- if (i % 3)
- request->setPriority(QHttpNetworkRequest::HighPriority);
- else if (i % 5)
- request->setPriority(QHttpNetworkRequest::NormalPriority);
- else if (i % 7)
- request->setPriority(QHttpNetworkRequest::LowPriority);
-
- requests.append(request);
- QHttpNetworkReply *reply = connection.sendRequest(*request);
- replies.append(reply);
- }
-
- QTime stopWatch;
- stopWatch.start();
- int finishedCount = 0;
- do {
- QCoreApplication::instance()->processEvents();
- if (stopWatch.elapsed() >= 60000)
- break;
-
- finishedCount = 0;
- for (int i = 0; i < replies.length(); i++)
- if (replies.at(i)->isFinished())
- finishedCount++;
-
- } while (finishedCount != replies.length());
-
- int pipelinedCount = 0;
- for (int i = 0; i < replies.length(); i++) {
- QVERIFY(replies.at(i)->isFinished());
- QVERIFY (!(replies.at(i)->request().isPipeliningAllowed() == false
- && replies.at(i)->isPipeliningUsed()));
-
- if (replies.at(i)->isPipeliningUsed())
- pipelinedCount++;
- }
-
- // We allow pipelining for every 2nd,3rd,4th,6th,8th,9th,10th etc request.
- // Assume that half of the requests had been pipelined.
- // (this is a very relaxed condition, when last measured 79 of 100
- // requests had been pipelined)
- QVERIFY(pipelinedCount >= requestCount / 2);
-
- qDebug() << "===" << stopWatch.elapsed() << "msec ===";
-
- qDeleteAll(requests);
- qDeleteAll(replies);
-}
-
-class GetMultipleWithPrioritiesReceiver : public QObject
-{
- Q_OBJECT
-public:
- int highPrioReceived;
- int lowPrioReceived;
- int requestCount;
- GetMultipleWithPrioritiesReceiver(int rq) : highPrioReceived(0), lowPrioReceived(0), requestCount(rq) { }
-public Q_SLOTS:
- void finishedSlot() {
- QHttpNetworkReply *reply = (QHttpNetworkReply*) sender();
- if (reply->request().priority() == QHttpNetworkRequest::HighPriority)
- highPrioReceived++;
- else if (reply->request().priority() == QHttpNetworkRequest::LowPriority)
- lowPrioReceived++;
- else
- QFAIL("Wrong priority!?");
-
- QVERIFY(highPrioReceived + 7 >= lowPrioReceived);
-
- if (highPrioReceived + lowPrioReceived == requestCount)
- QTestEventLoop::instance().exitLoop();
- }
-};
-
-void tst_QHttpNetworkConnection::getMultipleWithPriorities()
-{
- quint16 requestCount = 100;
- // use 2 connections.
- QHttpNetworkConnection connection(2, QtNetworkSettings::serverName());
- GetMultipleWithPrioritiesReceiver receiver(requestCount);
- QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
- QList<QHttpNetworkRequest*> requests;
- QList<QHttpNetworkReply*> replies;
-
- for (int i = 0; i < requestCount; i++) {
- QHttpNetworkRequest *request = 0;
- if (i % 3)
- request = new QHttpNetworkRequest(url, QHttpNetworkRequest::Get);
- else
- request = new QHttpNetworkRequest(url, QHttpNetworkRequest::Head);
-
- if (i % 2)
- request->setPriority(QHttpNetworkRequest::HighPriority);
- else
- request->setPriority(QHttpNetworkRequest::LowPriority);
-
- requests.append(request);
- QHttpNetworkReply *reply = connection.sendRequest(*request);
- connect(reply, SIGNAL(finished()), &receiver, SLOT(finishedSlot()));
- replies.append(reply);
- }
-
- QTestEventLoop::instance().enterLoop(40);
- QVERIFY(!QTestEventLoop::instance().timeout());
-
- qDeleteAll(requests);
- qDeleteAll(replies);
-}
-
-
-class GetEmptyWithPipeliningReceiver : public QObject
-{
- Q_OBJECT
-public:
- int receivedCount;
- int requestCount;
- GetEmptyWithPipeliningReceiver(int rq) : receivedCount(0),requestCount(rq) { }
-public Q_SLOTS:
- void finishedSlot() {
- QHttpNetworkReply *reply = (QHttpNetworkReply*) sender();
- Q_UNUSED(reply);
- receivedCount++;
-
- if (receivedCount == requestCount)
- QTestEventLoop::instance().exitLoop();
- }
-};
-
-void tst_QHttpNetworkConnection::getEmptyWithPipelining()
-{
- quint16 requestCount = 50;
- // use 2 connections.
- QHttpNetworkConnection connection(2, QtNetworkSettings::serverName());
- GetEmptyWithPipeliningReceiver receiver(requestCount);
-
- QUrl url("http://" + QtNetworkSettings::serverName() + "/cgi-bin/echo.cgi"); // a get on this = getting an empty file
- QList<QHttpNetworkRequest*> requests;
- QList<QHttpNetworkReply*> replies;
-
- for (int i = 0; i < requestCount; i++) {
- QHttpNetworkRequest *request = 0;
- request = new QHttpNetworkRequest(url, QHttpNetworkRequest::Get);
- request->setPipeliningAllowed(true);
-
- requests.append(request);
- QHttpNetworkReply *reply = connection.sendRequest(*request);
- connect(reply, SIGNAL(finished()), &receiver, SLOT(finishedSlot()));
- replies.append(reply);
- }
-
- QTestEventLoop::instance().enterLoop(20);
- QVERIFY(!QTestEventLoop::instance().timeout());
-
- qDeleteAll(requests);
- qDeleteAll(replies);
-}
-
-class GetAndEverythingShouldBePipelinedReceiver : public QObject
-{
- Q_OBJECT
-public:
- int receivedCount;
- int requestCount;
- GetAndEverythingShouldBePipelinedReceiver(int rq) : receivedCount(0),requestCount(rq) { }
-public Q_SLOTS:
- void finishedSlot() {
- QHttpNetworkReply *reply = (QHttpNetworkReply*) sender();
- Q_UNUSED(reply);
- receivedCount++;
-
- if (receivedCount == requestCount)
- QTestEventLoop::instance().exitLoop();
- }
-};
-
-void tst_QHttpNetworkConnection::getAndEverythingShouldBePipelined()
-{
- quint16 requestCount = 100;
- // use 1 connection.
- QHttpNetworkConnection connection(1, QtNetworkSettings::serverName());
- QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/rfc3252.txt");
- QList<QHttpNetworkRequest*> requests;
- QList<QHttpNetworkReply*> replies;
-
- GetAndEverythingShouldBePipelinedReceiver receiver(requestCount);
-
- for (int i = 0; i < requestCount; i++) {
- QHttpNetworkRequest *request = 0;
- request = new QHttpNetworkRequest(url, QHttpNetworkRequest::Get);
- request->setPipeliningAllowed(true);
- requests.append(request);
- QHttpNetworkReply *reply = connection.sendRequest(*request);
- connect(reply, SIGNAL(finished()), &receiver, SLOT(finishedSlot()));
- replies.append(reply);
- }
- QTestEventLoop::instance().enterLoop(40);
- QVERIFY(!QTestEventLoop::instance().timeout());
-
- qDeleteAll(requests);
- qDeleteAll(replies);
-
-}
-
-
-void tst_QHttpNetworkConnection::getAndThenDeleteObject_data()
-{
- QTest::addColumn<bool>("replyFirst");
-
- QTest::newRow("delete-reply-first") << true;
- QTest::newRow("delete-connection-first") << false;
-}
-
-void tst_QHttpNetworkConnection::getAndThenDeleteObject()
-{
- // yes, this will leak if the testcase fails. I don't care. It must not fail then :P
- QHttpNetworkConnection *connection = new QHttpNetworkConnection(QtNetworkSettings::serverName());
- QHttpNetworkRequest request("http://" + QtNetworkSettings::serverName() + "/qtest/bigfile");
- QHttpNetworkReply *reply = connection->sendRequest(request);
- reply->setDownstreamLimited(true);
-
- QTime stopWatch;
- stopWatch.start();
- forever {
- QCoreApplication::instance()->processEvents();
- if (reply->bytesAvailable())
- break;
- if (stopWatch.elapsed() >= 30000)
- break;
- }
-
- QVERIFY(reply->bytesAvailable());
- QCOMPARE(reply->statusCode() ,200);
- QVERIFY(!reply->isFinished()); // must not be finished
-
- QFETCH(bool, replyFirst);
-
- if (replyFirst) {
- delete reply;
- delete connection;
- } else {
- delete connection;
- delete reply;
- }
-}
-
-
-
-QTEST_MAIN(tst_QHttpNetworkConnection)
-#include "tst_qhttpnetworkconnection.moc"