From: Francis Dupont Date: Fri, 18 Nov 2022 14:05:38 +0000 (+0100) Subject: [#2643] Done: ported code and tests X-Git-Tag: Kea-2.3.3~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e055ca58248632fa9461f5d2334dcc2f488c9ebb;p=thirdparty%2Fkea.git [#2643] Done: ported code and tests --- diff --git a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc index 1fbd5bf3ca..bba6f2e125 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc @@ -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 diff --git a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc index 8d18aab1ef..49031a4cb7 100644 --- a/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc +++ b/src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc @@ -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