]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2795] adding new UT for IPv6 prefixes check
authorPiotrek Zadroga <piotrek@isc.org>
Wed, 21 Jun 2023 23:23:25 +0000 (01:23 +0200)
committerPiotrek Zadroga <piotrek@isc.org>
Mon, 26 Jun 2023 15:30:59 +0000 (15:30 +0000)
src/lib/dhcpsrv/tests/host_mgr_unittest.cc
src/lib/dhcpsrv/tests/mysql_host_data_source_unittest.cc
src/lib/dhcpsrv/tests/pgsql_host_data_source_unittest.cc
src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.cc
src/lib/dhcpsrv/testutils/generic_host_data_source_unittest.h

index 2ade444c06591f4cc13a74061d844bc45d9ba604..28ed24ee7803e4faecf06126017b616cd440f95a 100644 (file)
@@ -63,6 +63,13 @@ TEST_F(HostMgrTest, getAll6ByIP) {
     testGetAll6ByIP(*getCfgHosts(), *getCfgHosts());
 }
 
+// This test verifies that HostMgr returns all reservations for the
+// IPv6 reserved prefix. The reservations are specified in the
+// server's configuration.
+TEST_F(HostMgrTest, getAll6ByIpPrefix) {
+    testGetAll6ByIpPrefix(*getCfgHosts(), *getCfgHosts());
+}
+
 // This test verifies that HostMgr returns all reservations for the
 // specified DHCPv6 subnet. The reservations are defined in the server's
 // configuration.
index 7ab3bc3791ecc4676f5b47653d3d25f25c797869..8ad593c936d9772c244b06617fb6ec3b1d52df1b 100644 (file)
@@ -1583,6 +1583,12 @@ TEST_F(MySQLHostMgrTest, getAll6ByIP) {
     testGetAll6ByIP(*getCfgHosts(), *getCfgHosts());
 }
 
