[svn] commit: r1404 - in /trunk/src/lib/auth: data_source.cc sqlite3_datasrc.cc static_datasrc.cc tests/datasrc_unittest.cc tests/sqlite3_unittest.cc tests/test_datasrc.cc tests/testdata/q_www
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Mar 15 01:38:55 UTC 2010
Author: jinmei
Date: Mon Mar 15 01:38:55 2010
New Revision: 1404
Log:
handle class ANY query correctly (ticket #80)
Removed:
trunk/src/lib/auth/tests/testdata/q_www
Modified:
trunk/src/lib/auth/data_source.cc
trunk/src/lib/auth/sqlite3_datasrc.cc
trunk/src/lib/auth/static_datasrc.cc
trunk/src/lib/auth/tests/datasrc_unittest.cc
trunk/src/lib/auth/tests/sqlite3_unittest.cc
trunk/src/lib/auth/tests/test_datasrc.cc
Modified: trunk/src/lib/auth/data_source.cc
==============================================================================
--- trunk/src/lib/auth/data_source.cc (original)
+++ trunk/src/lib/auth/data_source.cc Mon Mar 15 01:38:55 2010
@@ -809,19 +809,12 @@
void
MetaDataSrc::findClosestEnclosure(NameMatch& match, const RRClass& qclass) const
{
- if (qclass == RRClass::ANY()) {
- isc_throw(Unexpected, "invalid query class");
- }
-
- if (getClass() != RRClass::ANY() && getClass() != qclass) {
+ if (getClass() != qclass &&
+ getClass() != RRClass::ANY() && qclass != RRClass::ANY()) {
return;
}
BOOST_FOREACH (ConstDataSrcPtr data_src, data_sources) {
- if (data_src->getClass() != qclass) {
- continue;
- }
-
data_src->findClosestEnclosure(match, qclass);
}
}
Modified: trunk/src/lib/auth/sqlite3_datasrc.cc
==============================================================================
--- trunk/src/lib/auth/sqlite3_datasrc.cc (original)
+++ trunk/src/lib/auth/sqlite3_datasrc.cc Mon Mar 15 01:38:55 2010
@@ -342,7 +342,7 @@
Sqlite3DataSrc::findClosestEnclosure(NameMatch& match,
const RRClass& qclass) const
{
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return;
}
@@ -482,7 +482,7 @@
uint32_t& flags,
const Name* zonename) const
{
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return (ERROR);
}
findRecords(qname, qtype, target, zonename, NORMAL, flags);
@@ -497,7 +497,7 @@
uint32_t& flags,
const Name* zonename) const
{
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return (ERROR);
}
findRecords(qname, qtype, target, zonename, NORMAL, flags);
@@ -521,7 +521,7 @@
uint32_t& flags,
const Name* zonename) const
{
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return (ERROR);
}
findRecords(qname, RRType::ANY(), target, zonename, ADDRESS, flags);
@@ -535,7 +535,7 @@
uint32_t& flags,
const Name* zonename) const
{
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return (ERROR);
}
findRecords(qname, RRType::ANY(), target, zonename, DELEGATION, flags);
Modified: trunk/src/lib/auth/static_datasrc.cc
==============================================================================
--- trunk/src/lib/auth/static_datasrc.cc (original)
+++ trunk/src/lib/auth/static_datasrc.cc Mon Mar 15 01:38:55 2010
@@ -108,7 +108,7 @@
const Name& qname = match.qname();
NameComparisonResult::NameRelation cmp;
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return;
}
@@ -134,7 +134,7 @@
const Name* zonename) const
{
flags = 0;
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return (ERROR);
}
Modified: trunk/src/lib/auth/tests/datasrc_unittest.cc
==============================================================================
--- trunk/src/lib/auth/tests/datasrc_unittest.cc (original)
+++ trunk/src/lib/auth/tests/datasrc_unittest.cc Mon Mar 15 01:38:55 2010
@@ -51,15 +51,22 @@
const ElementPtr SQLITE_DBFILE_EXAMPLE = Element::createFromString(
"{ \"database_file\": \"testdata/example.org.sqlite3\"}");
-TestDataSrc test_source;
-
class DataSrcTest : public ::testing::Test {
protected:
DataSrcTest() : obuffer(0), renderer(obuffer), msg(Message::PARSE) {
- sql3_source.init(SQLITE_DBFILE_EXAMPLE);
- test_source.init();
+ DataSrcPtr sql3_source = DataSrcPtr(new Sqlite3DataSrc);
+ sql3_source->init(SQLITE_DBFILE_EXAMPLE);
+ DataSrcPtr test_source = DataSrcPtr(new TestDataSrc);
+ test_source->init();
+ meta_source.addDataSrc(test_source);
+ meta_source.addDataSrc(sql3_source);
}
- Sqlite3DataSrc sql3_source;
+ void QueryCommon(const RRClass& qclass);
+ void readAndProcessQuery(const char* datafile);
+ void createAndProcessQuery(const Name& qname, const RRClass& qclass,
+ const RRType& qtype);
+
+ MetaDataSrc meta_source;
OutputBuffer obuffer;
MessageRenderer renderer;
Message msg;
@@ -74,27 +81,26 @@
}
void
-readAndProcessQuery(Message& message, const char* datafile) {
+DataSrcTest::readAndProcessQuery(const char* datafile) {
std::vector<unsigned char> data;
UnitTestUtil::readWireData(datafile, data);
InputBuffer buffer(&data[0], data.size());
- message.fromWire(buffer);
-
- message.makeResponse();
- performQuery(test_source, message);
+ msg.fromWire(buffer);
+
+ msg.makeResponse();
+ performQuery(meta_source, msg);
}
void
-createAndProcessQuery(DataSrc& data_source, Message& message,
- const Name& qname, const RRClass& qclass,
- const RRType& qtype)
+DataSrcTest::createAndProcessQuery(const Name& qname, const RRClass& qclass,
+ const RRType& qtype)
{
- message.makeResponse();
- message.setOpcode(Opcode::QUERY());
- message.addQuestion(Question(qname, qclass, qtype));
- message.setHeaderFlag(MessageFlag::RD());
- performQuery(data_source, message);
+ msg.makeResponse();
+ msg.setOpcode(Opcode::QUERY());
+ msg.addQuestion(Question(qname, qclass, qtype));
+ msg.setHeaderFlag(MessageFlag::RD());
+ performQuery(meta_source, msg);
}
void
@@ -112,114 +118,135 @@
EXPECT_EQ(arcount, message.getRRCount(Section::ADDITIONAL()));
}
+void
+DataSrcTest::QueryCommon(const RRClass& qclass) {
+ createAndProcessQuery(Name("www.example.com"), qclass, RRType::A());
+
+ headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
+
+ RRsetIterator rit = msg.beginSection(Section::ANSWER());
+ RRsetPtr rrset = *rit;
+ EXPECT_EQ(Name("www.example.com"), rrset->getName());
+ EXPECT_EQ(RRType::A(), rrset->getType());
+ EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+ RdataIteratorPtr it = rrset->getRdataIterator();
+ it->first();
+ EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
+ it->next();
+ EXPECT_TRUE(it->isLast());
+
+ // XXX: also check ANSWER RRSIG
+
+ rit = msg.beginSection(Section::AUTHORITY());
+ rrset = *rit;
+ EXPECT_EQ(Name("example.com"), rrset->getName());
+ EXPECT_EQ(RRType::NS(), rrset->getType());
+ EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+ it = rrset->getRdataIterator();
+ it->first();
+ EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+ it->next();
+ EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+ it->next();
+ EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+ it->next();
+ EXPECT_TRUE(it->isLast());
+
+ rit = msg.beginSection(Section::ADDITIONAL());
+ rrset = *rit;
+ EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
+ EXPECT_EQ(RRType::A(), rrset->getType());
+ EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+ it = rrset->getRdataIterator();
+ it->first();
+ EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
+ it->next();
+ EXPECT_TRUE(it->isLast());
+}
+
TEST_F(DataSrcTest, Query) {
- readAndProcessQuery(msg, "testdata/q_www");
-
- headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
-
- RRsetIterator rit = msg.beginSection(Section::ANSWER());
- RRsetPtr rrset = *rit;
- EXPECT_EQ(Name("www.example.com"), rrset->getName());
- EXPECT_EQ(RRType::A(), rrset->getType());
- EXPECT_EQ(RRClass::IN(), rrset->getClass());
-
- RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
- EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
- it->next();
- EXPECT_TRUE(it->isLast());
-
- // XXX: also check ANSWER RRSIG
-
- rit = msg.beginSection(Section::AUTHORITY());
- rrset = *rit;
- EXPECT_EQ(Name("example.com"), rrset->getName());
- EXPECT_EQ(RRType::NS(), rrset->getType());
- EXPECT_EQ(RRClass::IN(), rrset->getClass());
-
- it = rrset->getRdataIterator();
- it->first();
- EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
- it->next();
- EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
- it->next();
- EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
- it->next();
- EXPECT_TRUE(it->isLast());
-
- rit = msg.beginSection(Section::ADDITIONAL());
- rrset = *rit;
- EXPECT_EQ(Name("dns01.example.com"), rrset->getName());
- EXPECT_EQ(RRType::A(), rrset->getType());
- EXPECT_EQ(RRClass::IN(), rrset->getClass());
-
- it = rrset->getRdataIterator();
- it->first();
- EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
- it->next();
- EXPECT_TRUE(it->isLast());
-}
-
-TEST_F(DataSrcTest, NSQuery) {
- readAndProcessQuery(msg, "testdata/q_example_ns");
-
- headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 0, 6);
-
- RRsetIterator rit = msg.beginSection(Section::ANSWER());
- RRsetPtr rrset = *rit;
- EXPECT_EQ(Name("example.com"), rrset->getName());
- EXPECT_EQ(RRType::NS(), rrset->getType());
- EXPECT_EQ(RRClass::IN(), rrset->getClass());
-
- RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
- EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
- it->next();
- EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
- it->next();
- EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
- it->next();
- EXPECT_TRUE(it->isLast());
-}
-
-TEST_F(DataSrcTest, NxRRset) {
- readAndProcessQuery(msg, "testdata/q_example_ptr");
-
- headerCheck(msg, Rcode::NOERROR(), true, true, true, 0, 4, 0);
-
- RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
- RRsetPtr rrset = *rit;
- EXPECT_EQ(Name("example.com"), rrset->getName());
- EXPECT_EQ(RRType::SOA(), rrset->getType());
-}
-
-TEST_F(DataSrcTest, Nxdomain) {
- readAndProcessQuery(msg, "testdata/q_glork");
-
- headerCheck(msg, Rcode::NXDOMAIN(), true, true, true, 0, 6, 0);
-
- RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
- RRsetPtr rrset = *rit;
- EXPECT_EQ(Name("example.com"), rrset->getName());
- EXPECT_EQ(RRType::SOA(), rrset->getType());
- EXPECT_EQ(RRClass::IN(), rrset->getClass());
- // XXX: check for other authority section answers
-}
-
-TEST_F(DataSrcTest, NxZone) {
- readAndProcessQuery(msg, "testdata/q_spork");
-
+ QueryCommon(RRClass::IN());
+}
+
+// Query class doesn't match any of the data source classes. The result
+// should be the same as "NxZone".
+TEST_F(DataSrcTest, QueryClassMismatch) {
+ createAndProcessQuery(Name("www.example.com"), RRClass::CH(), RRType::A());
headerCheck(msg, Rcode::REFUSED(), true, false, true, 0, 0, 0);
EXPECT_EQ(Rcode::REFUSED(), msg.getRcode());
EXPECT_TRUE(msg.getHeaderFlag(MessageFlag::QR()));
EXPECT_FALSE(msg.getHeaderFlag(MessageFlag::AA()));
EXPECT_TRUE(msg.getHeaderFlag(MessageFlag::RD()));
-
+}
+
+// Query class of any should match the first data source.
+TEST_F(DataSrcTest, QueryClassAny) {
+ QueryCommon(RRClass::ANY());
+}
+
+TEST_F(DataSrcTest, NSQuery) {
+ readAndProcessQuery("testdata/q_example_ns");
+
+ headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 0, 6);
+
+ RRsetIterator rit = msg.beginSection(Section::ANSWER());
+ RRsetPtr rrset = *rit;
+ EXPECT_EQ(Name("example.com"), rrset->getName());
+ EXPECT_EQ(RRType::NS(), rrset->getType());
+ EXPECT_EQ(RRClass::IN(), rrset->getClass());
+
+ RdataIteratorPtr it = rrset->getRdataIterator();
+ it->first();
+ EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
+ it->next();
+ EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
+ it->next();
+ EXPECT_EQ("dns03.example.com.", it->getCurrent().toText());
+ it->next();
+ EXPECT_TRUE(it->isLast());
+}
+
+TEST_F(DataSrcTest, NxRRset) {
+ readAndProcessQuery("testdata/q_example_ptr");
+
+ headerCheck(msg, Rcode::NOERROR(), true, true, true, 0, 4, 0);
+
+ RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
+ RRsetPtr rrset = *rit;
+ EXPECT_EQ(Name("example.com"), rrset->getName());
+ EXPECT_EQ(RRType::SOA(), rrset->getType());
+}
+
+TEST_F(DataSrcTest, Nxdomain) {
+ readAndProcessQuery("testdata/q_glork");
+
+ headerCheck(msg, Rcode::NXDOMAIN(), true, true, true, 0, 6, 0);
+
+ RRsetIterator rit = msg.beginSection(Section::AUTHORITY());
+ RRsetPtr rrset = *rit;
+ EXPECT_EQ(Name("example.com"), rrset->getName());
+ EXPECT_EQ(RRType::SOA(), rrset->getType());
+ EXPECT_EQ(RRClass::IN(), rrset->getClass());
+ // XXX: check for other authority section answers
+}
+
+TEST_F(DataSrcTest, NxZone) {
+ readAndProcessQuery("testdata/q_spork");
+
+ headerCheck(msg, Rcode::REFUSED(), true, false, true, 0, 0, 0);
+
+ EXPECT_EQ(Rcode::REFUSED(), msg.getRcode());
+ EXPECT_TRUE(msg.getHeaderFlag(MessageFlag::QR()));
+ EXPECT_FALSE(msg.getHeaderFlag(MessageFlag::AA()));
+ EXPECT_TRUE(msg.getHeaderFlag(MessageFlag::RD()));
}
TEST_F(DataSrcTest, Wildcard) {
- readAndProcessQuery(msg, "testdata/q_wild_a");
+ readAndProcessQuery("testdata/q_wild_a");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
@@ -268,14 +295,14 @@
// Check that a query for a data type not covered by the wildcard
// returns NOERROR
- readAndProcessQuery(msg, "testdata/q_wild_aaaa");
+ readAndProcessQuery("testdata/q_wild_aaaa");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 0, 2, 0);
}
TEST_F(DataSrcTest, WildcardCname) {
// Check that wildcard answers containing CNAMES are followed
// correctly
- readAndProcessQuery(msg, "testdata/q_wild2_a");
+ readAndProcessQuery("testdata/q_wild2_a");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 4, 6);
@@ -334,7 +361,7 @@
}
TEST_F(DataSrcTest, AuthDelegation) {
- readAndProcessQuery(msg, "testdata/q_sql1");
+ readAndProcessQuery("testdata/q_sql1");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
@@ -380,7 +407,7 @@
}
TEST_F(DataSrcTest, Dname) {
- readAndProcessQuery(msg, "testdata/q_dname");
+ readAndProcessQuery("testdata/q_dname");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 5, 4, 6);
@@ -428,7 +455,7 @@
}
TEST_F(DataSrcTest, Cname) {
- readAndProcessQuery(msg, "testdata/q_cname");
+ readAndProcessQuery("testdata/q_cname");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 0, 0);
@@ -446,7 +473,7 @@
}
TEST_F(DataSrcTest, CnameInt) {
- readAndProcessQuery(msg, "testdata/q_cname_int");
+ readAndProcessQuery("testdata/q_cname_int");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 4, 6);
@@ -472,7 +499,7 @@
}
TEST_F(DataSrcTest, CnameExt) {
- readAndProcessQuery(msg, "testdata/q_cname_ext");
+ readAndProcessQuery("testdata/q_cname_ext");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 4, 4, 6);
@@ -496,7 +523,7 @@
}
TEST_F(DataSrcTest, Delegation) {
- readAndProcessQuery(msg, "testdata/q_subzone");
+ readAndProcessQuery("testdata/q_subzone");
headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 5, 2);
@@ -526,7 +553,7 @@
}
TEST_F(DataSrcTest, NSDelegation) {
- readAndProcessQuery(msg, "testdata/q_subzone_ns");
+ readAndProcessQuery("testdata/q_subzone_ns");
headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 5, 2);
@@ -558,7 +585,7 @@
TEST_F(DataSrcTest, ANYZonecut) {
// An ANY query at a zone cut should behave the same as any other
// delegation
- readAndProcessQuery(msg, "testdata/q_subzone_any");
+ readAndProcessQuery("testdata/q_subzone_any");
headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 5, 2);
@@ -588,7 +615,7 @@
}
TEST_F(DataSrcTest, NSECZonecut) {
- readAndProcessQuery(msg, "testdata/q_subzone_nsec");
+ readAndProcessQuery("testdata/q_subzone_nsec");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 2, 4, 6);
@@ -616,7 +643,7 @@
}
TEST_F(DataSrcTest, DS) {
- readAndProcessQuery(msg, "testdata/q_subzone_ds");
+ readAndProcessQuery("testdata/q_subzone_ds");
headerCheck(msg, Rcode::NOERROR(), true, true, true, 3, 4, 6);
@@ -644,16 +671,16 @@
}
TEST_F(DataSrcTest, CNAMELoop) {
- createAndProcessQuery(test_source, msg, Name("loop1.example.com"),
- RRClass::IN(), RRType::A());
+ createAndProcessQuery(Name("loop1.example.com"), RRClass::IN(),
+ RRType::A());
}
// NSEC query for the name of a zone cut for non-secure delegation.
// Should return normal referral.
#if 0 // currently fails
TEST_F(DataSrcTest, NSECZonecutOfNonsecureZone) {
- createAndProcessQuery(sql3_source, msg, Name("sub.example.org"),
- RRClass::IN(), RRType::NSEC());
+ createAndProcessQuery(Name("sub.example.org"), RRClass::IN(),
+ RRType::NSEC());
headerCheck(msg, Rcode::NOERROR(), true, false, true, 0, 1, 1);
@@ -688,8 +715,7 @@
#if 0 // currently fails
TEST_F(DataSrcTest, RootDSQuery) {
- createAndProcessQuery(test_source, msg, Name("."),
- RRClass::IN(), RRType::DS());
+ createAndProcessQuery(Name("."), RRClass::IN(), RRType::DS());
}
#endif
Modified: trunk/src/lib/auth/tests/sqlite3_unittest.cc
==============================================================================
--- trunk/src/lib/auth/tests/sqlite3_unittest.cc (original)
+++ trunk/src/lib/auth/tests/sqlite3_unittest.cc Mon Mar 15 01:38:55 2010
@@ -100,6 +100,7 @@
class Sqlite3DataSourceTest : public ::testing::Test {
protected:
Sqlite3DataSourceTest() : rrclass(RRClass::IN()),
+ rrclass_notmatch(RRClass::CH()),
rrtype(RRType::A()), rrttl(RRTTL(3600)),
find_flags(0), rrset_matched(0), rrset_count(0)
{
@@ -175,6 +176,7 @@
Sqlite3DataSrc data_source;
// we allow these to be modified in the test
RRClass rrclass;
+ RRClass rrclass_notmatch;
RRType rrtype;
RRTTL rrttl;
RRsetList result_sets;
@@ -225,6 +227,9 @@
vector<string> child_sig_data;
vector<string> nsec3_data;
vector<string> nsec3_sig_data;
+
+ void findReferralRRsetCommon(const Name& qname, const RRClass& qclass);
+ void findAddressRRsetCommon(const RRClass& qclass);
};
void
@@ -279,9 +284,9 @@
void
checkFind(FindMode mode, const Sqlite3DataSrc& data_source,
const Name& expected_name, const Name* zone_name,
- const RRClass& expected_class, const RRType& expected_type,
- const vector<RRTTL>& expected_ttls, const uint32_t expected_flags,
- const vector<RRType>& expected_types,
+ const RRClass& qclass, const RRClass& expected_class,
+ const RRType& expected_type, const vector<RRTTL>& expected_ttls,
+ const uint32_t expected_flags, const vector<RRType>& expected_types,
const vector<const vector<string>* >& expected_answers,
const vector<const vector<string>* >& expected_signatures)
{
@@ -293,26 +298,25 @@
switch (mode) {
case NORMAL:
EXPECT_EQ(DataSrc::SUCCESS,
- data_source.findRRset(expected_name, expected_class,
+ data_source.findRRset(expected_name, qclass,
expected_type, result_sets, find_flags,
zone_name));
break;
case EXACT:
EXPECT_EQ(DataSrc::SUCCESS,
- data_source.findExactRRset(expected_name,
- expected_class, expected_type,
- result_sets, find_flags,
- zone_name));
+ data_source.findExactRRset(expected_name, qclass,
+ expected_type, result_sets,
+ find_flags, zone_name));
break;
case ADDRESS:
EXPECT_EQ(DataSrc::SUCCESS,
- data_source.findAddrs(expected_name, expected_class,
- result_sets, find_flags, zone_name));
+ data_source.findAddrs(expected_name, qclass, result_sets,
+ find_flags, zone_name));
break;
case REFERRAL:
EXPECT_EQ(DataSrc::SUCCESS,
- data_source.findReferral(expected_name, expected_class,
- result_sets, find_flags, zone_name));
+ data_source.findReferral(expected_name, qclass, result_sets,
+ find_flags, zone_name));
break;
}
EXPECT_EQ(expected_flags, find_flags);
@@ -339,8 +343,9 @@
void
checkFind(FindMode mode, const Sqlite3DataSrc& data_source,
const Name& expected_name, const Name* zone_name,
- const RRClass& expected_class, const RRType& expected_type,
- const RRTTL& expected_rrttl, const uint32_t expected_flags,
+ const RRClass& qclass, const RRClass& expected_class,
+ const RRType& expected_type, const RRTTL& expected_rrttl,
+ const uint32_t expected_flags,
const vector<string>& expected_data,
const vector<string>* expected_sig_data)
{
@@ -354,7 +359,7 @@
answers.push_back(&expected_data);
signatures.push_back(expected_sig_data);
- checkFind(mode, data_source, expected_name, zone_name,
+ checkFind(mode, data_source, expected_name, zone_name, qclass,
expected_class, expected_type, ttls, expected_flags, types,
answers, signatures);
}
@@ -442,17 +447,26 @@
TEST_F(Sqlite3DataSourceTest, findClosestClassMismatch) {
NameMatch name_match(www_name);
- data_source.findClosestEnclosure(name_match, RRClass::CH());
+ data_source.findClosestEnclosure(name_match, rrclass_notmatch);
EXPECT_EQ(NULL, name_match.closestName());
EXPECT_EQ(NULL, name_match.bestDataSrc());
}
+// If the query class is ANY, the result should be the same as the case where
+// the class exactly matches.
+TEST_F(Sqlite3DataSourceTest, findClosestClassAny) {
+ NameMatch name_match(www_name);
+ data_source.findClosestEnclosure(name_match, RRClass::ANY());
+ EXPECT_EQ(zone_name, *name_match.closestName());
+ EXPECT_EQ(&data_source, name_match.bestDataSrc());
+}
+
TEST_F(Sqlite3DataSourceTest, findRRsetNormal) {
// Without specifying the zone name, and then with the zone name
- checkFind(NORMAL, data_source, www_name, NULL, rrclass, rrtype,
+ checkFind(NORMAL, data_source, www_name, NULL, rrclass, rrclass, rrtype,
rrttl, 0, common_a_data, &common_sig_data);
- checkFind(NORMAL, data_source, www_name, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, www_name, &zone_name, rrclass, rrclass,
rrtype, rrttl, 0, common_a_data, &common_sig_data);
// With a zone name that doesn't match
@@ -465,8 +479,18 @@
TEST_F(Sqlite3DataSourceTest, findRRsetClassMismatch) {
EXPECT_EQ(DataSrc::ERROR,
- data_source.findRRset(www_name, RRClass::CH(), rrtype,
+ data_source.findRRset(www_name, rrclass_notmatch, rrtype,
result_sets, find_flags, NULL));
+}
+
+TEST_F(Sqlite3DataSourceTest, findRRsetClassAny) {
+ checkFind(NORMAL, data_source, www_name, NULL, RRClass::ANY(), rrclass,
+ rrtype, rrttl, 0, common_a_data, &common_sig_data);
+}
+
+TEST_F(Sqlite3DataSourceTest, findRRsetClassClassAny) {
+ checkFind(NORMAL, data_source, www_name, NULL, RRClass::ANY(), rrclass,
+ rrtype, rrttl, 0, common_a_data, &common_sig_data);
}
TEST_F(Sqlite3DataSourceTest, findRRsetNormalANY) {
@@ -480,19 +504,19 @@
signatures.push_back(&www_nsec_sig_data);
rrtype = RRType::ANY();
- checkFind(NORMAL, data_source, www_name, NULL, rrclass, rrtype,
+ checkFind(NORMAL, data_source, www_name, NULL, rrclass, rrclass, rrtype,
ttls, 0, types, answers, signatures);
- checkFind(NORMAL, data_source, www_name, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, www_name, &zone_name, rrclass, rrclass,
rrtype, ttls, 0, types, answers, signatures);
}
// Case insensitive lookup
TEST_F(Sqlite3DataSourceTest, findRRsetNormalCase) {
- checkFind(NORMAL, data_source, www_upper_name, NULL, rrclass,
+ checkFind(NORMAL, data_source, www_upper_name, NULL, rrclass, rrclass,
rrtype, rrttl, 0, common_a_data, &common_sig_data);
- checkFind(NORMAL, data_source, www_upper_name, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, www_upper_name, &zone_name, rrclass, rrclass,
rrtype, rrttl, 0, common_a_data, &common_sig_data);
EXPECT_EQ(DataSrc::SUCCESS,
@@ -504,10 +528,10 @@
TEST_F(Sqlite3DataSourceTest, findRRsetApexNS) {
rrtype = RRType::NS();
- checkFind(NORMAL, data_source, zone_name, NULL, rrclass, rrtype,
+ checkFind(NORMAL, data_source, zone_name, NULL, rrclass, rrclass, rrtype,
rrttl, DataSrc::REFERRAL, apex_ns_data, &apex_ns_sig_data);
- checkFind(NORMAL, data_source, zone_name, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, zone_name, &zone_name, rrclass, rrclass,
rrtype, rrttl, DataSrc::REFERRAL, apex_ns_data,
&apex_ns_sig_data);
@@ -544,10 +568,10 @@
// there is an NS at the zone apex, so the REFERRAL flag should
// be set, but will ordinarily be ignored by the caller
- checkFind(NORMAL, data_source, zone_name, NULL, rrclass, rrtype,
+ checkFind(NORMAL, data_source, zone_name, NULL, rrclass, rrclass, rrtype,
ttls, DataSrc::REFERRAL, types, answers, signatures);
- checkFind(NORMAL, data_source, zone_name, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, zone_name, &zone_name, rrclass, rrclass,
rrtype, ttls, DataSrc::REFERRAL, types, answers, signatures);
}
@@ -565,7 +589,7 @@
signatures.push_back(NULL);
rrtype = RRType::ANY();
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, ttls, 0, types, answers, signatures);
}
@@ -593,9 +617,9 @@
// point of view, but perform minimal tests anyway.
TEST_F(Sqlite3DataSourceTest, findRRsetWildcard) {
const Name qname("*.wild.example.com");
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, rrttl, 0, wild_a_data, &common_sig_data);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, rrttl, 0, wild_a_data, &common_sig_data);
}
@@ -622,9 +646,9 @@
const Name qname("dname.example.com");
rrtype = RRType::DNAME();
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, rrttl, 0, dname_data, &dname_sig_data);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, rrttl, 0, dname_data, &dname_sig_data);
}
@@ -634,9 +658,9 @@
// This qname only has the CNAME (+ sigs). CNAME query is not different
// from ordinary queries.
rrtype = RRType::CNAME();
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, rrttl, 0, cname_data, &cname_sig_data);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, rrttl, 0, cname_data, &cname_sig_data);
// queries for (ordinary) different RR types that match the CNAME.
@@ -646,18 +670,18 @@
ttls.push_back(rrttl);
answers.push_back(&cname_data);
signatures.push_back(&cname_sig_data);
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, ttls, DataSrc::CNAME_FOUND, types, answers, signatures);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, ttls, DataSrc::CNAME_FOUND, types, answers, signatures);
// NSEC query that match the CNAME.
// CNAME_FOUND flag is NOT set, and the NSEC RR is returned instead of
// CNAME.
rrtype = RRType::NSEC();
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, RRTTL(7200), 0, cname_nsec_data, &cname_nsec_sig_data);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, RRTTL(7200), 0, cname_nsec_data, &cname_nsec_sig_data);
}
@@ -696,9 +720,9 @@
// For NS query, RRset is returned with the REFERRAL flag. No RRSIG should
// be provided.
rrtype = RRType::NS();
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, rrttl, DataSrc::REFERRAL, delegation_ns_data, NULL);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, rrttl, DataSrc::REFERRAL, delegation_ns_data, NULL);
// For ANY query. At the backend data source level, it returns all
@@ -717,20 +741,20 @@
signatures.push_back(&delegation_nsec_sig_data);
signatures.push_back(&delegation_ds_sig_data);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, ttls, DataSrc::REFERRAL, types, answers,
signatures);
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, ttls, DataSrc::REFERRAL, types, answers,
signatures);
// For NSEC query. At the backend data source level, it returns NSEC+
// RRSIG with the referral flag.
rrtype = RRType::NSEC();
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, RRTTL(7200), DataSrc::REFERRAL, delegation_nsec_data,
&delegation_nsec_sig_data);
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, RRTTL(7200), DataSrc::REFERRAL, delegation_nsec_data,
&delegation_nsec_sig_data);
}
@@ -741,7 +765,7 @@
// If we don't specify the zone, the data source should identify the
// best matching zone.
- checkFind(NORMAL, data_source, qname, NULL, rrclass,
+ checkFind(NORMAL, data_source, qname, NULL, rrclass, rrclass,
rrtype, rrttl, 0, child_a_data, &child_sig_data);
// If we specify the parent zone, it's treated as NXDOMAIN because it's
@@ -753,21 +777,25 @@
EXPECT_TRUE(result_sets.begin() == result_sets.end());
// If we specify the child zone, it should be the same as the first case.
- checkFind(NORMAL, data_source, qname, &child_zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &child_zone_name, rrclass, rrclass,
rrtype, rrttl, 0, child_a_data, &child_sig_data);
}
TEST_F(Sqlite3DataSourceTest, findExactRRset) {
// Normal case. No different than findRRset.
- checkFind(EXACT, data_source, www_name, &zone_name, rrclass, rrtype,
- rrttl, 0, common_a_data, &common_sig_data);
+ checkFind(EXACT, data_source, www_name, &zone_name, rrclass, rrclass,
+ rrtype, rrttl, 0, common_a_data, &common_sig_data);
}
TEST_F(Sqlite3DataSourceTest, findExactRRsetClassMismatch) {
- // Normal case. No different than findRRset.
EXPECT_EQ(DataSrc::ERROR,
- data_source.findExactRRset(www_name, RRClass::CH(), rrtype,
+ data_source.findExactRRset(www_name, rrclass_notmatch, rrtype,
result_sets, find_flags, NULL));
+}
+
+TEST_F(Sqlite3DataSourceTest, findExactRRsetClassAny) {
+ checkFind(EXACT, data_source, www_name, &zone_name, RRClass::ANY(), rrclass,
+ rrtype, rrttl, 0, common_a_data, &common_sig_data);
}
TEST_F(Sqlite3DataSourceTest, findRRsetNSEC3) {
@@ -792,7 +820,7 @@
// This qname only has the CNAME (+ sigs). In this case it should be
// no different than findRRset for CNAME query.
rrtype = RRType::CNAME();
- checkFind(NORMAL, data_source, qname, &zone_name, rrclass,
+ checkFind(NORMAL, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, rrttl, 0, cname_data, &cname_sig_data);
// queries for (ordinary) different RR types that match the CNAME.
@@ -803,15 +831,15 @@
ttls.push_back(rrttl);
answers.push_back(&cname_data);
signatures.push_back(&cname_sig_data);
- checkFind(EXACT, data_source, qname, &zone_name, rrclass,
+ checkFind(EXACT, data_source, qname, &zone_name, rrclass, rrclass,
rrtype, ttls, DataSrc::TYPE_NOT_FOUND, types, answers,
signatures);
}
-TEST_F(Sqlite3DataSourceTest, findReferralRRset) {
- // A referral lookup searches for NS, DS, or DNAME, or their sigs.
- const Name qname("sql1.example.com");
-
+void
+Sqlite3DataSourceTest::findReferralRRsetCommon(const Name& qname,
+ const RRClass& qclass)
+{
types.push_back(RRType::NS());
types.push_back(RRType::DS());
ttls.push_back(rrttl);
@@ -822,20 +850,32 @@
signatures.push_back(&child_ds_sig_data);
// Note: zone_name matters here because we need to perform the search
// in the parent zone.
- checkFind(REFERRAL, data_source, qname, &zone_name, rrclass,
+ checkFind(REFERRAL, data_source, qname, &zone_name, qclass, rrclass,
rrtype, ttls, DataSrc::REFERRAL, types, answers, signatures);
+}
+
+
+TEST_F(Sqlite3DataSourceTest, findReferralRRset) {
+ // A referral lookup searches for NS, DS, or DNAME, or their sigs.
+ const Name qname("sql1.example.com");
+ findReferralRRsetCommon(qname, rrclass);
}
TEST_F(Sqlite3DataSourceTest, findReferralRRsetClassMismatch) {
EXPECT_EQ(DataSrc::ERROR,
- data_source.findReferral(www_name, RRClass::CH(), result_sets,
+ data_source.findReferral(www_name, rrclass_notmatch, result_sets,
find_flags, NULL));
+}
+
+TEST_F(Sqlite3DataSourceTest, findReferralRRsetClassAny) {
+ const Name qname("sql1.example.com");
+ findReferralRRsetCommon(qname, RRClass::ANY());
}
TEST_F(Sqlite3DataSourceTest, findReferralRRsetDNAME) {
// same as above. the DNAME case.
const Name qname("dname.example.com");
- checkFind(REFERRAL, data_source, qname, &zone_name, rrclass,
+ checkFind(REFERRAL, data_source, qname, &zone_name, rrclass, rrclass,
RRType::DNAME(), rrttl, 0, dname_data, &dname_sig_data);
}
@@ -848,16 +888,17 @@
EXPECT_TRUE(result_sets.begin() == result_sets.end());
}
-TEST_F(Sqlite3DataSourceTest, findAddressRRset) {
+void
+Sqlite3DataSourceTest::findAddressRRsetCommon(const RRClass& qclass) {
// A referral lookup searches for A or AAAA, or their sigs.
// A-only case
- checkFind(ADDRESS, data_source, www_name, &zone_name, rrclass,
+ checkFind(ADDRESS, data_source, www_name, &zone_name, qclass, rrclass,
rrtype, rrttl, 0, common_a_data, &common_sig_data);
// AAAA-only case
checkFind(ADDRESS, data_source, Name("ip6.example.com"), &zone_name,
- rrclass, RRType::AAAA(), rrttl, 0, common_aaaa_data,
+ qclass, rrclass, RRType::AAAA(), rrttl, 0, common_aaaa_data,
&common_aaaa_sig_data);
// Dual-stack
@@ -869,21 +910,29 @@
ttls.push_back(rrttl);
answers.push_back(&common_aaaa_data);
signatures.push_back(&common_aaaa_sig_data);
- checkFind(ADDRESS, data_source, Name("ip46.example.com"),
- &zone_name, rrclass, rrtype, ttls, 0, types, answers, signatures);
+ checkFind(ADDRESS, data_source, Name("ip46.example.com"), &zone_name,
+ rrclass, rrclass, rrtype, ttls, 0, types, answers, signatures);
// The qname doesn't have no address records.
EXPECT_EQ(DataSrc::SUCCESS,
- data_source.findAddrs(Name("text.example.com"), rrclass,
+ data_source.findAddrs(Name("text.example.com"), qclass,
result_sets, find_flags, &zone_name));
EXPECT_EQ(DataSrc::TYPE_NOT_FOUND, find_flags);
EXPECT_TRUE(result_sets.begin() == result_sets.end());
}
+TEST_F(Sqlite3DataSourceTest, findAddressRRset) {
+ findAddressRRsetCommon(rrclass);
+}
+
TEST_F(Sqlite3DataSourceTest, findAddressRRsetClassMismatch) {
- EXPECT_EQ(DataSrc::ERROR, data_source.findAddrs(www_name, RRClass::CH(),
+ EXPECT_EQ(DataSrc::ERROR, data_source.findAddrs(www_name, rrclass_notmatch,
result_sets, find_flags,
NULL));
}
-}
+TEST_F(Sqlite3DataSourceTest, findAddressRRsetClassAny) {
+ findAddressRRsetCommon(RRClass::ANY());
+}
+
+}
Modified: trunk/src/lib/auth/tests/test_datasrc.cc
==============================================================================
--- trunk/src/lib/auth/tests/test_datasrc.cc (original)
+++ trunk/src/lib/auth/tests/test_datasrc.cc Mon Mar 15 01:38:55 2010
@@ -451,7 +451,7 @@
const Name& qname = match.qname();
NameComparisonResult::NameRelation cmp;
- if (qclass != getClass()) {
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
return;
}
@@ -726,6 +726,10 @@
uint32_t& flags,
const Name* zonename) const
{
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
+ return (ERROR);
+ }
+
findRecords(qname, qtype, target, zonename, NORMAL, flags);
return (SUCCESS);
}
@@ -738,6 +742,10 @@
uint32_t& flags,
const Name* zonename) const
{
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
+ return (ERROR);
+ }
+
findRecords(qname, qtype, target, zonename, NORMAL, flags);
// Ignore referrals in this case
flags &= ~REFERRAL;
@@ -758,6 +766,10 @@
uint32_t& flags,
const Name* zonename) const
{
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
+ return (ERROR);
+ }
+
findRecords(qname, RRType::ANY(), target, zonename, ADDRESS, flags);
return (SUCCESS);
}
@@ -769,6 +781,10 @@
uint32_t& flags,
const Name* zonename) const
{
+ if (qclass != getClass() && qclass != RRClass::ANY()) {
+ return (ERROR);
+ }
+
findRecords(qname, RRType::ANY(), target, zonename, DELEGATION, flags);
return (SUCCESS);
}
More information about the bind10-changes
mailing list