tst_QDnsLookup refactor: split the NXDOMAIN tests from lookup()

This will allow making lookup() require positive results only.

Change-Id: I455fe22ef4ad4b2f9b01fffd17c740e36002d25e
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
bb10
Thiago Macieira 2024-04-17 20:05:28 -07:00
parent 41675df695
commit 121a081d20
1 changed files with 64 additions and 8 deletions

View File

@ -35,12 +35,17 @@ class tst_QDnsLookup: public QObject
QString domainName(const QString &input);
QString domainNameList(const QString &input);
QStringList domainNameListAlternatives(const QString &input);
std::unique_ptr<QDnsLookup> lookupCommon(QDnsLookup::Type type, const QString &domain,
const QHostAddress &server = {}, quint16 port = 53);
public slots:
void initTestCase();
private slots:
void lookupLocalhost();
void lookupRoot();
void lookupNxDomain_data();
void lookupNxDomain();
void lookup_data();
void lookup();
void lookupIdn_data() { lookup_data(); }
@ -209,6 +214,37 @@ QStringList tst_QDnsLookup::domainNameListAlternatives(const QString &input)
return alternatives;
}
std::unique_ptr<QDnsLookup>
tst_QDnsLookup::lookupCommon(QDnsLookup::Type type, const QString &domain,
const QHostAddress &server, quint16 port)
{
auto lookup = std::make_unique<QDnsLookup>(type, domainName(domain), server, port);
QObject::connect(lookup.get(), &QDnsLookup::finished,
&QTestEventLoop::instance(), &QTestEventLoop::exitLoop);
lookup->lookup();
QTestEventLoop::instance().enterLoopMSecs(Timeout);
QDnsLookup::Error error = lookup->error();
if (QTestEventLoop::instance().timeout())
error = QDnsLookup::TimeoutError;
if (!dnsServersMustWork && (error == QDnsLookup::ServerFailureError
|| error == QDnsLookup::ServerRefusedError
|| error == QDnsLookup::TimeoutError)) {
// It's not a QDnsLookup problem if the server refuses to answer the query.
// This happens for queries of type ANY through Dnsmasq, for example.
[&] {
auto me = QMetaEnum::fromType<QDnsLookup::Type>();
QString msg = u"Server refused or was unable to answer query; %1 type %3: %2"_s
.arg(domain, lookup->errorString(), QString(me.valueToKey(int(type))));
QSKIP(msg.toLocal8Bit());
}();
return {};
}
return lookup;
}
void tst_QDnsLookup::lookupLocalhost()
{
QDnsLookup lookup(QDnsLookup::Type::A, u"localhost"_s);
@ -242,6 +278,34 @@ void tst_QDnsLookup::lookupRoot()
#endif
}
void tst_QDnsLookup::lookupNxDomain_data()
{
QTest::addColumn<QDnsLookup::Type>("type");
QTest::addColumn<QString>("domain");
QTest::newRow("a") << QDnsLookup::A << "invalid.invalid";
QTest::newRow("aaaa") << QDnsLookup::AAAA << "invalid.invalid";
QTest::newRow("any") << QDnsLookup::ANY << "invalid.invalid";
QTest::newRow("mx") << QDnsLookup::MX << "invalid.invalid";
QTest::newRow("ns") << QDnsLookup::NS << "invalid.invalid";
QTest::newRow("ptr") << QDnsLookup::PTR << "invalid.invalid";
QTest::newRow("srv") << QDnsLookup::SRV << "invalid.invalid";
QTest::newRow("txt") << QDnsLookup::TXT << "invalid.invalid";
}
void tst_QDnsLookup::lookupNxDomain()
{
QFETCH(QDnsLookup::Type, type);
QFETCH(QString, domain);
auto lookup = lookupCommon(type, domain);
if (!lookup)
return;
QCOMPARE(lookup->name(), domainName(domain));
QCOMPARE(lookup->type(), type);
QCOMPARE(lookup->error(), QDnsLookup::NotFoundError);
}
void tst_QDnsLookup::lookup_data()
{
QTest::addColumn<int>("type");
@ -255,19 +319,15 @@ void tst_QDnsLookup::lookup_data()
QTest::addColumn<QString>("srv");
QTest::addColumn<QString>("txt");
QTest::newRow("a-notfound") << int(QDnsLookup::A) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("a-single") << int(QDnsLookup::A) << "a-single" << int(QDnsLookup::NoError) << "" << "192.0.2.1" << "" << "" << "" << "" << "";
QTest::newRow("a-multi") << int(QDnsLookup::A) << "a-multi" << int(QDnsLookup::NoError) << "" << "192.0.2.1;192.0.2.2;192.0.2.3" << "" << "" << "" << "" << "";
QTest::newRow("aaaa-notfound") << int(QDnsLookup::AAAA) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("aaaa-single") << int(QDnsLookup::AAAA) << "aaaa-single" << int(QDnsLookup::NoError) << "" << "2001:db8::1" << "" << "" << "" << "" << "";
QTest::newRow("aaaa-multi") << int(QDnsLookup::AAAA) << "aaaa-multi" << int(QDnsLookup::NoError) << "" << "2001:db8::1;2001:db8::2;2001:db8::3" << "" << "" << "" << "" << "";
QTest::newRow("any-notfound") << int(QDnsLookup::ANY) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("any-a-single") << int(QDnsLookup::ANY) << "a-single" << int(QDnsLookup::NoError) << "" << "192.0.2.1" << "" << "" << "" << "" << "";
QTest::newRow("any-a-plus-aaaa") << int(QDnsLookup::ANY) << "a-plus-aaaa" << int(QDnsLookup::NoError) << "" << "198.51.100.1;2001:db8::1:1" << "" << "" << "" << "" << "";
QTest::newRow("any-multi") << int(QDnsLookup::ANY) << "multi" << int(QDnsLookup::NoError) << "" << "198.51.100.1;198.51.100.2;198.51.100.3;2001:db8::1:1;2001:db8::1:2" << "" << "" << "" << "" << "";
QTest::newRow("mx-notfound") << int(QDnsLookup::MX) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("mx-single") << int(QDnsLookup::MX) << "mx-single" << int(QDnsLookup::NoError) << "" << "" << "10 multi" << "" << "" << "" << "";
QTest::newRow("mx-single-cname") << int(QDnsLookup::MX) << "mx-single-cname" << int(QDnsLookup::NoError) << "" << "" << "10 cname" << "" << "" << "" << "";
QTest::newRow("mx-multi") << int(QDnsLookup::MX) << "mx-multi" << int(QDnsLookup::NoError) << "" << "" << "10 multi;20 a-single" << "" << "" << "" << "";
@ -275,18 +335,15 @@ void tst_QDnsLookup::lookup_data()
<< "10 multi;10 a-single|"
"10 a-single;10 multi" << "" << "" << "" << "";
QTest::newRow("ns-notfound") << int(QDnsLookup::NS) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("ns-single") << int(QDnsLookup::NS) << "ns-single" << int(QDnsLookup::NoError) << "" << "" << "" << "ns11.cloudns.net." << "" << "" << "";
QTest::newRow("ns-multi") << int(QDnsLookup::NS) << "ns-multi" << int(QDnsLookup::NoError) << "" << "" << "" << "ns11.cloudns.net.;ns12.cloudns.net." << "" << "" << "";
QTest::newRow("ptr-notfound") << int(QDnsLookup::PTR) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
#if 0
// temporarily disabled since the new hosting provider can't insert
// PTR records outside of the in-addr.arpa zone
QTest::newRow("ptr-single") << int(QDnsLookup::PTR) << "ptr-single" << int(QDnsLookup::NoError) << "" << "" << "" << "" << "a-single" << "" << "";
#endif
QTest::newRow("srv-notfound") << int(QDnsLookup::SRV) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("srv-single") << int(QDnsLookup::SRV) << "_echo._tcp.srv-single" << int(QDnsLookup::NoError) << "" << "" << "" << "" << "" << "5 0 7 multi" << "";
QTest::newRow("srv-prio") << int(QDnsLookup::SRV) << "_echo._tcp.srv-prio" << int(QDnsLookup::NoError) << "" << "" << "" << "" << "" << "1 0 7 multi;2 0 7 a-plus-aaaa" << "";
QTest::newRow("srv-weighted") << int(QDnsLookup::SRV) << "_echo._tcp.srv-weighted" << int(QDnsLookup::NoError) << "" << "" << "" << "" << ""
@ -296,7 +353,6 @@ void tst_QDnsLookup::lookup_data()
<< "1 50 7 multi;2 50 7 a-single;2 50 7 aaaa-single;3 50 7 a-multi|"
"1 50 7 multi;2 50 7 aaaa-single;2 50 7 a-single;3 50 7 a-multi" << "";
QTest::newRow("txt-notfound") << int(QDnsLookup::TXT) << "invalid.invalid" << int(QDnsLookup::NotFoundError) << "" << "" << "" << "" << "" << "" << "";
QTest::newRow("txt-single") << int(QDnsLookup::TXT) << "txt-single" << int(QDnsLookup::NoError) << "" << "" << "" << "" << "" << "" << "Hello";
QTest::newRow("txt-multi-onerr") << int(QDnsLookup::TXT) << "txt-multi-onerr" << int(QDnsLookup::NoError) << "" << "" << "" << "" << "" << ""
<< QString::fromLatin1("Hello\0World", sizeof("Hello\0World") - 1);