diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-07-27 11:30:56 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-07-27 12:08:23 +0200 |
| commit | d948bf99f250559ff67acdb1a6d635fa721a4e7a (patch) | |
| tree | 4caeff3ecb9eee6be3e38ba5d4095fad9e461c63 /tests | |
| parent | 49112bd127ba9335b60f815481dd02dfbabb1cf7 (diff) | |
| download | qxmpp-d948bf99f250559ff67acdb1a6d635fa721a4e7a.tar.gz | |
socks5: add test case for client
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/qxmppsocks/tst_qxmppsocks.cpp | 144 |
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(); |
