From: Jelte Jansen Date: Fri, 31 Aug 2012 15:22:59 +0000 (+0200) Subject: [2160] Automatically clean message after processMessage() X-Git-Tag: trac2351_base~85^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f328475860c3e2d69ec002a58fdc49e95e54619d;p=thirdparty%2Fkea.git [2160] Automatically clean message after processMessage() --- diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc index 6e5666f43f..b2383ca599 100644 --- a/src/bin/auth/auth_srv.cc +++ b/src/bin/auth/auth_srv.cc @@ -114,6 +114,18 @@ private: MessageRenderer& renderer_; }; +// Similar to Renderer holder, this is a very basic RAII-style class +// that calls clear(Message::PARSE) on the given Message upon destruction +class MessageHolder { +public: + MessageHolder(Message& message) : message_(message) {} + ~MessageHolder() { + message_.clear(Message::PARSE); + } +private: + Message& message_; +}; + // A helper container of socket session forwarder. // // This class provides a simple wrapper interface to SocketSessionForwarder @@ -344,6 +356,11 @@ public: OutputBufferPtr buffer, DNSServer* server) const { + // Keep a holder on the message, so that it is automatically + // cleared if processMessage() is done + // This is not done in processMessage itself (which would be + // equivalent), to allow tests to inspect the message handling. + MessageHolder message_holder(*message); server_->processMessage(io_message, *message, *buffer, server); } private: diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc index ca4247372b..e86cca4cb9 100644 --- a/src/bin/auth/tests/auth_srv_unittest.cc +++ b/src/bin/auth/tests/auth_srv_unittest.cc @@ -104,10 +104,6 @@ protected: } ~AuthSrvTest() { - // Clear the message now; depending on the RTTI implementation, - // type information may be lost if the message is cleared - // automatically later, so as a precaution we do it now. - parse_message->clear(Message::PARSE); server.destroyDDNSForwarder(); } @@ -833,6 +829,9 @@ TEST_F(AuthSrvTest, builtInQueryViaDNSServer) { response_obuffer->getData(), response_obuffer->getLength(), &response_data[0], response_data.size()); + + // After it has been run, the message should be cleared + EXPECT_EQ(0, parse_message->getRRCount(Message::SECTION_QUESTION)); } // In the following tests we confirm the response data is rendered in