/**************************************************************************** ** ** Copyright (C) 2016 Kurt Pattyn . ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtWebSockets 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 #include #include #include #include #include "QtWebSockets/QWebSocket" // Run 'wstest -m echoserver -w ws://localhost:9000' before launching // the test. // wstest is part of the autobahn-testsuite: // https://github.com/crossbario/autobahn-testsuite class tst_WebSocketsTest : public QObject { Q_OBJECT public: tst_WebSocketsTest(); private Q_SLOTS: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); /** * @brief Test isValid() with an unoped socket */ void testInvalidWithUnopenedSocket(); /** * @brief testTextMessage Tests sending and receiving a text message */ void testTextMessage(); void testBinaryMessage(); /** * @brief Tests the method localAddress and localPort */ void testLocalAddress(); /** * @brief Test the methods peerAddress, peerName and peerPort */ void testPeerAddress(); /** * @brief Test the methods proxy() and setProxy() and check if it can be correctly set */ void testProxy(); /** * @brief Runs the autobahn tests against our implementation */ //void autobahnTest(); private: QWebSocket *m_pWebSocket; QUrl m_url; }; tst_WebSocketsTest::tst_WebSocketsTest() : m_pWebSocket(0), m_url(QStringLiteral("ws://localhost:9000")) { } void tst_WebSocketsTest::initTestCase() { m_pWebSocket = new QWebSocket(); m_pWebSocket->open(m_url); QTRY_VERIFY_WITH_TIMEOUT(m_pWebSocket->state() == QAbstractSocket::ConnectedState, 1000); QVERIFY(m_pWebSocket->isValid()); } void tst_WebSocketsTest::cleanupTestCase() { if (m_pWebSocket) { m_pWebSocket->close(); //QVERIFY2(m_pWebSocket->waitForDisconnected(1000), "Disconnection failed."); delete m_pWebSocket; m_pWebSocket = 0; } } void tst_WebSocketsTest::init() { } void tst_WebSocketsTest::cleanup() { } void tst_WebSocketsTest::testTextMessage() { const QString message = QStringLiteral("Hello world!"); QSignalSpy spy(m_pWebSocket, SIGNAL(textMessageReceived(QString))); QCOMPARE(m_pWebSocket->sendTextMessage(message), qint64(message.length())); QTRY_VERIFY_WITH_TIMEOUT(spy.count() != 0, 1000); QCOMPARE(spy.count(), 1); QCOMPARE(spy.at(0).count(), 1); QCOMPARE(spy.takeFirst().at(0).toString(), message); } void tst_WebSocketsTest::testBinaryMessage() { QSignalSpy spy(m_pWebSocket, SIGNAL(binaryMessageReceived(QByteArray))); QByteArray data("Hello world!"); QCOMPARE(m_pWebSocket->sendBinaryMessage(data), qint64(data.size())); QTRY_VERIFY_WITH_TIMEOUT(spy.count() != 0, 1000); QCOMPARE(spy.count(), 1); QCOMPARE(spy.at(0).count(), 1); QCOMPARE(spy.takeFirst().at(0).toByteArray(), data); } void tst_WebSocketsTest::testLocalAddress() { QCOMPARE(m_pWebSocket->localAddress().toString(), QStringLiteral("127.0.0.1")); quint16 localPort = m_pWebSocket->localPort(); QVERIFY2(localPort > 0, "Local port is invalid."); } void tst_WebSocketsTest::testPeerAddress() { QHostInfo hostInfo = QHostInfo::fromName(m_url.host()); const QList addresses = hostInfo.addresses(); QVERIFY(addresses.length() > 0); QHostAddress peer = m_pWebSocket->peerAddress(); bool found = false; for (const QHostAddress &a : addresses) { if (a == peer) { found = true; break; } } if (!found) { QFAIL("PeerAddress is not found as a result of a reverse lookup"); } QCOMPARE(m_pWebSocket->peerName(), m_url.host()); QCOMPARE(m_pWebSocket->peerPort(), (quint16)m_url.port(80)); } void tst_WebSocketsTest::testProxy() { QNetworkProxy oldProxy = m_pWebSocket->proxy(); QNetworkProxy proxy(QNetworkProxy::HttpProxy, QStringLiteral("proxy.network.com"), 80); m_pWebSocket->setProxy(proxy); QCOMPARE(proxy, m_pWebSocket->proxy()); m_pWebSocket->setProxy(oldProxy); QCOMPARE(oldProxy, m_pWebSocket->proxy()); } void tst_WebSocketsTest::testInvalidWithUnopenedSocket() { QWebSocket qws; QCOMPARE(qws.isValid(), false); } QTEST_MAIN(tst_WebSocketsTest) #include "tst_websockets.moc"