From cf7a97a6582303bd2659cbf60c085eb28a8a9894 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 8 Aug 2017 14:37:49 -0700 Subject: QHostAddress: add more classification functions [ChangeLog][QtNetwork][QHostAddress] Added isGlobal(), isLinkLocal(), isSiteLocal(), isUniqueLocalUnicast(), and isBroadcast() classification functions to complement isLoopback() and isMulticast(). Change-Id: I3868166e5efc45538544fffd14d8fca6e9042c04 Reviewed-by: Edward Welbourne Reviewed-by: Timur Pocheptsov --- .../network/kernel/qhostaddress/qhostaddress.pro | 3 +- .../kernel/qhostaddress/tst_qhostaddress.cpp | 164 ++++++++++----------- 2 files changed, 82 insertions(+), 85 deletions(-) (limited to 'tests/auto/network/kernel') 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 +#include #include #include -#include #include #include #include @@ -46,6 +47,7 @@ # include #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("address"); - QTest::addColumn("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("address"); - QTest::addColumn("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("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() -- cgit v1.2.3