From: Francis Dupont Date: Wed, 13 Dec 2017 23:35:52 +0000 (+0100) Subject: [5425] Improved tests X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f9891718ecb3bd1a5463291274448f7f873df827;p=thirdparty%2Fkea.git [5425] Improved tests --- diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc index d2cd09f099..9a1c926f2b 100644 --- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc @@ -2388,7 +2388,8 @@ TEST_F(Dhcpv4SrvTest, clientPoolClassify) { } // Checks if the known-clients field is indeed used for pool selection. -TEST_F(Dhcpv4SrvTest, clientPoolKnown) { +// Unknown variant. +TEST_F(Dhcpv4SrvTest, clientPoolUnknown) { IfaceMgrTestConfig test_config(true); IfaceMgr::instance().openSockets4(); @@ -2438,6 +2439,64 @@ TEST_F(Dhcpv4SrvTest, clientPoolKnown) { EXPECT_EQ("192.0.3.1", offer->getYiaddr().toText()); } +// Checks if the known-clients field is indeed used for pool selection. +// Known variant. +TEST_F(Dhcpv4SrvTest, clientPoolKnown) { + IfaceMgrTestConfig test_config(true); + IfaceMgr::instance().openSockets4(); + + NakedDhcpv4Srv srv(0); + + // This test configures 2 pools. + string config = "{ \"interfaces-config\": {" + " \"interfaces\": [ \"*\" ]" + "}," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ " + "{ \"pools\": [ { " + " \"pool\": \"192.0.2.1 - 192.0.2.100\", " + " \"known-clients\": \"never\" }, " + " { \"pool\": \"192.0.3.1 - 192.0.3.100\", " + " \"known-clients\": \"only\" } ], " + " \"reservations\": [ { " + " \"hw-address\": \"00:11:22:33:44:55\", " + " \"hostname\": \"foo\" } ], " + " \"subnet\": \"192.0.0.0/16\" } " + "]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json; + ASSERT_NO_THROW(json = parseDHCP4(config, true)); + + ConstElementPtr status; + EXPECT_NO_THROW(status = configureDhcp4Server(srv, json)); + + CfgMgr::instance().commit(); + + // check if returned status is OK + ASSERT_TRUE(status); + comment_ = config::parseAnswer(rcode_, status); + ASSERT_EQ(0, rcode_); + + // Create a simple packet + Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234)); + const HWAddr& hw = HWAddr::fromText("00:11:22:33:44:55"); + HWAddrPtr hw_addr(new HWAddr(hw)); + dis->setHWAddr(hw_addr); + dis->setRemoteAddr(IOAddress("192.0.2.1")); + dis->setCiaddr(IOAddress("192.0.2.1")); + dis->setIface("eth0"); + OptionPtr clientid = generateClientId(); + dis->addOption(clientid); + + // First pool requires no reservation so the second will be used + Pkt4Ptr offer = srv.processDiscover(dis); + ASSERT_TRUE(offer); + EXPECT_EQ(DHCPOFFER, offer->getType()); + EXPECT_EQ("192.0.3.1", offer->getYiaddr().toText()); +} + // Verifies last resort option 43 is backward compatible TEST_F(Dhcpv4SrvTest, option43LastResort) { IfaceMgrTestConfig test_config(true); diff --git a/src/bin/dhcp6/tests/classify_unittests.cc b/src/bin/dhcp6/tests/classify_unittests.cc index d8967e8ffe..0e1ab5184d 100644 --- a/src/bin/dhcp6/tests/classify_unittests.cc +++ b/src/bin/dhcp6/tests/classify_unittests.cc @@ -176,6 +176,17 @@ public: } } + /// @brief Create a solicit + Pkt6Ptr createSolicit(std::string remote_addr = "fe80::abcd") { + OptionPtr clientid = generateClientId(); + Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); + query->setRemoteAddr(IOAddress(remote_addr)); + query->addOption(clientid); + query->setIface("eth1"); + query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + return (query); + } + /// @brief Interface Manager's fake configuration control. IfaceMgrTestConfig iface_mgr_test_config_; }; @@ -244,22 +255,9 @@ TEST_F(ClassifyTest, matchClassification) { ASSERT_NO_THROW(configure(config)); // Create packets with enough to select the subnet - OptionPtr clientid = generateClientId(); - Pkt6Ptr query1(new Pkt6(DHCPV6_SOLICIT, 1234)); - query1->setRemoteAddr(IOAddress("fe80::abcd")); - query1->addOption(clientid); - query1->setIface("eth1"); - query1->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); - Pkt6Ptr query2(new Pkt6(DHCPV6_SOLICIT, 1234)); - query2->setRemoteAddr(IOAddress("fe80::abcd")); - query2->addOption(clientid); - query2->setIface("eth1"); - query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - Pkt6Ptr query3(new Pkt6(DHCPV6_SOLICIT, 1234)); - query3->setRemoteAddr(IOAddress("fe80::abcd")); - query3->addOption(clientid); - query3->setIface("eth1"); - query3->addOption(generateIA(D6O_IA_NA, 345, 1500, 3000)); + Pkt6Ptr query1 = createSolicit(); + Pkt6Ptr query2 = createSolicit(); + Pkt6Ptr query3 = createSolicit(); // Create and add an ORO option to the first 2 queries OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -341,12 +339,7 @@ TEST_F(ClassifyTest, subnetClassPriority) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Create and add an ORO option to the query OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -413,12 +406,7 @@ TEST_F(ClassifyTest, subnetGlobalPriority) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Create and add an ORO option to the query OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -482,12 +470,7 @@ TEST_F(ClassifyTest, classGlobalPriority) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Create and add an ORO option to the query OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO)); @@ -558,12 +541,7 @@ TEST_F(ClassifyTest, classGlobalPersistency) { // Create a packet with enough to select the subnet and go through // the SOLICIT processing - Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234)); - query->setRemoteAddr(IOAddress("fe80::abcd")); - OptionPtr clientid = generateClientId(); - query->addOption(clientid); - query->setIface("eth1"); - query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000)); + Pkt6Ptr query = createSolicit(); // Do not add an ORO. OptionPtr oro = query->getOption(D6O_ORO); @@ -620,11 +598,7 @@ TEST_F(ClassifyTest, clientClassifySubnet) { ASSERT_NO_THROW(configure(config)); - Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - sol->setRemoteAddr(IOAddress("2001:db8:1::3")); - sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - OptionPtr clientid = generateClientId(); - sol->addOption(clientid); + Pkt6Ptr sol = createSolicit("2001:db8:1::3"); // This discover does not belong to foo class, so it will not // be serviced @@ -685,22 +659,9 @@ TEST_F(ClassifyTest, clientClassifyPool) { ASSERT_NO_THROW(configure(config)); - OptionPtr clientid = generateClientId(); - Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - query1->setRemoteAddr(IOAddress("2001:db8:1::3")); - query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - query1->addOption(clientid); - query1->setIface("eth1"); - Pkt6Ptr query2 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - query2->setRemoteAddr(IOAddress("2001:db8:1::3")); - query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - query2->addOption(clientid); - query2->setIface("eth1"); - Pkt6Ptr query3 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - query3->setRemoteAddr(IOAddress("2001:db8:1::3")); - query3->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - query3->addOption(clientid); - query3->setIface("eth1"); + Pkt6Ptr query1 = createSolicit("2001:db8:1::3"); + Pkt6Ptr query2 = createSolicit("2001:db8:1::3"); + Pkt6Ptr query3 = createSolicit("2001:db8:1::3"); // This discover does not belong to foo class, so it will not // be serviced @@ -776,12 +737,7 @@ TEST_F(ClassifyTest, clientKnownPool) { ASSERT_NO_THROW(configure(config)); - OptionPtr clientid1 = generateClientId(); - Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - query1->setRemoteAddr(IOAddress("2001:db8:1::3")); - query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - query1->addOption(clientid1); - query1->setIface("eth1"); + Pkt6Ptr query1 = createSolicit("2001:db8:1::3"); // First pool requires reservation so the second will be used srv.classifyPacket(query1); @@ -828,11 +784,7 @@ TEST_F(ClassifyTest, vendorClientClassification2) { NakedDhcpv6Srv srv(0); // Let's create a SOLICIT. - Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - sol->setRemoteAddr(IOAddress("2001:db8:1::3")); - sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - OptionPtr clientid = generateClientId(); - sol->addOption(clientid); + Pkt6Ptr sol = createSolicit("2001:db8:1::3"); // Now let's add a vendor-class with id=1234 and content "foo" OptionVendorClassPtr vendor_class(new OptionVendorClass(Option::V6, 1234)); @@ -895,11 +847,7 @@ TEST_F(ClassifyTest, relayOverrideAndClientClass) { ASSERT_TRUE(subnet1); ASSERT_TRUE(subnet2); - Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234)); - sol->setRemoteAddr(IOAddress("2001:db8:1::3")); - sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000)); - OptionPtr clientid = generateClientId(); - sol->addOption(clientid); + Pkt6Ptr sol = createSolicit("2001:db8:1::3"); // Now pretend the packet came via one relay. Pkt6::RelayInfo relay;