BIND 10 trac2096, updated. 256771158ce922d32b0341cfb9109c83b4bbc45a [2096] Test decoding

BIND 10 source code commits bind10-changes at lists.isc.org
Wed Aug 8 18:41:57 UTC 2012


The branch, trac2096 has been updated
       via  256771158ce922d32b0341cfb9109c83b4bbc45a (commit)
      from  fdb51ca68f97d1aedf06b91a48b8c96733e20bb0 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 256771158ce922d32b0341cfb9109c83b4bbc45a
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Wed Aug 8 20:37:04 2012 +0200

    [2096] Test decoding
    
    Provide three more decoders of the data, using the RdataReader. This
    does not link, as the reader has no bodies of the methods.

-----------------------------------------------------------------------

Summary of changes:
 src/lib/datasrc/memory/rdata_reader.h              |    6 +-
 .../memory/tests/rdata_serialization_unittest.cc   |  113 +++++++++++++++++---
 2 files changed, 104 insertions(+), 15 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/rdata_reader.h b/src/lib/datasrc/memory/rdata_reader.h
index 2f4609f..f665f3c 100644
--- a/src/lib/datasrc/memory/rdata_reader.h
+++ b/src/lib/datasrc/memory/rdata_reader.h
@@ -138,7 +138,11 @@ public:
         /// \brief The domain label.
         ///
         /// This holds the domain label. It is only valid if type() == NAME.
-        const dns::LabelSequence& sequence;
+        const dns::LabelSequence& label() const;
+        /// \brief Is the name in label() compressible?
+        ///
+        /// This is valid only if type() == NAME.
+        bool compressible() const;
         /// \brief If there are data returned.
         ///
         /// This returns if there are any data at all returned. This is
diff --git a/src/lib/datasrc/memory/tests/rdata_serialization_unittest.cc b/src/lib/datasrc/memory/tests/rdata_serialization_unittest.cc
index 62737f2..41ccb07 100644
--- a/src/lib/datasrc/memory/tests/rdata_serialization_unittest.cc
+++ b/src/lib/datasrc/memory/tests/rdata_serialization_unittest.cc
@@ -30,6 +30,7 @@
 
 #include <datasrc/memory/rdata_encoder.h>
 #include <datasrc/memory/rdata_field.h>
+#include <datasrc/memory/rdata_reader.h>
 
 #include <util/unittests/wiredata.h>
 
@@ -102,7 +103,7 @@ const TestRdata test_rdata_list[] = {
 // from encoded representation of each RDATA.
 void
 renderNameField(MessageRenderer* renderer, bool additional_required,
-                const LabelSequence& labels, RdataNameAttributes attributes)
+                const LabelSequence& labels, unsigned attributes)
 {
     EXPECT_EQ(additional_required,
               (attributes & NAMEATTR_ADDITIONAL) != 0);
@@ -169,6 +170,21 @@ public:
 // constant.
 const Name dummy_name2("example.com");
 
+bool
+additionalRequired(const RRType& type) {
+    // The set of RR types that require additional section processing.
+    // We'll pass it to renderNameField to check the stored attribute matches
+    // our expectation.
+    static std::set<RRType> need_additionals;
+    if (need_additionals.empty()) {
+        need_additionals.insert(RRType::NS());
+        need_additionals.insert(RRType::MX());
+        need_additionals.insert(RRType::SRV());
+    }
+
+    return (need_additionals.find(type) != need_additionals.end());
+}
+
 // A decoder that does not use RdataReader. Not recommended for use,
 // but it allows the tests to check the internals of the data.
 class ManualDecoderStyle {
@@ -282,22 +298,11 @@ public:
                                 encoded_data.end());
         }
 
-        // The set of RR types that require additional section processing.
-        // We'll pass it to renderNameField to check the stored attribute matches
-        // our expectation.
-        std::set<RRType> need_additionals;
-        need_additionals.insert(RRType::NS());
-        need_additionals.insert(RRType::MX());
-        need_additionals.insert(RRType::SRV());
-
-        const bool additional_required =
-            (need_additionals.find(rrtype) != need_additionals.end());
-
         // Create wire-format data from the encoded data
         foreachRdataField(rrclass, rrtype, rdata_count, encoded_data,
                           varlen_list,
                           boost::bind(renderNameField, &renderer,
-                                      additional_required, _1, _2),
+                                      additionalRequired(rrtype), _1, _2),
                           boost::bind(renderDataField, &renderer, _1, _2));
 
     // 2nd dummy name
@@ -308,7 +313,87 @@ public:
     }
 };
 
-typedef ::testing::Types<ManualDecoderStyle> DecoderStyles;
+// Decode using reader with the return value of next
+class NextDecoder {
+public:
+    static void decode(const isc::dns::RRClass& rrclass,
+                       const isc::dns::RRType& rrtype,
+                       size_t, size_t, size_t,
+                       const vector<uint8_t>& encoded_data,
+                       MessageRenderer& renderer)
+    {
+        RDataReader reader(rrclass, rrtype, encoded_data.size(),
+                           &encoded_data[0]);
+        RDataReader::Result field;
+        while (field = reader.next()) {
+            switch (field.type()) {
+                case RDataReader::DATA:
+                    renderer.writeData(field.data(), field.size());
+                    break;
+                case RDataReader::NAME:
+                    renderer.writeName(field.label(), field.compressible());
+                    break;
+                default:
+                    FAIL();
+            }
+        }
+
+        renderer.writeName(dummy_name2);
+
+        while (field = reader.nextSig()) {
+            switch (field.type()) {
+                case RDataReader::DATA:
+                    renderer.writeData(field.data(), field.size());
+                    break;
+                default: // There are also no NAME fields in RRSigs
+                    FAIL();
+            }
+        }
+    }
+};
+
+// Check using callbacks and calling next until the end.
+class CallbackDecoder {
+public:
+    static void decode(const isc::dns::RRClass& rrclass,
+                       const isc::dns::RRType& rrtype,
+                       size_t, size_t, size_t,
+                       const vector<uint8_t>& encoded_data,
+                       MessageRenderer& renderer)
+    {
+        RDataReader reader(rrclass, rrtype, encoded_data.size(),
+                           &encoded_data[0],
+                           boost::bind(renderNameField, &renderer,
+                                       additionalRequired(rrtype), _1, _2),
+                           boost::bind(renderDataField, &renderer, _1, _2));
+        while (reader.next()) { }
+        renderer.writeName(dummy_name2);
+        while (reader.nextSig()) { }
+    }
+};
+
+// Check using callbacks and calling iterate.
+class IterateDecoder {
+public:
+    static void decode(const isc::dns::RRClass& rrclass,
+                       const isc::dns::RRType& rrtype,
+                       size_t, size_t, size_t,
+                       const vector<uint8_t>& encoded_data,
+                       MessageRenderer& renderer)
+    {
+        RDataReader reader(rrclass, rrtype, encoded_data.size(),
+                           &encoded_data[0],
+                           boost::bind(renderNameField, &renderer,
+                                       additionalRequired(rrtype), _1, _2),
+                           boost::bind(renderDataField, &renderer, _1, _2));
+        reader.iterate();
+        renderer.writeName(dummy_name2);
+        reader.iterateSig();
+    }
+};
+
+typedef ::testing::Types<ManualDecoderStyle, NextDecoder, CallbackDecoder,
+                         IterateDecoder> DecoderStyles;
 TYPED_TEST_CASE(RdataEncodeDecodeTest, DecoderStyles);
 
 void



More information about the bind10-changes mailing list