From: Thomas Markwalder Date: Fri, 4 Oct 2019 19:56:52 +0000 (-0400) Subject: [#35,!517] Added v6 scope test X-Git-Tag: tmark-post-35-refactor~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5179e122a88e5b3ea9714056e283c5d9a1a716a;p=thirdparty%2Fkea.git [#35,!517] Added v6 scope test src/bin/dhcp6/tests/fqdn_unittest.cc TEST_F(FqdnDhcpv6SrvTest, ddnsScopeTest) - new test --- diff --git a/src/bin/dhcp6/tests/fqdn_unittest.cc b/src/bin/dhcp6/tests/fqdn_unittest.cc index b801854f2e..eb27678235 100644 --- a/src/bin/dhcp6/tests/fqdn_unittest.cc +++ b/src/bin/dhcp6/tests/fqdn_unittest.cc @@ -17,11 +17,13 @@ #include #include #include +#include #include #include #include - +#include #include + #include #include @@ -36,27 +38,9 @@ using namespace std; namespace { -#define ASSERT_NO_THROW_LOG(statement) \ -{ \ - try { \ - statement; \ - } catch (const std::exception& ex) { \ - GTEST_FAIL() << #statement << "threw: " << ex.what(); \ - } catch (...) { \ - GTEST_FAIL() << #statement << "threw non-std::exception"; \ - } \ -} \ - - /// @brief A test fixture class for testing DHCPv6 Client FQDN Option handling. class FqdnDhcpv6SrvTest : public Dhcpv6SrvTest { public: - /// Pointer to Dhcpv6Srv that is used in tests - boost::scoped_ptr srv_; - - // Reference to D2ClientMgr singleton - D2ClientMgr& d2_mgr_; - // Bit Constants for turning on and off DDNS configuration options. // (Defined here as these are only meaningful to this class.) static const uint16_t OVERRIDE_NO_UPDATE = 1; @@ -92,7 +76,8 @@ public: /// @brief Constructor FqdnDhcpv6SrvTest() : Dhcpv6SrvTest(), srv_(new NakedDhcpv6Srv(0)), - d2_mgr_(CfgMgr::instance().getD2ClientMgr()) { + d2_mgr_(CfgMgr::instance().getD2ClientMgr()), + iface_mgr_test_config_(true) { // generateClientId assigns DUID to duid_. generateClientId(); lease_.reset(new Lease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), @@ -400,7 +385,7 @@ public: // Call createNameChangeRequests ctx.fwd_dns_update_ = exp_fwd.value_; ctx.rev_dns_update_ = exp_rev.value_; - ASSERT_NO_THROW_LOG(srv_->createNameChangeRequests(answer, ctx)); + ASSERT_NO_THROW(srv_->createNameChangeRequests(answer, ctx)); if (exp_fwd.value_ || exp_rev.value_) { // Should have created 1 NCR. NameChangeRequestPtr ncr; @@ -595,7 +580,7 @@ public: /// @param forward An expected setting of the forward update flag. /// @param addr A string representation of the IPv6 address held in the /// NameChangeRequest. - /// @param dhcid An expected DHCID value. + /// @param dhcid An expected DHCID value. Ignored if blank. /// @note This value is the value that is produced by /// dhcp_ddns::D2Dhcid::createDigest() with the appropriate arguments. This /// method uses encryption tools to produce the value which cannot be @@ -624,7 +609,10 @@ public: EXPECT_EQ(forward, ncr->isForwardChange()); EXPECT_EQ(reverse, ncr->isReverseChange()); EXPECT_EQ(addr, ncr->getIpAddress()); - EXPECT_EQ(dhcid, ncr->getDhcid().toStr()); + if (!dhcid.empty()) { + EXPECT_EQ(dhcid, ncr->getDhcid().toStr()); + } + EXPECT_EQ(expires, ncr->getLeaseExpiresOn()); EXPECT_EQ(len, ncr->getLeaseLength()); EXPECT_EQ(isc::dhcp_ddns::ST_NEW, ncr->getStatus()); @@ -663,9 +651,17 @@ public: ASSERT_TRUE(pool); } + /// Pointer to Dhcpv6Srv that is used in tests + boost::scoped_ptr srv_; + + // Reference to D2ClientMgr singleton + D2ClientMgr& d2_mgr_; + + /// @brief Interface Manager's fake configuration control. + IfaceMgrTestConfig iface_mgr_test_config_; + // Holds a lease used by a test. Lease6Ptr lease_; - }; // A set of tests verifying server's behavior when it receives the DHCPv6 @@ -1591,4 +1587,91 @@ TEST_F(FqdnDhcpv6SrvTest, sanitizeFqdn) { "mxyxhost.example.com.", false); } +// Verifies that socped ddns-parameter handling. +// Specifically that D2 can be enabled with sending updates +// disabled globally, and enabled at the subnet level. +TEST_F(FqdnDhcpv6SrvTest, ddnsScopeTest) { + std::string config_str = + "{ \"interfaces-config\": {\n" + " \"interfaces\": [ \"*\" ]\n" + "},\n" + "\"preferred-lifetime\": 3000,\n" + "\"rebind-timer\": 2000,\n" + "\"renew-timer\": 1000,\n" + "\"ddns-send-updates\": false,\n" + "\"subnet6\": [ {\n" + " \"subnet\": \"2001:db8:1::/48\",\n" + " \"pools\": [ { \"pool\": \"2001:db8:1::1 - 2001:db8:1::10\" } ],\n" + " \"interface\": \"eth0\"\n" + " },\n" + " {\n" + " \"subnet\": \"2001:db8:2::/48\",\n" + " \"pools\": [ { \"pool\": \"2001:db8:2::1 - 2001:db8:2::10\" } ],\n" + " \"interface\": \"eth1\",\n" + " \"ddns-send-updates\": true\n" + " } ],\n" + "\"valid-lifetime\": 4000,\n" + " \"dhcp-ddns\" : {\n" + " \"enable-updates\" : true\n" + " }\n" + "}"; + + Dhcp6Client client1; + client1.setInterface("eth0"); + + // Load a configuration with D2 enabled + ASSERT_NO_FATAL_FAILURE(configure(config_str, *client1.getServer())); + ASSERT_TRUE(CfgMgr::instance().ddnsEnabled()); + ASSERT_NO_THROW(client1.getServer()->startD2()); + + // Include the Client FQDN option. + ASSERT_NO_THROW(client1.useFQDN(Option6ClientFqdn::FLAG_S, "one.example.org.", + Option6ClientFqdn::FULL)); + + // Now send the DHCPREQUEST with including the FQDN option. + ASSERT_NO_THROW(client1.doSARR()); + Pkt6Ptr resp = client1.getContext().response_; + ASSERT_TRUE(resp); + ASSERT_EQ(DHCPV6_REPLY, static_cast(resp->getType())); + + // Check that the response FQDN is as expected. + Option6ClientFqdnPtr fqdn; + fqdn = boost::dynamic_pointer_cast(resp->getOption(D6O_CLIENT_FQDN)); + ASSERT_TRUE(fqdn); + EXPECT_EQ("one.example.org.", fqdn->getDomainName()); + + // ddns-send-udpates for subnet 1 should be off, so we should NOT have an NRC. + ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize()); + + // Now let's try with a client on subnet 2. + Dhcp6Client client2; + client2.setInterface("eth1"); + client2.requestAddress(); + + // Include the Client FQDN option. + ASSERT_NO_THROW(client2.useFQDN(Option6ClientFqdn::FLAG_S, "two.example.org.", + Option6ClientFqdn::FULL)); + + ASSERT_NO_THROW(client2.doSARR()); + resp = client2.getContext().response_; + ASSERT_TRUE(resp); + ASSERT_EQ(DHCPV6_REPLY, static_cast(resp->getType())); + + // Check that the response FQDN is as expected. + fqdn = boost::dynamic_pointer_cast(resp->getOption(D6O_CLIENT_FQDN)); + ASSERT_TRUE(fqdn); + EXPECT_EQ("two.example.org.", fqdn->getDomainName()); + + Subnet6Ptr subnet = (CfgMgr::instance().getCurrentCfg()->getCfgSubnets6()->getSubnet(2)); + ASSERT_TRUE(subnet); + DdnsParamsPtr p = (CfgMgr::instance().getCurrentCfg()->getDdnsParams(*subnet)); + ASSERT_TRUE(p->enable_updates_); + + // ddns-send-udpates for subnet 2 are enabled, verify the NCR is correct. + ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize()); + verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true, "2001:db8:2::1", + "", 0, 4000); + +} + } // end of anonymous namespace