diff options
author | Peter Hartmann <phartmann@blackberry.com> | 2013-08-28 10:56:24 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-11 15:37:10 +0100 |
commit | 42cfb5fe4daa586f382bde6936b0ee33b5298f4d (patch) | |
tree | 8c55a9a461f9ec7d4722e6367103c8ae50982e86 /tests/manual | |
parent | df62c31807f7b0a8b9bc222b47ccc7016cfaee65 (diff) |
SSL: add support for the Next Protocol Negotiation extension
... which is needed to negotiate the SPDY protocol.
[ChangeLog][QtNetwork][QSslConfiguration] Added support for the Next
Protocol Negotiation (NPN) TLS extension.
Task-number: QTBUG-33208
Change-Id: I3c945f9b7e2d2ffb0814bfdd3e87de1dae6c20ef
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'tests/manual')
-rw-r--r-- | tests/manual/manual.pro | 1 | ||||
-rw-r--r-- | tests/manual/qsslsocket/main.cpp | 164 | ||||
-rw-r--r-- | tests/manual/qsslsocket/qsslsocket.pro | 6 |
3 files changed, 171 insertions, 0 deletions
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro index c9072c4e9e..62722ea62b 100644 --- a/tests/manual/manual.pro +++ b/tests/manual/manual.pro @@ -25,6 +25,7 @@ qnetworkreply \ qpainfo \ qscreen \ qssloptions \ +qsslsocket \ qtabletevent \ qtexteditlist \ qtbug-8933 \ diff --git a/tests/manual/qsslsocket/main.cpp b/tests/manual/qsslsocket/main.cpp new file mode 100644 index 0000000000..67726b5897 --- /dev/null +++ b/tests/manual/qsslsocket/main.cpp @@ -0,0 +1,164 @@ +/**************************************************************************** +** +** Copyright (C) 2014 BlackBerry Limited. All rights reserved. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, 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, Digia gives you certain additional +** rights. These rights are described in the Digia 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. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtNetwork/qsslconfiguration.h> +#include <QtNetwork/qsslsocket.h> +#include <QtTest/QtTest> + +#ifndef QT_NO_SSL +Q_DECLARE_METATYPE(QSslConfiguration::NextProtocolNegotiationStatus) +#endif + +class tst_QSslSocket : public QObject +{ + Q_OBJECT + +#ifndef QT_NO_SSL +private slots: + void nextProtocolNegotiation_data(); + void nextProtocolNegotiation(); +#endif // QT_NO_SSL +}; + +#ifndef QT_NO_SSL +void tst_QSslSocket::nextProtocolNegotiation_data() +{ + QTest::addColumn<bool>("setConfiguration"); + QTest::addColumn<QString>("host"); + QTest::addColumn<QList<QByteArray> >("allowedProtocols"); + QTest::addColumn<QByteArray>("expectedProtocol"); + QTest::addColumn<QSslConfiguration::NextProtocolNegotiationStatus>("expectedStatus"); + + QList<QString> hosts = QList<QString>() + << QStringLiteral("www.google.com") + << QStringLiteral("www.facebook.com") + << QStringLiteral("www.twitter.com") + << QStringLiteral("graph.facebook.com") + << QStringLiteral("api.twitter.com"); + + foreach (QString host, hosts) { + QByteArray tag = host.toLocal8Bit(); + tag.append("-none"); + QTest::newRow(tag) + << false + << host + << QList<QByteArray>() + << QByteArray() + << QSslConfiguration::NextProtocolNegotiationNone; + + tag = host.toLocal8Bit(); + tag.append("-none-explicit"); + QTest::newRow(tag) + << true + << host + << QList<QByteArray>() + << QByteArray() + << QSslConfiguration::NextProtocolNegotiationNone; + + tag = host.toLocal8Bit(); + tag.append("-http/1.1"); + QTest::newRow(tag) + << true + << host + << (QList<QByteArray>() << QSslConfiguration::NextProtocolHttp1_1) + << QByteArray(QSslConfiguration::NextProtocolHttp1_1) + << QSslConfiguration::NextProtocolNegotiationNegotiated; + + tag = host.toLocal8Bit(); + tag.append("-spdy/3"); + QTest::newRow(tag) + << true + << host + << (QList<QByteArray>() << QSslConfiguration::NextProtocolSpdy3_0) + << QByteArray(QSslConfiguration::NextProtocolSpdy3_0) + << QSslConfiguration::NextProtocolNegotiationNegotiated; + + tag = host.toLocal8Bit(); + tag.append("-spdy/3-and-http/1.1"); + QTest::newRow(tag) + << true + << host + << (QList<QByteArray>() << QSslConfiguration::NextProtocolSpdy3_0 << QSslConfiguration::NextProtocolHttp1_1) + << QByteArray(QSslConfiguration::NextProtocolSpdy3_0) + << QSslConfiguration::NextProtocolNegotiationNegotiated; + } +} + +void tst_QSslSocket::nextProtocolNegotiation() +{ + if (!QSslSocket::supportsSsl()) + return; + + QSslSocket socket; + + QFETCH(bool, setConfiguration); + + if (setConfiguration) { + QSslConfiguration conf = socket.sslConfiguration(); + QFETCH(QList<QByteArray>, allowedProtocols); + conf.setAllowedNextProtocols(allowedProtocols); + socket.setSslConfiguration(conf); + } + + QFETCH(QString, host); + + socket.connectToHostEncrypted(host, 443); + socket.ignoreSslErrors(); + + QVERIFY(socket.waitForEncrypted(10000)); + + QFETCH(QByteArray, expectedProtocol); + QCOMPARE(socket.sslConfiguration().nextNegotiatedProtocol(), expectedProtocol); + + QFETCH(QSslConfiguration::NextProtocolNegotiationStatus, expectedStatus); + QCOMPARE(socket.sslConfiguration().nextProtocolNegotiationStatus(), expectedStatus); + + socket.disconnectFromHost(); + QVERIFY(socket.waitForDisconnected()); + +} + +#endif // QT_NO_SSL + +QTEST_MAIN(tst_QSslSocket) + +#include "main.moc" diff --git a/tests/manual/qsslsocket/qsslsocket.pro b/tests/manual/qsslsocket/qsslsocket.pro new file mode 100644 index 0000000000..c297d887ba --- /dev/null +++ b/tests/manual/qsslsocket/qsslsocket.pro @@ -0,0 +1,6 @@ +CONFIG += testcase + +SOURCES += main.cpp +QT = core network testlib + +TARGET = tst_qsslsocket |