]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2815] Fix unit test
authorSlawek Figiel <slawek@isc.org>
Tue, 18 Apr 2023 12:13:27 +0000 (14:13 +0200)
committerSlawek Figiel <slawek@isc.org>
Thu, 25 May 2023 11:29:29 +0000 (13:29 +0200)
src/lib/dhcpsrv/cfg_hosts.cc
src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc

index c5d54034bd41674923357c4c4c95b977875a881f..22b48aa3f3b494e206b095d9b746cbf9a3170dfb 100644 (file)
@@ -1202,10 +1202,11 @@ CfgHosts::del6(const SubnetID& subnet_id,
         }
 
         // Delete host.
+        auto host_id = (*key)->getHostId();
         key = idx.erase(key);
         erased_hosts++;
         // Delete reservations.
-        erased_reservations += idx6.erase((*key)->getHostId());
+        erased_reservations += idx6.erase(host_id);
     }
 
     LOG_DEBUG(hosts_logger, HOSTS_DBG_TRACE, HOSTS_CFG_DEL6)
index a066a33ea00ae4f1f6730aa23e42e729a3acb03f..38939277dde11979a59e65b7306da9cb99e673bd 100644 (file)
@@ -4767,94 +4767,130 @@ HostMgrTest::testDelete4ByIDAndIdentifier(BaseHostDataSource& data_source1,
 void
 HostMgrTest::testDelete6ByIDAndIdentifier(BaseHostDataSource& data_source1,
                                           BaseHostDataSource& data_source2) {
+    // Set the mode of operation with multiple reservations for the same
+    // IP address.
+    ASSERT_TRUE(HostMgr::instance().setIPReservationsUnique(false));
+    CfgMgr::instance().getStagingCfg()->getCfgHosts()->setIPReservationsUnique(false);
+
     bool is_first_source_primary = isPrimaryDataSource(data_source1);
     bool is_second_source_primary = isPrimaryDataSource(data_source2);
+    bool has_alternate_source = !is_first_source_primary || !is_second_source_primary;
     size_t hosts_in_primary_source = is_first_source_primary + is_second_source_primary;
     size_t hosts_in_alternate_sources = 2 - hosts_in_primary_source;
 
     // Delete from the explicit operation target - all sources.
-    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"));
-    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"));
+    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
+    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
     CfgMgr::instance().commit();
 
-    HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
-                             &duids_[0]->getDuid()[0],
-                             duids_[0]->getDuid().size(),
-                             HostMgrOperationTarget::ALL_SOURCES);
-    HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
-                             &duids_[1]->getDuid()[0],
-                             duids_[1]->getDuid().size(),
-                             HostMgrOperationTarget::ALL_SOURCES);
+    EXPECT_TRUE(HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
+                                         &duids_[0]->getDuid()[0],
+                                         duids_[0]->getDuid().size(),
+                                         HostMgrOperationTarget::ALL_SOURCES));
+    EXPECT_TRUE(HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
+                                         &duids_[1]->getDuid()[0],
+                                         duids_[1]->getDuid().size(),
+                                         HostMgrOperationTarget::ALL_SOURCES));
 
-    ASSERT_TRUE(HostMgr::instance().getAll6(SubnetID(1)).empty());
+    EXPECT_TRUE(HostMgr::instance().getAll6(SubnetID(1)).empty());
 
     // Delete from the default operation target.
-    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"));
-    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"));
+    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
+    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
     CfgMgr::instance().commit();
 
-    HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
-                             &duids_[0]->getDuid()[0],
-                             duids_[0]->getDuid().size());
-    HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
-                             &duids_[1]->getDuid()[0],
-                             duids_[1]->getDuid().size());
+    if (has_alternate_source) {
+        EXPECT_EQ(!is_first_source_primary, HostMgr::instance().del6(SubnetID(1),
+                                            Host::IDENT_DUID,
+                                            &duids_[0]->getDuid()[0],
+                                            duids_[0]->getDuid().size()));
+        EXPECT_EQ(!is_second_source_primary, HostMgr::instance().del6(SubnetID(1),
+                                             Host::IDENT_DUID,
+                                             &duids_[1]->getDuid()[0],
+                                             duids_[1]->getDuid().size()));
+    } else {
+        EXPECT_THROW(HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
+                                              &duids_[0]->getDuid()[0],
+                                              duids_[0]->getDuid().size()),
+                     NoHostDataSourceManager);
+        EXPECT_THROW(HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
+                                              &duids_[1]->getDuid()[0],
+                                              duids_[1]->getDuid().size()),
+                     NoHostDataSourceManager);
+    }
 
-    ASSERT_EQ(hosts_in_primary_source, HostMgr::instance().getAll6(SubnetID(1)).size());
+    EXPECT_EQ(hosts_in_primary_source, HostMgr::instance().getAll6(SubnetID(1)).size());
 
     HostMgr::instance().del(SubnetID(1), IOAddress("2001:db8:1::5"), HostMgrOperationTarget::ALL_SOURCES);
 
     // Delete from the explicit operation target - alternate sources.
