Parcourir la source

[2160] Automatically clean message after processMessage()

Jelte Jansen il y a 12 ans
Parent
commit
f328475860
2 fichiers modifiés avec 20 ajouts et 4 suppressions
  1. 17 0
      src/bin/auth/auth_srv.cc
  2. 3 4
      src/bin/auth/tests/auth_srv_unittest.cc

+ 17 - 0
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:

+ 3 - 4
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