I have successfully built a thin client/server using Qt's Tcp Sockets API. I know it works very well, because I have sent plenty of data over the wire and verified it. However, my project manager wants a suite of unit-tests, and I'm implementing them using Qt's Test Library.
Anyhow, I'm trying to set up some dummy server to simply receive data from a QTcpSocket to verify a sendData() method in a unit test. When I connect the test socket, is shows that it is connected, but the slot for connecting the dummy server and its dummy socket is never called!
Can anyone see what I'm doing wrong here? ( I've stripped the code down down to just the parts that seem broken in the test class )
From tst_tcpcommsocket.h
#ifndef TST_TCPCOMMSOCKET_H
#define TST_TCPCOMMSOCKET_H
#include <QtCore/QString>
#include <QtTest/QtTest>
#include <iostream>
#include <QTcpSocket>
#include <QTcpServer>
class TcpCommSocketTest : public QObject
{
Q_OBJECT
private:
QTcpSocket* qTestSocket;
QTcpSocket* qDummySocket;
QTcpServer* qDummyServer;
public:
TcpCommSocketTest();
public slots:
void connectDummyServer();
private Q_SLOTS:
void initTestCase();
void sendDataTest();
void cleanupTestCase();
};
#endif // TST_TCPCOMMSOCKET_H
From tst_tcpcommsocket.cpp
#include "tst_tcpcommsocket.h"
void TcpCommSocketTest::connectDummyServer()
{
cout << "connection attempt" << endl;
qDummySocket = qDummyServer->nextPendingConnection();
}
void TcpCommSocketTest::initTestCase()
{
qDummySocket = NULL;
qDummyServer = new QTcpServer();
qDummyServer->listen( QHostAddress("127.0.0.1"), 9000 );
connect( qDummyServer, SIGNAL(newConnection()), SLOT(connectDummyServer()) );
qTestSocket = new QTcpSocket();
qTestSocket->connectToHost( QHostAddress("127.0.0.1"), 9000 );
QVERIFY( qTestSocket->waitForConnected( 5000 ) );
QVERIFY( qTestSocket->state() == QTcpSocket::ConnectedState );
}
void TcpCommSocketTest::sendDataTest()
{
int i=0;
QVERIFY( qDummySocket != NULL );
}
QTEST_MAIN(TcpCommSocketTest);
The Test Run's output:
********* Start testing of TcpCommSocketTest *********
Config: Using QTest library 4.7.3, Qt 4.7.3
PASS : TcpCommSocketTest::initTestCase()
FAIL! : TcpCommSocketTest::sendDataTest() 'qDummySocket != NULL' returned FALSE. ()
Loc: [-]
cleanup
PASS : TcpCommSocketTest::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped
Verify the return value of
qDummyServer->listen()
. It should returntrue
if the server is indeed listening at port 9000. If it returnsfalse
, chances are port 9000 is blocked by another process, and it couldn't listen. In that case, yourqTestSocket
connected to that other process instead of your own server.While
QTEST_MAIN
creates a QApplication and runs all your tests, it does so sequentially and not with an event loop. Therefore, while your socket can indeed connect to the server (meaningqTestSocket->waitForConnected()
returnstrue
), since the app doesn't return to an event loop, theQTcpServer
's signal will not get emitted, andTcpCommSocketTest::connectDummyServer()
never gets called.Try adding a call to
qApp->processEvents()
at the end ofinitTestCase()
. It should letconnectDummyServer()
be called.You could be connecting to an instance of the server started earlier. Poke around with a process monitor to make sure you don't have any stray instances. Does your test setup automatically kick off and shutdown the dummy server? It could be that the test is succesfully starting the server, but failing to kill it.
Also, from the 127.0.0.1, the dummy server is running on the same machine as the test code right?