Browse Source

[2223] add full rrsets comparison in test

this implementation goes even further than the original one did; it converts both iterators (of rrsets) to string vectors, and sorts and compares the result, so it really does compare everything that is contained in all rrsets (as long as it is in toText() output).

It can compare vectors where the signatures are put in as separate rrsets and vectors where the signatures are contained in the rrset (by splitting them out when constructing the string vector), and as such is backwards comaptible with the existing tests that use rrsetsCheck.
Jelte Jansen 12 years ago
parent
commit
e4f9ff3f23
1 changed files with 53 additions and 12 deletions
  1. 53 12
      src/lib/testutils/dnsmessage_test.h

+ 53 - 12
src/lib/testutils/dnsmessage_test.h

@@ -178,6 +178,40 @@ private:
 };
 }
 
+namespace {
+/// \brief Add the string representation of RRsets to a vector
+///
+/// This is a helper function for checkRRsets, to compare the
+/// contents of two sets of RRsets
+///
+/// It adds the string representations of the RRsets in the given
+/// iterator to the given vector.
+///
+/// If an RRset has signatures, those are added to the
+/// vector as a separate string
+template<typename ITERATOR_TYPE>
+void
+addRRsetsToStringVector(std::vector<std::string>& strings,
+                        ITERATOR_TYPE begin,
+                        ITERATOR_TYPE end)
+{
+    for (ITERATOR_TYPE it = begin; it != end; ++it) {
+        if ((*it)->getRRsig()) {
+            // no 'sigless' toText(), but since we need to get both,
+            // it's easier to remove the sigs after toText than to
+            // reimplement toText here
+            std::string rrset_string = (*it)->toText();
+            std::string rrsig_string = (*it)->getRRsig()->toText();
+            strings.push_back(
+                rrset_string.substr(0, rrset_string.find(rrsig_string)));
+            strings.push_back(rrsig_string);
+        } else {
+            strings.push_back((*it)->toText());
+        }
+    }
+}
+}
+
 /// \brief A converter from a string to RRset.
 ///
 /// This is a convenient shortcut for tests that need to create an RRset
@@ -271,19 +305,26 @@ rrsetsCheck(EXPECTED_ITERATOR expected_begin, EXPECTED_ITERATOR expected_end,
         // make sure all expected RRsets are in actual sets
         EXPECT_EQ(std::distance(expected_begin, expected_end), rrset_matched);
 
-#if (0)
-        // TODO: see bug #2223. The following code was
-        // disabled by #2165. The RRSIG RRsets are no longer directly
-        // stored in the Message's rrsets, so the iterator will not find
-        // them. The expected text used in many tests are flattened,
-        // where the RRSIGs are inline. In other words, RRSIGs may occur
-        // between (expected_begin, expected_end) but not between
-        // (actual_begin, actual_end).
-
         // make sure rrsets only contains expected RRsets
-        EXPECT_EQ(std::distance(expected_begin, expected_end),
-                  std::distance(actual_begin, actual_end));
-#endif
+        //
+        // In order to compare two lists of RRsets, we first convert
+        // them to vectors of strings, sort those vectors, and compare
+        // the result.
+        //
+        // Since some of the RRsets may have their signatures in-line,
+        // and some vectors has them as separate RRsets, we perform one
+        // additional step; If an RRset has signatures, those signatures
+        // are stripped from the original toText() result, and added
+        // as a separate RRset in the string vector.
+        std::vector<std::string> expected_strings;
+        addRRsetsToStringVector(expected_strings, expected_begin, expected_end);
+        std::sort(expected_strings.begin(), expected_strings.end());
+
+        std::vector<std::string> actual_strings;
+        addRRsetsToStringVector(actual_strings, actual_begin, actual_end);
+        std::sort(actual_strings.begin(), actual_strings.end());
+
+        EXPECT_EQ(expected_strings, actual_strings);
     }
 }