summaryrefslogtreecommitdiffstats
path: root/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp')
-rw-r--r--tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp53
1 files changed, 53 insertions, 0 deletions
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()));