aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-07-27 11:30:56 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-07-27 12:08:23 +0200
commitd948bf99f250559ff67acdb1a6d635fa721a4e7a (patch)
tree4caeff3ecb9eee6be3e38ba5d4095fad9e461c63
parent49112bd127ba9335b60f815481dd02dfbabb1cf7 (diff)
downloadqxmpp-d948bf99f250559ff67acdb1a6d635fa721a4e7a.tar.gz
socks5: add test case for client
-rw-r--r--tests/qxmppsocks/tst_qxmppsocks.cpp144
1 files changed, 99 insertions, 45 deletions
diff --git a/tests/qxmppsocks/tst_qxmppsocks.cpp b/tests/qxmppsocks/tst_qxmppsocks.cpp
index 747a4c6b..24af982e 100644
--- a/tests/qxmppsocks/tst_qxmppsocks.cpp
+++ b/tests/qxmppsocks/tst_qxmppsocks.cpp
@@ -21,6 +21,7 @@
*
*/
+#include <QTcpServer>
#include <QTcpSocket>
#include "QXmppSocks.h"
#include "util.h"
@@ -33,11 +34,11 @@ private slots:
void init();
void newConnectionSlot(QTcpSocket *socket, QString hostName, quint16 port);
+ void testClient_data();
+ void testClient();
void testClientAndServer();
void testServer_data();
void testServer();
- void testServerBadHandshake_data();
- void testServerBadHandshake();
private:
QTcpSocket *m_connectionSocket;
@@ -59,66 +60,99 @@ void tst_QXmppSocks::newConnectionSlot(QTcpSocket *socket, QString hostName, qui
m_connectionPort = port;
}
-void tst_QXmppSocks::testClientAndServer()
+void tst_QXmppSocks::testClient_data()
{
- QXmppSocksServer server;
+ QTest::addColumn<QByteArray>("serverHandshake");
+ QTest::addColumn<bool>("serverHandshakeWorks");
+ QTest::addColumn<QByteArray>("serverConnect");
+ QTest::addColumn<bool>("serverConnectWorks");
+
+ QTest::newRow("no authentication - good connect")
+ << QByteArray::fromHex("0500") << true
+ << QByteArray::fromHex("050000030e7777772e676f6f676c652e636f6d0050") << true;
+ QTest::newRow("no authentication - bad connect")
+ << QByteArray::fromHex("0500") << true
+ << QByteArray::fromHex("0500") << false;
+ QTest::newRow("bad authentication")
+ << QByteArray::fromHex("05ff") << false
+ << QByteArray() << false;
+}
+
+void tst_QXmppSocks::testClient()
+{
+ QFETCH(QByteArray, serverHandshake);
+ QFETCH(bool, serverHandshakeWorks);
+ QFETCH(QByteArray, serverConnect);
+ QFETCH(bool, serverConnectWorks);
+
+ QTcpServer server;
QVERIFY(server.listen());
QVERIFY(server.serverPort() != 0);
- connect(&server, SIGNAL(newConnection(QTcpSocket*,QString,quint16)),
- this, SLOT(newConnectionSlot(QTcpSocket*,QString,quint16)));
QXmppSocksClient client("127.0.0.1", server.serverPort());
QEventLoop loop;
- connect(&client, SIGNAL(ready()), &loop, SLOT(quit()));
-
+ connect(&server, SIGNAL(newConnection()), &loop, SLOT(quit()));
+
client.connectToHost("www.google.com", 80);
loop.exec();
- // check server
+ // receive client handshake
+ m_connectionSocket = server.nextPendingConnection();
QVERIFY(m_connectionSocket);
+
+ connect(m_connectionSocket, SIGNAL(disconnected()), &loop, SLOT(quit()));
+ connect(m_connectionSocket, SIGNAL(readyRead()), &loop, SLOT(quit()));
+ loop.exec();
+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
QCOMPARE(m_connectionSocket->state(), QAbstractSocket::ConnectedState);
- QCOMPARE(m_connectionHostName, QLatin1String("www.google.com"));
- QCOMPARE(m_connectionPort, quint16(80));
+ QCOMPARE(m_connectionSocket->readAll(), QByteArray::fromHex("050100"));
- // disconnect
- client.disconnectFromHost();
-}
+ // receive client connect
+ m_connectionSocket->write(serverHandshake);
+ loop.exec();
+ if (!serverHandshakeWorks) {
+ QCOMPARE(client.state(), QAbstractSocket::UnconnectedState);
+ QCOMPARE(m_connectionSocket->state(), QAbstractSocket::UnconnectedState);
+ return;
+ }
-void tst_QXmppSocks::testServer_data()
-{
- QTest::addColumn<QByteArray>("clientHandshake");
+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(m_connectionSocket->state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(m_connectionSocket->readAll(), QByteArray::fromHex("050100030e7777772e676f6f676c652e636f6d0050"));
+
+ // wait for client to be ready
+ connect(&client, SIGNAL(ready()), &loop, SLOT(quit()));
+ m_connectionSocket->write(serverConnect);
+ loop.exec();
+ if (!serverConnectWorks) {
+ QCOMPARE(client.state(), QAbstractSocket::UnconnectedState);
+ QCOMPARE(m_connectionSocket->state(), QAbstractSocket::UnconnectedState);
+ return;
+ }
+
+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(m_connectionSocket->state(), QAbstractSocket::ConnectedState);
- QTest::newRow("no authentication") << QByteArray::fromHex("050100");
- QTest::newRow("no authentication or GSSAPI") << QByteArray::fromHex("05020001");
+ // disconnect
+ client.disconnectFromHost();
}
-void tst_QXmppSocks::testServer()
+void tst_QXmppSocks::testClientAndServer()
{
- QFETCH(QByteArray, clientHandshake);
-
QXmppSocksServer server;
QVERIFY(server.listen());
QVERIFY(server.serverPort() != 0);
connect(&server, SIGNAL(newConnection(QTcpSocket*,QString,quint16)),
this, SLOT(newConnectionSlot(QTcpSocket*,QString,quint16)));
- QTcpSocket client;
- client.connectToHost(QHostAddress::LocalHost, server.serverPort());
- QVERIFY2(client.waitForConnected(), qPrintable(client.errorString()));
+ QXmppSocksClient client("127.0.0.1", server.serverPort());
QEventLoop loop;
- connect(&client, SIGNAL(readyRead()), &loop, SLOT(quit()));
+ connect(&client, SIGNAL(ready()), &loop, SLOT(quit()));
- // send client handshake
- client.write(clientHandshake);
- loop.exec();
- QCOMPARE(client.readAll(), QByteArray::fromHex("0500"));
-
- // request connect to www.google.com port 80
- client.write(QByteArray::fromHex("050100030e7777772e676f6f676c652e636f6d0050"));
+ client.connectToHost("www.google.com", 80);
loop.exec();
- QCOMPARE(client.readAll(), QByteArray::fromHex("050000030e7777772e676f6f676c652e636f6d0050"));
// check client
QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
@@ -133,18 +167,23 @@ void tst_QXmppSocks::testServer()
client.disconnectFromHost();
}
-void tst_QXmppSocks::testServerBadHandshake_data()
+void tst_QXmppSocks::testServer_data()
{
QTest::addColumn<QByteArray>("clientHandshake");
+ QTest::addColumn<bool>("clientHandshakeWorks");
- QTest::newRow("bad SOCKS version") << QByteArray::fromHex("060100");
- QTest::newRow("no methods") << QByteArray::fromHex("0500");
- QTest::newRow("GSSAPI only") << QByteArray::fromHex("050101");
+ QTest::newRow("no authentication") << QByteArray::fromHex("050100") << true;
+ QTest::newRow("no authentication or GSSAPI") << QByteArray::fromHex("05020001") << true;
+
+ QTest::newRow("bad SOCKS version") << QByteArray::fromHex("060100") << false;
+ QTest::newRow("no methods") << QByteArray::fromHex("0500") << false;
+ QTest::newRow("GSSAPI only") << QByteArray::fromHex("050101") << false;
}
-void tst_QXmppSocks::testServerBadHandshake()
+void tst_QXmppSocks::testServer()
{
QFETCH(QByteArray, clientHandshake);
+ QFETCH(bool, clientHandshakeWorks);
QXmppSocksServer server;
QVERIFY(server.listen());
@@ -158,18 +197,33 @@ void tst_QXmppSocks::testServerBadHandshake()
QEventLoop loop;
connect(&client, SIGNAL(disconnected()), &loop, SLOT(quit()));
+ connect(&client, SIGNAL(readyRead()), &loop, SLOT(quit()));
// send client handshake
client.write(clientHandshake);
loop.exec();
+ if (!clientHandshakeWorks) {
+ QCOMPARE(client.state(), QAbstractSocket::UnconnectedState);
- // check client
- QCOMPARE(client.state(), QAbstractSocket::UnconnectedState);
+ QVERIFY(!m_connectionSocket);
+ QVERIFY(m_connectionHostName.isNull());
+ QCOMPARE(m_connectionPort, quint16(0));
+ return;
+ }
- // check server
- QVERIFY(!m_connectionSocket);
- QVERIFY(m_connectionHostName.isNull());
- QCOMPARE(m_connectionPort, quint16(0));
+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(client.readAll(), QByteArray::fromHex("0500"));
+
+ // request connect to www.google.com port 80
+ client.write(QByteArray::fromHex("050100030e7777772e676f6f676c652e636f6d0050"));
+ loop.exec();
+ QCOMPARE(client.readAll(), QByteArray::fromHex("050000030e7777772e676f6f676c652e636f6d0050"));
+
+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
+ QVERIFY(m_connectionSocket);
+ QCOMPARE(m_connectionSocket->state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(m_connectionHostName, QLatin1String("www.google.com"));
+ QCOMPARE(m_connectionPort, quint16(80));
// disconnect
client.disconnectFromHost();