From: JINMEI Tatuya Date: Thu, 20 Sep 2012 22:01:37 +0000 (-0700) Subject: [2219] added unit tests TreeNodeRRset::getRRsig(). X-Git-Tag: trac2351_base~37^2~1^2~13^2~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ceeaa8ae96db786b65715e0cb440a411fbab8b2c;p=thirdparty%2Fkea.git [2219] added unit tests TreeNodeRRset::getRRsig(). not directly related to this branch, but it should have been done when the method was implemented. Also made small optimization: just return NULL if it's not supposed to be signed. --- diff --git a/src/lib/datasrc/memory/tests/treenode_rrset_unittest.cc b/src/lib/datasrc/memory/tests/treenode_rrset_unittest.cc index eea62e67f5..02ad2bd49a 100644 --- a/src/lib/datasrc/memory/tests/treenode_rrset_unittest.cc +++ b/src/lib/datasrc/memory/tests/treenode_rrset_unittest.cc @@ -25,6 +25,7 @@ #include +#include #include #include @@ -137,11 +138,22 @@ protected: RdataSet* wildcard_rdataset_; // for wildcard (type doesn't matter much) }; +void +compareRRSIGData(RdataIteratorPtr rit, const void* data, size_t data_len) { + ASSERT_FALSE(rit->isLast()); + + OutputBuffer buffer(0); + rit->getCurrent().toWire(buffer); + matchWireData(data, data_len, buffer.getData(), buffer.getLength()); + rit->next(); +} + // Check some trivial fields of a constructed TreeNodeRRset (passed as // AbstractRRset as we'd normally use it in polymorphic way). // Other complicated fields are checked through rendering tests. void -checkBasicFields(const AbstractRRset& actual_rrset, const Name& expected_name, +checkBasicFields(const AbstractRRset& actual_rrset, const RdataSet* rdataset, + const Name& expected_name, const RRClass& expected_class, const RRType& expected_type, const uint32_t expected_ttl, size_t expected_rdatacount, size_t expected_sigcount) @@ -152,6 +164,28 @@ checkBasicFields(const AbstractRRset& actual_rrset, const Name& expected_name, EXPECT_EQ(RRTTL(expected_ttl), actual_rrset.getTTL()); EXPECT_EQ(expected_rdatacount, actual_rrset.getRdataCount()); EXPECT_EQ(expected_sigcount, actual_rrset.getRRsigDataCount()); + + // getRRsig() should return non NULL iff the RRset is expected to be signed + if (expected_sigcount == 0) { + EXPECT_FALSE(actual_rrset.getRRsig()); + } else { + ConstRRsetPtr actual_sigrrset = actual_rrset.getRRsig(); + ASSERT_TRUE(actual_sigrrset); + EXPECT_EQ(expected_name, actual_sigrrset->getName()); + EXPECT_EQ(expected_class, actual_sigrrset->getClass()); + EXPECT_EQ(RRType::RRSIG(), actual_sigrrset->getType()); + EXPECT_EQ(RRTTL(expected_ttl), actual_sigrrset->getTTL()); + EXPECT_EQ(expected_sigcount, actual_sigrrset->getRdataCount()); + + // Compare each RRSIG RDATA + RdataIteratorPtr rit = actual_sigrrset->getRdataIterator(); + RdataReader reader(expected_class, expected_type, + rdataset->getDataBuf(), expected_rdatacount, + expected_sigcount, &RdataReader::emptyNameAction, + boost::bind(compareRRSIGData, rit, _1, _2)); + while (reader.nextSig() != RdataReader::RRSET_BOUNDARY) {} + EXPECT_TRUE(rit->isLast()); // should check all RDATAs + } } // The following two are trivial wrapper to create a shared pointer @@ -178,30 +212,37 @@ createRRset(const Name& realname, const RRClass& rrclass, const ZoneNode* node, TEST_F(TreeNodeRRsetTest, create) { // Constructed with RRSIG, and it should be visible. checkBasicFields(*createRRset(rrclass_, www_node_, a_rdataset_, true), - www_name_, rrclass_, RRType::A(), 3600, 2, 1); + a_rdataset_, www_name_, rrclass_, RRType::A(), 3600, 2, + 1); // Constructed with RRSIG, and it should be invisible. checkBasicFields(*createRRset(rrclass_, www_node_, a_rdataset_, false), - www_name_, rrclass_, RRType::A(), 3600, 2, 0); + a_rdataset_, www_name_, rrclass_, RRType::A(), 3600, 2, + 0); // Constructed without RRSIG, and it would be visible (but of course won't) checkBasicFields(*createRRset(rrclass_, origin_node_, ns_rdataset_, true), - origin_name_, rrclass_, RRType::NS(), 3600, 1, 0); + ns_rdataset_, origin_name_, rrclass_, RRType::NS(), 3600, + 1, 0); // Constructed without RRSIG, and it should be visible checkBasicFields(*createRRset(rrclass_, origin_node_, ns_rdataset_, false), - origin_name_, rrclass_, RRType::NS(), 3600, 1, 0); + ns_rdataset_, origin_name_, rrclass_, RRType::NS(), 3600, + 1, 0); // RRSIG-only case (note the RRset's type is covered type) checkBasicFields(*createRRset(rrclass_, www_node_, rrsig_only_rdataset_, true), - www_name_, rrclass_, RRType::TXT(), 3600, 0, 1); + rrsig_only_rdataset_, www_name_, rrclass_, RRType::TXT(), + 3600, 0, 1); // RRSIG-only case (note the RRset's type is covered type), but it's // invisible checkBasicFields(*createRRset(rrclass_, www_node_, rrsig_only_rdataset_, false), - www_name_, rrclass_, RRType::TXT(), 3600, 0, 0); + rrsig_only_rdataset_, www_name_, rrclass_, RRType::TXT(), + 3600, 0, 0); // Wildcard substitution checkBasicFields(*createRRset(match_name_, rrclass_, wildcard_node_, wildcard_rdataset_, true), - match_name_, rrclass_, RRType::A(), 3600, 2, 1); + wildcard_rdataset_, match_name_, rrclass_, RRType::A(), + 3600, 2, 1); } // The following two templated functions are helper to encapsulate the diff --git a/src/lib/datasrc/memory/treenode_rrset.cc b/src/lib/datasrc/memory/treenode_rrset.cc index b3f842d26a..f51b2f95ac 100644 --- a/src/lib/datasrc/memory/treenode_rrset.cc +++ b/src/lib/datasrc/memory/treenode_rrset.cc @@ -278,6 +278,13 @@ TreeNodeRRset::getSigRdataIterator() const { RRsetPtr TreeNodeRRset::getRRsig() const { + // Shortcut: if DNSSEC is disabled for the RRset, simply return NULL. + // The generic code below provides the same behavior, but with much more + // overhead. + if (!dnssec_ok_) { + return (RRsetPtr()); + } + RRsetPtr tmp_rrset; for (RdataIteratorPtr rit = getSigRdataIterator(); !rit->isLast(); diff --git a/src/lib/datasrc/memory/treenode_rrset.h b/src/lib/datasrc/memory/treenode_rrset.h index a5f48bfb1a..460a70451d 100644 --- a/src/lib/datasrc/memory/treenode_rrset.h +++ b/src/lib/datasrc/memory/treenode_rrset.h @@ -190,8 +190,6 @@ public: virtual dns::RdataIteratorPtr getRdataIterator() const; /// \brief Specialized version of \c getRRsig() for \c TreeNodeRRset. - /// - /// It throws \c isc::Unexpected unconditionally. virtual dns::RRsetPtr getRRsig() const; virtual unsigned int getRRsigDataCount() const {