|
@@ -13,6 +13,8 @@
|
|
|
// PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
#include <config.h>
|
|
|
+#include <dhcp/option4_client_fqdn.h>
|
|
|
+#include <dhcp/option6_client_fqdn.h>
|
|
|
#include <dhcpsrv/d2_client.h>
|
|
|
#include <exceptions/exceptions.h>
|
|
|
|
|
@@ -290,5 +292,526 @@ TEST(D2ClientMgr, validConfig) {
|
|
|
EXPECT_NE(*original_config, *updated_config);
|
|
|
}
|
|
|
|
|
|
+/// @brief Tests that analyzeFqdn generates correct server S and N flags when
|
|
|
+/// updates are disabled.
|
|
|
+TEST(D2ClientMgr, analyzeFqdnUpdatesDisabled) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ bool server_s = false;
|
|
|
+ bool server_n = false;
|
|
|
+
|
|
|
+ // Create disabled configuration.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig()));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_FALSE(mgr.ddnsEnabled());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideClientUpdate());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideNoUpdate());
|
|
|
+
|
|
|
+ // client S=0 N=0 means client wants to do forward update.
|
|
|
+ // server S should be 0 (server is not doing forward updates)
|
|
|
+ // and server N should be 1 (server doing no updates)
|
|
|
+ mgr.analyzeFqdn(false, false, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+
|
|
|
+ // client S=1 N=0 means client wants server to do forward update.
|
|
|
+ // server S should be 0 (server is not doing forward updates)
|
|
|
+ // and server N should be 1 (server doing no updates)
|
|
|
+ mgr.analyzeFqdn(true, false, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+
|
|
|
+ // client S=0 N=1 means client wants no one to do forward updates.
|
|
|
+ // server S should be 0 (server is not forward updates)
|
|
|
+ // and server N should be 1 (server is not doing any updates)
|
|
|
+ mgr.analyzeFqdn(false, true, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Tests that analyzeFqdn generates correct server S and N flags when
|
|
|
+/// updates are enabled and all overrides are off.
|
|
|
+TEST(D2ClientMgr, analyzeFqdnEnabledNoOverrides) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ bool server_s = false;
|
|
|
+ bool server_n = false;
|
|
|
+
|
|
|
+ // Create enabled configuration with all controls off (no overrides).
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, false, false,
|
|
|
+ "pre-fix", "suf-fix")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(mgr.ddnsEnabled());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideClientUpdate());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideNoUpdate());
|
|
|
+
|
|
|
+ // client S=0 N=0 means client wants to do forward update.
|
|
|
+ // server S should be 0 (server is not doing forward updates)
|
|
|
+ // and server N should be 1 (server doing no updates)
|
|
|
+ mgr.analyzeFqdn(false, false, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+
|
|
|
+ // client S=1 N=0 means client wants server to do forward update.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ mgr.analyzeFqdn(true, false, server_s, server_n);
|
|
|
+ EXPECT_TRUE(server_s);
|
|
|
+ EXPECT_FALSE(server_n);
|
|
|
+
|
|
|
+
|
|
|
+ // client S=0 N=1 means client wants no one to do forward updates.
|
|
|
+ // server S should be 0 (server is not forward updates)
|
|
|
+ // and server N should be 1 (server is not doing any updates)
|
|
|
+ mgr.analyzeFqdn(false, true, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Tests that analyzeFqdn generates correct server S and N flags when
|
|
|
+/// updates are enabled and override-no-update is on.
|
|
|
+TEST(D2ClientMgr, analyzeFqdnEnabledOverrideNoUpdate) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ bool server_s = false;
|
|
|
+ bool server_n = false;
|
|
|
+
|
|
|
+ // Create enabled configuration with OVERRIDE_NO_UPDATE on.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, true, false, false,
|
|
|
+ "pre-fix", "suf-fix")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(mgr.ddnsEnabled());
|
|
|
+ ASSERT_TRUE(cfg->getOverrideNoUpdate());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideClientUpdate());
|
|
|
+
|
|
|
+ // client S=0 N=0 means client wants to do forward update.
|
|
|
+ // server S should be 0 (server is not doing forward updates)
|
|
|
+ // and server N should be 1 (server is not doing any updates)
|
|
|
+ mgr.analyzeFqdn(false, false, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+
|
|
|
+ // client S=1 N=0 means client wants server to do forward update.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ mgr.analyzeFqdn(true, false, server_s, server_n);
|
|
|
+ EXPECT_TRUE(server_s);
|
|
|
+ EXPECT_FALSE(server_n);
|
|
|
+
|
|
|
+ // client S=0 N=1 means client wants no one to do forward updates.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server is doing updates)
|
|
|
+ mgr.analyzeFqdn(false, true, server_s, server_n);
|
|
|
+ EXPECT_TRUE(server_s);
|
|
|
+ EXPECT_FALSE(server_n);
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Tests that analyzeFqdn generates correct server S and N flags when
|
|
|
+/// updates are enabled and override-client-update is on.
|
|
|
+TEST(D2ClientMgr, analyzeFqdnEnabledOverrideClientUpdate) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ bool server_s = false;
|
|
|
+ bool server_n = false;
|
|
|
+
|
|
|
+ // Create enabled configuration with OVERRIDE_CLIENT_UPDATE on.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, true, false,
|
|
|
+ "pre-fix", "suf-fix")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(mgr.ddnsEnabled());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideNoUpdate());
|
|
|
+ ASSERT_TRUE(cfg->getOverrideClientUpdate());
|
|
|
+
|
|
|
+ // client S=0 N=0 means client wants to do forward update.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ mgr.analyzeFqdn(false, false, server_s, server_n);
|
|
|
+ EXPECT_TRUE(server_s);
|
|
|
+ EXPECT_FALSE(server_n);
|
|
|
+
|
|
|
+ // client S=1 N=0 means client wants server to do forward update.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ mgr.analyzeFqdn(true, false, server_s, server_n);
|
|
|
+ EXPECT_TRUE(server_s);
|
|
|
+ EXPECT_FALSE(server_n);
|
|
|
+
|
|
|
+ // client S=0 N=1 means client wants no one to do forward updates.
|
|
|
+ // server S should be 0 (server is not forward updates)
|
|
|
+ // and server N should be 1 (server is not doing any updates)
|
|
|
+ mgr.analyzeFqdn(false, true, server_s, server_n);
|
|
|
+ EXPECT_FALSE(server_s);
|
|
|
+ EXPECT_TRUE(server_n);
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Verifies the adustFqdnFlags template with Option4ClientFqdn objects.
|
|
|
+/// Ensures that the method can set the N, S, and O flags properly.
|
|
|
+/// Other permutations are covered by analyzeFqdnFlag tests.
|
|
|
+TEST(D2ClientMgr, adjustFqdnFlagsV4) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ Option4ClientFqdnPtr request;
|
|
|
+ Option4ClientFqdnPtr response;
|
|
|
+
|
|
|
+ // Create enabled configuration and override-no-update on.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, true, false, false,
|
|
|
+ "pre-fix", "suf-fix")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(mgr.ddnsEnabled());
|
|
|
+ ASSERT_TRUE(cfg->getOverrideNoUpdate());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideClientUpdate());
|
|
|
+
|
|
|
+ // client S=0 N=0 means client wants to do forward update.
|
|
|
+ // server S should be 0 (server is not doing forward updates)
|
|
|
+ // and server N should be 1 (server doing no updates)
|
|
|
+ // and server O should be 0
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+ response->resetFlags();
|
|
|
+
|
|
|
+ mgr.adjustFqdnFlags<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_FALSE(response->getFlag(Option4ClientFqdn::FLAG_S));
|
|
|
+ EXPECT_TRUE(response->getFlag(Option4ClientFqdn::FLAG_N));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option4ClientFqdn::FLAG_O));
|
|
|
+
|
|
|
+ // client S=1 N=0 means client wants server to do forward update.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ // and server O should be 0
|
|
|
+ request.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_S,
|
|
|
+ Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+ response->resetFlags();
|
|
|
+
|
|
|
+ mgr.adjustFqdnFlags<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_TRUE(response->getFlag(Option4ClientFqdn::FLAG_S));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option4ClientFqdn::FLAG_N));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option4ClientFqdn::FLAG_O));
|
|
|
+
|
|
|
+ // client S=0 N=1 means client wants no one to do updates
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ // and O should be 1 (overriding client S)
|
|
|
+ request.reset(new Option4ClientFqdn(Option4ClientFqdn::FLAG_N,
|
|
|
+ Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+ response->resetFlags();
|
|
|
+
|
|
|
+ mgr.adjustFqdnFlags<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_TRUE(response->getFlag(Option4ClientFqdn::FLAG_S));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option4ClientFqdn::FLAG_N));
|
|
|
+ EXPECT_TRUE(response->getFlag(Option4ClientFqdn::FLAG_O));
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Tests the qualifyName method's ability to construct FQDNs
|
|
|
+TEST(D2ClientMgr, qualifyName) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+
|
|
|
+ // Create enabled configuration.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, true, false,
|
|
|
+ "prefix", "suffix.com")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+
|
|
|
+ // Verify that the qualifying suffix gets appended with trailing dot added.
|
|
|
+ std::string partial_name = "somehost";
|
|
|
+ std::string qualified_name = mgr.qualifyName(partial_name);
|
|
|
+ EXPECT_EQ("somehost.suffix.com.", qualified_name);
|
|
|
+
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, true, false,
|
|
|
+ "prefix", "hasdot.com.")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+
|
|
|
+ // Verify that the qualifying suffix gets appended without dot added.
|
|
|
+ qualified_name = mgr.qualifyName(partial_name);
|
|
|
+ EXPECT_EQ("somehost.hasdot.com.", qualified_name);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/// @brief Tests the generateFdqn method's ability to construct FQDNs
|
|
|
+TEST(D2ClientMgr, generateFqdn) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+
|
|
|
+ // Create enabled configuration.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, true, false,
|
|
|
+ "prefix", "suffix.com")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+
|
|
|
+ // Verify that it works with an IPv4 address.
|
|
|
+ asiolink::IOAddress v4address("192.0.2.75");
|
|
|
+ EXPECT_EQ("prefix-192-0-2-75.suffix.com.", mgr.generateFqdn(v4address));
|
|
|
+
|
|
|
+ // Verify that it works with an IPv6 address.
|
|
|
+ asiolink::IOAddress v6address("2001:db8::2");
|
|
|
+ EXPECT_EQ("prefix-2001-db8--2.suffix.com.", mgr.generateFqdn(v6address));
|
|
|
+
|
|
|
+ // Create a disabled config.
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig()));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+
|
|
|
+ // Verify names generate properly with a disabled configuration.
|
|
|
+ EXPECT_EQ("myhost-192-0-2-75.example.com.", mgr.generateFqdn(v4address));
|
|
|
+ EXPECT_EQ("myhost-2001-db8--2.example.com.", mgr.generateFqdn(v6address));
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Tests adjustDomainName template method with Option4ClientFqdn
|
|
|
+TEST(D2ClientMgr, adjustDomainNameV4) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ Option4ClientFqdnPtr request;
|
|
|
+ Option4ClientFqdnPtr response;
|
|
|
+
|
|
|
+ // Create enabled configuration.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, false, false,
|
|
|
+ "prefix", "suffix.com")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_FALSE(cfg->getReplaceClientName());
|
|
|
+
|
|
|
+ // replace-client-name is false, client passes in empty fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option4ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+
|
|
|
+
|
|
|
+ // replace-client-name is false, client passes in a partial fqdn
|
|
|
+ // response should contain client's name plus the qualifying suffix.
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "myhost", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("myhost.suffix.com.", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option4ClientFqdn::FULL, response->getDomainNameType());
|
|
|
+
|
|
|
+
|
|
|
+ // replace-client-name is false, client passes in a full fqdn
|
|
|
+ // response domain should not be altered.
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "myhost.example.com.",
|
|
|
+ Option4ClientFqdn::FULL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+ mgr.adjustDomainName<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("myhost.example.com.", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option4ClientFqdn::FULL, response->getDomainNameType());
|
|
|
+
|
|
|
+ // Create enabled configuration.
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, false, true,
|
|
|
+ "prefix", "suffix.com")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(cfg->getReplaceClientName());
|
|
|
+
|
|
|
+ // replace-client-name is true, client passes in empty fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option4ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+
|
|
|
+ // replace-client-name is true, client passes in a partial fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "myhost", Option4ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option4ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+
|
|
|
+
|
|
|
+ // replace-client-name is true, client passes in a full fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option4ClientFqdn(0, Option4ClientFqdn::RCODE_CLIENT(),
|
|
|
+ "myhost.example.com.",
|
|
|
+ Option4ClientFqdn::FULL));
|
|
|
+ response.reset(new Option4ClientFqdn(*request));
|
|
|
+ mgr.adjustDomainName<Option4ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option4ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Tests adjustDomainName template method with Option6ClientFqdn
|
|
|
+TEST(D2ClientMgr, adjustDomainNameV6) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ Option6ClientFqdnPtr request;
|
|
|
+ Option6ClientFqdnPtr response;
|
|
|
+
|
|
|
+ // Create enabled configuration.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, false, false,
|
|
|
+ "prefix", "suffix.com")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_FALSE(cfg->getReplaceClientName());
|
|
|
+
|
|
|
+ // replace-client-name is false, client passes in empty fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option6ClientFqdn(0, "", Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option6ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+
|
|
|
+ // replace-client-name is false, client passes in a partial fqdn
|
|
|
+ // response should contain client's name plus the qualifying suffix.
|
|
|
+ request.reset(new Option6ClientFqdn(0, "myhost",
|
|
|
+ Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("myhost.suffix.com.", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option6ClientFqdn::FULL, response->getDomainNameType());
|
|
|
+
|
|
|
+
|
|
|
+ // replace-client-name is false, client passes in a full fqdn
|
|
|
+ // response domain should not be altered.
|
|
|
+ request.reset(new Option6ClientFqdn(0, "myhost.example.com.",
|
|
|
+ Option6ClientFqdn::FULL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+ mgr.adjustDomainName<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("myhost.example.com.", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option6ClientFqdn::FULL, response->getDomainNameType());
|
|
|
+
|
|
|
+ // Create enabled configuration.
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, false, false, true,
|
|
|
+ "prefix", "suffix.com")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(cfg->getReplaceClientName());
|
|
|
+
|
|
|
+ // replace-client-name is true, client passes in empty fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option6ClientFqdn(0, "", Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option6ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+
|
|
|
+ // replace-client-name is true, client passes in a partial fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option6ClientFqdn(0, "myhost",
|
|
|
+ Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+
|
|
|
+ mgr.adjustDomainName<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option6ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+
|
|
|
+
|
|
|
+ // replace-client-name is true, client passes in a full fqdn
|
|
|
+ // reponse domain should be empty/partial.
|
|
|
+ request.reset(new Option6ClientFqdn(0, "myhost.example.com.",
|
|
|
+ Option6ClientFqdn::FULL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+ mgr.adjustDomainName<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_EQ("", response->getDomainName());
|
|
|
+ EXPECT_EQ(Option6ClientFqdn::PARTIAL, response->getDomainNameType());
|
|
|
+}
|
|
|
+
|
|
|
+/// @brief Verifies the adustFqdnFlags template with Option6ClientFqdn objects.
|
|
|
+/// Ensures that the method can set the N, S, and O flags properly.
|
|
|
+/// Other permutations are covered by analyzeFqdnFlags tests.
|
|
|
+TEST(D2ClientMgr, adjustFqdnFlagsV6) {
|
|
|
+ D2ClientMgr mgr;
|
|
|
+ Option6ClientFqdnPtr request;
|
|
|
+ Option6ClientFqdnPtr response;
|
|
|
+
|
|
|
+ // Create enabled configuration and override-no-update on.
|
|
|
+ D2ClientConfigPtr cfg;
|
|
|
+ ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true,
|
|
|
+ isc::asiolink::IOAddress("127.0.0.1"), 477,
|
|
|
+ dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON,
|
|
|
+ false, false, true, false, false,
|
|
|
+ "pre-fix", "suf-fix")));
|
|
|
+ ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg));
|
|
|
+ ASSERT_TRUE(mgr.ddnsEnabled());
|
|
|
+ ASSERT_TRUE(cfg->getOverrideNoUpdate());
|
|
|
+ ASSERT_FALSE(cfg->getOverrideClientUpdate());
|
|
|
+
|
|
|
+ // client S=0 N=0 means client wants to do forward update.
|
|
|
+ // server S should be 0 (server is not doing forward updates)
|
|
|
+ // and server N should be 1 (server doing no updates)
|
|
|
+ // and server O should be 0
|
|
|
+ request.reset(new Option6ClientFqdn(0, "", Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+ response->resetFlags();
|
|
|
+
|
|
|
+ mgr.adjustFqdnFlags<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_FALSE(response->getFlag(Option6ClientFqdn::FLAG_S));
|
|
|
+ EXPECT_TRUE(response->getFlag(Option6ClientFqdn::FLAG_N));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option6ClientFqdn::FLAG_O));
|
|
|
+
|
|
|
+ // client S=1 N=0 means client wants server to do forward update.
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ // and server O should be 0
|
|
|
+ request.reset(new Option6ClientFqdn(Option6ClientFqdn::FLAG_S,
|
|
|
+ "", Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+ response->resetFlags();
|
|
|
+
|
|
|
+ mgr.adjustFqdnFlags<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_TRUE(response->getFlag(Option6ClientFqdn::FLAG_S));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option6ClientFqdn::FLAG_N));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option6ClientFqdn::FLAG_O));
|
|
|
+
|
|
|
+ // client S=0 N=1 means client wants no one to do updates
|
|
|
+ // server S should be 1 (server is doing forward updates)
|
|
|
+ // and server N should be 0 (server doing updates)
|
|
|
+ // and O should be 1 (overriding client S)
|
|
|
+ request.reset(new Option6ClientFqdn(Option6ClientFqdn::FLAG_N,
|
|
|
+ "", Option6ClientFqdn::PARTIAL));
|
|
|
+ response.reset(new Option6ClientFqdn(*request));
|
|
|
+ response->resetFlags();
|
|
|
+
|
|
|
+ mgr.adjustFqdnFlags<Option6ClientFqdn>(*request, *response);
|
|
|
+ EXPECT_TRUE(response->getFlag(Option6ClientFqdn::FLAG_S));
|
|
|
+ EXPECT_FALSE(response->getFlag(Option6ClientFqdn::FLAG_N));
|
|
|
+ EXPECT_TRUE(response->getFlag(Option6ClientFqdn::FLAG_O));
|
|
|
+}
|
|
|
|
|
|
} // end of anonymous namespace
|