tst_QTcpSocket, tst_QUdpSocket: Improve diagnostics.
Add more error messages on failures. Task-number: QTBUG-25367 Task-number: QTBUG-25368 Change-Id: I064143a058b7b98d9d5eecab8b5da49f5307e1eb Reviewed-by: Edward Welbourne <edward.welbourne@theqtcompany.com> Reviewed-by: Richard J. Moore <rich@kde.org>
This commit is contained in:
parent
8f0bf2d3d2
commit
22a7edd816
@ -34,6 +34,8 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#ifdef QT_NETWORK_LIB
|
#ifdef QT_NETWORK_LIB
|
||||||
#include <QtNetwork/QHostInfo>
|
#include <QtNetwork/QHostInfo>
|
||||||
|
#include <QtNetwork/QHostAddress>
|
||||||
|
#include <QtNetwork/QAbstractSocket>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_UNIX
|
#ifdef Q_OS_UNIX
|
||||||
@ -139,5 +141,21 @@ public:
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
// Helper function for usage with QVERIFY2 on sockets.
|
||||||
|
static QByteArray msgSocketError(const QAbstractSocket &s)
|
||||||
|
{
|
||||||
|
QString result;
|
||||||
|
QDebug debug(&result);
|
||||||
|
debug.nospace();
|
||||||
|
debug.noquote();
|
||||||
|
if (!s.localAddress().isNull())
|
||||||
|
debug << "local=" << s.localAddress().toString() << ':' << s.localPort();
|
||||||
|
if (!s.peerAddress().isNull())
|
||||||
|
debug << ", peer=" << s.peerAddress().toString() << ':' << s.peerPort();
|
||||||
|
debug << ", type=" << s.socketType() << ", state=" << s.state()
|
||||||
|
<< ", error=" << s.error() << ": " << s.errorString();
|
||||||
|
return result.toLocal8Bit();
|
||||||
|
}
|
||||||
|
#endif // QT_NETWORK_LIB
|
||||||
};
|
};
|
||||||
|
@ -675,8 +675,10 @@ void tst_QTcpSocket::bindThenResolveHost()
|
|||||||
|
|
||||||
dummySocket.close();
|
dummySocket.close();
|
||||||
|
|
||||||
socket->connectToHost(hostName, 80);
|
const quint16 port = 80;
|
||||||
QVERIFY2(socket->waitForConnected(), "Network timeout");
|
socket->connectToHost(hostName, port);
|
||||||
|
QVERIFY2(socket->waitForConnected(), (hostName.toLocal8Bit() + ": " + QByteArray::number(port) + ' '
|
||||||
|
+ QtNetworkSettings::msgSocketError(*socket)).constData());
|
||||||
|
|
||||||
QCOMPARE(socket->localPort(), boundPort);
|
QCOMPARE(socket->localPort(), boundPort);
|
||||||
QCOMPARE(socket->socketDescriptor(), fd);
|
QCOMPARE(socket->socketDescriptor(), fd);
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include <qcoreapplication.h>
|
#include <qcoreapplication.h>
|
||||||
#include <qfileinfo.h>
|
#include <qfileinfo.h>
|
||||||
#include <qdatastream.h>
|
#include <qdatastream.h>
|
||||||
|
#include <qdebug.h>
|
||||||
#include <qudpsocket.h>
|
#include <qudpsocket.h>
|
||||||
#include <qhostaddress.h>
|
#include <qhostaddress.h>
|
||||||
#include <qhostinfo.h>
|
#include <qhostinfo.h>
|
||||||
@ -265,7 +266,7 @@ void tst_QUdpSocket::unconnectedServerAndClientTest()
|
|||||||
char buf[1024];
|
char buf[1024];
|
||||||
QHostAddress host;
|
QHostAddress host;
|
||||||
quint16 port;
|
quint16 port;
|
||||||
QVERIFY(serverSocket.waitForReadyRead(5000));
|
QVERIFY2(serverSocket.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(serverSocket).constData());
|
||||||
QCOMPARE(int(serverSocket.readDatagram(buf, sizeof(buf), &host, &port)),
|
QCOMPARE(int(serverSocket.readDatagram(buf, sizeof(buf), &host, &port)),
|
||||||
int(strlen(message[i])));
|
int(strlen(message[i])));
|
||||||
buf[strlen(message[i])] = '\0';
|
buf[strlen(message[i])] = '\0';
|
||||||
@ -397,8 +398,8 @@ void tst_QUdpSocket::loop()
|
|||||||
QCOMPARE(paul.writeDatagram(paulMessage.data(), paulMessage.length(),
|
QCOMPARE(paul.writeDatagram(paulMessage.data(), paulMessage.length(),
|
||||||
peterAddress, peter.localPort()), qint64(paulMessage.length()));
|
peterAddress, peter.localPort()), qint64(paulMessage.length()));
|
||||||
|
|
||||||
QVERIFY(peter.waitForReadyRead(9000));
|
QVERIFY2(peter.waitForReadyRead(9000), QtNetworkSettings::msgSocketError(peter).constData());
|
||||||
QVERIFY(paul.waitForReadyRead(9000));
|
QVERIFY2(paul.waitForReadyRead(9000), QtNetworkSettings::msgSocketError(paul).constData());
|
||||||
char peterBuffer[16*1024];
|
char peterBuffer[16*1024];
|
||||||
char paulBuffer[16*1024];
|
char paulBuffer[16*1024];
|
||||||
if (success) {
|
if (success) {
|
||||||
@ -454,8 +455,8 @@ void tst_QUdpSocket::ipv6Loop()
|
|||||||
char peterBuffer[16*1024];
|
char peterBuffer[16*1024];
|
||||||
char paulBuffer[16*1024];
|
char paulBuffer[16*1024];
|
||||||
#if !defined(Q_OS_WINCE)
|
#if !defined(Q_OS_WINCE)
|
||||||
QVERIFY(peter.waitForReadyRead(5000));
|
QVERIFY2(peter.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(peter).constData());
|
||||||
QVERIFY(paul.waitForReadyRead(5000));
|
QVERIFY2(paul.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(paul).constData());
|
||||||
#else
|
#else
|
||||||
QVERIFY(peter.waitForReadyRead(15000));
|
QVERIFY(peter.waitForReadyRead(15000));
|
||||||
QVERIFY(paul.waitForReadyRead(15000));
|
QVERIFY(paul.waitForReadyRead(15000));
|
||||||
@ -490,7 +491,7 @@ void tst_QUdpSocket::dualStack()
|
|||||||
QByteArray buffer;
|
QByteArray buffer;
|
||||||
//test v4 -> dual
|
//test v4 -> dual
|
||||||
QCOMPARE((int)v4Sock.writeDatagram(v4Data.constData(), v4Data.length(), QHostAddress(QHostAddress::LocalHost), dualSock.localPort()), v4Data.length());
|
QCOMPARE((int)v4Sock.writeDatagram(v4Data.constData(), v4Data.length(), QHostAddress(QHostAddress::LocalHost), dualSock.localPort()), v4Data.length());
|
||||||
QVERIFY(dualSock.waitForReadyRead(5000));
|
QVERIFY2(dualSock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(dualSock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
qint64 size = dualSock.readDatagram(buffer.data(), 100, &from, &port);
|
qint64 size = dualSock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, v4Data.length());
|
QCOMPARE((int)size, v4Data.length());
|
||||||
@ -504,7 +505,7 @@ void tst_QUdpSocket::dualStack()
|
|||||||
|
|
||||||
//test v6 -> dual
|
//test v6 -> dual
|
||||||
QCOMPARE((int)v6Sock.writeDatagram(v6Data.constData(), v6Data.length(), QHostAddress(QHostAddress::LocalHostIPv6), dualSock.localPort()), v6Data.length());
|
QCOMPARE((int)v6Sock.writeDatagram(v6Data.constData(), v6Data.length(), QHostAddress(QHostAddress::LocalHostIPv6), dualSock.localPort()), v6Data.length());
|
||||||
QVERIFY(dualSock.waitForReadyRead(5000));
|
QVERIFY2(dualSock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(dualSock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = dualSock.readDatagram(buffer.data(), 100, &from, &port);
|
size = dualSock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, v6Data.length());
|
QCOMPARE((int)size, v6Data.length());
|
||||||
@ -513,7 +514,7 @@ void tst_QUdpSocket::dualStack()
|
|||||||
|
|
||||||
//test dual -> v6
|
//test dual -> v6
|
||||||
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length());
|
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length());
|
||||||
QVERIFY(v6Sock.waitForReadyRead(5000));
|
QVERIFY2(v6Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v6Sock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = v6Sock.readDatagram(buffer.data(), 100, &from, &port);
|
size = v6Sock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, dualData.length());
|
QCOMPARE((int)size, dualData.length());
|
||||||
@ -523,7 +524,7 @@ void tst_QUdpSocket::dualStack()
|
|||||||
|
|
||||||
//test dual -> v4
|
//test dual -> v4
|
||||||
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length());
|
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length());
|
||||||
QVERIFY(v4Sock.waitForReadyRead(5000));
|
QVERIFY2(v4Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v4Sock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = v4Sock.readDatagram(buffer.data(), 100, &from, &port);
|
size = v4Sock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, dualData.length());
|
QCOMPARE((int)size, dualData.length());
|
||||||
@ -555,7 +556,7 @@ void tst_QUdpSocket::dualStackAutoBinding()
|
|||||||
QUdpSocket dualSock;
|
QUdpSocket dualSock;
|
||||||
|
|
||||||
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length());
|
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length());
|
||||||
QVERIFY(v4Sock.waitForReadyRead(5000));
|
QVERIFY2(v4Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v4Sock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = v4Sock.readDatagram(buffer.data(), 100, &from, &port);
|
size = v4Sock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, dualData.length());
|
QCOMPARE((int)size, dualData.length());
|
||||||
@ -563,7 +564,7 @@ void tst_QUdpSocket::dualStackAutoBinding()
|
|||||||
QCOMPARE(buffer, dualData);
|
QCOMPARE(buffer, dualData);
|
||||||
|
|
||||||
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length());
|
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length());
|
||||||
QVERIFY(v6Sock.waitForReadyRead(5000));
|
QVERIFY2(v6Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v6Sock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = v6Sock.readDatagram(buffer.data(), 100, &from, &port);
|
size = v6Sock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, dualData.length());
|
QCOMPARE((int)size, dualData.length());
|
||||||
@ -576,7 +577,7 @@ void tst_QUdpSocket::dualStackAutoBinding()
|
|||||||
QUdpSocket dualSock;
|
QUdpSocket dualSock;
|
||||||
|
|
||||||
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length());
|
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHostIPv6), v6Sock.localPort()), dualData.length());
|
||||||
QVERIFY(v6Sock.waitForReadyRead(5000));
|
QVERIFY2(v6Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v6Sock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = v6Sock.readDatagram(buffer.data(), 100, &from, &port);
|
size = v6Sock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, dualData.length());
|
QCOMPARE((int)size, dualData.length());
|
||||||
@ -584,7 +585,7 @@ void tst_QUdpSocket::dualStackAutoBinding()
|
|||||||
QCOMPARE(buffer, dualData);
|
QCOMPARE(buffer, dualData);
|
||||||
|
|
||||||
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length());
|
QCOMPARE((int)dualSock.writeDatagram(dualData.constData(), dualData.length(), QHostAddress(QHostAddress::LocalHost), v4Sock.localPort()), dualData.length());
|
||||||
QVERIFY(v4Sock.waitForReadyRead(5000));
|
QVERIFY2(v4Sock.waitForReadyRead(5000), QtNetworkSettings::msgSocketError(v4Sock).constData());
|
||||||
buffer.reserve(100);
|
buffer.reserve(100);
|
||||||
size = v4Sock.readDatagram(buffer.data(), 100, &from, &port);
|
size = v4Sock.readDatagram(buffer.data(), 100, &from, &port);
|
||||||
QCOMPARE((int)size, dualData.length());
|
QCOMPARE((int)size, dualData.length());
|
||||||
@ -689,7 +690,7 @@ void tst_QUdpSocket::pendingDatagramSize()
|
|||||||
QVERIFY(client.writeDatagram("3 messages", 10, serverAddress, server.localPort()) == 10);
|
QVERIFY(client.writeDatagram("3 messages", 10, serverAddress, server.localPort()) == 10);
|
||||||
|
|
||||||
char c = 0;
|
char c = 0;
|
||||||
QVERIFY(server.waitForReadyRead());
|
QVERIFY2(server.waitForReadyRead(), QtNetworkSettings::msgSocketError(server).constData());
|
||||||
if (server.hasPendingDatagrams()) {
|
if (server.hasPendingDatagrams()) {
|
||||||
#if defined Q_OS_HPUX && defined __ia64
|
#if defined Q_OS_HPUX && defined __ia64
|
||||||
QEXPECT_FAIL("", "HP-UX 11i v2 can't determine the datagram size correctly.", Abort);
|
QEXPECT_FAIL("", "HP-UX 11i v2 can't determine the datagram size correctly.", Abort);
|
||||||
@ -1101,7 +1102,7 @@ void tst_QUdpSocket::zeroLengthDatagram()
|
|||||||
#endif
|
#endif
|
||||||
QCOMPARE(sender.writeDatagram(QByteArray(), QHostAddress::LocalHost, receiver.localPort()), qint64(0));
|
QCOMPARE(sender.writeDatagram(QByteArray(), QHostAddress::LocalHost, receiver.localPort()), qint64(0));
|
||||||
|
|
||||||
QVERIFY(receiver.waitForReadyRead(1000));
|
QVERIFY2(receiver.waitForReadyRead(1000), QtNetworkSettings::msgSocketError(receiver).constData());
|
||||||
QVERIFY(receiver.hasPendingDatagrams());
|
QVERIFY(receiver.hasPendingDatagrams());
|
||||||
|
|
||||||
char buf;
|
char buf;
|
||||||
@ -1379,8 +1380,7 @@ void tst_QUdpSocket::multicast()
|
|||||||
int(datagram.size()));
|
int(datagram.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
QVERIFY2(receiver.waitForReadyRead(),
|
QVERIFY2(receiver.waitForReadyRead(), QtNetworkSettings::msgSocketError(receiver).constData());
|
||||||
qPrintable(receiver.errorString()));
|
|
||||||
QVERIFY(receiver.hasPendingDatagrams());
|
QVERIFY(receiver.hasPendingDatagrams());
|
||||||
QList<QByteArray> receivedDatagrams;
|
QList<QByteArray> receivedDatagrams;
|
||||||
while (receiver.hasPendingDatagrams()) {
|
while (receiver.hasPendingDatagrams()) {
|
||||||
@ -1446,7 +1446,7 @@ void tst_QUdpSocket::echo()
|
|||||||
qDebug() << "packets in" << successes << "out" << i;
|
qDebug() << "packets in" << successes << "out" << i;
|
||||||
QTest::qWait(50); //choke to avoid triggering flood/DDoS protections on echo service
|
QTest::qWait(50); //choke to avoid triggering flood/DDoS protections on echo service
|
||||||
}
|
}
|
||||||
QVERIFY(successes >= 9);
|
QVERIFY2(successes >= 9, QByteArray::number(successes).constData());
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QUdpSocket::linkLocalIPv6()
|
void tst_QUdpSocket::linkLocalIPv6()
|
||||||
@ -1567,7 +1567,7 @@ void tst_QUdpSocket::linkLocalIPv4()
|
|||||||
QByteArray receiveBuffer("xxxxx");
|
QByteArray receiveBuffer("xxxxx");
|
||||||
foreach (QUdpSocket *s, sockets) {
|
foreach (QUdpSocket *s, sockets) {
|
||||||
QVERIFY(s->writeDatagram(testData, s->localAddress(), neutral.localPort()));
|
QVERIFY(s->writeDatagram(testData, s->localAddress(), neutral.localPort()));
|
||||||
QVERIFY(neutral.waitForReadyRead(10000));
|
QVERIFY2(neutral.waitForReadyRead(10000), QtNetworkSettings::msgSocketError(neutral).constData());
|
||||||
QHostAddress from;
|
QHostAddress from;
|
||||||
quint16 fromPort;
|
quint16 fromPort;
|
||||||
QCOMPARE((int)neutral.readDatagram(receiveBuffer.data(), receiveBuffer.length(), &from, &fromPort), testData.length());
|
QCOMPARE((int)neutral.readDatagram(receiveBuffer.data(), receiveBuffer.length(), &from, &fromPort), testData.length());
|
||||||
@ -1576,7 +1576,7 @@ void tst_QUdpSocket::linkLocalIPv4()
|
|||||||
QCOMPARE(receiveBuffer, testData);
|
QCOMPARE(receiveBuffer, testData);
|
||||||
|
|
||||||
QVERIFY(neutral.writeDatagram(testData, s->localAddress(), s->localPort()));
|
QVERIFY(neutral.writeDatagram(testData, s->localAddress(), s->localPort()));
|
||||||
QVERIFY(s->waitForReadyRead(10000));
|
QVERIFY2(s->waitForReadyRead(10000), QtNetworkSettings::msgSocketError(*s).constData());
|
||||||
QCOMPARE((int)s->readDatagram(receiveBuffer.data(), receiveBuffer.length(), &from, &fromPort), testData.length());
|
QCOMPARE((int)s->readDatagram(receiveBuffer.data(), receiveBuffer.length(), &from, &fromPort), testData.length());
|
||||||
QCOMPARE(receiveBuffer, testData);
|
QCOMPARE(receiveBuffer, testData);
|
||||||
|
|
||||||
|
@ -36,18 +36,21 @@ class Server : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
Server(int port)
|
|
||||||
|
Server() { connect(&serverSocket, &QIODevice::readyRead, this, &Server::sendEcho); }
|
||||||
|
|
||||||
|
bool bind(quint16 port)
|
||||||
{
|
{
|
||||||
connect(&serverSocket, SIGNAL(readyRead()),
|
const bool result = serverSocket.bind(QHostAddress::Any, port,
|
||||||
this, SLOT(sendEcho()));
|
QUdpSocket::ReuseAddressHint
|
||||||
if (serverSocket.bind(QHostAddress::Any, port,
|
| QUdpSocket::ShareAddress);
|
||||||
QUdpSocket::ReuseAddressHint
|
if (result) {
|
||||||
| QUdpSocket::ShareAddress)) {
|
|
||||||
printf("OK\n");
|
printf("OK\n");
|
||||||
} else {
|
} else {
|
||||||
printf("FAILED\n");
|
printf("FAILED: %s\n", qPrintable(serverSocket.errorString()));
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
@ -73,8 +76,19 @@ private:
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
|
QStringList arguments = QCoreApplication::arguments();
|
||||||
|
arguments.pop_front();
|
||||||
|
quint16 port = 0;
|
||||||
|
if (!arguments.isEmpty())
|
||||||
|
port = arguments.constFirst().toUShort();
|
||||||
|
if (!port) {
|
||||||
|
printf("Specify port number\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
Server server(app.arguments().at(1).toInt());
|
Server server;
|
||||||
|
if (!server.bind(port))
|
||||||
|
return -2;
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user