Convert the QSocks5SocketEngine test to use Docker

Change-Id: I5d223758471a72c93ad57d250001c1de51a208cd
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Mårten Nordheim 2019-02-07 13:23:36 +01:00
parent 2ec47d6cb5
commit 1844f011f6
5 changed files with 98 additions and 20 deletions

View File

@ -72,15 +72,20 @@ public:
} }
#ifdef QT_NETWORK_LIB #ifdef QT_NETWORK_LIB
static QHostAddress serverIP() static QHostAddress getServerIpImpl(const QString &serverName)
{ {
const QHostInfo info = QHostInfo::fromName(serverName()); const QHostInfo info = QHostInfo::fromName(serverName);
if (info.error()) { if (info.error()) {
QTest::qFail(qPrintable(info.errorString()), __FILE__, __LINE__); QTest::qFail(qPrintable(info.errorString()), __FILE__, __LINE__);
return QHostAddress(); return QHostAddress();
} }
return info.addresses().constFirst(); return info.addresses().constFirst();
} }
static QHostAddress serverIP()
{
return getServerIpImpl(serverName());
}
#endif #endif
static bool compareReplyIMAP(QByteArray const& actual) static bool compareReplyIMAP(QByteArray const& actual)
@ -214,4 +219,19 @@ public:
return serverName(); return serverName();
#endif #endif
} }
static QString imapServerName()
{
#ifdef QT_TEST_SERVER_NAME
return QString("cyrus.") % serverDomainName();
#else
return serverName();
#endif
}
#ifdef QT_NETWORK_LIB
static QHostAddress imapServerIp()
{
return getServerIpImpl(imapServerName());
}
#endif
}; };

View File

@ -11,3 +11,9 @@ MOC_DIR=tmp
QT = core-private network-private testlib QT = core-private network-private testlib
requires(qtConfig(private_tests)) requires(qtConfig(private_tests))
# Only on Linux until cyrus has been added to docker-compose-for-{windows,macOS}.yml and tested
linux {
QT_TEST_SERVER_LIST = danted apache2 cyrus
include($$dirname(_QMAKE_CONF_)/tests/auto/testserver.pri)
}

View File

