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 {
bool xfrout_connected_;
AbstractXfroutClient& xfrout_client_;
- BaseSocketSessionForwarder& ddns_forwarder_;
+ SocketSessionForwarderHolder ddns_forwarder_;
/// Increment query counter
void incCounter(const int protocol);
std::auto_ptr<TSIGContext> /*tsig_context*/)
{
// hardcode for initial test
- ddns_forwarder_.connectToReceiver();
+ ddns_forwarder_.connect();
+
return (false);
}
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());
+ }
}
}