+// This test verifies that HostMgr returns all reservations for the
+// IPv6 reserved prefix.
+TEST_F(MySQLHostMgrTest, getAll6ByIpPrefix) {
+    testGetAll6ByIpPrefix(*getCfgHosts(), *getCfgHosts());
+}
+
 // This test verifies that reservations for a particular hostname can be
 // retrieved from the configuration file and a database simultaneously.
 TEST_F(MySQLHostMgrTest, getAllbyHostname) {
index 2d30b239ad7b58c4d2c60c3934cd48147b770fd0..561e059089f13a0bc823858a31535c9dd32219f6 100644 (file)
@@ -1551,6 +1551,12 @@ TEST_F(PgSQLHostMgrTest, getAll6ByIP) {
     testGetAll6ByIP(*getCfgHosts(), *getCfgHosts());
 }
 
+// This test verifies that HostMgr returns all reservations for the
+// IPv6 reserved prefix.
+TEST_F(PgSQLHostMgrTest, getAll6ByIpPrefix) {
+    testGetAll6ByIpPrefix(*getCfgHosts(), *getCfgHosts());
+}
+
 // This test verifies that reservations for a particular hostname can be
 // retrieved from the configuration file and a database simultaneously.
 TEST_F(PgSQLHostMgrTest, getAllbyHostname) {
index 80a83b73592e386bde52e6926abcf4d391347c76..562109d03b05a28d5381b2d63ecf66a5999a6163 100644 (file)
@@ -4512,6 +4512,110 @@ HostMgrTest::testGetAll6ByIP(BaseHostDataSource& data_source1, BaseHostDataSourc
     EXPECT_EQ(0, hosts.size());
 }
 
+void
+HostMgrTest::testGetAll6ByIpPrefix(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);
+
+    // Initially, no reservations should be present.
+    ConstHostCollection hosts = HostMgr::instance().getAll6(SubnetID(1),
+                                                            IOAddress("2001:db8:1:10::"));
+    ASSERT_TRUE(hosts.empty());
+
+    // Prepare vectors of IPv6 prefix reservations for new hosts.
+    std::vector<IOAddress> addresses1;
+    std::vector<IOAddress> addresses2;
+    addresses1.push_back(IOAddress("2001:db8:1:10::"));
+    addresses1.push_back(IOAddress("2001:db8:1:11::"));
+    addresses2.push_back(IOAddress("2001:db8:1:10::"));
+    addresses2.push_back(IOAddress("2001:db8:1:12::"));
+
+    // Add two hosts for the same subnet with 2 IPv6 prefix reservations per host.
+    addHost6(data_source1, duids_[0], SubnetID(1), addresses1, 64);
+    addHost6(data_source2, duids_[1], SubnetID(1), addresses2, 64);
+
+    CfgMgr::instance().commit();
+
+    // If a non-matching subnet is specified, nothing should be returned.
+    hosts = HostMgr::instance().getAll6(SubnetID(100), IOAddress("2001:db8:1:10::"));
+    ASSERT_TRUE(hosts.empty());
+
+    // For given IP prefix there should be one reservation.
+    hosts = HostMgr::instance().getAll6(IOAddress("2001:db8:1:11::"));
+    ASSERT_EQ(1, hosts.size());
+
+    // For given IP prefix there should be one reservation.
+    hosts = HostMgr::instance().getAll6(IOAddress("2001:db8:1:12::"));
+    ASSERT_EQ(1, hosts.size());
+
+    // For given IP prefix there should be two reservations.
+    hosts = HostMgr::instance().getAll6(IOAddress("2001:db8:1:10::"));
+    ASSERT_EQ(2, hosts.size());
+
+    // Make sure that subnet is correct.
+    EXPECT_EQ(1, hosts[0]->getIPv6SubnetID());
+    EXPECT_EQ(1, hosts[1]->getIPv6SubnetID());
+
+    // Make sure that all hosts were returned with different identifiers, and
+    // they have expected reservations.
+    EXPECT_NE(hosts[0]->getIdentifierAsText(), hosts[1]->getIdentifierAsText());
+    EXPECT_TRUE(
+        hosts[0]->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:10::"), 64)));
+    EXPECT_TRUE(
+        hosts[0]->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:11::"), 64)));
+    EXPECT_TRUE(
+        hosts[1]->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:10::"), 64)));
+    EXPECT_TRUE(
+        hosts[1]->hasReservation(IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:12::"), 64)));
+
+    // Make sure that the operation target is supported.
+    bool is_first_source_primary = isPrimaryDataSource(data_source1);
+    bool is_second_source_primary = isPrimaryDataSource(data_source2);
+    size_t hosts_in_primary_source = is_first_source_primary + is_second_source_primary;
+
+    // Select hosts only from the primary source.
+    hosts = HostMgr::instance().getAll6(IOAddress("2001:db8:1:10::"),
+                                        HostMgrOperationTarget::PRIMARY_SOURCE);
+    EXPECT_EQ(hosts_in_primary_source, hosts.size());
+    if (is_first_source_primary) {
+        EXPECT_TRUE(hosts[0]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:10::"), 64)));
+        EXPECT_TRUE(hosts[0]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:11::"), 64)));
+    }
+    if (is_second_source_primary) {
+        EXPECT_TRUE(hosts[hosts_in_primary_source - 1]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:10::"), 64)));
+        EXPECT_TRUE(hosts[hosts_in_primary_source - 1]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:12::"), 64)));
+    }
+
+    // Select hosts only from the alternate sources.
+    hosts = HostMgr::instance().getAll6(IOAddress("2001:db8:1:10::"),
+                                        HostMgrOperationTarget::ALTERNATE_SOURCES);
+    EXPECT_EQ(2 - hosts_in_primary_source, hosts.size());
+    if (!is_first_source_primary) {
+        EXPECT_TRUE(hosts[0]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:10::"), 64)));
+        EXPECT_TRUE(hosts[0]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:11::"), 64)));
+    }
+    if (!is_second_source_primary) {
+        EXPECT_TRUE(hosts[2 - hosts_in_primary_source - 1]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:10::"), 64)));
+        EXPECT_TRUE(hosts[2 - hosts_in_primary_source - 1]->hasReservation(
+            IPv6Resrv(IPv6Resrv::TYPE_PD, IOAddress("2001:db8:1:11::"), 64)));
+    }
+
+    // Select hosts for an unspecified source.
+    hosts = HostMgr::instance().getAll4(IOAddress("2001:db8:1:10::"),
+                                        HostMgrOperationTarget::UNSPECIFIED_SOURCE);
+    EXPECT_EQ(0, hosts.size());
+}
+
 void
 HostMgrTest::testAdd(BaseHostDataSource& data_source1,
                      BaseHostDataSource& data_source2) {
index b804e29cdbf3f4d4e9822efd864a24a44f7f4c41..6717bbbf7ccc4c1ab01c519941f648c4f4e02105 100644 (file)
@@ -965,6 +965,18 @@ protected:
     void testGetAll6ByIP(BaseHostDataSource& data_source1,
                          BaseHostDataSource& data_source2);
 
+    /// @brief This test verifies that HostMgr returns all reservations for the
+    /// specified IPv6 prefix/es.
+    ///
+    /// If reservations are added to different host data sources, it is expected
+    /// that the @c HostMgr will retrieve reservations from both of them.
+    ///
+    /// @param data_source1 Host data source to which first reservation is
+    /// inserted.
+    /// @param data_source2 Host data source to which second reservation is
+    /// inserted.
+    void testGetAll6ByIpPrefix(BaseHostDataSource& data_source1, BaseHostDataSource& data_source2);
+
     /// @brief This test verifies that HostMgr adds the reservations to any
     /// data source.
     ///