Parcourir la source

[2098] added truncation case with 2 RRSIGs

JINMEI Tatuya il y a 12 ans
Parent
commit
b08ec1b998
1 fichiers modifiés avec 43 ajouts et 17 suppressions
  1. 43 17
      src/lib/datasrc/memory/tests/treenode_rrset_unittest.cc

+ 43 - 17
src/lib/datasrc/memory/tests/treenode_rrset_unittest.cc

@@ -47,10 +47,18 @@ protected:
         ns_rrset_(textToRRset("example.com. 3600 IN NS ns.example.com.")),
         a_rrset_(textToRRset("www.example.com. 3600 IN A 192.0.2.1\n"
                              "www.example.com. 3600 IN A 192.0.2.2")),
+        aaaa_rrset_(textToRRset("www.example.com. 3600 IN AAAA "
+                                "2001:db8::1\n")),
         dname_rrset_(textToRRset("example.com. 3600 IN DNAME d.example.org.")),
-        rrsig_rrset_(textToRRset("www.example.com. 3600 IN RRSIG "
-                                 "A 5 2 3600 20120814220826 20120715220826 "
-                                 "1234 example.com. FAKE")),
+        a_rrsig_rrset_(textToRRset("www.example.com. 3600 IN RRSIG "
+                                   "A 5 2 3600 20120814220826 20120715220826 "
+                                   "1234 example.com. FAKE")),
+        aaaa_rrsig_rrset_(textToRRset("www.example.com. 3600 IN RRSIG AAAA 5 2"
+                                      " 3600 20120814220826 20120715220826 "
+                                      "1234 example.com. FAKE\n"
+                                      "www.example.com. 3600 IN RRSIG AAAA 5 2"
+                                      " 3600 20120814220826 20120715220826 "
+                                      "4321 example.com. FAKE\n")),
         zone_data_(NULL)
     {}
     void SetUp() {
@@ -69,8 +77,12 @@ protected:
 
         zone_data_->insertName(mem_sgmt_, www_name_, &www_node_);
         a_rdataset_ = RdataSet::create(mem_sgmt_, encoder_, a_rrset_,
-                                       rrsig_rrset_);
+                                       a_rrsig_rrset_);
         www_node_->setData(a_rdataset_);
