]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2643] Done: ported code and tests
authorFrancis Dupont <fdupont@isc.org>
Fri, 18 Nov 2022 14:05:38 +0000 (15:05 +0100)
committerFrancis Dupont <fdupont@isc.org>
Mon, 21 Nov 2022 14:32:13 +0000 (15:32 +0100)
src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc
src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc

index 1fbd5bf3ca4952d60c6301b211c090a4ad7b291d..bba6f2e125f6fab7994ee60f29a6760f17e43ea9 100644 (file)
@@ -2084,4 +2084,85 @@ TEST(CfgSubnets4Test, outOfRangeHost) {
     EXPECT_THROW_MSG(parser.parse(elems), DhcpConfigError, msg);
 }
 
+// This test verifies that the getLinks tool works as expected.
+TEST(CfgSubnets4Test, getLinks) {
+    CfgSubnets4 cfg;
+
+    // Create 3 subnets.
+    Subnet4Ptr subnet1(new Subnet4(IOAddress("192.0.1.0"),
+                                   26, 1, 2, 3, SubnetID(1)));
+    Subnet4Ptr subnet2(new Subnet4(IOAddress("192.0.2.0"),
+                                   26, 1, 2, 3, SubnetID(2)));
+    Subnet4Ptr subnet3(new Subnet4(IOAddress("192.0.3.0"),
+                                   26, 1, 2, 3, SubnetID(3)));
+
+    // Add all subnets to the configuration.
+    ASSERT_NO_THROW(cfg.add(subnet1));
+    ASSERT_NO_THROW(cfg.add(subnet2));
+    ASSERT_NO_THROW(cfg.add(subnet3));
+
+    // No 192.0.4.0 subnet.
+    SubnetIDSet links;
+    uint8_t link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.4.0"), link_len));
+    EXPECT_TRUE(links.empty());
+    EXPECT_EQ(111, link_len);
+
+    // A 192.0.2.0/26 subnet.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.2.0"), link_len));
+    SubnetIDSet expected = { 2 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(26, link_len);
+
+    // Check that any address in the subnet works.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.2.23"), link_len));
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(26, link_len);
+
+    // Check that an address outside the subnet does not work.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.2.123"), link_len));
+    EXPECT_TRUE(links.empty());
+    EXPECT_EQ(111, link_len);
+
+    // Add a second 192.0.2.0/26 subnet.
+    Subnet4Ptr subnet10(new Subnet4(IOAddress("192.0.2.10"),
+                                    26, 1, 2, 3, SubnetID(10)));
+    ASSERT_NO_THROW(cfg.add(subnet10));
+
+    // Now we should get 2 subnets.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.2.0"), link_len));
+    expected = { 2, 10 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(26, link_len);
+
+    // Add a larger subnet.
+    Subnet4Ptr subnet20(new Subnet4(IOAddress("192.0.2.20"),
+                                    24, 1, 2, 3, SubnetID(20)));
+    ASSERT_NO_THROW(cfg.add(subnet20));
+
+    // Now we should get 3 subnets and a smaller prefix length.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.2.0"), link_len));
+    expected = { 2, 10, 20 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(24, link_len);
+
+    // But only the larger subnet if the address is only in it.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("192.0.2.123"), link_len));
+    expected = { 20 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(24, link_len);
+}
+
 } // end of anonymous namespace
index 8d18aab1ef04e3cc5b8c466439174285829f66fd..49031a4cb72603dc25781639a17e1bf560854062 100644 (file)
@@ -2005,4 +2005,86 @@ TEST(CfgSubnets6Test, hostPD) {
     CfgMgr::instance().clear();
 }
 
+// This test verifies that the getLinks tool works as expected.
+TEST(CfgSubnets6Test, getLinks) {
+    CfgSubnets6 cfg;
+
+    // Create 3 subnets.
+    Subnet6Ptr subnet1(new Subnet6(IOAddress("2001:db8:1::"), 64, 1, 2, 3, 4,
+                                   SubnetID(1)));
+    Subnet6Ptr subnet2(new Subnet6(IOAddress("2001:db8:2::"), 64, 1, 2, 3, 4,
+                                   SubnetID(2)));
+    Subnet6Ptr subnet3(new Subnet6(IOAddress("2001:db8:3::"), 64, 1, 2, 3, 4,
+                                   SubnetID(3)));
+
+    // Add all subnets to the configuration.
+    ASSERT_NO_THROW(cfg.add(subnet1));
+    ASSERT_NO_THROW(cfg.add(subnet2));
+    ASSERT_NO_THROW(cfg.add(subnet3));
+
+    // No 2001:db8:4:: subnet.
+    SubnetIDSet links;
+    uint8_t link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:4::"), link_len));
+    EXPECT_TRUE(links.empty());
+    EXPECT_EQ(111, link_len);
+
+    // A 2001:db8:2::/64 subnet.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:2::"), link_len));
+    SubnetIDSet expected = { 2 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(64, link_len);
+
+    // Check that any address in the subnet works.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:2::1234:5678:9abc:def0"),
+                                         link_len));
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(64, link_len);
+
+    // Check that an address outside the subnet does not work.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:2:1::"), link_len));
+    EXPECT_TRUE(links.empty());
+    EXPECT_EQ(111, link_len);
+
+    // Add a second 2001:db8:2::/64 subnet.
+    Subnet6Ptr subnet10(new Subnet6(IOAddress("2001:db8:2::10"), 64, 1, 2, 3,
+                                    4, SubnetID(10)));
+    ASSERT_NO_THROW(cfg.add(subnet10));
+
+    // Now we should get 2 subnets.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:2::"), link_len));
+    expected = { 2, 10 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(64, link_len);
+
+    // Add a larger subnet.
+    Subnet6Ptr subnet20(new Subnet6(IOAddress("2001:db8:2::20"), 56, 1, 2, 3,
+                                    4, SubnetID(20)));
+    ASSERT_NO_THROW(cfg.add(subnet20));
+
+    // Now we should get 3 subnets and a smaller prefix length.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:2::"), link_len));
+    expected = { 2, 10, 20 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(56, link_len);
+
+    // But only the larger subnet if the address is only in it.
+    links.clear();
+    link_len = 111;
+    EXPECT_NO_THROW(links = cfg.getLinks(IOAddress("2001:db8:2:1::"), link_len));
+    expected = { 20 };
+    EXPECT_EQ(expected, links);
+    EXPECT_EQ(56, link_len);
+}
+
 } // end of anonymous namespace