|
@@ -68,9 +68,15 @@ const char* const mx_txt =
|
|
|
"mx.example.com. 3600 IN MX 20 mailer.example.org.\n"
|
|
|
"mx.example.com. 3600 IN MX 30 mx.delegation.example.com.\n";
|
|
|
const char* const www_a_txt = "www.example.com. 3600 IN A 192.0.2.80\n";
|
|
|
+const char* const cname_txt =
|
|
|
+ "cname.example.com. 3600 IN CNAME www.example.com.\n";
|
|
|
+const char* const cname_nxdom_txt =
|
|
|
+ "cnamenxdom.example.com. 3600 IN CNAME nxdomain.example.com.\n";
|
|
|
+// CNAME Leading out of zone
|
|
|
+const char* const cname_out_txt =
|
|
|
+ "cnameout.example.com. 3600 IN CNAME www.example.org.\n";
|
|
|
// The rest of data won't be referenced from the test cases.
|
|
|
const char* const other_zone_rrs =
|
|
|
- "cname.example.com. 3600 IN CNAME www.example.com.\n"
|
|
|
"cnamemailer.example.com. 3600 IN CNAME www.example.com.\n"
|
|
|
"cnamemx.example.com. 3600 IN MX 10 cnamemailer.example.com.\n"
|
|
|
"mx.delegation.example.com. 3600 IN A 192.0.2.100\n";
|
|
@@ -95,7 +101,8 @@ public:
|
|
|
{
|
|
|
stringstream zone_stream;
|
|
|
zone_stream << soa_txt << zone_ns_txt << ns_addrs_txt <<
|
|
|
- delegation_txt << mx_txt << www_a_txt << other_zone_rrs;
|
|
|
+ delegation_txt << mx_txt << www_a_txt << cname_txt <<
|
|
|
+ cname_nxdom_txt << cname_out_txt << other_zone_rrs;
|
|
|
|
|
|
masterLoad(zone_stream, origin_, rrclass_,
|
|
|
boost::bind(&MockZone::loadRRset, this, _1));
|
|
@@ -422,4 +429,101 @@ TEST_F(QueryTest, MXAlias) {
|
|
|
responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
NULL, NULL, ns_addrs_txt);
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Tests encountering a cname.
|
|
|
+ *
|
|
|
+ * There are tests leading to successful answers, NXRRSET, NXDOMAIN and
|
|
|
+ * out of the zone.
|
|
|
+ *
|
|
|
+ * TODO: We currently don't do chaining, so only the CNAME itself should be
|
|
|
+ * returned.
|
|
|
+ */
|
|
|
+TEST_F(QueryTest, CNAME) {
|
|
|
+ Query(memory_datasrc, Name("cname.example.com"), RRType::A(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, explicitCNAME) {
|
|
|
+ // same owner name as the CNAME test but explicitly query for CNAME RR.
|
|
|
+ // expect the same response as we don't provide a full chain yet.
|
|
|
+ Query(memory_datasrc, Name("cname.example.com"), RRType::CNAME(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, CNAME_NX_RRSET) {
|
|
|
+ // Leads to www.example.com, it doesn't have TXT
|
|
|
+ // note: with chaining, what should be expected is not trivial:
|
|
|
+ // BIND 9 returns the CNAME in answer and SOA in authority, no additional.
|
|
|
+ // NSD returns the CNAME, NS in authority, A/AAAA for NS in additional.
|
|
|
+ Query(memory_datasrc, Name("cname.example.com"), RRType::TXT(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, explicitCNAME_NX_RRSET) {
|
|
|
+ // same owner name as the NXRRSET test but explicitly query for CNAME RR.
|
|
|
+ Query(memory_datasrc, Name("cname.example.com"), RRType::CNAME(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, CNAME_NX_DOMAIN) {
|
|
|
+ // Leads to nxdomain.example.com
|
|
|
+ // note: with chaining, what should be expected is not trivial:
|
|
|
+ // BIND 9 returns the CNAME in answer and SOA in authority, no additional,
|
|
|
+ // RCODE being NXDOMAIN.
|
|
|
+ // NSD returns the CNAME, NS in authority, A/AAAA for NS in additional,
|
|
|
+ // RCODE being NOERROR.
|
|
|
+ Query(memory_datasrc, Name("cnamenxdom.example.com"), RRType::A(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_nxdom_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, explicitCNAME_NX_DOMAIN) {
|
|
|
+ // same owner name as the NXDOMAIN test but explicitly query for CNAME RR.
|
|
|
+ Query(memory_datasrc, Name("cnamenxdom.example.com"), RRType::CNAME(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_nxdom_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, CNAME_OUT) {
|
|
|
+ /*
|
|
|
+ * This leads out of zone. This should have only the CNAME even
|
|
|
+ * when we do chaining.
|
|
|
+ *
|
|
|
+ * TODO: We should be able to have two zones in the mock data source.
|
|
|
+ * Then the same test should be done with .org included there and
|
|
|
+ * see what it does (depends on what we want to do)
|
|
|
+ */
|
|
|
+ Query(memory_datasrc, Name("cnameout.example.com"), RRType::A(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_out_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_F(QueryTest, explicitCNAME_OUT) {
|
|
|
+ // same owner name as the OUT test but explicitly query for CNAME RR.
|
|
|
+ Query(memory_datasrc, Name("cnameout.example.com"), RRType::CNAME(),
|
|
|
+ response).process();
|
|
|
+
|
|
|
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 1, 3, 3,
|
|
|
+ cname_out_txt, zone_ns_txt, ns_addrs_txt);
|
|
|
+}
|
|
|
+
|
|
|
}
|