summaryrefslogtreecommitdiffstats
path: root/tests/auto/network/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/network/kernel')
-rw-r--r--tests/auto/network/kernel/qhostaddress/qhostaddress.pro3
-rw-r--r--tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp164
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/BLACKLIST2
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp86
4 files changed, 164 insertions, 91 deletions
diff --git a/tests/auto/network/kernel/qhostaddress/qhostaddress.pro b/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
index a79fa2f59d..b5d6ea6459 100644
--- a/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
+++ b/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
@@ -2,7 +2,6 @@ CONFIG += testcase
TARGET = tst_qhostaddress
SOURCES += tst_qhostaddress.cpp
-
-QT = core network testlib
+QT = core network-private testlib
win32:LIBS += -lws2_32
diff --git a/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp b/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp
index bc3f5650ba..224e4d61a9 100644
--- a/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp
+++ b/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp
@@ -27,9 +27,10 @@
**
****************************************************************************/
+#include <qhostaddress.h>
+#include <private/qhostaddress_p.h>
#include <qcoreapplication.h>
#include <QtTest/QtTest>
-#include <qhostaddress.h>
#include <qplatformdefs.h>
#include <qdebug.h>
#include <qhash.h>
@@ -46,6 +47,7 @@
# include <netinet/in.h>
#endif
+Q_DECLARE_METATYPE(AddressClassification)
Q_DECLARE_METATYPE(QHostAddress::SpecialAddress)
class tst_QHostAddress : public QObject
@@ -75,10 +77,8 @@ private slots:
void parseSubnet();
void isInSubnet_data();
void isInSubnet();
- void isLoopback_data();
- void isLoopback();
- void isMulticast_data();
- void isMulticast();
+ void classification_data();
+ void classification();
void convertv4v6_data();
void convertv4v6();
};
@@ -667,90 +667,88 @@ void tst_QHostAddress::isInSubnet()
QTEST(address.isInSubnet(prefix, prefixLength), "result");
}
-void tst_QHostAddress::isLoopback_data()
-{
- QTest::addColumn<QHostAddress>("address");
- QTest::addColumn<bool>("result");
-
- QTest::newRow("default") << QHostAddress() << false;
- QTest::newRow("invalid") << QHostAddress("&&&") << false;
-
- QTest::newRow("ipv6_loop") << QHostAddress(QHostAddress::LocalHostIPv6) << true;
- QTest::newRow("::1") << QHostAddress("::1") << true;
-
- QTest::newRow("ipv4_loop") << QHostAddress(QHostAddress::LocalHost) << true;
- QTest::newRow("127.0.0.1") << QHostAddress("127.0.0.1") << true;
- QTest::newRow("127.0.0.2") << QHostAddress("127.0.0.2") << true;
- QTest::newRow("127.3.2.1") << QHostAddress("127.3.2.1") << true;
-
- QTest::newRow("1.2.3.4") << QHostAddress("1.2.3.4") << false;
- QTest::newRow("10.0.0.4") << QHostAddress("10.0.0.4") << false;
- QTest::newRow("192.168.3.4") << QHostAddress("192.168.3.4") << false;
-
- QTest::newRow("::") << QHostAddress("::") << false;
- QTest::newRow("Any") << QHostAddress(QHostAddress::Any) << false;
- QTest::newRow("AnyIPv4") << QHostAddress(QHostAddress::AnyIPv4) << false;
- QTest::newRow("AnyIPv6") << QHostAddress(QHostAddress::AnyIPv6) << false;
- QTest::newRow("Broadcast") << QHostAddress(QHostAddress::Broadcast) << false;
- QTest::newRow("Null") << QHostAddress(QHostAddress::Null) << false;
- QTest::newRow("ipv6-all-ffff") << QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") << false;
-
- QTest::newRow("::ffff:127.0.0.1") << QHostAddress("::ffff:127.0.0.1") << true;
- QTest::newRow("::ffff:127.0.0.2") << QHostAddress("::ffff:127.0.0.2") << true;
- QTest::newRow("::ffff:127.3.2.1") << QHostAddress("::ffff:127.3.2.1") << true;
-
-}
-
-void tst_QHostAddress::isLoopback()
-{
- QFETCH(QHostAddress, address);
- QFETCH(bool, result);
-
- QCOMPARE(address.isLoopback(), result);
-}
-
-void tst_QHostAddress::isMulticast_data()
+void tst_QHostAddress::classification_data()
{
QTest::addColumn<QHostAddress>("address");
- QTest::addColumn<bool>("result");
-
- QTest::newRow("default") << QHostAddress() << false;
- QTest::newRow("invalid") << QHostAddress("&&&") << false;
-
- QTest::newRow("ipv6_loop") << QHostAddress(QHostAddress::LocalHostIPv6) << false;
- QTest::newRow("::1") << QHostAddress("::1") << false;
- QTest::newRow("ipv4_loop") << QHostAddress(QHostAddress::LocalHost) << false;
- QTest::newRow("127.0.0.1") << QHostAddress("127.0.0.1") << false;
- QTest::newRow("::") << QHostAddress("::") << false;
- QTest::newRow("Any") << QHostAddress(QHostAddress::Any) << false;
- QTest::newRow("AnyIPv4") << QHostAddress(QHostAddress::AnyIPv4) << false;
- QTest::newRow("AnyIPv6") << QHostAddress(QHostAddress::AnyIPv6) << false;
- QTest::newRow("Broadcast") << QHostAddress(QHostAddress::Broadcast) << false;
- QTest::newRow("Null") << QHostAddress(QHostAddress::Null) << false;
-
- QTest::newRow("223.255.255.255") << QHostAddress("223.255.255.255") << false;
- QTest::newRow("224.0.0.0") << QHostAddress("224.0.0.0") << true;
- QTest::newRow("239.255.255.255") << QHostAddress("239.255.255.255") << true;
- QTest::newRow("240.0.0.0") << QHostAddress("240.0.0.0") << false;
-
- QTest::newRow("::ffff:223.255.255.255") << QHostAddress("::ffff:223.255.255.255") << false;
- QTest::newRow("::ffff:224.0.0.0") << QHostAddress("::ffff:224.0.0.0") << true;
- QTest::newRow("::ffff:239.255.255.255") << QHostAddress("::ffff:239.255.255.255") << true;
- QTest::newRow("::ffff:240.0.0.0") << QHostAddress("::ffff:240.0.0.0") << false;
-
- QTest::newRow("fc00::") << QHostAddress("fc00::") << false;
- QTest::newRow("fe80::") << QHostAddress("fe80::") << false;
- QTest::newRow("fec0::") << QHostAddress("fec0::") << false;
- QTest::newRow("ff00::") << QHostAddress("ff00::") << true;
- QTest::newRow("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") << QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") << true;
+ QTest::addColumn<AddressClassification>("result");
+
+ QTest::newRow("default") << QHostAddress() << UnknownAddress;
+ QTest::newRow("invalid") << QHostAddress("&&&") << UnknownAddress;
+
+ QTest::newRow("Any") << QHostAddress(QHostAddress::Any) << LocalNetAddress;
+ QTest::newRow("Null") << QHostAddress(QHostAddress::Null) << UnknownAddress;
+
+ // IPv6 address space
+ auto addV6 = [](const char *str, AddressClassification cl) {
+ QTest::newRow(str) << QHostAddress(str) << cl;
+ };
+ QTest::newRow("AnyIPv6") << QHostAddress(QHostAddress::AnyIPv6) << LocalNetAddress;
+ QTest::newRow("ipv6_loop") << QHostAddress(QHostAddress::LocalHostIPv6) << LoopbackAddress;
+ addV6("::", LocalNetAddress);
+ addV6("::1", LoopbackAddress);
+ addV6("::2", GlobalAddress);
+ addV6("2000::", GlobalAddress);
+ addV6("3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", GlobalAddress);
+ addV6("fbff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", GlobalAddress);
+ addV6("fc00::", UniqueLocalAddress);
+ addV6("fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", UniqueLocalAddress);
+ addV6("fe00::", UnknownAddress);
+ addV6("fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", UnknownAddress);
+ addV6("fe80::", LinkLocalAddress);
+ addV6("febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff", LinkLocalAddress);
+ addV6("fec0::", SiteLocalAddress);
+ addV6("feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", SiteLocalAddress);
+ addV6("ff00::", MulticastAddress);
+ addV6("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", MulticastAddress);
+
+ // IPv4 address space
+ auto addV4 = [](const char *str, AddressClassification cl) {
+ QTest::newRow(str) << QHostAddress(str) << cl;
+ QByteArray v6 = "::ffff:";
+ v6 += str;
+ QTest::newRow(v6.constData()) << QHostAddress(QString::fromLatin1(v6)) << cl;
+ };
+ QTest::newRow("AnyIPv4") << QHostAddress(QHostAddress::AnyIPv4) << LocalNetAddress;
+ QTest::newRow("ipv4_loop") << QHostAddress(QHostAddress::LocalHost) << LoopbackAddress;
+ QTest::newRow("Broadcast") << QHostAddress(QHostAddress::Broadcast) << BroadcastAddress;
+ addV4("0.0.0.0", LocalNetAddress);
+ addV4("0.0.0.1", LocalNetAddress);
+ addV4("0.255.255.255", LocalNetAddress);
+ addV4("1.0.0.0", GlobalAddress);
+ addV4("1.2.3.4", GlobalAddress);
+ addV4("10.0.0.4", PrivateNetworkAddress);
+ addV4("127.0.0.1", LoopbackAddress);
+ addV4("127.0.0.2", LoopbackAddress);
+ addV4("127.255.255.255", LoopbackAddress);
+ addV4("192.168.3.4", PrivateNetworkAddress);
+ addV4("223.255.255.255", GlobalAddress);
+ addV4("224.0.0.0", MulticastAddress);
+ addV4("239.255.255.255", MulticastAddress);
+ addV4("240.0.0.0", UnknownAddress);
+ addV4("255.255.255.254", UnknownAddress);
+ addV4("255.255.255.255", BroadcastAddress);
}
-void tst_QHostAddress::isMulticast()
+void tst_QHostAddress::classification()
{
QFETCH(QHostAddress, address);
- QFETCH(bool, result);
-
- QCOMPARE(address.isMulticast(), result);
+ QFETCH(AddressClassification, result);
+
+ bool isLoopback = (result == LoopbackAddress);
+ bool isGlobal = (result & GlobalAddress); // GlobalAddress is a bit
+ bool isLinkLocal = (result == LinkLocalAddress);
+ bool isSiteLocal = (result == SiteLocalAddress);
+ bool isUniqueLocalAddress = (result == UniqueLocalAddress);
+ bool isMulticast = (result == MulticastAddress);
+ bool isBroadcast = (result == BroadcastAddress);
+
+ QCOMPARE(address.isLoopback(), isLoopback);
+ QCOMPARE(address.isGlobal(), isGlobal);
+ QCOMPARE(address.isLinkLocal(), isLinkLocal);
+ QCOMPARE(address.isSiteLocal(), isSiteLocal);
+ QCOMPARE(address.isUniqueLocalUnicast(), isUniqueLocalAddress);
+ QCOMPARE(address.isMulticast(), isMulticast);
+ QCOMPARE(address.isBroadcast(), isBroadcast);
}
void tst_QHostAddress::convertv4v6_data()
diff --git a/tests/auto/network/kernel/qnetworkinterface/BLACKLIST b/tests/auto/network/kernel/qnetworkinterface/BLACKLIST
deleted file mode 100644
index 23bb688d9a..0000000000
--- a/tests/auto/network/kernel/qnetworkinterface/BLACKLIST
+++ /dev/null
@@ -1,2 +0,0 @@
-[localAddress]
-linux
diff --git a/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp b/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
index 36dcec0a82..0b4ed4870d 100644
--- a/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
+++ b/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
@@ -40,6 +40,8 @@
#include "../../../network-settings.h"
#include "emulationdetector.h"
+Q_DECLARE_METATYPE(QHostAddress)
+
class tst_QNetworkInterface : public QObject
{
Q_OBJECT
@@ -57,6 +59,7 @@ private slots:
void consistencyCheck();
void loopbackIPv4();
void loopbackIPv6();
+ void localAddress_data();
void localAddress();
void interfaceFromXXX_data();
void interfaceFromXXX();
@@ -138,7 +141,9 @@ void tst_QNetworkInterface::dump()
qDebug() << " index: " << i.index();
qDebug() << " flags: " << qPrintable(flags);
+ qDebug() << " type: " << i.type();
qDebug() << " hw address:" << qPrintable(i.hardwareAddress());
+ qDebug() << " MTU: " << i.maxTransmissionUnit();
int count = 0;
foreach (const QNetworkAddressEntry &e, i.addressEntries()) {
@@ -151,6 +156,16 @@ void tst_QNetworkInterface::dump()
<< " (" << qPrintable(e.netmask().toString()) << ')';
if (!e.broadcast().isNull())
s.nospace() << " broadcast " << qPrintable(e.broadcast().toString());
+ if (e.dnsEligibility() == QNetworkAddressEntry::DnsEligible)
+ s.nospace() << " dns-eligible";
+ else if (e.dnsEligibility() == QNetworkAddressEntry::DnsIneligible)
+ s.nospace() << " dns-ineligible";
+ if (e.isLifetimeKnown()) {
+#define printable(l) qPrintable(l.isForever() ? "forever" : QString::fromLatin1("%1ms").arg(l.remainingTime()))
+ s.nospace() << " preferred:" << printable(e.preferredLifetime())
+ << " valid:" << printable(e.validityLifetime());
+#undef printable
+ }
}
}
}
@@ -162,6 +177,7 @@ void tst_QNetworkInterface::consistencyCheck()
QVector<int> interfaceIndexes;
foreach (const QNetworkInterface &iface, ifaces) {
+ QVERIFY(iface.isValid());
QVERIFY2(!interfaceNames.contains(iface.name()),
"duplicate name = " + iface.name().toLocal8Bit());
interfaceNames << iface.name();
@@ -170,6 +186,17 @@ void tst_QNetworkInterface::consistencyCheck()
"duplicate index = " + QByteArray::number(iface.index()));
if (iface.index())
interfaceIndexes << iface.index();
+
+ QVERIFY(iface.maxTransmissionUnit() >= 0);
+
+ const QList<QNetworkAddressEntry> addresses = iface.addressEntries();
+ for (auto entry : addresses) {
+ QVERIFY(entry.ip().protocol() != QAbstractSocket::UnknownNetworkLayerProtocol);
+ if (!entry.preferredLifetime().isForever() || !entry.validityLifetime().isForever())
+ QVERIFY(entry.isLifetimeKnown());
+ if (!entry.validityLifetime().isForever())
+ QVERIFY(entry.isTemporary());
+ }
}
}
@@ -186,18 +213,69 @@ void tst_QNetworkInterface::loopbackIPv6()
QList<QHostAddress> all = QNetworkInterface::allAddresses();
QVERIFY(all.contains(QHostAddress(QHostAddress::LocalHostIPv6)));
}
+void tst_QNetworkInterface::localAddress_data()
+{
+ QTest::addColumn<QHostAddress>("target");
+
+ QTest::newRow("localhost-ipv4") << QHostAddress(QHostAddress::LocalHost);
+ if (isIPv6Working())
+ QTest::newRow("localhost-ipv6") << QHostAddress(QHostAddress::LocalHostIPv6);
+
+ QTest::newRow("test-server") << QtNetworkSettings::serverIP();
+
+ // Since we don't actually transmit anything, we can list any IPv4 address
+ // and it should work. But we're using a linklocal address so that this
+ // test can pass even machines that failed to reach a DHCP server.
+ QTest::newRow("linklocal-ipv4") << QHostAddress("169.254.0.1");
+
+ if (isIPv6Working()) {
+ // On the other hand, we can't list just any IPv6 here. It's very
+ // likely that this machine has not received a route via ICMPv6-RA or
+ // DHCPv6, so it won't have a global route. On some OSes, IPv6 may be
+ // enabled per interface, so we need to know which ones work.
+ const QList<QHostAddress> addrs = QNetworkInterface::allAddresses();
+ for (const QHostAddress &addr : addrs) {
+ QString scope = addr.scopeId();
+ if (scope.isEmpty())
+ continue;
+ QTest::addRow("linklocal-ipv6-%s", qPrintable(scope))
+ << QHostAddress("fe80::1234%" + scope);
+ }
+ }
+}
void tst_QNetworkInterface::localAddress()
{
+ QFETCH(QHostAddress, target);
QUdpSocket socket;
- socket.connectToHost(QtNetworkSettings::serverName(), 80);
+ socket.connectToHost(target, 80);
QVERIFY(socket.waitForConnected(5000));
QHostAddress local = socket.localAddress();
- // test that we can find the address that QUdpSocket reported
- QList<QHostAddress> all = QNetworkInterface::allAddresses();
- QVERIFY(all.contains(local));
+ // find the interface that contains the address QUdpSocket reported
+ QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
+ const QNetworkInterface *outgoingIface = nullptr;
+ for (const QNetworkInterface &iface : ifaces) {
+ QList<QNetworkAddressEntry> addrs = iface.addressEntries();
+ for (const QNetworkAddressEntry &entry : addrs) {
+ if (entry.ip() == local) {
+ outgoingIface = &iface;
+ break;
+ }
+ }
+ if (outgoingIface)
+ break;
+ }
+ QVERIFY(outgoingIface);
+
+ // we get QVariant() if the QNativeSocketEngine doesn't know how to get the PMTU
+ int pmtu = socket.socketOption(QAbstractSocket::PathMtuSocketOption).toInt();
+ qDebug() << "Connected to" << target.toString() << "via interface" << outgoingIface->name()
+ << "pmtu" << pmtu;
+
+ // check that the Path MTU is less than or equal the interface's MTU
+ QVERIFY(pmtu <= outgoingIface->maxTransmissionUnit());
}
void tst_QNetworkInterface::interfaceFromXXX_data()