Browse Source

[1600] Add a handle class for MessageRederer(),and add two tests for
it.

Xie Jiagui 13 years ago
parent
commit
ede52d8098
3 changed files with 120 additions and 13 deletions
  1. 12 13
      src/bin/auth/auth_srv.cc
  2. 24 0
      src/bin/auth/tests/auth_srv_unittest.cc
  3. 84 0
      src/lib/dns/messagerendererhandle.h

+ 12 - 13
src/bin/auth/auth_srv.cc

@@ -36,7 +36,7 @@
 
 #include <dns/edns.h>
 #include <dns/exceptions.h>
-#include <dns/messagerenderer.h>
+#include <dns/messagerendererhandle.h>
 #include <dns/name.h>
 #include <dns/question.h>
 #include <dns/opcode.h>
@@ -99,8 +99,7 @@ public:
 
     IOService io_service_;
 
-    MessageRenderer renderer_;
-    
+    MessageRendererHandle renderer_handle_;
     /// Currently non-configurable, but will be.
     static const uint16_t DEFAULT_LOCAL_UDPSIZE = 4096;
 
@@ -558,18 +557,18 @@ AuthSrvImpl::processNormalQuery(const IOMessage& io_message, MessagePtr message,
         return (true);
     }
 
-    renderer_.setBuffer(buffer.get());
+    renderer_handle_.setBuffer(buffer.get());
     const bool udp_buffer =
         (io_message.getSocket().getProtocol() == IPPROTO_UDP);
-    renderer_.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
+    renderer_handle_.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
     if (tsig_context.get() != NULL) {
-        message->toWire(renderer_, *tsig_context);
+        message->toWire(renderer_handle_.getRenderer(), *tsig_context);
     } else {
-        message->toWire(renderer_);
+        message->toWire(renderer_handle_.getRenderer());
     }
-    renderer_.setBuffer(NULL);
+    renderer_handle_.setBuffer(NULL);
     LOG_DEBUG(auth_logger, DBG_AUTH_MESSAGES, AUTH_SEND_NORMAL_RESPONSE)
-              .arg(renderer_.getLength()).arg(message->toText());
+              .arg(renderer_handle_.getLength()).arg(message->toText());
 
     return (true);
 }
@@ -688,13 +687,13 @@ AuthSrvImpl::processNotify(const IOMessage& io_message, MessagePtr message,
     message->setHeaderFlag(Message::HEADERFLAG_AA);
     message->setRcode(Rcode::NOERROR());
 
-    renderer_.setBuffer(buffer.get());
+    renderer_handle_.setBuffer(buffer.get());
     if (tsig_context.get() != NULL) {
-        message->toWire(renderer_, *tsig_context);
+        message->toWire(renderer_handle_.getRenderer(), *tsig_context);
     } else {
-        message->toWire(renderer_);
+        message->toWire(renderer_handle_.getRenderer());
     }
-    renderer_.setBuffer(NULL);
+    renderer_handle_.setBuffer(NULL);
     return (true);
 }
 

+ 24 - 0
src/bin/auth/tests/auth_srv_unittest.cc

@@ -120,6 +120,7 @@ protected:
             }
         }
     }
+
     IOService ios_;
     DNSService dnss_;
     MockSession statistics_session;
@@ -1038,4 +1039,27 @@ TEST_F(AuthSrvTest, listenAddresses) {
                                 "Released tokens");
 }
 
+TEST_F(AuthSrvTest, processNormalQuery_reuseRenderer1) {
+    UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+                                       default_qid, Name("example.com"),
+                                       RRClass::IN(), RRType::NS());
+    
+    request_message.setHeaderFlag(Message::HEADERFLAG_AA);
+    createRequestPacket(request_message, IPPROTO_UDP);
+    server.processMessage(*io_message, parse_message, response_obuffer, &dnsserv);
+    EXPECT_NE(request_message.getRcode(), parse_message->getRcode());
+}
+
+TEST_F(AuthSrvTest, processNormalQuery_reuseRenderer2) {
+    UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+                                       default_qid, Name("example.com"),
+                                       RRClass::IN(), RRType::SOA());
+    
+    request_message.setHeaderFlag(Message::HEADERFLAG_AA);
+    createRequestPacket(request_message, IPPROTO_UDP);
+    server.processMessage(*io_message, parse_message, response_obuffer, &dnsserv);
+    ConstQuestionPtr question = *parse_message->beginQuestion();
+    EXPECT_STRNE(question->getType().toText().c_str(),RRType::NS().toText().c_str());
+}
+
 }

+ 84 - 0
src/lib/dns/messagerendererhandle.h

@@ -0,0 +1,84 @@
+// Copyright (C) 2009  Internet Systems Consortium, Inc. ("ISC")
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+#ifndef __MESSAGERENDERERHANDLE_H
+#define __MESSAGERENDERERHANDLE_H 1
+
+#include <dns/messagerenderer.h>
+
+namespace isc {
+
+namespace dns {
+
+/// The \c MessageRendererHandle is a handle class for
+/// \c MessageRendere.
+///
+/// A \c MessageRendererHandle object is constructed with a \c MessageRenderer
+/// object.
+class MessageRendererHandle {
+    ///
+    /// \name Constructors, Assignment Operator and Destructor.
+    ///
+    /// Note: The copy constructor and the assignment operator are
+    /// intentionally defined as private.
+    //@{
+private:
+    MessageRendererHandle(const MessageRendererHandle& renderer);
+    MessageRendererHandle& operator=(const MessageRendererHandle& renderer);
+public:
+    /// The constructor.
+    ///
+    /// \param use_cache Whether to enable hot spot cache for lookup results.
+    /// \param xfrout_client Communication interface with a separate xfrout
+    /// process.  It's normally a reference to an xfr::XfroutClient object,
+    /// but can refer to a local mock object for te
+    explicit MessageRendererHandle():renderer_(NULL){
+        renderer_ = new MessageRenderer();
+    }
+    ~MessageRendererHandle() {
+        if(NULL != renderer_) {
+            delete renderer_;
+            renderer_ = NULL;
+        }
+    }
+    //@}
+public:
+    /// \brief Return the length of data written in the internal buffer.
+    size_t getLength() const {
+           return (renderer_->getLength());
+    }
+    /// \brief Set the buffer.
+    void setBuffer(isc::util::OutputBuffer* buffer) {
+        renderer_->setBuffer(buffer);
+    }
+    MessageRenderer& getRenderer() const {
+        return *renderer_;
+    }
+    /// \brief Set the maximum length of rendered data that can fit in the
+    /// corresponding DNS message without truncation.
+    ///
+    /// \param len The maximum length in bytes.
+    void setLengthLimit(size_t len) {
+        renderer_->setLengthLimit(len);
+    }
+private:
+    MessageRenderer * renderer_;
+};
+}
+}
+#endif // __MESSAGERENDERERHANDLE_H
+
+// Local Variables:
+// mode: c++
+// End: