diff options
Diffstat (limited to 'tests/auto/network/kernel')
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() |