]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5425] Improved tests
authorFrancis Dupont <fdupont@isc.org>
Wed, 13 Dec 2017 23:35:52 +0000 (00:35 +0100)
committerFrancis Dupont <fdupont@isc.org>
Wed, 13 Dec 2017 23:35:52 +0000 (00:35 +0100)
src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
src/bin/dhcp6/tests/classify_unittests.cc

index d2cd09f099dcd351c93374dad37d41f97c2d7c31..9a1c926f2b6dc2ee013e7133f3003c5df08cfee9 100644 (file)
@@ -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);
index d8967e8ffea490bcec727b98f90d863a4bd9af3e..0e1ab5184d2642b10b082e093bb60ada1cbc4b28 100644 (file)
@@ -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;