From: Francis Dupont Date: Mon, 17 Oct 2022 23:47:02 +0000 (+0200) Subject: [#2596] Checkpoint: one UT to add X-Git-Tag: Kea-2.3.3~72 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=59a75bec6a580f76f636f592b15cd32469a3a180;p=thirdparty%2Fkea.git [#2596] Checkpoint: one UT to add --- diff --git a/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc b/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc index 5d71a1a542..18b114e920 100644 --- a/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc +++ b/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc @@ -55,6 +55,7 @@ public: } /// @brief Exposes protected methods and members. + using LeaseMgr::setExtendedInfoEnabled; using Memfile_LeaseMgr::relay_id6_; using Memfile_LeaseMgr::remote_id6_; using Memfile_LeaseMgr::deleteExtendedInfo6; @@ -111,6 +112,7 @@ public: leases6.push_back(lease); EXPECT_TRUE(lease_mgr_->addLease(lease)); } + ASSERT_EQ(ADDRESS6.size(), leases6.size()); } /// @brief Create a vector of uint8_t from a string. @@ -1035,4 +1037,200 @@ TEST_F(MemfileExtendedInfoTest, getLeases6ByLinkMultiThreading) { EXPECT_EQ(0, got.size()); } +/// @brief Verifies that v6 deleteLease removes references from extended +/// info tables. +TEST_F(MemfileExtendedInfoTest, deleteLease6) { + start(Memfile_LeaseMgr::V6); + initLease6(); + EXPECT_TRUE(lease_mgr_->getExtendedInfoEnabled()); + + // Create parameter values. + IOAddress lease_addr(ADDRESS6[0]); + IOAddress link_addr(ADDRESS6[1]); + string relay_id_str = DUID6[0]; + vector relay_id; + relay_id.resize(relay_id_str.size()); + memmove(&relay_id[0], &relay_id_str[0], relay_id.size()); + string remote_id_str = DUID6[1]; + vector remote_id; + remote_id.resize(remote_id_str.size()); + memmove(&remote_id[0], &remote_id_str[0], remote_id.size()); + + // Fill the table. + EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr, link_addr, relay_id)); + EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr, link_addr, remote_id)); + EXPECT_NO_THROW(lease_mgr_->addLinkAddr6(lease_addr, link_addr)); + + EXPECT_EQ(1, lease_mgr_->relay_id6_.size()); + EXPECT_EQ(1, lease_mgr_->remote_id6_.size()); + EXPECT_EQ(1, lease_mgr_->link_addr6_.size()); + + // Delete the second lease: no side effect on tables. + Lease6Ptr lease = leases6[1]; + ASSERT_TRUE(lease); + EXPECT_NE(lease_addr, lease->addr_); + lease->extended_info_action_ = Lease::ACTION_UPDATE; + bool ret; + EXPECT_NO_THROW(ret = lease_mgr_->deleteLease(lease)); + EXPECT_TRUE(ret); + EXPECT_EQ(Lease::ACTION_IGNORE, lease->extended_info_action_); + EXPECT_EQ(1, lease_mgr_->relay_id6_.size()); + EXPECT_EQ(1, lease_mgr_->remote_id6_.size()); + EXPECT_EQ(1, lease_mgr_->link_addr6_.size()); + + // Delete the first lease: tables are cleared. + lease = leases6[0]; + ASSERT_TRUE(lease); + EXPECT_EQ(lease_addr, lease->addr_); + EXPECT_NO_THROW(ret = lease_mgr_->deleteLease(lease)); + EXPECT_TRUE(ret); + EXPECT_TRUE(lease_mgr_->relay_id6_.empty()); + EXPECT_TRUE(lease_mgr_->remote_id6_.empty()); + EXPECT_TRUE(lease_mgr_->link_addr6_.empty()); +} + +/// @brief Verifies that v6 deleteLease does not touch extended info tables +/// when they are disabled. +TEST_F(MemfileExtendedInfoTest, deleteLease6disabled) { + start(Memfile_LeaseMgr::V6); + initLease6(); + lease_mgr_->setExtendedInfoEnabled(false); + + // Create parameter values. + IOAddress lease_addr(ADDRESS6[0]); + IOAddress link_addr(ADDRESS6[1]); + string relay_id_str = DUID6[0]; + vector relay_id; + relay_id.resize(relay_id_str.size()); + memmove(&relay_id[0], &relay_id_str[0], relay_id.size()); + string remote_id_str = DUID6[1]; + vector remote_id; + remote_id.resize(remote_id_str.size()); + memmove(&remote_id[0], &remote_id_str[0], remote_id.size()); + + // Fill the table. + EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr, link_addr, relay_id)); + EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr, link_addr, remote_id)); + EXPECT_NO_THROW(lease_mgr_->addLinkAddr6(lease_addr, link_addr)); + + EXPECT_EQ(1, lease_mgr_->relay_id6_.size()); + EXPECT_EQ(1, lease_mgr_->remote_id6_.size()); + EXPECT_EQ(1, lease_mgr_->link_addr6_.size()); + + // Delete the first lease: tables are no longer cleared. + Lease6Ptr lease = leases6[0]; + ASSERT_TRUE(lease); + EXPECT_EQ(lease_addr, lease->addr_); + lease->extended_info_action_ = Lease::ACTION_DELETE; + bool ret; + EXPECT_NO_THROW(ret = lease_mgr_->deleteLease(lease)); + EXPECT_TRUE(ret); + EXPECT_EQ(Lease::ACTION_IGNORE, lease->extended_info_action_); + EXPECT_EQ(1, lease_mgr_->relay_id6_.size()); + EXPECT_EQ(1, lease_mgr_->remote_id6_.size()); + EXPECT_EQ(1, lease_mgr_->link_addr6_.size()); +} + +/// @brief Verifies that v6 addLease adds references to extended info tables. +TEST_F(MemfileExtendedInfoTest, addLease6) { + start(Memfile_LeaseMgr::V6); + EXPECT_TRUE(lease_mgr_->getExtendedInfoEnabled()); + EXPECT_TRUE(lease_mgr_->relay_id6_.empty()); + EXPECT_TRUE(lease_mgr_->remote_id6_.empty()); + EXPECT_TRUE(lease_mgr_->link_addr6_.empty()); + + // Create parameter values. + Lease6Ptr lease; + IOAddress lease_addr(ADDRESS6[1]); + IOAddress link_addr(ADDRESS6[2]); + string duid_str = DUID6[0]; + vector duid_data; + duid_data.resize(duid_str.size()); + memmove(&duid_data[0], &duid_str[0], duid_data.size()); + DuidPtr duid(new DUID(duid_data)); + ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid, + 123, 1000, 2000, 1))); + string user_context_txt = + "{ \"ISC\": { \"relay-info\": [ { \"hop\": 33," + " \"link\": \"2001:db8::2\", \"peer\": \"2001:db8::3\"," + " \"options\": \"0x00250006010203040506003500086464646464646464\"," + " \"remote-id\": \"010203040506\"," + " \"relay-id\": \"6464646464646464\" } ] } }"; + ElementPtr user_context; + ASSERT_NO_THROW(user_context = Element::fromJSON(user_context_txt)); + lease->setContext(user_context); + lease->extended_info_action_ = Lease::ACTION_DELETE; + bool ret; + EXPECT_NO_THROW(ret = lease_mgr_->addLease(lease)); + EXPECT_TRUE(ret); + EXPECT_EQ(Lease::ACTION_IGNORE, lease->extended_info_action_); + + // Check extended info tables. + ASSERT_EQ(1, lease_mgr_->relay_id6_.size()); + auto relay_id_it = lease_mgr_->relay_id6_.cbegin(); + ASSERT_NE(relay_id_it, lease_mgr_->relay_id6_.cend()); + Lease6ExtendedInfoPtr ex_info = *relay_id_it; + ASSERT_TRUE(ex_info); + EXPECT_EQ(ADDRESS6[1], ex_info->lease_addr_.toText()); + EXPECT_EQ(ADDRESS6[2], ex_info->link_addr_.toText()); + const vector& relay_id = ex_info->id_; + const vector& exp_relay_id = vector(8, 0x64); + EXPECT_EQ(exp_relay_id, relay_id); + + ASSERT_EQ(1, lease_mgr_->remote_id6_.size()); + auto remote_id_it = lease_mgr_->remote_id6_.cbegin(); + ASSERT_NE(remote_id_it, lease_mgr_->remote_id6_.cend()); + ex_info = *remote_id_it; + ASSERT_TRUE(ex_info); + EXPECT_EQ(ADDRESS6[1], ex_info->lease_addr_.toText()); + EXPECT_EQ(ADDRESS6[2], ex_info->link_addr_.toText()); + const vector& remote_id = ex_info->id_; + const vector& exp_remote_id = { 1, 2, 3, 4, 5, 6 }; + EXPECT_EQ(exp_remote_id, remote_id); + + ASSERT_EQ(1, lease_mgr_->link_addr6_.size()); + auto link_addr_it = lease_mgr_->link_addr6_.cbegin(); + ASSERT_NE(link_addr_it, lease_mgr_->link_addr6_.cend()); + Lease6SimpleExtendedInfoPtr sex_info = *link_addr_it; + ASSERT_TRUE(sex_info); + EXPECT_EQ(ADDRESS6[1], sex_info->lease_addr_.toText()); + EXPECT_EQ(ADDRESS6[2], sex_info->link_addr_.toText()); +} + +/// @brief Verifies that v6 addLease does not touch extended info tables +/// when they are disabled. +TEST_F(MemfileExtendedInfoTest, addLease6disabled) { + start(Memfile_LeaseMgr::V6); + lease_mgr_->setExtendedInfoEnabled(false); + + // Create parameter values. + Lease6Ptr lease; + IOAddress lease_addr(ADDRESS6[1]); + IOAddress link_addr(ADDRESS6[2]); + string duid_str = DUID6[0]; + vector duid_data; + duid_data.resize(duid_str.size()); + memmove(&duid_data[0], &duid_str[0], duid_data.size()); + DuidPtr duid(new DUID(duid_data)); + ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid, + 123, 1000, 2000, 1))); + string user_context_txt = + "{ \"ISC\": { \"relay-info\": [ { \"hop\": 33," + " \"link\": \"2001:db8::2\", \"peer\": \"2001:db8::3\"," + " \"options\": \"0x00250006010203040506003500086464646464646464\"," + " \"remote-id\": \"010203040506\"," + " \"relay-id\": \"6464646464646464\" } ] } }"; + ElementPtr user_context; + ASSERT_NO_THROW(user_context = Element::fromJSON(user_context_txt)); + lease->setContext(user_context); + lease->extended_info_action_ = Lease::ACTION_UPDATE; + bool ret; + EXPECT_NO_THROW(ret = lease_mgr_->addLease(lease)); + EXPECT_TRUE(ret); + EXPECT_EQ(Lease::ACTION_IGNORE, lease->extended_info_action_); + EXPECT_TRUE(lease_mgr_->relay_id6_.empty()); + EXPECT_TRUE(lease_mgr_->remote_id6_.empty()); + EXPECT_TRUE(lease_mgr_->link_addr6_.empty()); +} + } // namespace