setNSEC3HashCreator(NULL);
}
- void enableNSEC3() {
+ void enableNSEC3(const vector<string>& rrsets_to_add) {
boost::shared_ptr<ConfigurableClientList> new_list;
switch (GetParam()) {
case MOCK:
mock_finder->setNSEC3Flag(true);
+ for (vector<string>::const_iterator it = rrsets_to_add.begin();
+ it != rrsets_to_add.end();
+ ++it) {
+ mock_finder->addRecord(*it);
+ }
break;
case INMEMORY:
+ // dynamic addition is not yet supported for in-memory
+ ASSERT_TRUE(rrsets_to_add.empty());
new_list.reset(new ConfigurableClientList(RRClass::IN()));
new_list->configure(isc::data::Element::fromJSON(
"[{\"type\": \"MasterFiles\","
string(TEST_OWN_DATA_DIR
"/example-nsec3.sqlite3.copied") +
"\"}}]"), true);
+
+ const Name origin("example.com");
+ ZoneUpdaterPtr updater =
+ new_list->find(origin, true, false).dsrc_client_->
+ getUpdater(origin, false);
+ for (vector<string>::const_iterator it = rrsets_to_add.begin();
+ it != rrsets_to_add.end();
+ ++it) {
+ ConstRRsetPtr rrset = textToRRset(*it);
+ updater->addRRset(*rrset);
+ updater->addRRset(*createRRSIG(rrset));
+ }
+ updater->commit();
+
list_ = new_list;
break;
}
}
+private:
+ // A helper for enableNSEC3, creating an RRSIG RRset for the corresponding
+ // non-sig RRset, using the commonly used parameters.
+ static ConstRRsetPtr createRRSIG(ConstRRsetPtr rrset) {
+ RRsetPtr sig_rrset(new RRset(rrset->getName(), rrset->getClass(),
+ RRType::RRSIG(), rrset->getTTL()));
+ sig_rrset->addRdata(generic::RRSIG(
+ getCommonRRSIGText(rrset->getType().
+ toText())));
+ return (sig_rrset);
+ }
+
+protected:
MockZoneFinder* mock_finder;
// We use InMemoryClient here. We could have some kind of mock client
// here, but historically, the Query supported only InMemoryClient
const string ns_addrs_and_sig_txt; // convenient shortcut
Query query;
TestNSEC3Hash nsec3_hash_;
+ vector<string> rrsets_to_add_;
private:
const TestNSEC3HashCreator nsec3hash_creator_;
};
TEST_P(QueryTest, secureUnsignedDelegationWithNSEC3OptOut) {
// Similar to the previous case, but the delegation is an optout.
- enableNSEC3();
+ enableNSEC3(rrsets_to_add_);
query.process(*list_,
Name("foo.unsigned-delegation.example.com"),
}
TEST_P(QueryTest, wildcardNSEC3) {
- // skip NSEC3-related tests for actual data source for the moment
- if (GetParam() != MOCK) {
+ // This test requires incremental update to the zone; unavailable for
+ // in-memory.
+ if (GetParam() == INMEMORY) {
return;
}
// Similar to wildcardNSEC, but the zone is signed with NSEC3.
// The next closer is y.wild.example.com, the covering NSEC3 for it
// is (in our setup) the NSEC3 for the apex.
- mock_finder->setNSEC3Flag(true);
-
- // This is NSEC3 for wild.example.com, which will be used in the middle
+ //
+ // Adding NSEC3 for wild.example.com, which will be used in the middle
// of identifying the next closer name.
- mock_finder->addRecord(nsec3_atwild_txt);
+ rrsets_to_add_.push_back(nsec3_atwild_txt);
+ enableNSEC3(rrsets_to_add_);
query.process(*list_, Name("x.y.wild.example.com"), RRType::A(),
response, true);
TEST_P(QueryTest, CNAMEwildNSEC3) {
// skip NSEC3-related tests for actual data source for the moment
- if (GetParam() != MOCK) {
+ if (GetParam() == INMEMORY) {
return;
}
// Similar to CNAMEwildNSEC, but with NSEC3.
// The next closer is qname itself, the covering NSEC3 for it
// is (in our setup) the NSEC3 for the www.example.com.
- mock_finder->setNSEC3Flag(true);
- mock_finder->addRecord(nsec3_atcnamewild_txt);
+ rrsets_to_add_.push_back(nsec3_atcnamewild_txt);
+ enableNSEC3(rrsets_to_add_);
query.process(*list_, Name("www.cnamewild.example.com"),
RRType::A(), response, true);
}
TEST_P(QueryTest, badWildcardNSEC3) {
- // broken data source scenario; works only with mock.
+ // This test requires incremental update to the zone; unavailable for
+ // in-memory.
if (GetParam() != MOCK) {
return;
}
}
TEST_P(QueryTest, wildcardNxrrsetWithNSEC3) {
- // skip NSEC3-related tests for actual data source for the moment
- if (GetParam() != MOCK) {
+ // This test requires incremental update to the zone; unavailable for
+ // in-memory.
+ if (GetParam() == INMEMORY) {
return;
}
// Similar to the previous case, but providing NSEC3 proofs according to
// RFC5155 Section 7.2.5.
- mock_finder->addRecord(nsec3_wild_txt);
- mock_finder->addRecord(nsec3_uwild_txt);
- mock_finder->setNSEC3Flag(true);
+ rrsets_to_add_.push_back(nsec3_wild_txt);
+ rrsets_to_add_.push_back(nsec3_uwild_txt);
+ enableNSEC3(rrsets_to_add_);
query.process(*list_, Name("www1.uwild.example.com"),
RRType::TXT(), response, true);
// Check the signature is present when an NXRRSET is returned
TEST_P(QueryTest, nxrrsetWithNSEC3) {
- enableNSEC3();
+ enableNSEC3(rrsets_to_add_);
// NXRRSET with DNSSEC proof. We should have SOA, NSEC3 that proves the
// NXRRSET and their RRSIGs.
}
TEST_P(QueryTest, nxrrsetWithNSEC3_ds_exact) {
- // skip NSEC3-related tests for actual data source for the moment
- if (GetParam() != MOCK) {
+ // This test requires incremental update to the zone; unavailable for
+ // in-memory.
+ if (GetParam() == INMEMORY) {
return;
}
- mock_finder->addRecord(unsigned_delegation_nsec3_txt);
- mock_finder->setNSEC3Flag(true);
+ rrsets_to_add_.push_back(unsigned_delegation_nsec3_txt);
+ enableNSEC3(rrsets_to_add_);
// This delegation has no DS, but does have a matching NSEC3 record
// (See RFC5155 section 7.2.4)
}
TEST_P(QueryTest, nxrrsetWithNSEC3_ds_no_exact) {
- // skip NSEC3-related tests for actual data source for the moment
- if (GetParam() != MOCK) {
+ // This test requires incremental update to the zone; unavailable for
+ // in-memory.
+ if (GetParam() == INMEMORY) {
return;
}
- mock_finder->addRecord(unsigned_delegation_nsec3_txt);
- mock_finder->setNSEC3Flag(true);
+ rrsets_to_add_.push_back(unsigned_delegation_nsec3_txt);
+ enableNSEC3(rrsets_to_add_);
// This delegation has no DS, and no directly matching NSEC3 record
// So the response should contain closest encloser proof (and the
}
TEST_P(QueryTest, nxdomainWithNSEC3Proof) {
- // skip NSEC3-related tests for actual data source for the moment
- if (GetParam() != MOCK) {
+ // This test requires incremental update to the zone; unavailable for
+ // in-memory.
+ if (GetParam() == INMEMORY) {
return;
}
// Name Error (NXDOMAIN) case with NSEC3 proof per RFC5155 Section 7.2.2.
- // Enable NSEC3
- mock_finder->setNSEC3Flag(true);
// This will be the covering NSEC3 for the next closer
- mock_finder->addRecord(nsec3_uwild_txt);
+ rrsets_to_add_.push_back(nsec3_uwild_txt);
// This will be the covering NSEC3 for the possible wildcard
- mock_finder->addRecord(unsigned_delegation_nsec3_txt);
+ rrsets_to_add_.push_back(unsigned_delegation_nsec3_txt);
+ // Enable NSEC3
+ enableNSEC3(rrsets_to_add_);
query.process(*list_, Name("nxdomain.example.com"), qtype,
response, true);
// query logic for these cases. At that point it's probably better to
// clean them up.
TEST_P(QueryTest, emptyNameWithNSEC3) {
- enableNSEC3();
+ enableNSEC3(rrsets_to_add_);
const Name qname("no.example.com");
ASSERT_TRUE(list_->find(qname).finder_);
ZoneFinderContextPtr result =