summaryrefslogtreecommitdiffstats
path: root/tests/auto/network
diff options
context:
space:
mode:
authorPeter Hartmann <peter.hartmann@nokia.com>2012-01-20 13:55:15 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-25 19:35:05 +0100
commit07662f93ac700d18bf2c7f5e3df1fa310327130d (patch)
tree8a1a81ab5d9e905b3e09f83673777fb8b4b1e978 /tests/auto/network
parent0da4451b783b02d6df464fba9f0c34828df1ac06 (diff)
QAbstractSocket / QSslSocket: add API to pause and resume
pause and resume is currently only supported upon emitting the QSslSocket::sslErrors() signal. The API was added in QAbstractSocket to also support QAbstractSocket::proxyAuthenticationRequired() in the future. This is the first patch to support that feature on the socket level, another patch will follow to support sslErrors() and authenticationRequired() in QNetworkAccessManager / QNetworkReply. Task-number: QTBUG-19032 Change-Id: Ide2918268590ab9a01454ab26cb7fdca3dc840ab Reviewed-by: Shane Kearns <ext-shane.2.kearns@nokia.com>
Diffstat (limited to 'tests/auto/network')
-rw-r--r--tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp110
1 files changed, 93 insertions, 17 deletions
diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
index 41896b4a72..c0196196c7 100644
--- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
@@ -192,10 +192,12 @@ private slots:
void readFromClosedSocket();
void writeBigChunk();
void blacklistedCertificates();
- void setEmptyDefaultConfiguration();
void versionAccessors();
void sslOptions();
void encryptWithoutConnecting();
+ void resume_data();
+ void resume();
+ void setEmptyDefaultConfiguration(); // this test should be last
static void exitLoop()
{
@@ -2058,22 +2060,6 @@ void tst_QSslSocket::blacklistedCertificates()
QCOMPARE(sslErrors.at(0).error(), QSslError::CertificateBlacklisted);
}
-void tst_QSslSocket::setEmptyDefaultConfiguration()
-{
- // used to produce a crash in QSslConfigurationPrivate::deepCopyDefaultConfiguration, QTBUG-13265
-
- if (!QSslSocket::supportsSsl())
- return;
-
- QSslConfiguration emptyConf;
- QSslConfiguration::setDefaultConfiguration(emptyConf);
-
- QSslSocketPtr socket = newSocket();
- connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(ignoreErrorSlot()));
- socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
- QVERIFY2(!socket->waitForEncrypted(4000), qPrintable(socket->errorString()));
-}
-
void tst_QSslSocket::versionAccessors()
{
if (!QSslSocket::supportsSsl())
@@ -2141,7 +2127,97 @@ void tst_QSslSocket::encryptWithoutConnecting()
sock.startClientEncryption();
}
+void tst_QSslSocket::resume_data()
+{
+ QTest::addColumn<bool>("ignoreErrorsAfterPause");
+ QTest::addColumn<QList<QSslError> >("errorsToIgnore");
+ QTest::addColumn<bool>("expectSuccess");
+
+ QList<QSslError> errorsList;
+ QTest::newRow("DoNotIgnoreErrors") << false << QList<QSslError>() << false;
+ QTest::newRow("ignoreAllErrors") << true << QList<QSslError>() << true;
+
+ QList<QSslCertificate> certs = QSslCertificate::fromPath(QLatin1String(SRCDIR "certs/qt-test-server-cacert.pem"));
+ QSslError rightError(QSslError::SelfSignedCertificate, certs.at(0));
+ QSslError wrongError(QSslError::SelfSignedCertificate);
+ errorsList.append(wrongError);
+ QTest::newRow("ignoreSpecificErrors-Wrong") << true << errorsList << false;
+ errorsList.clear();
+ errorsList.append(rightError);
+ QTest::newRow("ignoreSpecificErrors-Right") << true << errorsList << true;
+}
+
+void tst_QSslSocket::resume()
+{
+ // make sure the server certificate is not in the list of accepted certificates,
+ // we want to trigger the sslErrors signal
+ QSslSocket::setDefaultCaCertificates(QSslSocket::systemCaCertificates());
+
+ QFETCH(bool, ignoreErrorsAfterPause);
+ QFETCH(QList<QSslError>, errorsToIgnore);
+ QFETCH(bool, expectSuccess);
+
+ QSslSocket socket;
+ socket.setPauseMode(QAbstractSocket::PauseOnNotify);
+
+ QSignalSpy sslErrorSpy(&socket, SIGNAL(sslErrors(QList<QSslError>)));
+ QSignalSpy encryptedSpy(&socket, SIGNAL(encrypted()));
+ QSignalSpy errorSpy(&socket, SIGNAL(error(QAbstractSocket::SocketError)));
+
+ connect(&socket, SIGNAL(sslErrors(QList<QSslError>)), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ connect(&socket, SIGNAL(encrypted()), &QTestEventLoop::instance(), SLOT(exitLoop()));
+ connect(&socket, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)),
+ this, SLOT(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)));
+ connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)), &QTestEventLoop::instance(), SLOT(exitLoop()));
+
+ socket.connectToHostEncrypted(QtNetworkSettings::serverName(), 993);
+ QTestEventLoop::instance().enterLoop(10);
+ QVERIFY(!QTestEventLoop::instance().timeout());
+ QCOMPARE(sslErrorSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(encryptedSpy.count(), 0);
+ QVERIFY(!socket.isEncrypted());
+ if (ignoreErrorsAfterPause) {
+ if (errorsToIgnore.empty())
+ socket.ignoreSslErrors();
+ else
+ socket.ignoreSslErrors(errorsToIgnore);
+ }
+ socket.resume();
+ QTestEventLoop::instance().enterLoop(10);
+ QVERIFY(!QTestEventLoop::instance().timeout()); // quit by encrypted() or error() signal
+ if (expectSuccess) {
+ QCOMPARE(encryptedSpy.count(), 1);
+ QVERIFY(socket.isEncrypted());
+ QCOMPARE(errorSpy.count(), 0);
+ socket.disconnectFromHost();
+ QVERIFY(socket.waitForDisconnected(10000));
+ } else {
+ QCOMPARE(encryptedSpy.count(), 0);
+ QVERIFY(!socket.isEncrypted());
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(socket.error(), QAbstractSocket::SslHandshakeFailedError);
+ }
+}
+
+void tst_QSslSocket::setEmptyDefaultConfiguration() // this test should be last, as it has some side effects
+{
+ // used to produce a crash in QSslConfigurationPrivate::deepCopyDefaultConfiguration, QTBUG-13265
+
+ if (!QSslSocket::supportsSsl())
+ return;
+
+ QSslConfiguration emptyConf;
+ QSslConfiguration::setDefaultConfiguration(emptyConf);
+
+ QSslSocketPtr socket = newSocket();
+ connect(socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(ignoreErrorSlot()));
+ socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443);
+ QVERIFY2(!socket->waitForEncrypted(4000), qPrintable(socket->errorString()));
+}
+
#endif // QT_NO_OPENSSL
QTEST_MAIN(tst_QSslSocket)
+
#include "tst_qsslsocket.moc"