summaryrefslogtreecommitdiffstats
path: root/tests/auto/network/socket
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/network/socket')
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp12
-rw-r--r--tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp53
2 files changed, 65 insertions, 0 deletions
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index a74a056d91..60ee4eb471 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -625,6 +625,18 @@ void tst_QLocalSocket::readBufferOverflow()
QCOMPARE(client.read(buffer, readBufferSize), qint64(readBufferSize));
// no more bytes available
QCOMPARE(client.bytesAvailable(), 0);
+
+#ifdef Q_OS_WIN
+ // Test overflow caused by an asynchronous pipe operation.
+ client.setReadBufferSize(1);
+ serverSocket->write(buffer, 2);
+
+ QVERIFY(client.waitForReadyRead());
+ // socket disconnects, if there any error on pipe
+ QCOMPARE(client.state(), QLocalSocket::ConnectedState);
+ QCOMPARE(client.bytesAvailable(), qint64(2));
+ QCOMPARE(client.read(buffer, 2), qint64(2));
+#endif
}
static qint64 writeCommand(const QVariant &command, QIODevice *device, int commandCounter)
diff --git a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
index 3b9ef577bd..cd1de209da 100644
--- a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
@@ -63,6 +63,13 @@
#include <QNetworkConfigurationManager>
#include "../../../network-settings.h"
+#if defined(Q_OS_LINUX)
+#define SHOULD_CHECK_SYSCALL_SUPPORT
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <errno.h>
+#endif
+
class tst_QTcpServer : public QObject
{
Q_OBJECT
@@ -111,6 +118,11 @@ private slots:
void canAccessPendingConnectionsWhileNotListening();
private:
+ bool shouldSkipIpv6TestsForBrokenGetsockopt();
+#ifdef SHOULD_CHECK_SYSCALL_SUPPORT
+ bool ipv6GetsockoptionMissing(int level, int optname);
+#endif
+
#ifndef QT_NO_BEARERMANAGEMENT
QNetworkSession *networkSession;
#endif
@@ -180,6 +192,42 @@ void tst_QTcpServer::cleanup()
#endif
}
+#ifdef SHOULD_CHECK_SYSCALL_SUPPORT
+bool tst_QTcpServer::ipv6GetsockoptionMissing(int level, int optname)
+{
+ int testSocket;
+
+ testSocket = socket(PF_INET6, SOCK_STREAM, 0);
+
+ // If we can't test here, assume it's not missing
+ if (testSocket == -1)
+ return false;
+
+ bool result = false;
+ if (getsockopt(testSocket, level, optname, nullptr, 0) == -1) {
+ if (errno == EOPNOTSUPP) {
+ result = true;
+ }
+ }
+
+ close(testSocket);
+ return result;
+}
+#endif //SHOULD_CHECK_SYSCALL_SUPPORT
+
+bool tst_QTcpServer::shouldSkipIpv6TestsForBrokenGetsockopt()
+{
+#ifdef SHOULD_CHECK_SYSCALL_SUPPORT
+ // Following parameters for setsockopt are not supported by all QEMU versions:
+ if (ipv6GetsockoptionMissing(SOL_IPV6, IPV6_V6ONLY)) {
+ return true;
+ }
+#endif //SHOULD_CHECK_SYSCALL_SUPPORT
+
+ return false;
+}
+
+
//----------------------------------------------------------------------------------
void tst_QTcpServer::constructing()
@@ -848,6 +896,11 @@ void tst_QTcpServer::serverAddress()
QFETCH(QHostAddress, serverAddress);
QTcpServer server;
+ if (shouldSkipIpv6TestsForBrokenGetsockopt()
+ && listenAddress == QHostAddress(QHostAddress::Any)) {
+ QSKIP("Syscalls needed for ipv6 sockoptions missing functionality");
+ }
+
// TODO: why does this QSKIP?
if (!server.listen(listenAddress))
QSKIP(qPrintable(server.errorString()));