From: JINMEI Tatuya Date: Fri, 18 May 2012 20:30:20 +0000 (-0700) Subject: [1539] make sure ddns forwarder establishes connection only once. X-Git-Tag: trac2351_base~226^2~85^2~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc6b92a8b79d43fb9dfa530cbbc94618dc39df79;p=thirdparty%2Fkea.git [1539] make sure ddns forwarder establishes connection only once. --- diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc index c22765db5b..a48f9da8dd 100644 --- a/src/bin/auth/auth_srv.cc +++ b/src/bin/auth/auth_srv.cc @@ -110,6 +110,27 @@ public: private: MessageRenderer& renderer_; }; + +/// TBD document it. +class SocketSessionForwarderHolder { +public: + SocketSessionForwarderHolder(BaseSocketSessionForwarder& forwarder) : + forwarder_(forwarder), connected_(false) + {} + ~SocketSessionForwarderHolder() {} + + void connect() { + if (!connected_) { + forwarder_.connectToReceiver(); + connected_ = true; + } + } + + BaseSocketSessionForwarder& forwarder_; + +private: + bool connected_; +}; } class AuthSrvImpl { @@ -196,7 +217,7 @@ private: bool xfrout_connected_; AbstractXfroutClient& xfrout_client_; - BaseSocketSessionForwarder& ddns_forwarder_; + SocketSessionForwarderHolder ddns_forwarder_; /// Increment query counter void incCounter(const int protocol); @@ -763,7 +784,8 @@ AuthSrvImpl::processUpdate(const IOMessage& /*io_message*/, std::auto_ptr /*tsig_context*/) { // hardcode for initial test - ddns_forwarder_.connectToReceiver(); + ddns_forwarder_.connect(); + return (false); } diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc index df0c2f014c..66c95ed777 100644 --- a/src/bin/auth/tests/auth_srv_unittest.cc +++ b/src/bin/auth/tests/auth_srv_unittest.cc @@ -1392,14 +1392,19 @@ TEST_F(AuthSrvTest, queryWithThrowingInToWire) { TEST_F(AuthSrvTest, DDNSForward) { EXPECT_FALSE(ddns_forwarder.isConnected()); - UnitTestUtil::createRequestMessage(request_message, Opcode::UPDATE(), - default_qid, Name("example.com"), - RRClass::IN(), RRType::SOA()); - createRequestPacket(request_message, IPPROTO_UDP); - server.processMessage(*io_message, *parse_message, *response_obuffer, - &dnsserv); - EXPECT_FALSE(dnsserv.hasAnswer()); - EXPECT_TRUE(ddns_forwarder.isConnected()); + // Repeat sending an update request two times. By doing that we'll + // confirm the forwarder connection will be established exactly once, + // and kept established. + for (size_t i = 0; i < 2; ++i) { + UnitTestUtil::createRequestMessage(request_message, Opcode::UPDATE(), + default_qid, Name("example.com"), + RRClass::IN(), RRType::SOA()); + createRequestPacket(request_message, IPPROTO_UDP); + server.processMessage(*io_message, *parse_message, *response_obuffer, + &dnsserv); + EXPECT_FALSE(dnsserv.hasAnswer()); + EXPECT_TRUE(ddns_forwarder.isConnected()); + } } } diff --git a/src/lib/testutils/mockups.h b/src/lib/testutils/mockups.h index e48da50804..4f4c27b2ea 100644 --- a/src/lib/testutils/mockups.h +++ b/src/lib/testutils/mockups.h @@ -218,6 +218,9 @@ public: isc_throw(isc::util::io::SocketSessionError, "socket session " "forwarding connection disabled for test"); } + if (is_connected_) { + isc_throw(isc::util::io::SocketSessionError, "duplicate connect"); + } is_connected_ = true; } virtual void close() {}