+
+        aaaa_rdataset_ = RdataSet::create(mem_sgmt_, encoder_, aaaa_rrset_,
+                                          aaaa_rrsig_rrset_);
+        a_rdataset_->next = aaaa_rdataset_;
     }
     void TearDown() {
         ZoneData::destroy(mem_sgmt_, zone_data_, rrclass_);
@@ -83,13 +95,15 @@ protected:
     isc::util::MemorySegmentLocal mem_sgmt_;
     RdataEncoder encoder_;
     MessageRenderer renderer_, renderer_expected_;
-    ConstRRsetPtr ns_rrset_, a_rrset_, dname_rrset_, rrsig_rrset_;
+    ConstRRsetPtr ns_rrset_, a_rrset_, aaaa_rrset_, dname_rrset_,
+        a_rrsig_rrset_, aaaa_rrsig_rrset_;
     ZoneData* zone_data_;
     ZoneNode* origin_node_;
     ZoneNode* www_node_;
     RdataSet* ns_rdataset_;
     RdataSet* dname_rdataset_;
     RdataSet* a_rdataset_;
+    RdataSet* aaaa_rdataset_;
 };
 
 TEST_F(TreeNodeRRsetTest, create) {
@@ -149,16 +163,14 @@ TEST_F(TreeNodeRRsetTest, toWire) {
         SCOPED_TRACE("with RRSIG, DNSSEC OK");
         const TreeNodeRRset rrset1(rrclass_, www_node_, a_rdataset_, true);
         checkToWireResult(expected_renderer, actual_renderer, rrset1,
-                          www_name_, a_rrset_, rrsig_rrset_, true);
-        EXPECT_FALSE(actual_renderer.isTruncated());
+                          www_name_, a_rrset_, a_rrsig_rrset_, true);
     }
 
     {
         SCOPED_TRACE("with RRSIG, DNSSEC not OK");
         const TreeNodeRRset rrset2(rrclass_, www_node_, a_rdataset_, false);
         checkToWireResult(expected_renderer, actual_renderer, rrset2,
-                          www_name_, a_rrset_, rrsig_rrset_, false);
-        EXPECT_FALSE(actual_renderer.isTruncated());
+                          www_name_, a_rrset_, a_rrsig_rrset_, false);
     }
 
     {
@@ -166,7 +178,6 @@ TEST_F(TreeNodeRRsetTest, toWire) {
         const TreeNodeRRset rrset3(rrclass_, origin_node_, ns_rdataset_, true);
         checkToWireResult(expected_renderer, actual_renderer, rrset3,
                           origin_name_, ns_rrset_, ConstRRsetPtr(), true);
-        EXPECT_FALSE(actual_renderer.isTruncated());
     }
 
     {
@@ -175,7 +186,6 @@ TEST_F(TreeNodeRRsetTest, toWire) {
                                    false);
         checkToWireResult(expected_renderer, actual_renderer, rrset4,
                           origin_name_, ns_rrset_, ConstRRsetPtr(), false);
-        EXPECT_FALSE(actual_renderer.isTruncated());
     }
 
     {
@@ -187,7 +197,6 @@ TEST_F(TreeNodeRRsetTest, toWire) {
         checkToWireResult(expected_renderer, actual_renderer, rrset5,
                           Name("example.org"), dname_rrset_, ConstRRsetPtr(),
                           false);
-        EXPECT_FALSE(actual_renderer.isTruncated());
     }
 }
 
@@ -224,17 +233,34 @@ TEST_F(TreeNodeRRsetTest, toWireTruncated) {
     checkTruncationResult(expected_renderer, actual_renderer,
                           TreeNodeRRset(rrclass_, www_node_, a_rdataset_,
                                         true),
-                          a_rrset_, rrsig_rrset_, true,
+                          a_rrset_, a_rrsig_rrset_, true,
                           www_name_.getLength() + 14,
-                          1);
+                          1);   // 1 main RR, no RRSIG
 
-    // The first normal RRs should fit in the renderer (the name will be
+    // The first main RRs should fit in the renderer (the name will be
     // fully compressed, so its size is 2 bytes), but the RRSIG doesn't.
     checkTruncationResult(expected_renderer, actual_renderer,
                           TreeNodeRRset(rrclass_, www_node_, a_rdataset_,
                                         true),
-                          a_rrset_, rrsig_rrset_, true,
-                          www_name_.getLength() + 14 + 2 + 14, 2);
+                          a_rrset_, a_rrsig_rrset_, true,
+                          www_name_.getLength() + 14 + 2 + 14,
+                          2);   // 2 main RR, no RRSIG
+
+    // This RRset has one main RR and two RRSIGs.  Rendering the second RRSIG
+    // causes truncation.
+    // First, compute the rendered length for the main RR and a single RRSIG.
+    // The length of the RRSIG should be the same if we "accidentally"
+    // rendered the RRSIG for the A RR (which only contains one RRSIG).
+    expected_renderer.clear();
+    aaaa_rrset_->toWire(expected_renderer);
+    a_rrsig_rrset_->toWire(expected_renderer);
+    const size_t limit_len = expected_renderer.getLength();
+    // Then perform the test
+    checkTruncationResult(expected_renderer, actual_renderer,
+                          TreeNodeRRset(rrclass_, www_node_, aaaa_rdataset_,
+                                        true),
+                          aaaa_rrset_, aaaa_rrsig_rrset_, true, limit_len,
+                          2);   // 1 main RR, 1 RRSIG
 }
 
 void