@ -137,7 +137,13 @@ private slots:
void tst_QSocks5SocketEngine::initTestCase() void tst_QSocks5SocketEngine::initTestCase()
{ {
#ifdef QT_TEST_SERVER
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::socksProxyServerName(), 1080));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::httpServerName(), 80));
QVERIFY(QtNetworkSettings::verifyConnection(QtNetworkSettings::imapServerName(), 143));
#else
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
#endif
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -293,13 +299,13 @@ void tst_QSocks5SocketEngine::simpleConnectToIMAP()
QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol)); QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState);
socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080)); socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::socksProxyServerName(), 1080));
QVERIFY(!socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143)); QVERIFY(!socketDevice.connectToHost(QtNetworkSettings::imapServerIp(), 143));
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState);
QVERIFY(socketDevice.waitForWrite()); QVERIFY(socketDevice.waitForWrite());
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectedState);
QCOMPARE(socketDevice.peerAddress(), QtNetworkSettings::serverIP()); QCOMPARE(socketDevice.peerAddress(), QtNetworkSettings::imapServerIp());
// Wait for the greeting // Wait for the greeting
QVERIFY(socketDevice.waitForRead()); QVERIFY(socketDevice.waitForRead());
@ -347,10 +353,10 @@ void tst_QSocks5SocketEngine::simpleErrorsAndStates()
// Initialize device // Initialize device
QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol)); QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080)); socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::socksProxyServerName(), 1080));
QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState);
QVERIFY(!socketDevice.connectToHost(QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first(), 8088)); QVERIFY(!socketDevice.connectToHost(QHostInfo::fromName(QtNetworkSettings::socksProxyServerName()).addresses().first(), 8088));
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState);
if (socketDevice.waitForWrite(15000)) { if (socketDevice.waitForWrite(15000)) {
QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState || QVERIFY(socketDevice.state() == QAbstractSocket::UnconnectedState ||
@ -433,7 +439,7 @@ void tst_QSocks5SocketEngine::serverTest()
// Initialize a Tcp socket // Initialize a Tcp socket
QVERIFY(server.initialize(QAbstractSocket::TcpSocket)); QVERIFY(server.initialize(QAbstractSocket::TcpSocket));
QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080); QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::socksProxyServerName(), 1080);
server.setProxy(proxy); server.setProxy(proxy);
@ -510,7 +516,7 @@ void tst_QSocks5SocketEngine::udpTest()
QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket)); QVERIFY(udpSocket.initialize(QAbstractSocket::UdpSocket));
QVERIFY(udpSocket.isValid()); QVERIFY(udpSocket.isValid());
QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080); QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::socksProxyServerName(), 1080);
udpSocket.setProxy(proxy); udpSocket.setProxy(proxy);
@ -564,7 +570,7 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
QTcpSocket socket; QTcpSocket socket;
// Connect // Connect
socket.connectToHost(QtNetworkSettings::serverName(), 143); socket.connectToHost(QtNetworkSettings::imapServerName(), 143);
QVERIFY(socket.waitForConnected()); QVERIFY(socket.waitForConnected());
QCOMPARE(socket.state(), QTcpSocket::ConnectedState); QCOMPARE(socket.state(), QTcpSocket::ConnectedState);
@ -635,7 +641,7 @@ void tst_QSocks5SocketEngine::tcpSocketNonBlockingTest()
}); });
// Connect // Connect
socket.connectToHost(QtNetworkSettings::serverName(), 143); socket.connectToHost(QtNetworkSettings::imapServerName(), 143);
QVERIFY(socket.state() == QTcpSocket::HostLookupState || QVERIFY(socket.state() == QTcpSocket::HostLookupState ||
socket.state() == QTcpSocket::ConnectingState); socket.state() == QTcpSocket::ConnectingState);
@ -754,13 +760,13 @@ void tst_QSocks5SocketEngine::downloadBigFile()
<< " (" << stopWatch.elapsed() << "ms)"; << " (" << stopWatch.elapsed() << "ms)";
}); });
socket.connectToHost(QtNetworkSettings::serverName(), 80); socket.connectToHost(QtNetworkSettings::httpServerName(), 80);
QTestEventLoop::instance().enterLoop(30); QTestEventLoop::instance().enterLoop(30);
if (QTestEventLoop::instance().timeout()) if (QTestEventLoop::instance().timeout())
QFAIL("Network operation timed out"); QFAIL("Network operation timed out");
QByteArray hostName = QtNetworkSettings::serverName().toLatin1(); QByteArray hostName = QtNetworkSettings::httpServerName().toLatin1();
QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState);
QVERIFY(socket.write("GET /qtest/mediumfile HTTP/1.0\r\n") > 0); QVERIFY(socket.write("GET /qtest/mediumfile HTTP/1.0\r\n") > 0);
QVERIFY(socket.write("HOST: ") > 0); QVERIFY(socket.write("HOST: ") > 0);
@ -791,13 +797,13 @@ void tst_QSocks5SocketEngine::passwordAuth()
QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol)); QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState);
socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1080, "qsockstest", "password")); socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::socksProxyServerName(), 1080, "qsockstest", "password"));
// Connect to imap.trolltech.com's IP // Connect to imap.trolltech.com's IP
QVERIFY(!socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143)); QVERIFY(!socketDevice.connectToHost(QtNetworkSettings::imapServerIp(), 143));
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState);
QVERIFY(socketDevice.waitForWrite()); QVERIFY(socketDevice.waitForWrite());
if (!socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143)) { if (!socketDevice.connectToHost(QtNetworkSettings::imapServerIp(), 143)) {
qDebug("%d, %s", socketDevice.error(), socketDevice.errorString().toLatin1().constData()); qDebug("%d, %s", socketDevice.error(), socketDevice.errorString().toLatin1().constData());
} }
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectedState);
@ -857,19 +863,19 @@ void tst_QSocks5SocketEngine::passwordAuth2()
QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol)); QVERIFY(socketDevice.initialize(QAbstractSocket::TcpSocket, QAbstractSocket::IPv4Protocol));
QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::UnconnectedState);
socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::serverName(), 1081)); socketDevice.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, QtNetworkSettings::socksProxyServerName(), 1081));
socketDevice.setReceiver(this); socketDevice.setReceiver(this);
QVERIFY(!socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143)); QVERIFY(!socketDevice.connectToHost(QtNetworkSettings::imapServerIp(), 143));
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectingState);
while (socketDevice.state() == QAbstractSocket::ConnectingState) { while (socketDevice.state() == QAbstractSocket::ConnectingState) {
QVERIFY(socketDevice.waitForWrite()); QVERIFY(socketDevice.waitForWrite());
socketDevice.connectToHost(QtNetworkSettings::serverIP(), 143); socketDevice.connectToHost(QtNetworkSettings::imapServerIp(), 143);
} }
if (socketDevice.state() != QAbstractSocket::ConnectedState) if (socketDevice.state() != QAbstractSocket::ConnectedState)
qDebug("%d, %s", socketDevice.error(), socketDevice.errorString().toLatin1().constData()); qDebug("%d, %s", socketDevice.error(), socketDevice.errorString().toLatin1().constData());
QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectedState); QCOMPARE(socketDevice.state(), QAbstractSocket::ConnectedState);
QCOMPARE(socketDevice.peerAddress(), QtNetworkSettings::serverIP()); QCOMPARE(socketDevice.peerAddress(), QtNetworkSettings::imapServerIp());
// Wait for the greeting // Wait for the greeting
QVERIFY(socketDevice.waitForRead()); QVERIFY(socketDevice.waitForRead());

34
tests/testserver/cyrus/cyrus.sh Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env bash
#############################################################################
##
## Copyright (C) 2019 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of the test suite of the Qt Toolkit.
##
## $QT_BEGIN_LICENSE:GPL$
## 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 or (at your option) any later version
## approved by the KDE Free Qt Foundation. The licenses are as published by
## the Free Software Foundation and appearing in the file LICENSE.GPL3
## 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$
##
#############################################################################
set -ex
service cyrus-imapd start

View File

@ -76,8 +76,20 @@ services:
- apache2:apache2.${TEST_DOMAIN} - apache2:apache2.${TEST_DOMAIN}
- vsftpd:vsftpd.${TEST_DOMAIN} - vsftpd:vsftpd.${TEST_DOMAIN}
- ftp-proxy:ftp-proxy.${TEST_DOMAIN} - ftp-proxy:ftp-proxy.${TEST_DOMAIN}
- cyrus:cyrus.${TEST_DOMAIN}
volumes: volumes:
- ./common:/common:ro - ./common:/common:ro
- ./danted:/service:ro - ./danted:/service:ro
entrypoint: common/startup.sh entrypoint: common/startup.sh
command: service/danted.sh command: service/danted.sh
cyrus:
image: qt-test-server-cyrus:c8d72754abc0e501afd624ce838e4df35505abc9
container_name: qt-test-server-cyrus
domainname: ${TEST_DOMAIN}
hostname: cyrus
volumes:
- ./common:/common:ro
- ./cyrus:/service:ro
entrypoint: common/startup.sh
command: service/cyrus.sh