summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2019-02-13 19:43:33 +0100
committerMichal Klocek <michal.klocek@qt.io>2019-02-19 10:32:09 +0000
commit05369331163c3c07907c2caed98e3eaabbdfe023 (patch)
tree4600f4a76f11599a42188d1b6c45e1457f4467e8
parent42d8036576c340e9d4cca45361c448f184957aa6 (diff)
Add proxy authentication unit test
Task-number: QTBUG-58121 Change-Id: Id2f983903f2e631cc6ec0632a70ac6ec3ef3c1ce Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--tests/auto/widgets/proxy/proxy.pro9
-rw-r--r--tests/auto/widgets/proxy/proxy_server.cpp90
-rw-r--r--tests/auto/widgets/proxy/proxy_server.h59
-rw-r--r--tests/auto/widgets/proxy/tst_proxy.cpp69
-rw-r--r--tests/auto/widgets/widgets.pro3
5 files changed, 229 insertions, 1 deletions
diff --git a/tests/auto/widgets/proxy/proxy.pro b/tests/auto/widgets/proxy/proxy.pro
new file mode 100644
index 00000000..802dfad0
--- /dev/null
+++ b/tests/auto/widgets/proxy/proxy.pro
@@ -0,0 +1,9 @@
+include(../tests.pri)
+QT += core-private webengine webengine-private
+
+HEADERS += \
+ proxy_server.h
+
+SOURCES += \
+ proxy_server.cpp
+
diff --git a/tests/auto/widgets/proxy/proxy_server.cpp b/tests/auto/widgets/proxy/proxy_server.cpp
new file mode 100644
index 00000000..55f01491
--- /dev/null
+++ b/tests/auto/widgets/proxy/proxy_server.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "proxy_server.h"
+#include <QDataStream>
+#include <QTcpSocket>
+#include <QDebug>
+
+ProxyServer::ProxyServer(QObject *parent) : QObject(parent)
+{
+ connect(&m_server, &QTcpServer::newConnection, this, &ProxyServer::handleNewConnection);
+}
+
+void ProxyServer::setCredentials(const QByteArray &user, const QByteArray password)
+{
+ m_auth.append(user);
+ m_auth.append(QChar(':'));
+ m_auth.append(password);
+ m_auth = m_auth.toBase64();
+}
+
+bool ProxyServer::isListening()
+{
+ return m_server.isListening();
+}
+
+void ProxyServer::run()
+{
+ if (!m_server.listen(QHostAddress::LocalHost, 5555))
+ qFatal("Could not start the test server");
+}
+
+void ProxyServer::handleNewConnection()
+{
+ // do one connection at the time
+ Q_ASSERT(m_data.isEmpty());
+ QTcpSocket *socket = m_server.nextPendingConnection();
+ Q_ASSERT(socket);
+ connect(socket, &QAbstractSocket::disconnected, socket, &QObject::deleteLater);
+ connect(socket, &QAbstractSocket::readyRead, this, &ProxyServer::handleReadReady);
+}
+
+void ProxyServer::handleReadReady()
+{
+ QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
+ Q_ASSERT(socket);
+
+ m_data.append(socket->readAll());
+
+ if (!m_data.endsWith("\r\n\r\n"))
+ return;
+
+ if (!m_data.contains(QByteArrayLiteral("Proxy-Authorization: Basic"))) {
+ socket->write("HTTP/1.1 407 Proxy Authentication Required\nProxy-Authenticate: "
+ "Basic realm=\"Proxy requires authentication\"\r\n"
+ "content-length: 0\r\n"
+ "\r\n");
+ return;
+ }
+
+ if (m_data.contains(m_auth)) {
+ emit success();
+ }
+ m_data.clear();
+}
diff --git a/tests/auto/widgets/proxy/proxy_server.h b/tests/auto/widgets/proxy/proxy_server.h
new file mode 100644
index 00000000..cb7c3060
--- /dev/null
+++ b/tests/auto/widgets/proxy/proxy_server.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PROXY_SERVER_H
+#define PROXY_SERVER_H
+
+#include <QObject>
+#include <QTcpServer>
+
+class ProxyServer : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit ProxyServer(QObject *parent = nullptr);
+ void setCredentials(const QByteArray &user, const QByteArray password);
+ bool isListening();
+
+public slots:
+ void run();
+
+private slots:
+ void handleNewConnection();
+ void handleReadReady();
+
+signals:
+ void success();
+private:
+ QByteArray m_data;
+ QTcpServer m_server;
+ QByteArray m_auth;
+};
+
+#endif // PROXY_SERVER_H
diff --git a/tests/auto/widgets/proxy/tst_proxy.cpp b/tests/auto/widgets/proxy/tst_proxy.cpp
new file mode 100644
index 00000000..5f5dec01
--- /dev/null
+++ b/tests/auto/widgets/proxy/tst_proxy.cpp
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "proxy_server.h"
+#include <QTest>
+#include <QSignalSpy>
+#include <QNetworkProxy>
+#include <QWebEnginePage>
+#include <QWebEngineView>
+
+
+class tst_Proxy : public QObject {
+ Q_OBJECT
+public:
+ tst_Proxy(){}
+
+private slots:
+ void proxyAuthentication();
+};
+
+void tst_Proxy::proxyAuthentication()
+{
+ QByteArray user(QByteArrayLiteral("test"));
+ QByteArray password(QByteArrayLiteral("pass"));
+ QNetworkProxy proxy;
+ proxy.setType(QNetworkProxy::HttpProxy);
+ proxy.setHostName("localhost");
+ proxy.setPort(5555);
+ proxy.setUser(user);
+ proxy.setPassword(password);
+ QNetworkProxy::setApplicationProxy(proxy);
+ ProxyServer server;
+ server.setCredentials(user,password);
+ server.run();
+ QTRY_VERIFY2(server.isListening(), "Could not setup authentication server");
+ QWebEnginePage page;
+ QSignalSpy successSpy(&server, &ProxyServer::success);
+ page.load(QUrl("http://www.qt.io"));
+ QTRY_VERIFY2(successSpy.count() > 0, "Could not get authentication token");
+}
+
+#include "tst_proxy.moc"
+QTEST_MAIN(tst_Proxy)
+
diff --git a/tests/auto/widgets/widgets.pro b/tests/auto/widgets/widgets.pro
index 0addb967..3f0e6dc3 100644
--- a/tests/auto/widgets/widgets.pro
+++ b/tests/auto/widgets/widgets.pro
@@ -9,6 +9,7 @@ SUBDIRS += \
faviconmanager \
loadsignals \
origins \
+ proxy \
proxypac \
schemes \
shutdown \
@@ -41,4 +42,4 @@ boot2qt: SUBDIRS -= accessibility defaultsurfaceformat devtools \
faviconmanager qwebenginepage qwebenginehistory \
qwebengineprofile qwebenginescript \
qwebengineview qwebenginedownloaditem qwebenginesettings \
- schemes origins loadsignals proxypac
+ schemes origins loadsignals proxy proxypac