From: Xie Jiagui Date: Mon, 12 Mar 2012 06:24:38 +0000 (+0800) Subject: [1600] Add a handle class for MessageRederer(),and add two tests for X-Git-Tag: trac2351_base~226^2~116^2~131 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ede52d8098375352ae87a124619ad78f01fa2e28;p=thirdparty%2Fkea.git [1600] Add a handle class for MessageRederer(),and add two tests for it. --- diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc index 73f559245c..747c124bfd 100644 --- a/src/bin/auth/auth_srv.cc +++ b/src/bin/auth/auth_srv.cc @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include #include @@ -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); } diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc index f00efd9a7e..3fc69bfd4a 100644 --- a/src/bin/auth/tests/auth_srv_unittest.cc +++ b/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()); +} + } diff --git a/src/lib/dns/messagerendererhandle.h b/src/lib/dns/messagerendererhandle.h new file mode 100644 index 0000000000..be813c4770 --- /dev/null +++ b/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 + +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: