diff options
Diffstat (limited to 'tests/auto/qnetworkreply/tst_qnetworkreply.cpp')
-rw-r--r-- | tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index c0975817ac..0f60e31086 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -349,6 +349,8 @@ private Q_SLOTS: #ifdef QT_BUILD_INTERNAL void sslSessionSharing_data(); void sslSessionSharing(); + void sslSessionSharingFromPersistentSession_data(); + void sslSessionSharingFromPersistentSession(); #endif #endif @@ -5742,6 +5744,70 @@ void tst_QNetworkReply::sslSessionSharingHelperSlot() } } +void tst_QNetworkReply::sslSessionSharingFromPersistentSession_data() +{ + QTest::addColumn<bool>("sessionPersistenceEnabled"); + QTest::newRow("enabled") << true; + QTest::newRow("disabled") << false; +} + +void tst_QNetworkReply::sslSessionSharingFromPersistentSession() +{ + QNetworkRequest::Attribute sslSessionEnablePersistenceAttribute = + static_cast<QNetworkRequest::Attribute>( + static_cast<int>(QNetworkRequest::User)-1); + QNetworkRequest::Attribute sslSessionTicketLifeTimeHintAttribute = + static_cast<QNetworkRequest::Attribute>( + static_cast<int>(QNetworkRequest::User)-2); + QNetworkRequest::Attribute sslSessionAttribute = + static_cast<QNetworkRequest::Attribute>( + static_cast<int>(QNetworkRequest::User)-3); + + QString urlString("https://" + QtNetworkSettings::serverName()); + + // warm up SSL session cache to get a working session + QNetworkRequest warmupRequest(urlString); + QFETCH(bool, sessionPersistenceEnabled); + if (sessionPersistenceEnabled) + warmupRequest.setAttribute(sslSessionEnablePersistenceAttribute, true); + + QNetworkReply *warmupReply = manager.get(warmupRequest); + warmupReply->ignoreSslErrors(); + connect(warmupReply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(20); + QVERIFY(!QTestEventLoop::instance().timeout()); + QCOMPARE(warmupReply->error(), QNetworkReply::NoError); + QByteArray sslSession = warmupReply->attribute(sslSessionAttribute).toByteArray(); + QCOMPARE(!sslSession.isEmpty(), sessionPersistenceEnabled); + + QVariant sessionTicketLifeTimeHint = warmupReply->attribute( + sslSessionTicketLifeTimeHintAttribute); + // the value will always be 0: If enabled the server sends a value of 0, + // but in that case the attribute is defined at least + QCOMPARE(sessionPersistenceEnabled, !sessionTicketLifeTimeHint.isNull()); + QCOMPARE(sessionTicketLifeTimeHint.toInt(), 0); + + warmupReply->deleteLater(); + + // now send another request with a new QNAM and the persisted session, + // to verify it can be resumed without any internal state + QNetworkRequest request(warmupRequest); + if (sessionPersistenceEnabled) + request.setAttribute(sslSessionAttribute, sslSession); + + QNetworkAccessManager newManager; + QNetworkReply *reply = newManager.get(request); + reply->ignoreSslErrors(); + connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(20); + QVERIFY(!QTestEventLoop::instance().timeout()); + QCOMPARE(reply->error(), QNetworkReply::NoError); + + bool sslSessionSharingWasUsedInReply = QSslConfigurationPrivate::peerSessionWasShared( + reply->sslConfiguration()); + QCOMPARE(sessionPersistenceEnabled, sslSessionSharingWasUsedInReply); +} + #endif // QT_BUILD_INTERNAL #endif // QT_NO_OPENSSL |