-    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"));
-    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"));
+    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
+    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
     CfgMgr::instance().commit();
 
-    HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
-                             &duids_[0]->getDuid()[0],
-                             duids_[0]->getDuid().size(),
-                             HostMgrOperationTarget::ALTERNATE_SOURCES);
-    HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
-                             &duids_[1]->getDuid()[0],
-                             duids_[1]->getDuid().size(),
-                             HostMgrOperationTarget::ALTERNATE_SOURCES);
+    if (has_alternate_source) {
+        EXPECT_EQ(!is_first_source_primary, HostMgr::instance().del6(SubnetID(1),
+                                Host::IDENT_DUID,
+                                &duids_[0]->getDuid()[0],
+                                duids_[0]->getDuid().size(),
+                                HostMgrOperationTarget::ALTERNATE_SOURCES));
+        EXPECT_EQ(!is_second_source_primary, HostMgr::instance().del6(SubnetID(1),
+                                Host::IDENT_DUID,
+                                &duids_[1]->getDuid()[0],
+                                duids_[1]->getDuid().size(),
+                                HostMgrOperationTarget::ALTERNATE_SOURCES));
+    } else {
+        EXPECT_THROW(HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
+                                &duids_[0]->getDuid()[0],
+                                duids_[0]->getDuid().size(),
+                                HostMgrOperationTarget::ALTERNATE_SOURCES),
+                     NoHostDataSourceManager);
+        EXPECT_THROW(HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
+                                &duids_[1]->getDuid()[0],
+                                duids_[1]->getDuid().size(),
+                                HostMgrOperationTarget::ALTERNATE_SOURCES),
+                     NoHostDataSourceManager);
+    }
 
-    ASSERT_EQ(hosts_in_primary_source, HostMgr::instance().getAll6(SubnetID(1)).size());
+    EXPECT_EQ(hosts_in_primary_source, HostMgr::instance().getAll6(SubnetID(1)).size());
 
     HostMgr::instance().del(SubnetID(1), IOAddress("2001:db8:1::5"), HostMgrOperationTarget::ALL_SOURCES);
     
     // Delete from the explicit operation target - primary source.
-    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"));
-    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"));
+    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
+    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
     CfgMgr::instance().commit();
 
-    HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
-                             &duids_[0]->getDuid()[0],
-                             duids_[0]->getDuid().size(),
-                             HostMgrOperationTarget::PRIMARY_SOURCE);
-    HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
-                             &duids_[1]->getDuid()[0],
-                             duids_[1]->getDuid().size(),
-                             HostMgrOperationTarget::PRIMARY_SOURCE);
+    EXPECT_EQ(is_first_source_primary, HostMgr::instance().del6(SubnetID(1),
+                                    Host::IDENT_DUID,
+                                    &duids_[0]->getDuid()[0],
+                                    duids_[0]->getDuid().size(),
+                                    HostMgrOperationTarget::PRIMARY_SOURCE));
+    EXPECT_EQ(is_second_source_primary, HostMgr::instance().del6(SubnetID(1),
+                                    Host::IDENT_DUID,
+                                    &duids_[1]->getDuid()[0],
+                                    duids_[1]->getDuid().size(),
+                                    HostMgrOperationTarget::PRIMARY_SOURCE));
 
-    ASSERT_EQ(hosts_in_alternate_sources, HostMgr::instance().getAll6(SubnetID(1)).size());
+    EXPECT_EQ(hosts_in_alternate_sources, HostMgr::instance().getAll6(SubnetID(1)).size());
 
     HostMgr::instance().del(SubnetID(1), IOAddress("2001:db8:1::5"), HostMgrOperationTarget::ALL_SOURCES);
 
     // Delete from the explicit operation target - unspecified source.
-    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"));
-    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"));
+    addHost6(data_source1, duids_[0], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
+    addHost6(data_source2, duids_[1], SubnetID(1), IOAddress("2001:db8:1::5"), 128);
     CfgMgr::instance().commit();
 
-    HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
+    EXPECT_FALSE(HostMgr::instance().del6(SubnetID(1),Host::IDENT_DUID,
                              &duids_[0]->getDuid()[0],
                              duids_[0]->getDuid().size(),
-                             HostMgrOperationTarget::UNSPECIFIED_SOURCE);
-    HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
+                             HostMgrOperationTarget::UNSPECIFIED_SOURCE));
+    EXPECT_FALSE(HostMgr::instance().del6(SubnetID(1), Host::IDENT_DUID,
                              &duids_[1]->getDuid()[0],
                              duids_[1]->getDuid().size(),
-                             HostMgrOperationTarget::UNSPECIFIED_SOURCE);
+                             HostMgrOperationTarget::UNSPECIFIED_SOURCE));
 
-    ASSERT_EQ(2, HostMgr::instance().getAll6(SubnetID(1)).size());
+    EXPECT_EQ(2, HostMgr::instance().getAll6(SubnetID(1)).size());
 
     HostMgr::instance().del(SubnetID(1), IOAddress("2001:db8:1::5"), HostMgrOperationTarget::ALL_SOURCES);
 }