Revision control

++ // Copyright (C) 2016 Kurt Pattyn <pattyn.kurt@gmail.com>.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ #include <QtTest/QtTest>
++ #include <QtTest/qtestcase.h>
++ #include <QSignalSpy>
++ #include <QHostInfo>
++ #include <QDebug>
++ #include "QtWebSockets/QWebSocket"
++
++ // Run 'wstest -m echoserver -w ws://localhost:9000' before launching
++ // the test.
++
++ // wstest is part of the 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<QHostAddress> 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"
++