BOOST_CHECK_EQUAL(queriesWithoutEDNS, 1);
}
+BOOST_AUTO_TEST_CASE(test_edns_formerr_but_edns_enabled) {
+ std::unique_ptr<SyncRes> sr;
+ initSR(sr);
+
+ /* in this test, the auth answers with FormErr to an EDNS-enabled
+ query, but the response does contain EDNS so we should not mark
+ it as EDNS ignorant or intolerant.
+ */
+ size_t queriesWithEDNS = 0;
+ size_t queriesWithoutEDNS = 0;
+ std::set<ComboAddress> usedServers;
+
+ sr->setAsyncCallback([&queriesWithEDNS, &queriesWithoutEDNS, &usedServers](const ComboAddress& ip, const DNSName& domain, int type, bool doTCP, bool sendRDQuery, int EDNS0Level, struct timeval* now, boost::optional<Netmask>& srcmask, boost::optional<const ResolveContext&> context, std::shared_ptr<RemoteLogger> outgoingLogger, LWResult* res, bool* chained) {
+
+ if (EDNS0Level > 0) {
+ queriesWithEDNS++;
+ }
+ else {
+ queriesWithoutEDNS++;
+ }
+ usedServers.insert(ip);
+
+ if (type == QType::DNAME) {
+ setLWResult(res, RCode::FormErr);
+ if (EDNS0Level > 0) {
+ res->d_haveEDNS = true;
+ }
+ return 1;
+ }
+
+ return 0;
+ });
+
+ primeHints();
+
+ vector<DNSRecord> ret;
+ int res = sr->beginResolve(DNSName("powerdns.com."), QType(QType::DNAME), QClass::IN, ret);
+ BOOST_CHECK_EQUAL(res, RCode::ServFail);
+ BOOST_CHECK_EQUAL(ret.size(), 0);
+ BOOST_CHECK_EQUAL(queriesWithEDNS, 26);
+ BOOST_CHECK_EQUAL(queriesWithoutEDNS, 0);
+ BOOST_CHECK_EQUAL(SyncRes::getEDNSStatusesSize(), 26);
+ BOOST_CHECK_EQUAL(usedServers.size(), 26);
+ for (const auto& server : usedServers) {
+ BOOST_CHECK_EQUAL(SyncRes::getEDNSStatus(server), SyncRes::EDNSStatus::EDNSOK);
+ }
+}
+
BOOST_AUTO_TEST_CASE(test_tc_fallback_to_tcp) {
std::unique_ptr<SyncRes> sr;
initSR(sr);