diff options
author | Peter Hartmann <peter.hartmann@nokia.com> | 2012-01-20 13:55:15 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-25 19:35:05 +0100 |
commit | 07662f93ac700d18bf2c7f5e3df1fa310327130d (patch) | |
tree | 8a1a81ab5d9e905b3e09f83673777fb8b4b1e978 /tests/auto/network | |
parent | 0da4451b783b02d6df464fba9f0c34828df1ac06 (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.cpp | 110 |
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" |