]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2898] added unittests for pool-id
authorRazvan Becheriu <razvan@isc.org>
Mon, 19 Jun 2023 14:28:13 +0000 (17:28 +0300)
committerRazvan Becheriu <razvan@isc.org>
Thu, 22 Jun 2023 14:52:48 +0000 (14:52 +0000)
src/hooks/dhcp/lease_cmds/lease_parser.cc
src/hooks/dhcp/lease_cmds/tests/lease_cmds4_unittest.cc
src/hooks/dhcp/lease_cmds/tests/lease_cmds6_unittest.cc
src/hooks/dhcp/lease_cmds/tests/lease_cmds_unittest.h
src/lib/dhcpsrv/alloc_engine.cc
src/lib/dhcpsrv/lease.cc
src/lib/dhcpsrv/lease_mgr.h
src/lib/dhcpsrv/tests/generic_lease_mgr_unittest.cc
src/lib/dhcpsrv/tests/lease_unittest.cc
src/lib/dhcpsrv/testutils/test_utils.cc

index 2871c1cd94fb43c766d5bce793f228490a672e1d..32ac214ff690acd91a7c3b383857e593054e8877 100644 (file)
@@ -55,6 +55,7 @@ Lease4Parser::parse(ConstSrvConfigPtr& cfg,
         pool_id = getUint32(lease_info, "pool-id");
     }
 
+    // Check if the subnet-id specified is sane.
     ConstSubnet4Ptr subnet;
     if (subnet_id) {
         // If subnet-id is specified, it has to match.
@@ -64,6 +65,7 @@ Lease4Parser::parse(ConstSrvConfigPtr& cfg,
                       << subnet_id << " currently configured.");
         }
 
+        // Check if the address specified really belongs to the subnet.
         if (!subnet->inRange(addr)) {
             isc_throw(LeaseCmdsConflict, "The address " << addr.toText() << " does not belong "
                       "to subnet " << subnet->toText() << ", subnet-id=" << subnet_id);
@@ -170,7 +172,6 @@ Lease4Parser::parse(ConstSrvConfigPtr& cfg,
     }
 
     // Let's fabricate some data and we're ready to go.
-
     Lease4Ptr l(new Lease4(addr, hwaddr_ptr, client_id, valid_lft,
                            cltt, subnet_id,
                            fqdn_fwd, fqdn_rev, hostname));
@@ -265,6 +266,7 @@ Lease6Parser::parse(ConstSrvConfigPtr& cfg,
             isc_throw(BadValue, "Subnet-id is 0 or not specified. This is allowed for"
                       " address leases only, not prefix leases.");
         }
+        // Subnet-id was not specified. Let's try to figure it out on our own.
         subnet = cfg->getCfgSubnets6()->selectSubnet(addr);
         if (!subnet) {
             isc_throw(LeaseCmdsConflict, "subnet-id not specified and failed to find a "
@@ -382,7 +384,6 @@ Lease6Parser::parse(ConstSrvConfigPtr& cfg,
     }
 
     // Let's fabricate some data and we're ready to go.
-
     Lease6Ptr l(new Lease6(type, addr, duid_ptr, iaid, pref_lft, valid_lft,
                            subnet_id, fqdn_fwd, fqdn_rev, hostname,
                            hwaddr_ptr, prefix_len));
index fef1132152a0328751badf84e6b4b382e4a70442..34f5e02952c0bc95d826e0cd4c371a624ef39486 100644 (file)
@@ -59,7 +59,7 @@ public:
     /// @param client_id_required true if client-id is expected
     void checkLease4(isc::data::ConstElementPtr l, std::string ip,
                      uint32_t subnet_id, std::string hwaddr,
-                     bool client_id_required) {
+                     bool client_id_required, uint32_t pool_id = 0) {
         ASSERT_TRUE(l);
 
         // If the element is a list we need to retrieve the lease that
@@ -91,7 +91,14 @@ public:
             EXPECT_TRUE(l->get("client-id"));
         }
 
-        // Check that other parameters are there.
+        if (pool_id) {
+            ASSERT_TRUE(l->get("pool-id"));
+            EXPECT_EQ(pool_id, l->get("pool-id")->intValue());
+        } else {
+            EXPECT_FALSE(l->get("pool-id"));
+        }
+
+        // Check that all expected fields are there.
         ASSERT_TRUE(l->contains("valid-lft"));
         ASSERT_TRUE(l->contains("cltt"));
         ASSERT_TRUE(l->contains("subnet-id"));
@@ -101,7 +108,7 @@ public:
         ASSERT_TRUE(l->contains("hostname"));
         ASSERT_TRUE(l->contains("state"));
 
-        // Check that there are no v6 specific fields
+        // Check that there are no v6 specific fields.
         ASSERT_FALSE(l->contains("prefix"));
         ASSERT_FALSE(l->contains("duid"));
         ASSERT_FALSE(l->contains("preferred-lft"));
@@ -243,6 +250,9 @@ public:
     /// @brief Verifies that the limit must be a number.
     void testLease4GetPagedLimitNotNumber();
 
+    /// @brief Verifies that the limit of 0 is rejected.
+    void testLease4GetPagedLimitIsZero();
+
     /// @brief Check that lease4-get-by-hw-address can handle a situation when
     /// the query is broken (required parameter is missing).
     void testLease4GetByHwAddressParams();
@@ -267,9 +277,6 @@ public:
     /// leases).
     void testLease4GetByClientIdFind2();
 
-    /// @brief Verifies that the limit of 0 is rejected.
-    void testLease4GetPagedLimitIsZero();
-
     /// @brief Check that lease4-get-by-hostname can handle a situation when
     /// the query is broken (required parameter is missing).
     void testLease4GetByHostnameParams();
@@ -439,7 +446,7 @@ void Lease4CmdsTest::testLease4AddMissingParams() {
     // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
-    // Everything missing. What sort of crap is that?
+    // Everything missing. What sort of nonsense is that?
     string txt =
         "{\n"
         "    \"command\": \"lease4-add\",\n"
@@ -461,7 +468,7 @@ void Lease4CmdsTest::testLease4AddMissingParams() {
     exp_rsp = "missing parameter 'hw-address' (<string>:3:19)";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
-    // Better, but still no luck. (hwaddr missing).
+    // Just subnet-id and ip is not enough. (hwaddr missing).
     txt =
         "{\n"
         "    \"command\": \"lease4-add\",\n"
@@ -530,7 +537,7 @@ void Lease4CmdsTest::testLease4AddBadParams() {
     exp_rsp = "Non-IPv4 address specified: 2001:db8:1::1";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
-    // currently defined states are 0,1 and 2. 123 is junk.
+    // Invalid state: the only supported values are 0,1,2.
     txt =
         "{\n"
         "    \"command\": \"lease4-add\",\n"
@@ -574,6 +581,38 @@ void Lease4CmdsTest::testLease4AddBadParams() {
     exp_rsp = "Duplicated comment entry '\"direct\"' in user context "
         "'{ \"comment\": \"in user context\" }'";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    // Negative expiration time.
+    txt =
+        "{\n"
+        "    \"command\": \"lease4-add\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 44,\n"
+        "        \"ip-address\": \"192.0.2.1\",\n"
+        "        \"hw-address\": \"1a:1b:1c:1d:1e:1f\",\n"
+        "        \"user-context\": { \"comment\": \"in user context\" },\n"
+        "        \"expire\": -6218189367\n"
+        "    }\n"
+        "}";
+    exp_rsp = "expiration time must be positive for address 192.0.2.1";
+    testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    // Negative cltt
+    txt =
+        "{\n"
+        "    \"command\": \"lease4-add\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 44,\n"
+        "        \"ip-address\": \"192.0.2.1\",\n"
+        "        \"hw-address\": \"1a:1b:1c:1d:1e:1f\",\n"
+        "        \"user-context\": { \"comment\": \"in user context\" },\n"
+        "        \"expire\": 123456,\n"
+        "        \"valid-lft\": 123457"
+        "    }\n"
+        "}";
+    exp_rsp = "expiration time must be greater than valid lifetime for address "
+        "192.0.2.1";
+    testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 }
 
 void Lease4CmdsTest::testLease4Add() {
@@ -651,7 +690,7 @@ void Lease4CmdsTest::testLease4AddDeclinedLeases() {
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
 
-    // Make sure the lease have proper value set.
+    // Make sure the lease has proper value set.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
     EXPECT_EQ(3, l->valid_lft_); // taken from subnet configuration
@@ -718,7 +757,7 @@ void Lease4CmdsTest::testLease4AddSubnetIdMissing() {
 
     checkLease4Stats(88, 0, 0);
 
-    // Now check that the lease is really there.
+    // Now check that the lease is really there and has correct subnet-id.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
     EXPECT_EQ(44, l->subnet_id_);
@@ -750,7 +789,7 @@ void Lease4CmdsTest::testLease4AddSubnetIdMissingDeclinedLeases() {
 
     checkLease4Stats(88, 0, 0);
 
-    // Now check that the lease is really there.
+    // Now check that the lease is really there and has correct subnet-id.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
     EXPECT_EQ(44, l->subnet_id_);
@@ -871,6 +910,7 @@ void Lease4CmdsTest::testLease4AddFullAddr() {
         "        \"fqdn-fwd\": true,\n"
         "        \"fqdn-rev\": true,\n"
         "        \"hostname\": \"urania.example.org\",\n"
+        "        \"pool-id\": 5,\n"
         "        \"user-context\": { \"foobar\": true }\n"
         "    }\n"
         "}";
@@ -894,6 +934,7 @@ void Lease4CmdsTest::testLease4AddFullAddr() {
     EXPECT_EQ(true, l->fqdn_fwd_);
     EXPECT_EQ(true, l->fqdn_rev_);
     EXPECT_EQ("urania.example.org", l->hostname_);
+    EXPECT_EQ(5, l->pool_id_);
     ASSERT_TRUE(l->getContext());
     EXPECT_EQ("{ \"foobar\": true }", l->getContext()->str());
 }
@@ -928,7 +969,7 @@ void Lease4CmdsTest::testLease4AddComment() {
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
 
-    // Make sure the lease have proper value set.
+    // Make sure the lease has proper value set.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
     ASSERT_TRUE(l->getContext());
@@ -981,9 +1022,11 @@ void Lease4CmdsTest::testLease4AddExtendedInfo() {
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
 
-    // Make sure the lease have proper value set.
+    // Make sure the lease has proper value set.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
+
+    // Check the user context / extended info too.
     ConstElementPtr ctx = l->getContext();
     ASSERT_TRUE(ctx);
     string expected = "{ \"ISC\": { \"relay-agent-info\": ";
@@ -1122,14 +1165,17 @@ void Lease4CmdsTest::testLease4GetByAddrNotFound() {
         "    }\n"
         "}";
     string exp_rsp = "Lease not found.";
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    // Note the status expected is empty. The query completed correctly,
+    // just didn't found the lease.
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 }
 
 void Lease4CmdsTest::testLease4GetByAddr() {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
-    // Query for valid, existing lease.
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-get\",\n"
@@ -1138,14 +1184,17 @@ void Lease4CmdsTest::testLease4GetByAddr() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease found.";
+
+    // The status expected is success. The lease should be returned.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     // Now check that the lease parameters were indeed returned.
     ASSERT_TRUE(rsp);
+
     ConstElementPtr lease = rsp->get("arguments");
     ASSERT_TRUE(lease);
 
-    // Let's check if the response makes any sense.
+    // Now check that the lease was indeed returned.
     checkLease4(lease, "192.0.2.1", 44, "08:08:08:08:08:08", true);
 }
 
@@ -1164,14 +1213,14 @@ void Lease4CmdsTest::testLease4GetByHWAddrNotFound() {
         "    }\n"
         "}";
     string exp_rsp = "Lease not found.";
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 }
 
 void Lease4CmdsTest::testLease4GetByHWAddr() {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
-    // Invalid
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-get\",\n"
@@ -1182,14 +1231,17 @@ void Lease4CmdsTest::testLease4GetByHWAddr() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease found.";
+
+    // The status expected is success. The lease should be returned.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     // Now check that the lease parameters were indeed returned.
     ASSERT_TRUE(rsp);
+
     ConstElementPtr lease = rsp->get("arguments");
     ASSERT_TRUE(lease);
 
-    // Let's check if the response makes any sense.
+    // Now check that the lease was indeed returned.
     checkLease4(lease, "192.0.2.1", 44, "08:08:08:08:08:08", false);
 }
 
@@ -1208,7 +1260,7 @@ void Lease4CmdsTest::testLease4GetByClientIdNotFound() {
         "    }\n"
         "}";
     string exp_rsp = "Lease not found.";
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 }
 
 void Lease4CmdsTest::testLease4GetByClientId() {
@@ -1225,14 +1277,17 @@ void Lease4CmdsTest::testLease4GetByClientId() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease found.";
+
+    // The status expected is success. The lease should be returned.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     // Now check that the lease parameters were indeed returned.
     ASSERT_TRUE(rsp);
+
     ConstElementPtr lease = rsp->get("arguments");
     ASSERT_TRUE(lease);
 
-    // Let's check if the response makes any sense.
+    // Now check that the lease was indeed returned.
     checkLease4(lease, "192.0.2.1", 44, "08:08:08:08:08:08", false);
 }
 
@@ -1261,7 +1316,7 @@ void Lease4CmdsTest::testLease4GetAll() {
 
     // Let's check if the response contains desired leases.
     checkLease4(leases, "192.0.2.1", 44, "08:08:08:08:08:08", true);
-    checkLease4(leases, "192.0.2.2", 44, "09:09:09:09:09:09", true);
+    checkLease4(leases, "192.0.2.2", 44, "09:09:09:09:09:09", true, 5);
     checkLease4(leases, "192.0.3.1", 88, "08:08:08:08:08:08", true);
     checkLease4(leases, "192.0.3.2", 88, "09:09:09:09:09:09", true);
 }
@@ -1321,7 +1376,7 @@ void Lease4CmdsTest::testLease4GetAllBySubnetId() {
 
     // Let's check if the response contains desired leases.
     checkLease4(leases, "192.0.2.1", 44, "08:08:08:08:08:08", true);
-    checkLease4(leases, "192.0.2.2", 44, "09:09:09:09:09:09", true);
+    checkLease4(leases, "192.0.2.2", 44, "09:09:09:09:09:09", true, 5);
 }
 
 void Lease4CmdsTest::testLease4GetAllBySubnetIdNoLeases() {
@@ -1382,7 +1437,7 @@ void Lease4CmdsTest::testLease4GetAllByMultipleSubnetIds() {
 
     // Let's check if the response contains desired leases.
     checkLease4(leases, "192.0.2.1", 44, "08:08:08:08:08:08", true);
-    checkLease4(leases, "192.0.2.2", 44, "09:09:09:09:09:09", true);
+    checkLease4(leases, "192.0.2.2", 44, "09:09:09:09:09:09", true, 5);
     checkLease4(leases, "192.0.3.1", 88, "08:08:08:08:08:08", true);
     checkLease4(leases, "192.0.3.2", 88, "09:09:09:09:09:09", true);
 }
@@ -1498,8 +1553,12 @@ void Lease4CmdsTest::testLease4GetPaged() {
                 // ask the Lease Manager.
                 Lease4Ptr from_mgr = LeaseMgrFactory::instance().getLease4(IOAddress(last_address));
                 ASSERT_TRUE(from_mgr);
+                uint32_t pool_id = 0;
+                if (last_address == "192.0.2.2") {
+                    pool_id = 5;
+                }
                 checkLease4(leases, last_address, from_mgr->subnet_id_,
-                            from_mgr->hwaddr_->toText(false), true);
+                            from_mgr->hwaddr_->toText(false), true, pool_id);
             }
 
         } else {
@@ -1881,7 +1940,7 @@ void Lease4CmdsTest::testLease4UpdateMissingParams() {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
-    // Everything missing. What sort of crap is that?
+    // Everything missing. What sort of nonsense is that?
     string txt =
         "{\n"
         "    \"command\": \"lease4-update\",\n"
@@ -1892,7 +1951,7 @@ void Lease4CmdsTest::testLease4UpdateMissingParams() {
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
     // Just ip is not enough (subnet-id and hwaddr missing, although
-    // Kea can now figure out subnet-id on its own).
+    // Kea should be able to figure out the subnet-id on its own).
     txt =
         "{\n"
         "    \"command\": \"lease4-update\",\n"
@@ -2007,6 +2066,10 @@ void Lease4CmdsTest::testLease4UpdateNoLease() {
     // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    checkLease4Stats(44, 0, 0);
+
+    checkLease4Stats(88, 0, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -2022,6 +2085,10 @@ void Lease4CmdsTest::testLease4UpdateNoLease() {
         "either because the lease has been deleted or it has changed in the "
         "database, in both cases a retry might succeed";
     testCommand(txt, CONTROL_RESULT_CONFLICT, exp_rsp);
+
+    checkLease4Stats(44, 0, 0);
+
+    checkLease4Stats(88, 0, 0);
 }
 
 void Lease4CmdsTest::testLease4Update() {
@@ -2040,6 +2107,7 @@ void Lease4CmdsTest::testLease4Update() {
         "        \"subnet-id\": 44,\n"
         "        \"ip-address\": \"192.0.2.1\",\n"
         "        \"hw-address\": \"1a:1b:1c:1d:1e:1f\",\n"
+        "        \"pool-id\": 3,\n"
         "        \"hostname\": \"newhostname.example.org\""
         "    }\n"
         "}";
@@ -2050,13 +2118,14 @@ void Lease4CmdsTest::testLease4Update() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Now check that the lease is still there.
+    // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it's been updated.
+    // Make sure the lease has been updated.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
+    EXPECT_EQ(3, l->pool_id_);
     EXPECT_EQ("newhostname.example.org", l->hostname_);
     EXPECT_FALSE(l->getContext());
 }
@@ -2077,6 +2146,7 @@ void Lease4CmdsTest::testLease4UpdateDeclinedLeases() {
         "        \"subnet-id\": 44,\n"
         "        \"ip-address\": \"192.0.2.1\",\n"
         "        \"hw-address\": \"1a:1b:1c:1d:1e:1f\",\n"
+        "        \"pool-id\": 3,\n"
         "        \"hostname\": \"newhostname.example.org\""
         "    }\n"
         "}";
@@ -2091,9 +2161,10 @@ void Lease4CmdsTest::testLease4UpdateDeclinedLeases() {
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it's been updated.
+    // Make sure the lease has been updated.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
+    EXPECT_EQ(3, l->pool_id_);
     EXPECT_EQ("newhostname.example.org", l->hostname_);
     EXPECT_FALSE(l->getContext());
 }
@@ -2127,7 +2198,10 @@ void Lease4CmdsTest::testLease4UpdateNoSubnetId() {
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it's been updated.
+    // Make sure the subnet-id is correct.
+    EXPECT_EQ(44, l->subnet_id_);
+
+    // Make sure the lease has been updated.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
     EXPECT_EQ("newhostname.example.org", l->hostname_);
@@ -2159,11 +2233,14 @@ void Lease4CmdsTest::testLease4UpdateNoSubnetIdDeclinedLeases() {
 
     checkLease4Stats(88, 2, 2);
 
-    // Now check that the lease is still there.
+    // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it's been updated.
+    // Make sure the subnet-id is correct.
+    EXPECT_EQ(44, l->subnet_id_);
+
+    // Make sure the lease has been updated.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
     EXPECT_EQ("newhostname.example.org", l->hostname_);
@@ -2197,11 +2274,11 @@ void Lease4CmdsTest::testLease4UpdateForceCreate() {
 
     checkLease4Stats(88, 0, 0);
 
-    // Now check that the lease is still there.
+    // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it contains expected values..
+    // Make sure the lease is correct.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
     EXPECT_EQ("newhostname.example.org", l->hostname_);
@@ -2234,14 +2311,14 @@ void Lease4CmdsTest::testLease4UpdateForceCreateNoSubnetId() {
 
     checkLease4Stats(88, 0, 0);
 
-    // Now check that the lease is still there.
+    // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
     // Make sure the subnet-id is figured out correctly.
     EXPECT_EQ(44, l->subnet_id_);
 
-    // Make sure it contains expected values..
+    // Make sure the lease is correct.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
     EXPECT_EQ("newhostname.example.org", l->hostname_);
@@ -2305,11 +2382,11 @@ void Lease4CmdsTest::testLease4UpdateComment() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Now check that the lease is still there.
+    // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it's been updated.
+    // Make sure the lease has been updated.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("42:42:42:42:42:42:42:42", l->hwaddr_->toText(false));
 
@@ -2365,15 +2442,15 @@ void Lease4CmdsTest::testLease4UpdateExtendedInfo() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Now check that the lease is still there.
+    // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
 
-    // Make sure it's been updated.
+    // Make sure the lease has been updated.
     ASSERT_TRUE(l->hwaddr_);
     EXPECT_EQ("42:42:42:42:42:42:42:42", l->hwaddr_->toText(false));
 
-    // Check user context.
+    // Check the user context / extended info too.
     ConstElementPtr ctx = l->getContext();
     ASSERT_TRUE(ctx);
     string expected = "{ \"ISC\": { \"relay-agent-info\": ";
@@ -2479,7 +2556,7 @@ void Lease4CmdsTest::testLease4DelByAddrNotFound() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Invalid
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-del\",\n"
@@ -2489,6 +2566,9 @@ void Lease4CmdsTest::testLease4DelByAddrNotFound() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease not found.";
+
+    // Note the status expected is empty. The query completed correctly,
+    // just didn't found the lease.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 
     checkLease4Stats(44, 2, 0);
@@ -2504,7 +2584,7 @@ void Lease4CmdsTest::testLease4DelByAddr() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Query for valid, existing lease.
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-del\",\n"
@@ -2513,6 +2593,8 @@ void Lease4CmdsTest::testLease4DelByAddr() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease deleted.";
+
+    // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 1, 0);
@@ -2531,7 +2613,7 @@ void Lease4CmdsTest::testLease4DelByAddrDeclinedLeases() {
 
     checkLease4Stats(88, 2, 2);
 
-    // Query for valid, existing lease.
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-del\",\n"
@@ -2540,6 +2622,8 @@ void Lease4CmdsTest::testLease4DelByAddrDeclinedLeases() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease deleted.";
+
+    // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 1, 1);
@@ -2622,7 +2706,7 @@ void Lease4CmdsTest::testLease4DelByHWAddr() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Invalid
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-del\",\n"
@@ -2633,6 +2717,8 @@ void Lease4CmdsTest::testLease4DelByHWAddr() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease deleted.";
+
+    // The status expected is success. The lease should be deleted.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 1, 0);
@@ -2680,7 +2766,7 @@ void Lease4CmdsTest::testLease4DelByClientId() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Invalid
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-del\",\n"
@@ -2691,6 +2777,8 @@ void Lease4CmdsTest::testLease4DelByClientId() {
         "    }\n"
         "}";
     string exp_rsp = "IPv4 lease deleted.";
+
+    // The status expected is success. The lease should be deleted.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 1, 0);
@@ -2709,7 +2797,7 @@ void Lease4CmdsTest::testLease4Wipe() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Query for valid, existing lease.
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-wipe\",\n"
@@ -2718,6 +2806,8 @@ void Lease4CmdsTest::testLease4Wipe() {
         "    }\n"
         "}";
     string exp_rsp = "Deleted 2 IPv4 lease(s) from subnet(s) 44";
+
+    // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 0, 0);
@@ -2741,7 +2831,7 @@ void Lease4CmdsTest::testLease4WipeAll() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Query for valid, existing lease.
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-wipe\",\n"
@@ -2750,6 +2840,8 @@ void Lease4CmdsTest::testLease4WipeAll() {
         "    }\n"
         "}";
     string exp_rsp = "Deleted 4 IPv4 lease(s) from subnet(s) 44 88";
+
+    // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 0, 0);
@@ -2773,12 +2865,14 @@ void Lease4CmdsTest::testLease4WipeAllNoArgs() {
 
     checkLease4Stats(88, 2, 0);
 
-    // Query for valid, existing lease.
+    // Now send the command.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-wipe\"\n"
         "}";
     string exp_rsp = "Deleted 4 IPv4 lease(s) from subnet(s) 44 88";
+
+    // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
     checkLease4Stats(44, 0, 0);
@@ -2910,6 +3004,7 @@ void Lease4CmdsTest::testLease4ResendDdnsDisabled() {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Disable DDNS updating.
     disableD2();
 
     // Query for valid, existing lease.
@@ -2940,7 +3035,7 @@ void Lease4CmdsTest::testLease4ResendDdnsNoLease() {
         "    }\n"
         "}\n";
     string exp_rsp = "No lease found for: 192.0.2.5";
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 }
 
 void Lease4CmdsTest::testLease4ResendNoHostname() {
@@ -3782,6 +3877,24 @@ TEST_F(Lease4CmdsTest, lease4UpdateNoSubnetIdDeclinedLeasesMultiThreading) {
     testLease4UpdateNoSubnetIdDeclinedLeases();
 }
 
+TEST_F(Lease4CmdsTest, lease4UpdateComment) {
+    testLease4UpdateComment();
+}
+
+TEST_F(Lease4CmdsTest, lease4UpdateCommentMultiThreading) {
+    MultiThreadingTest mt(true);
+    testLease4UpdateComment();
+}
+
+TEST_F(Lease4CmdsTest, lease4UpdateExtendedInfo) {
+    testLease4UpdateExtendedInfo();
+}
+
+TEST_F(Lease4CmdsTest, lease4UpdateExtendedInfoMultiThreading) {
+    MultiThreadingTest mt(true);
+    testLease4UpdateExtendedInfo();
+}
+
 TEST_F(Lease4CmdsTest, lease4UpdateForceCreate) {
     testLease4UpdateForceCreate();
 }
@@ -3809,24 +3922,6 @@ TEST_F(Lease4CmdsTest, lease4UpdateDoNotForceCreateMultiThreading) {
     testLease4UpdateDoNotForceCreate();
 }
 
-TEST_F(Lease4CmdsTest, lease4UpdateComment) {
-    testLease4UpdateComment();
-}
-
-TEST_F(Lease4CmdsTest, lease4UpdateCommentMultiThreading) {
-    MultiThreadingTest mt(true);
-    testLease4UpdateComment();
-}
-
-TEST_F(Lease4CmdsTest, lease4UpdateExtendedInfo) {
-    testLease4UpdateExtendedInfo();
-}
-
-TEST_F(Lease4CmdsTest, lease4UpdateExtendedInfoMultiThreading) {
-    MultiThreadingTest mt(true);
-    testLease4UpdateExtendedInfo();
-}
-
 TEST_F(Lease4CmdsTest, lease4DelMissingParams) {
     testLease4DelMissingParams();
 }
@@ -3953,7 +4048,6 @@ TEST_F(Lease4CmdsTest, lease4WipeNoLeasesAllMultiThreading) {
     testLease4WipeNoLeasesAll();
 }
 
-
 TEST_F(Lease4CmdsTest, lease4BrokenUpdate) {
     testLease4BrokenUpdate();
 }
index d1fc8ab99ef6ac197740b6977efb39e1bb4a6166..8ac316f416771100f5835ca50061df63773ffd07 100644 (file)
@@ -59,9 +59,8 @@ public:
     /// @param duid expected value of DUID
     /// @param hwaddr_required true if hwaddr is expected
     void checkLease6(isc::data::ConstElementPtr l, std::string ip,
-                     uint8_t prefixlen,
-                     uint32_t subnet_id, std::string duid,
-                     bool hwaddr_required) {
+                     uint8_t prefixlen, uint32_t subnet_id, std::string duid,
+                     bool hwaddr_required, uint32_t pool_id = 0) {
         ASSERT_TRUE(l);
 
         // If the element is a list we need to retrieve the lease that
@@ -79,17 +78,17 @@ public:
             ASSERT_TRUE(l);
         }
 
-        ASSERT_TRUE(l->contains("ip-address"));
+        ASSERT_TRUE(l->get("ip-address"));
         EXPECT_EQ(ip, l->get("ip-address")->stringValue());
         if (prefixlen != 0) {
             ASSERT_TRUE(l->get("prefix-len"));
             EXPECT_EQ(prefixlen, l->get("prefix-len")->intValue());
         }
 
-        ASSERT_TRUE(l->contains("subnet-id"));
+        ASSERT_TRUE(l->get("subnet-id"));
         EXPECT_EQ(subnet_id, l->get("subnet-id")->intValue());
 
-        ASSERT_TRUE(l->contains("duid"));
+        ASSERT_TRUE(l->get("duid"));
         EXPECT_EQ(duid, l->get("duid")->stringValue());
 
         // hwaddr may or may not appear
@@ -97,7 +96,14 @@ public:
             EXPECT_TRUE(l->get("hwaddr"));
         }
 
-        // Check that there are expected fields
+        if (pool_id) {
+            ASSERT_TRUE(l->get("pool-id"));
+            EXPECT_EQ(pool_id, l->get("pool-id")->intValue());
+        } else {
+            EXPECT_FALSE(l->get("pool-id"));
+        }
+
+        // Check that all expected fields are there.
         ASSERT_TRUE(l->contains("preferred-lft"));
         ASSERT_TRUE(l->contains("valid-lft"));
         ASSERT_TRUE(l->contains("cltt"));
@@ -184,6 +190,10 @@ public:
     /// @brief Check that a well formed lease6 with a comment can be added.
     void testLease6AddComment();
 
+    /// @brief Check that a well formed lease6 with relay and remote ids
+    /// can be added.
+    void testLease6AddExtendedInfo();
+
     /// @brief Check that lease6-get can handle a situation when the query is
     /// broken (some required parameters are missing).
     void testLease6GetMissingParams();
@@ -201,14 +211,14 @@ public:
     /// @brief Check that lease6-get can return a lease by prefix.
     void testLease6GetByAddrPrefix();
 
-    /// @bfief Check that lease6-get rejects queries by client-id.
+    /// @brief Check that lease6-get rejects queries by client-id.
     void testLease6GetByClientIdInvalidType();
 
     /// @brief Check that lease6-get can handle a situation when the query is
     /// correctly formed, but the lease is not there.
     void testLease6GetByDuidNotFound();
 
-    /// @bfief Check that lease6-get can find a lease by duid.
+    /// @brief Check that lease6-get can find a lease by duid.
     void testLease6GetByDuid();
 
     /// @brief Check that lease6-get-all returns all leases.
@@ -289,10 +299,6 @@ public:
     /// lease to be updated.
     void testLease6UpdateNoLease();
 
-    /// @brief Check that a lease6 can be updated. We're changing hw-address,
-    /// hostname and extended info.
-    void testLease6UpdateExtendedInfo();
-
     /// @brief Check that a lease6 can be updated. We're changing hw-address and
     /// a hostname.
     void testLease6Update();
@@ -328,6 +334,10 @@ public:
     /// user context.
     void testLease6UpdateComment();
 
+    /// @brief Check that a lease6 can be updated. We're changing hw-address,
+    /// hostname and extended info.
+    void testLease6UpdateExtendedInfo();
+
     /// @brief Check that lease6-del can handle a situation when the query is
     /// broken (some required parameters are missing).
     void testLease6DelMissingParams();
@@ -479,8 +489,8 @@ void Lease6CmdsTest::testLease6AddMissingParams() {
     string exp_rsp = "missing parameter 'ip-address' (<string>:3:19)";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
-    // Just ip is not enough (subnet-id and duid missing, but subnet-id
-    // can now be figured out by kea)
+    // Just ip is not enough (subnet-id and duid missing, although
+    // subnet-id can now be figured out by Kea code)
     txt =
         "{\n"
         "    \"command\": \"lease6-add\",\n"
@@ -718,6 +728,13 @@ void Lease6CmdsTest::testLease6Add() {
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
+
+    // Make sure the lease has proper value set.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->duid_->toText());
+    EXPECT_EQ(4, l->valid_lft_); // taken from subnet configuration
+    EXPECT_FALSE(l->fqdn_fwd_);
+    EXPECT_FALSE(l->fqdn_rev_);
     EXPECT_EQ("", l->hostname_);
     EXPECT_FALSE(l->getContext());
 
@@ -758,6 +775,13 @@ void Lease6CmdsTest::testLease6AddDeclinedLeases() {
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
+
+    // Make sure the lease has proper value set.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->duid_->toText());
+    EXPECT_EQ(4, l->valid_lft_); // taken from subnet configuration
+    EXPECT_FALSE(l->fqdn_fwd_);
+    EXPECT_FALSE(l->fqdn_rev_);
     EXPECT_EQ("", l->hostname_);
     EXPECT_FALSE(l->getContext());
 
@@ -803,7 +827,8 @@ void Lease6CmdsTest::testLease6AddSubnetIdMissing() {
 
     checkLease6Stats(99, 0, 0, 0);
 
-    // Now send the command (without subnet-id)
+    // Now send the command without subnet-id. Kea should select
+    // the subnet id on its own.
     string txt =
         "{\n"
         "    \"command\": \"lease6-add\",\n"
@@ -834,7 +859,8 @@ void Lease6CmdsTest::testLease6AddSubnetIdMissingDeclinedLeases() {
 
     checkLease6Stats(99, 0, 0, 0);
 
-    // Now send the command (without subnet-id)
+    // Now send the command without subnet-id. Kea should select
+    // the subnet id on its own.
     string txt =
         "{\n"
         "    \"command\": \"lease6-add\",\n"
@@ -866,7 +892,8 @@ void Lease6CmdsTest::testLease6AddSubnetIdMissingBadAddr() {
 
     checkLease6Stats(99, 0, 0, 0);
 
-    // Now send the command (without subnet-id)
+    // Now send the command without subnet-id. Kea should select
+    // the subnet id on its own.
     string txt =
         "{\n"
         "    \"command\": \"lease6-add\",\n"
@@ -1016,6 +1043,7 @@ void Lease6CmdsTest::testLease6AddFullAddr() {
         "        \"fqdn-fwd\": true,\n"
         "        \"fqdn-rev\": true,\n"
         "        \"hostname\": \"urania.example.org\",\n"
+        "        \"pool-id\": 5,\n"
         "        \"user-context\": { \"foobar\": true }\n"
         "    }\n"
         "}";
@@ -1040,6 +1068,7 @@ void Lease6CmdsTest::testLease6AddFullAddr() {
     EXPECT_EQ(true, l->fqdn_fwd_);
     EXPECT_EQ(true, l->fqdn_rev_);
     EXPECT_EQ("urania.example.org", l->hostname_);
+    EXPECT_EQ(5, l->pool_id_);
     ASSERT_TRUE(l->getContext());
     EXPECT_EQ("{ \"foobar\": true }", l->getContext()->str());
 }
@@ -1075,93 +1104,102 @@ void Lease6CmdsTest::testLease6AddComment() {
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
 
-    // Make sure the lease have proper value set.
+    // Make sure the lease has proper value set.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->duid_->toText());
     ASSERT_TRUE(l->getContext());
     EXPECT_EQ("{ \"comment\": \"a comment\" }", l->getContext()->str());
 }
 
-void Lease6CmdsTest::testLease6GetByAddrNotFound() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true);
-
-    // Now send the command.
-    string cmd =
-        "{\n"
-        "    \"command\": \"lease6-get\",\n"
-        "    \"arguments\": {"
-        "        \"subnet-id\": 1,\n"
-        "        \"ip-address\": \"2001:db8:1::10\"\n"
-        "    }\n"
-        "}";
-    string exp_rsp = "Lease not found.";
-
-    // Note the status expected is empty. The query completed correctly,
-    // just didn't found the lease.
-    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
-}
+void Lease6CmdsTest::testLease6AddExtendedInfo() {
+    // Initialize lease manager (true = v6, false = don't add leases)
+    initLeaseMgr(true, false);
 
-void Lease6CmdsTest::testLease6GetByClientIdInvalidType() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true);
+    checkLease6Stats(66, 0, 0, 0);
 
-    // client-id query is allowed in v4 only.
-    string cmd =
-        "{\n"
-        "    \"command\": \"lease6-get\",\n"
-        "    \"arguments\": {"
-        "        \"identifier-type\": \"client-id\","
-        "        \"identifier\": \"01:02:03:04\","
-        "        \"subnet-id\": 44"
-        "    }\n"
-        "}";
-    string exp_rsp = "Query by client-id is not allowed in v6.";
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
-}
+    checkLease6Stats(99, 0, 0, 0);
 
-void Lease6CmdsTest::testLease6GetByDuidNotFound() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true);
+    Lease6Collection leases;
+    vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
+    leases = lmptr_->getLeases6ByRemoteId(remote_id,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          0,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          LeasePageSize(10));
+    EXPECT_TRUE(leases.empty());
+    vector<uint8_t> relay_bin(8, 0x64);
+    DuidPtr relay_id(new DUID(relay_bin));
+    leases = lmptr_->getLeases6ByRelayId(*relay_id,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         0,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         LeasePageSize(10));
+    EXPECT_TRUE(leases.empty());
 
     // Now send the command.
-    string cmd =
+    string txt =
         "{\n"
-        "    \"command\": \"lease6-get\",\n"
+        "    \"command\": \"lease6-add\",\n"
         "    \"arguments\": {"
-        "        \"subnet-id\": 1,\n"
-        "        \"identifier-type\": \"duid\","
-        "        \"identifier\": \"00:01:02:03:04:05:06:07\"\n"
+        "        \"subnet-id\": 66,\n"
+        "        \"ip-address\": \"2001:db8:1::1\",\n"
+        "        \"iaid\": 7654321,\n"
+        "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
+        "        \"hostname\": \"newhostname.example.org\",\n"
+        "        \"user-context\": { \"ISC\": { \"relay-info\": [ {\n"
+        "          \"remote-id\": \"010203040506\",\n"
+        "          \"relay-id\": \"6464646464646464\" } ] } }\n"
         "    }\n"
         "}";
-    string exp_rsp = "Lease not found.";
+    string exp_rsp = "Lease for address 2001:db8:1::1, subnet-id 66 added.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Note the status expected is empty. The query completed correctly,
-    // just didn't found the lease.
-    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
-}
+    checkLease6Stats(66, 1, 0, 0);
 
-void Lease6CmdsTest::testLease6GetByAddr() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true);
+    checkLease6Stats(99, 0, 0, 0);
 
-    // Now send the command.
-    string cmd =
-        "{\n"
-        "    \"command\": \"lease6-get\",\n"
-        "    \"arguments\": {\n"
-        "        \"ip-address\": \"2001:db8:1::1\"\n"
-        "    }\n"
-        "}";
-    string exp_rsp = "IPv6 lease found.";
+    // Now check that the lease is really there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
 
-    // The status expected is success. The lease should be returned.
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
-    ASSERT_TRUE(rsp);
+    // Make sure the lease has proper value set.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_EQ(7654321, l->iaid_);
 
-    ConstElementPtr lease = rsp->get("arguments");
-    ASSERT_TRUE(lease);
+    // Check the user context / extended info too.
+    ConstElementPtr ctx = l->getContext();
+    ASSERT_TRUE(ctx);
+    string expected = "{ \"ISC\": { \"relay-info\": ";
+    expected += "[ { \"relay-id\": \"6464646464646464\", ";
+    expected += "\"remote-id\": \"010203040506\" } ] } }";
+    EXPECT_EQ(expected, ctx->str());
 
-    // Now check that the lease was indeed returned.
-    checkLease6(lease, "2001:db8:1::1", 0, 66, "42:42:42:42:42:42:42:42", false);
+    // Check that BLQ tables were updated.
+    leases = lmptr_->getLeases6ByRemoteId(remote_id,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          0,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          LeasePageSize(10));
+    // The lease must be retrieved from the remote id table.
+    ASSERT_EQ(1, leases.size());
+    Lease6Ptr lx = leases[0];
+    ASSERT_TRUE(lx);
+    EXPECT_EQ(IOAddress("2001:db8:1::1"), lx->addr_);
+    EXPECT_EQ(*l, *lx);
+
+    // The lease must be retrieved from the relay id table.
+    leases = lmptr_->getLeases6ByRelayId(*relay_id,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         0,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         LeasePageSize(10));
+    ASSERT_EQ(1, leases.size());
+    lx = leases[0];
+    ASSERT_TRUE(lx);
+    EXPECT_EQ(IOAddress("2001:db8:1::1"), lx->addr_);
+    EXPECT_EQ(*l, *lx);
 }
 
 void Lease6CmdsTest::testLease6GetMissingParams() {
@@ -1265,6 +1303,91 @@ void Lease6CmdsTest::testLease6GetByAddrBadParam() {
     testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
 }
 
+void Lease6CmdsTest::testLease6GetByAddrNotFound() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true);
+
+    // Invalid
+    string cmd =
+        "{\n"
+        "    \"command\": \"lease6-get\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 1,\n"
+        "        \"ip-address\": \"2001:db8:1::10\"\n"
+        "    }\n"
+        "}";
+    string exp_rsp = "Lease not found.";
+
+    // Note the status expected is empty. The query completed correctly,
+    // just didn't found the lease.
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+}
+
+void Lease6CmdsTest::testLease6GetByClientIdInvalidType() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true);
+
+    // client-id query is allowed in v4 only.
+    string cmd =
+        "{\n"
+        "    \"command\": \"lease6-get\",\n"
+        "    \"arguments\": {"
+        "        \"identifier-type\": \"client-id\","
+        "        \"identifier\": \"01:02:03:04\","
+        "        \"subnet-id\": 44"
+        "    }\n"
+        "}";
+    string exp_rsp = "Query by client-id is not allowed in v6.";
+    testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
+}
+
+void Lease6CmdsTest::testLease6GetByDuidNotFound() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true);
+
+    // Now send the command.
+    string cmd =
+        "{\n"
+        "    \"command\": \"lease6-get\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 1,\n"
+        "        \"identifier-type\": \"duid\","
+        "        \"identifier\": \"00:01:02:03:04:05:06:07\"\n"
+        "    }\n"
+        "}";
+    string exp_rsp = "Lease not found.";
+
+    // Note the status expected is empty. The query completed correctly,
+    // just didn't found the lease.
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+}
+
+void Lease6CmdsTest::testLease6GetByAddr() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true);
+
+    // Now send the command.
+    string cmd =
+        "{\n"
+        "    \"command\": \"lease6-get\",\n"
+        "    \"arguments\": {\n"
+        "        \"ip-address\": \"2001:db8:1::1\"\n"
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv6 lease found.";
+
+    // The status expected is success. The lease should be returned.
+    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    // Now check that the lease parameters were indeed returned.
+    ASSERT_TRUE(rsp);
+
+    ConstElementPtr lease = rsp->get("arguments");
+    ASSERT_TRUE(lease);
+
+    // Now check that the lease was indeed returned.
+    checkLease6(lease, "2001:db8:1::1", 0, 66, "42:42:42:42:42:42:42:42", false);
+}
 void Lease6CmdsTest::testLease6GetByAddrPrefix() {
     // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
@@ -1290,6 +1413,8 @@ void Lease6CmdsTest::testLease6GetByAddrPrefix() {
 
     // The status expected is success. The lease should be returned.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    // Now check that the lease parameters were indeed returned.
     ASSERT_TRUE(rsp);
 
     ConstElementPtr lease = rsp->get("arguments");
@@ -1318,6 +1443,8 @@ void Lease6CmdsTest::testLease6GetByDuid() {
 
     // The status expected is success. The lease should be returned.
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    // Now check that the lease parameters were indeed returned.
     ASSERT_TRUE(rsp);
 
     ConstElementPtr lease = rsp->get("arguments");
@@ -1352,7 +1479,7 @@ void Lease6CmdsTest::testLease6GetAll() {
 
     // Let's check if the response contains desired leases.
     checkLease6(leases, "2001:db8:1::1", 0, 66, "42:42:42:42:42:42:42:42", false);
-    checkLease6(leases, "2001:db8:1::2", 0, 66, "56:56:56:56:56:56:56:56", false);
+    checkLease6(leases, "2001:db8:1::2", 0, 66, "56:56:56:56:56:56:56:56", false, 5);
     checkLease6(leases, "2001:db8:2::1", 0, 99, "42:42:42:42:42:42:42:42", false);
     checkLease6(leases, "2001:db8:2::2", 0, 99, "56:56:56:56:56:56:56:56", false);
 }
@@ -1412,7 +1539,7 @@ void Lease6CmdsTest::testLease6GetAllBySubnetId() {
 
     // Let's check if the response contains desired leases.
     checkLease6(leases, "2001:db8:1::1", 0, 66, "42:42:42:42:42:42:42:42", false);
-    checkLease6(leases, "2001:db8:1::2", 0, 66, "56:56:56:56:56:56:56:56", false);
+    checkLease6(leases, "2001:db8:1::2", 0, 66, "56:56:56:56:56:56:56:56", false, 5);
 }
 
 void Lease6CmdsTest::testLease6GetAllBySubnetIdNoLeases() {
@@ -1473,7 +1600,7 @@ void Lease6CmdsTest::testLease6GetAllByMultipleSubnetIds() {
 
     // Let's check if the response contains desired leases.
     checkLease6(leases, "2001:db8:1::1", 0, 66, "42:42:42:42:42:42:42:42", false);
-    checkLease6(leases, "2001:db8:1::2", 0, 66, "56:56:56:56:56:56:56:56", false);
+    checkLease6(leases, "2001:db8:1::2", 0, 66, "56:56:56:56:56:56:56:56", false, 5);
     checkLease6(leases, "2001:db8:2::1", 0, 99, "42:42:42:42:42:42:42:42", false);
     checkLease6(leases, "2001:db8:2::2", 0, 99, "56:56:56:56:56:56:56:56", false);
 }
@@ -1590,8 +1717,12 @@ void Lease6CmdsTest::testLease6GetPaged() {
                 Lease6Ptr from_mgr = LeaseMgrFactory::instance().getLease6(Lease::TYPE_NA,
                                                                            IOAddress(last_address));
                 ASSERT_TRUE(from_mgr);
+                uint32_t pool_id = 0;
+                if (last_address == "2001:db8:1::2") {
+                    pool_id = 5;
+                }
                 checkLease6(leases, last_address, 0, from_mgr->subnet_id_,
-                            from_mgr->duid_->toText(), false);
+                            from_mgr->duid_->toText(), false, pool_id);
             }
 
         } else {
@@ -1888,7 +2019,7 @@ void Lease6CmdsTest::testLease6UpdateMissingParams() {
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
-    // Everything missing. What sort of crap is that?
+    // Everything missing. What sort of nonsense is that?
     string txt =
         "{\n"
         "    \"command\": \"lease6-update\",\n"
@@ -1899,7 +2030,7 @@ void Lease6CmdsTest::testLease6UpdateMissingParams() {
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
     // Just ip is not enough (subnet-id and duid missing, although
-    // kea should be able to figure out the subnet-id on its own.
+    // Kea should be able to figure out the subnet-id on its own.
     txt =
         "{\n"
         "    \"command\": \"lease6-update\",\n"
@@ -1992,7 +2123,7 @@ void Lease6CmdsTest::testLease6UpdateBadParams() {
     exp_rsp = "The address 3000::1 does not belong to subnet 2001:db8:1::/48, subnet-id=66";
     testCommand(txt, CONTROL_RESULT_CONFLICT, exp_rsp);
 
-    // Nope, can't do v4 address in v6 lease.
+    // v4? You're a time traveler from early 80s or what?
     txt =
         "{\n"
         "    \"command\": \"lease6-update\",\n"
@@ -2055,13 +2186,13 @@ void Lease6CmdsTest::testLease6UpdateBadParams() {
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 }
 
-void Lease6CmdsTest::testLease6Update() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true);
+void Lease6CmdsTest::testLease6UpdateNoLease() {
+    // Initialize lease manager (true = v6, false = don't add leases)
+    initLeaseMgr(true, false);
 
-    checkLease6Stats(66, 2, 0, 0);
+    checkLease6Stats(66, 0, 0, 0);
 
-    checkLease6Stats(99, 2, 0, 0);
+    checkLease6Stats(99, 0, 0, 0);
 
     // Now send the command.
     string txt =
@@ -2075,26 +2206,17 @@ void Lease6CmdsTest::testLease6Update() {
         "        \"hostname\": \"newhostname.example.org\""
         "    }\n"
         "}";
-    string exp_rsp = "IPv6 lease updated.";
-    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
-
-    checkLease6Stats(66, 2, 0, 0);
-
-    checkLease6Stats(99, 2, 0, 0);
+    string exp_rsp = "failed to update the lease with address 2001:db8:1::1 "
+        "either because the lease has been deleted or it has changed in the "
+        "database, in both cases a retry might succeed";
+    testCommand(txt, CONTROL_RESULT_CONFLICT, exp_rsp);
 
-    // Now check that the lease is really there.
-    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
-    ASSERT_TRUE(l);
+    checkLease6Stats(66, 0, 0, 0);
 
-    // Make sure the lease has been updated.
-    ASSERT_TRUE(l->duid_);
-    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
-    EXPECT_EQ("newhostname.example.org", l->hostname_);
-    EXPECT_EQ(7654321, l->iaid_);
-    EXPECT_FALSE(l->getContext());
+    checkLease6Stats(99, 0, 0, 0);
 }
 
-void Lease6CmdsTest::testLease6UpdateExtendedInfo() {
+void Lease6CmdsTest::testLease6Update() {
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
@@ -2102,23 +2224,6 @@ void Lease6CmdsTest::testLease6UpdateExtendedInfo() {
 
     checkLease6Stats(99, 2, 0, 0);
 
-    Lease6Collection leases;
-    vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
-    leases = lmptr_->getLeases6ByRemoteId(remote_id,
-                                          IOAddress::IPV6_ZERO_ADDRESS(),
-                                          0,
-                                          IOAddress::IPV6_ZERO_ADDRESS(),
-                                          LeasePageSize(10));
-    EXPECT_TRUE(leases.empty());
-    vector<uint8_t> relay_bin(8, 0x64);
-    DuidPtr relay_id(new DUID(relay_bin));
-    leases = lmptr_->getLeases6ByRelayId(*relay_id,
-                                         IOAddress::IPV6_ZERO_ADDRESS(),
-                                         0,
-                                         IOAddress::IPV6_ZERO_ADDRESS(),
-                                         LeasePageSize(10));
-    EXPECT_TRUE(leases.empty());
-
     // Now send the command.
     string txt =
         "{\n"
@@ -2128,10 +2233,8 @@ void Lease6CmdsTest::testLease6UpdateExtendedInfo() {
         "        \"ip-address\": \"2001:db8:1::1\",\n"
         "        \"iaid\": 7654321,\n"
         "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
-        "        \"hostname\": \"newhostname.example.org\",\n"
-        "        \"user-context\": { \"ISC\": { \"relay-info\": [ {\n"
-        "          \"remote-id\": \"010203040506\",\n"
-        "          \"relay-id\": \"6464646464646464\" } ] } }\n"
+        "        \"pool-id\": 3,\n"
+        "        \"hostname\": \"newhostname.example.org\""
         "    }\n"
         "}";
     string exp_rsp = "IPv6 lease updated.";
@@ -2148,41 +2251,10 @@ void Lease6CmdsTest::testLease6UpdateExtendedInfo() {
     // Make sure the lease has been updated.
     ASSERT_TRUE(l->duid_);
     EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ(3, l->pool_id_);
     EXPECT_EQ("newhostname.example.org", l->hostname_);
     EXPECT_EQ(7654321, l->iaid_);
-
-    // Check the user context / extended info too.
-    ConstElementPtr ctx = l->getContext();
-    ASSERT_TRUE(ctx);
-    string expected = "{ \"ISC\": { \"relay-info\": ";
-    expected += "[ { \"relay-id\": \"6464646464646464\", ";
-    expected += "\"remote-id\": \"010203040506\" } ] } }";
-    EXPECT_EQ(expected, ctx->str());
-
-    // Check that BLQ tables were updated.
-    leases = lmptr_->getLeases6ByRemoteId(remote_id,
-                                          IOAddress::IPV6_ZERO_ADDRESS(),
-                                          0,
-                                          IOAddress::IPV6_ZERO_ADDRESS(),
-                                          LeasePageSize(10));
-    // The lease must be retrieved from the remote id table.
-    ASSERT_EQ(1, leases.size());
-    Lease6Ptr lx = leases[0];
-    ASSERT_TRUE(lx);
-    EXPECT_EQ(IOAddress("2001:db8:1::1"), lx->addr_);
-    EXPECT_EQ(*l, *lx);
-
-    // The lease must be retrieved from the relay id table.
-    leases = lmptr_->getLeases6ByRelayId(*relay_id,
-                                         IOAddress::IPV6_ZERO_ADDRESS(),
-                                         0,
-                                         IOAddress::IPV6_ZERO_ADDRESS(),
-                                         LeasePageSize(10));
-    ASSERT_EQ(1, leases.size());
-    lx = leases[0];
-    ASSERT_TRUE(lx);
-    EXPECT_EQ(IOAddress("2001:db8:1::1"), lx->addr_);
-    EXPECT_EQ(*l, *lx);
+    EXPECT_FALSE(l->getContext());
 }
 
 void Lease6CmdsTest::testLease6UpdateDeclinedLeases() {
@@ -2202,6 +2274,7 @@ void Lease6CmdsTest::testLease6UpdateDeclinedLeases() {
         "        \"ip-address\": \"2001:db8:1::1\",\n"
         "        \"iaid\": 7654321,\n"
         "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
+        "        \"pool-id\": 3,\n"
         "        \"hostname\": \"newhostname.example.org\""
         "    }\n"
         "}";
@@ -2212,13 +2285,14 @@ void Lease6CmdsTest::testLease6UpdateDeclinedLeases() {
 
     checkLease6Stats(99, 2, 2, 0);
 
-    // Now check that the lease is really there.
+    // Now check that the lease is still there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     ASSERT_TRUE(l);
 
     // Make sure the lease has been updated.
     ASSERT_TRUE(l->duid_);
     EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ(3, l->pool_id_);
     EXPECT_EQ("newhostname.example.org", l->hostname_);
     EXPECT_EQ(7654321, l->iaid_);
     EXPECT_FALSE(l->getContext());
@@ -2250,135 +2324,60 @@ void Lease6CmdsTest::testLease6UpdateNoSubnetId() {
 
     checkLease6Stats(99, 2, 0, 0);
 
-    // Now check that the lease is really there.
-    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
-    ASSERT_TRUE(l);
-
-    // Make sure the subnet-id is correct.
-    EXPECT_EQ(66, l->subnet_id_);
-
-    // Make sure the lease has been updated.
-    ASSERT_TRUE(l->duid_);
-    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
-    EXPECT_EQ("newhostname.example.org", l->hostname_);
-    EXPECT_EQ(7654321, l->iaid_);
-    EXPECT_FALSE(l->getContext());
-}
-
-void Lease6CmdsTest::testLease6UpdateNoSubnetIdDeclinedLeases() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true, true);
-
-    checkLease6Stats(66, 2, 2, 0);
-
-    checkLease6Stats(99, 2, 2, 0);
-
-    // Now send the command.
-    string txt =
-        "{\n"
-        "    \"command\": \"lease6-update\",\n"
-        "    \"arguments\": {"
-        "        \"ip-address\": \"2001:db8:1::1\",\n"
-        "        \"iaid\": 7654321,\n"
-        "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
-        "        \"hostname\": \"newhostname.example.org\""
-        "    }\n"
-        "}";
-    string exp_rsp = "IPv6 lease updated.";
-    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
-
-    checkLease6Stats(66, 2, 1, 0);
-
-    checkLease6Stats(99, 2, 2, 0);
-
-    // Now check that the lease is really there.
-    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
-    ASSERT_TRUE(l);
-
-    // Make sure the subnet-id is correct.
-    EXPECT_EQ(66, l->subnet_id_);
-
-    // Make sure the lease has been updated.
-    ASSERT_TRUE(l->duid_);
-    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
-    EXPECT_EQ("newhostname.example.org", l->hostname_);
-    EXPECT_EQ(7654321, l->iaid_);
-    EXPECT_FALSE(l->getContext());
-}
-
-void Lease6CmdsTest::testLease6UpdateComment() {
-    // Initialize lease manager (true = v6, true = add leases)
-    initLeaseMgr(true, true);
-
-    checkLease6Stats(66, 2, 0, 0);
-
-    checkLease6Stats(99, 2, 0, 0);
-
-    // Now send the command.
-    string txt =
-        "{\n"
-        "    \"command\": \"lease6-update\",\n"
-        "    \"arguments\": {"
-        "        \"subnet-id\": 66,\n"
-        "        \"ip-address\": \"2001:db8:1::1\",\n"
-        "        \"iaid\": 42,\n"
-        "        \"duid\": \"42:42:42:42:42:42:42:42\",\n"
-        "        \"comment\": \"a comment\",\n"
-        "        \"user-context\": { \"foobar\": true }\n"
-        "    }\n"
-        "}";
-    string exp_rsp = "IPv6 lease updated.";
-    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
-
-    checkLease6Stats(66, 2, 0, 0);
-
-    checkLease6Stats(99, 2, 0, 0);
-
-    // Now check that the lease is really there.
-    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
-    ASSERT_TRUE(l);
-
-    // Make sure the lease has been updated.
-    ASSERT_TRUE(l->duid_);
-
-    // Check user context.
-    ConstElementPtr ctx = l->getContext();
-    ASSERT_TRUE(ctx);
-    EXPECT_EQ(2, ctx->size());
-    ASSERT_TRUE(ctx->contains("comment"));
-    EXPECT_EQ("\"a comment\"", ctx->get("comment")->str());
-    ASSERT_TRUE(ctx->contains("foobar"));
-    EXPECT_EQ("true", ctx->get("foobar")->str());
+    // Now check that the lease is still there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
+
+    // Make sure the subnet-id is correct.
+    EXPECT_EQ(66, l->subnet_id_);
+
+    // Make sure the lease has been updated.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_EQ(7654321, l->iaid_);
+    EXPECT_FALSE(l->getContext());
 }
 
-void Lease6CmdsTest::testLease6UpdateNoLease() {
-    // Initialize lease manager (true = v6, false = don't add leases)
-    initLeaseMgr(true, false);
+void Lease6CmdsTest::testLease6UpdateNoSubnetIdDeclinedLeases() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true, true);
 
-    checkLease6Stats(66, 0, 0, 0);
+    checkLease6Stats(66, 2, 2, 0);
 
-    checkLease6Stats(99, 0, 0, 0);
+    checkLease6Stats(99, 2, 2, 0);
 
     // Now send the command.
     string txt =
         "{\n"
         "    \"command\": \"lease6-update\",\n"
         "    \"arguments\": {"
-        "        \"subnet-id\": 66,\n"
         "        \"ip-address\": \"2001:db8:1::1\",\n"
         "        \"iaid\": 7654321,\n"
         "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
         "        \"hostname\": \"newhostname.example.org\""
         "    }\n"
         "}";
-    string exp_rsp = "failed to update the lease with address 2001:db8:1::1 "
-        "either because the lease has been deleted or it has changed in the "
-        "database, in both cases a retry might succeed";
-    testCommand(txt, CONTROL_RESULT_CONFLICT, exp_rsp);
+    string exp_rsp = "IPv6 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    checkLease6Stats(66, 0, 0, 0);
+    checkLease6Stats(66, 2, 1, 0);
 
-    checkLease6Stats(99, 0, 0, 0);
+    checkLease6Stats(99, 2, 2, 0);
+
+    // Now check that the lease is really there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
+
+    // Make sure the subnet-id is correct.
+    EXPECT_EQ(66, l->subnet_id_);
+
+    // Make sure the lease has been updated.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_EQ(7654321, l->iaid_);
+    EXPECT_FALSE(l->getContext());
 }
 
 void Lease6CmdsTest::testLease6UpdateForceCreate() {
@@ -2494,6 +2493,143 @@ void Lease6CmdsTest::testLease6UpdateDoNotForceCreate() {
     checkLease6Stats(99, 0, 0, 0);
 }
 
+void Lease6CmdsTest::testLease6UpdateComment() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true);
+
+    checkLease6Stats(66, 2, 0, 0);
+
+    checkLease6Stats(99, 2, 0, 0);
+
+    // Now send the command.
+    string txt =
+        "{\n"
+        "    \"command\": \"lease6-update\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 66,\n"
+        "        \"ip-address\": \"2001:db8:1::1\",\n"
+        "        \"iaid\": 42,\n"
+        "        \"duid\": \"42:42:42:42:42:42:42:42\",\n"
+        "        \"comment\": \"a comment\",\n"
+        "        \"user-context\": { \"foobar\": true }\n"
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv6 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    checkLease6Stats(66, 2, 0, 0);
+
+    checkLease6Stats(99, 2, 0, 0);
+
+    // Now check that the lease is really there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
+
+    // Make sure the lease has been updated.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("42:42:42:42:42:42:42:42", l->duid_->toText());
+
+    // Check user context.
+    ConstElementPtr ctx = l->getContext();
+    ASSERT_TRUE(ctx);
+    EXPECT_EQ(2, ctx->size());
+    ASSERT_TRUE(ctx->contains("comment"));
+    EXPECT_EQ("\"a comment\"", ctx->get("comment")->str());
+    ASSERT_TRUE(ctx->contains("foobar"));
+    EXPECT_EQ("true", ctx->get("foobar")->str());
+}
+
+void Lease6CmdsTest::testLease6UpdateExtendedInfo() {
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true);
+
+    checkLease6Stats(66, 2, 0, 0);
+
+    checkLease6Stats(99, 2, 0, 0);
+
+    Lease6Collection leases;
+    vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
+    leases = lmptr_->getLeases6ByRemoteId(remote_id,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          0,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          LeasePageSize(10));
+    EXPECT_TRUE(leases.empty());
+    vector<uint8_t> relay_bin(8, 0x64);
+    DuidPtr relay_id(new DUID(relay_bin));
+    leases = lmptr_->getLeases6ByRelayId(*relay_id,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         0,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         LeasePageSize(10));
+    EXPECT_TRUE(leases.empty());
+
+    // Now send the command.
+    string txt =
+        "{\n"
+        "    \"command\": \"lease6-update\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 66,\n"
+        "        \"ip-address\": \"2001:db8:1::1\",\n"
+        "        \"iaid\": 7654321,\n"
+        "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
+        "        \"hostname\": \"newhostname.example.org\",\n"
+        "        \"user-context\": { \"ISC\": { \"relay-info\": [ {\n"
+        "          \"remote-id\": \"010203040506\",\n"
+        "          \"relay-id\": \"6464646464646464\" } ] } }\n"
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv6 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    checkLease6Stats(66, 2, 0, 0);
+
+    checkLease6Stats(99, 2, 0, 0);
+
+    // Now check that the lease is really there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
+
+    // Make sure the lease has been updated.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_EQ(7654321, l->iaid_);
+
+    // Check the user context / extended info too.
+    ConstElementPtr ctx = l->getContext();
+    ASSERT_TRUE(ctx);
+    string expected = "{ \"ISC\": { \"relay-info\": ";
+    expected += "[ { \"relay-id\": \"6464646464646464\", ";
+    expected += "\"remote-id\": \"010203040506\" } ] } }";
+    EXPECT_EQ(expected, ctx->str());
+
+    // Check that BLQ tables were updated.
+    leases = lmptr_->getLeases6ByRemoteId(remote_id,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          0,
+                                          IOAddress::IPV6_ZERO_ADDRESS(),
+                                          LeasePageSize(10));
+    // The lease must be retrieved from the remote id table.
+    ASSERT_EQ(1, leases.size());
+    Lease6Ptr lx = leases[0];
+    ASSERT_TRUE(lx);
+    EXPECT_EQ(IOAddress("2001:db8:1::1"), lx->addr_);
+    EXPECT_EQ(*l, *lx);
+
+    // The lease must be retrieved from the relay id table.
+    leases = lmptr_->getLeases6ByRelayId(*relay_id,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         0,
+                                         IOAddress::IPV6_ZERO_ADDRESS(),
+                                         LeasePageSize(10));
+    ASSERT_EQ(1, leases.size());
+    lx = leases[0];
+    ASSERT_TRUE(lx);
+    EXPECT_EQ(IOAddress("2001:db8:1::1"), lx->addr_);
+    EXPECT_EQ(*l, *lx);
+}
+
 void Lease6CmdsTest::testLease6DelMissingParams() {
     // No parameters whatsoever. You want just a lease, any lease?
     string cmd =
@@ -2692,6 +2828,10 @@ void Lease6CmdsTest::testLease6DelByAddrBadParam() {
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    checkLease6Stats(66, 2, 0, 0);
+
+    checkLease6Stats(99, 2, 0, 0);
+
     // Invalid family
     string cmd =
         "{\n"
@@ -2703,6 +2843,10 @@ void Lease6CmdsTest::testLease6DelByAddrBadParam() {
     string exp_rsp = "Invalid IPv6 address specified: 192.0.2.1";
     testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
 
+    checkLease6Stats(66, 2, 0, 0);
+
+    checkLease6Stats(99, 2, 0, 0);
+
     // This is way off
     cmd =
         "{\n"
@@ -3510,7 +3654,7 @@ void Lease6CmdsTest::testLease6ResendDdnsNoLease() {
         "    }\n"
         "}\n";
     string exp_rsp = "No lease found for: 2001::dead:beef";
-    ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+    testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 }
 
 void Lease6CmdsTest::testLease6ResendNoHostname() {
@@ -3777,6 +3921,7 @@ void Lease6CmdsTest::testLease6DnsRemoveD2Disabled() {
     ASSERT_FALSE(lease);
 }
 
+// Verify that v4 lease add handles conflict as expected.
 void Lease6CmdsTest::testLease6ConflictingAdd() {
     MultiThreadingTest mt(true);
 
@@ -3825,7 +3970,7 @@ void Lease6CmdsTest::testLease6ConflictingUpdate() {
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
-    // Verify lease stats show leases.
+    // Verify stats show no leases.
     checkLease6Stats(66, 2, 0, 0);
 
     // Make sure the lease exists.
@@ -3930,6 +4075,9 @@ void Lease6CmdsTest::testLease6ConflictingBulkApplyAdd() {
 }
 
 void Lease6CmdsTest::testLease6Write() {
+    // lease4-write negative tests. Positive tests are in the
+    // memfile_lease_mgr_unittest.cc file.
+
     // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
 
@@ -4083,6 +4231,33 @@ TEST_F(Lease6CmdsTest, lease6AddCommentMultiThreading) {
     testLease6AddComment();
 }
 
+TEST_F(Lease6CmdsTest, lease6AddExtendedInfo) {
+    testLease6AddExtendedInfo();
+}
+
+TEST_F(Lease6CmdsTest, lease6AddExtendedInfoMultiThreading) {
+    MultiThreadingTest mt(true);
+    testLease6AddExtendedInfo();
+}
+
+TEST_F(Lease6CmdsTest, lease6GetMissingParams) {
+    testLease6GetMissingParams();
+}
+
+TEST_F(Lease6CmdsTest, lease6GetMissingParamsMultiThreading) {
+    MultiThreadingTest mt(true);
+    testLease6GetMissingParams();
+}
+
+TEST_F(Lease6CmdsTest, lease6GetByAddrBadParam) {
+    testLease6GetByAddrBadParam();
+}
+
+TEST_F(Lease6CmdsTest, lease6GetByAddrBadParamMultiThreading) {
+    MultiThreadingTest mt(true);
+    testLease6GetByAddrBadParam();
+}
+
 TEST_F(Lease6CmdsTest, lease6GetByAddrNotFound) {
     testLease6GetByAddrNotFound();
 }
@@ -4119,24 +4294,6 @@ TEST_F(Lease6CmdsTest, lease6GetByAddrMultiThreading) {
     testLease6GetByAddr();
 }
 
-TEST_F(Lease6CmdsTest, lease6GetMissingParams) {
-    testLease6GetMissingParams();
-}
-
-TEST_F(Lease6CmdsTest, lease6GetMissingParamsMultiThreading) {
-    MultiThreadingTest mt(true);
-    testLease6GetMissingParams();
-}
-
-TEST_F(Lease6CmdsTest, lease6GetByAddrBadParam) {
-    testLease6GetByAddrBadParam();
-}
-
-TEST_F(Lease6CmdsTest, lease6GetByAddrBadParamMultiThreading) {
-    MultiThreadingTest mt(true);
-    testLease6GetByAddrBadParam();
-}
-
 TEST_F(Lease6CmdsTest, lease6GetByAddrPrefix) {
     testLease6GetByAddrPrefix();
 }
@@ -4344,12 +4501,17 @@ TEST_F(Lease6CmdsTest, lease6UpdateBadParamsMultiThreading) {
     testLease6UpdateBadParams();
 }
 
-TEST_F(Lease6CmdsTest, lease6Update) {
-    testLease6Update();
+TEST_F(Lease6CmdsTest, lease6UpdateNoLease) {
+    testLease6UpdateNoLease();
 }
 
-TEST_F(Lease6CmdsTest, lease6UpdateExtendedInfo) {
-    testLease6UpdateExtendedInfo();
+TEST_F(Lease6CmdsTest, lease6UpdateNoLeaseMultiThreading) {
+    MultiThreadingTest mt(true);
+    testLease6UpdateNoLease();
+}
+
+TEST_F(Lease6CmdsTest, lease6Update) {
+    testLease6Update();
 }
 
 TEST_F(Lease6CmdsTest, lease6UpdateMultiThreading) {
@@ -4393,13 +4555,13 @@ TEST_F(Lease6CmdsTest, lease6UpdateCommentMultiThreading) {
     testLease6UpdateComment();
 }
 
-TEST_F(Lease6CmdsTest, lease6UpdateNoLease) {
-    testLease6UpdateNoLease();
+TEST_F(Lease6CmdsTest, lease6UpdateExtendedInfo) {
+    testLease6UpdateExtendedInfo();
 }
 
-TEST_F(Lease6CmdsTest, lease6UpdateNoLeaseMultiThreading) {
+TEST_F(Lease6CmdsTest, lease6UpdateExtendedInfoMultiThreading) {
     MultiThreadingTest mt(true);
-    testLease6UpdateNoLease();
+    testLease6UpdateExtendedInfo();
 }
 
 TEST_F(Lease6CmdsTest, lease6UpdateForceCreate) {
index b8da1f94d4ede02859d57ea43e7f91ca44b8e3ea..6332ef7dc32fef0df8421d9a29f74f75337a1f39 100644 (file)
@@ -311,7 +311,7 @@ public:
                                       const isc::dhcp::SubnetID& subnet_id,
                                       const uint8_t hw_address_pattern,
                                       const uint8_t client_id_pattern,
-                                      bool declined = false) {
+                                      bool declined = false, uint32_t pool_id = 0) {
         isc::dhcp::Lease4Ptr lease(new isc::dhcp::Lease4());
 
         lease->addr_ = isc::asiolink::IOAddress(ip_address);
@@ -331,6 +331,7 @@ public:
         lease->fqdn_fwd_ = false;
         lease->fqdn_rev_ = true;
         lease->hostname_ = "myhost.example.com.";
+        lease->pool_id_ = pool_id;
 
         return (lease);
     }
@@ -351,7 +352,7 @@ public:
     isc::dhcp::Lease6Ptr createLease6(const std::string& ip_address,
                                       const isc::dhcp::SubnetID& subnet_id,
                                       const uint8_t duid_pattern,
-                                      bool declined = false) {
+                                      bool declined = false, uint32_t pool_id = 0) {
         isc::dhcp::Lease6Ptr lease(new isc::dhcp::Lease6());
 
         lease->addr_ = isc::asiolink::IOAddress(ip_address);
@@ -372,6 +373,7 @@ public:
         lease->fqdn_fwd_ = false;
         lease->fqdn_rev_ = true;
         lease->hostname_ = "myhost.example.com.";
+        lease->pool_id_ = pool_id;
 
         return (lease);
     }
@@ -393,7 +395,7 @@ public:
         if (v6) {
             s << "universe=6 extended-info-tables=true";
         } else {
-            s <<  "universe=4";
+            s << "universe=4";
         }
         isc::dhcp::LeaseMgrFactory::create(s.str());
 
@@ -420,7 +422,7 @@ public:
         if (insert_lease) {
             if (v6) {
                 lmptr_->addLease(createLease6("2001:db8:1::1", 66, 0x42, declined));
-                lmptr_->addLease(createLease6("2001:db8:1::2", 66, 0x56, declined));
+                lmptr_->addLease(createLease6("2001:db8:1::2", 66, 0x56, declined, 5));
                 lmptr_->addLease(createLease6("2001:db8:2::1", 99, 0x42, declined));
                 lmptr_->addLease(createLease6("2001:db8:2::2", 99, 0x56, declined));
                 if (declined) {
@@ -446,7 +448,7 @@ public:
                     int64_t(2));
             } else {
                 lmptr_->addLease(createLease4("192.0.2.1", 44, 0x08, 0x42, declined));
-                lmptr_->addLease(createLease4("192.0.2.2", 44, 0x09, 0x56, declined));
+                lmptr_->addLease(createLease4("192.0.2.2", 44, 0x09, 0x56, declined, 5));
                 lmptr_->addLease(createLease4("192.0.3.1", 88, 0x08, 0x42, declined));
                 lmptr_->addLease(createLease4("192.0.3.2", 88, 0x09, 0x56, declined));
                 if (declined) {
index 61bbe614b0a5165e7370c66e2357ca2d81a893b3..c96a34317cd91cebb0f5f2b2d80a410ecff29d55 100644 (file)
@@ -1793,7 +1793,7 @@ AllocEngine::reuseExpiredLease(Lease6Ptr& expired, ClientContext6& ctx,
     }
 
     if (!ctx.fake_allocation_) {
-        // Add(update) the extended information on the lease.
+        // Add (update) the extended information on the lease.
         updateLease6ExtendedInfo(expired, ctx);
 
         const auto& pool = ctx.subnet_->getPool(ctx.currentIA().type_, expired->addr_, false);
@@ -1986,7 +1986,7 @@ Lease6Ptr AllocEngine::createLease6(ClientContext6& ctx,
     }
 
     if (!ctx.fake_allocation_) {
-        // Add(update) the extended information on the lease.
+        // Add (update) the extended information on the lease.
         updateLease6ExtendedInfo(lease, ctx);
 
         const auto& pool = ctx.subnet_->getPool(ctx.currentIA().type_, lease->addr_, false);
@@ -4237,7 +4237,7 @@ AllocEngine::createLease4(const ClientContext4& ctx, const IOAddress& addr,
     lease->fqdn_rev_ = ctx.rev_dns_update_;
     lease->hostname_ = ctx.hostname_;
 
-    // Add(update) the extended information on the lease.
+    // Add (update) the extended information on the lease.
     static_cast<void>(updateLease4ExtendedInfo(lease, ctx));
 
     // Let's execute all callouts registered for lease4_select
@@ -4910,7 +4910,7 @@ AllocEngine::updateLease4Information(const Lease4Ptr& lease,
         lease->hostname_ = ctx.hostname_;
     }
 
-    // Add(update) the extended information on the lease.
+    // Add (update) the extended information on the lease.
     if (updateLease4ExtendedInfo(lease, ctx)) {
         changed = true;
     }
index 58cc4952071790780f143f412168b2e2c81d0393..b8bf3531d2e8fa3cc456891f600af10fb6490f56 100644 (file)
@@ -186,7 +186,7 @@ Lease::fromElementCommon(const LeasePtr& lease, const data::ConstElementPtr& ele
             isc_throw(BadValue, "pool-id is not an integer");
         }
 
-        if (pool_id->intValue() < 0) {
+        if (pool_id->intValue() <= 0) {
             isc_throw(BadValue, "pool-id " << pool_id->intValue() << " is not"
                       << " a positive integer");
         } else if (pool_id->intValue() > numeric_limits<uint32_t>::max()) {
@@ -386,7 +386,9 @@ Lease4::toElement() const {
     contextToElement(map);
     map->set("ip-address", Element::create(addr_.toText()));
     map->set("subnet-id", Element::create(static_cast<long int>(subnet_id_)));
-    map->set("pool-id", Element::create(static_cast<long int>(pool_id_)));
+    if (pool_id_) {
+        map->set("pool-id", Element::create(static_cast<long int>(pool_id_)));
+    }
     map->set("hw-address", Element::create(hwaddr_->toText(false)));
 
     if (client_id_) {
@@ -617,7 +619,9 @@ Lease6::toElement() const {
     map->set("iaid", Element::create(static_cast<long int>(iaid_)));
     map->set("duid", Element::create(duid_->toText()));
     map->set("subnet-id", Element::create(static_cast<long int>(subnet_id_)));
-    map->set("pool-id", Element::create(static_cast<long int>(pool_id_)));
+    if (pool_id_) {
+        map->set("pool-id", Element::create(static_cast<long int>(pool_id_)));
+    }
 
     map->set("cltt", Element::create(cltt_));
     map->set("preferred-lft", Element::create(static_cast<long int>(preferred_lft_)));
index 4b84ae3cbc90848307497b8afed1e39da9a5ebe1..4b5ea9900738bc318a820c30f5543a9df80dd6d7 100644 (file)
@@ -99,7 +99,7 @@ struct LeaseStatsRow {
     }
 
     /// @brief Less-than operator
-    bool operator< (const LeaseStatsRow &rhs) const {
+    bool operator<(const LeaseStatsRow &rhs) const {
         if (subnet_id_ < rhs.subnet_id_) {
             return (true);
         }
index a452accd8540bbfced26ea63f4ceaf9e365369f4..1e2735c5224f20dd3405bd918c2532a5f9309f75 100644 (file)
@@ -126,6 +126,7 @@ GenericLeaseMgrTest::initializeLease4(std::string address) {
         lease->fqdn_rev_ = true;
         lease->fqdn_fwd_ = true;
         lease->hostname_ = "myhost.example.com.";
+        lease->pool_id_ = 7;
 
     } else if (address == straddress4_[2]) {
         lease->hwaddr_.reset(new HWAddr(vector<uint8_t>(6, 0x2a), HTYPE_ETHER));
@@ -254,6 +255,7 @@ GenericLeaseMgrTest::initializeLease6(std::string address) {
         lease->fqdn_fwd_ = false;
         lease->fqdn_rev_ = true;
         lease->hostname_ = "myhost.example.com.";
+        lease->pool_id_ = 7;
 
     } else if (address == straddress6_[2]) {
         lease->type_ = leasetype6_[2];
@@ -3127,6 +3129,7 @@ GenericLeaseMgrTest::testRecountLeaseStats6() {
     cfg->add(subnet);
 
     ASSERT_NO_THROW(CfgMgr::instance().commit());
+
     // Create the expected stats list.  At this point, the only stat
     // that should be non-zero is total-nas/total-pds.
     for (int i = 0; i < num_subnets; ++i) {
index b63131b8885fe86c1429a118ed8bed52024c40e4..0ed815ade49fe44fedabf9f4d4f4325b671ade63 100644 (file)
@@ -422,7 +422,6 @@ TEST_F(Lease4Test, toElement) {
         "\"ip-address\": \"192.0.2.3\","
         "\"state\": 0,"
         "\"subnet-id\": 789,"
-        "\"pool-id\": 0,"
         "\"user-context\": { \"foobar\": 1234 },"
         "\"valid-lft\": 3600 "
         "}";
@@ -432,6 +431,7 @@ TEST_F(Lease4Test, toElement) {
     // Now let's try with a lease without client-id and user context.
     lease.client_id_.reset();
     lease.setContext(ConstElementPtr());
+    lease.pool_id_ = 5;
 
     expected = "{"
         "\"cltt\": 12345678,"
@@ -442,7 +442,7 @@ TEST_F(Lease4Test, toElement) {
         "\"ip-address\": \"192.0.2.3\","
         "\"state\": 0,"
         "\"subnet-id\": 789,"
-        "\"pool-id\": 0,"
+        "\"pool-id\": 5,"
         "\"valid-lft\": 3600 "
         "}";
 
@@ -461,7 +461,7 @@ TEST_F(Lease4Test, toElement) {
         "\"ip-address\": \"192.0.2.3\","
         "\"state\": 0,"
         "\"subnet-id\": 789,"
-        "\"pool-id\": 0,"
+        "\"pool-id\": 5,"
         "\"valid-lft\": 3600 "
         "}";
 
@@ -546,6 +546,7 @@ TEST_F(Lease4Test, fromElementInvalidValues) {
     testInvalidElement<Lease4>(json, "subnet-id", 0x100000000, false);
     testInvalidElement<Lease4>(json, "pool-id", std::string("xyz"), false);
     testInvalidElement<Lease4>(json, "pool-id", -5, false);
+    testInvalidElement<Lease4>(json, "pool-id", 0, false);
     testInvalidElement<Lease4>(json, "pool-id", 0x100000000, false);
     testInvalidElement<Lease4>(json, "valid-lft", std::string("xyz"));
     testInvalidElement<Lease4>(json, "valid-lft", -3, false);
@@ -1015,7 +1016,6 @@ TEST(Lease6Test, toElementAddress) {
         "\"preferred-lft\": 400,"
         "\"state\": 1,"
         "\"subnet-id\": 5678,"
-        "\"pool-id\": 0,"
         "\"type\": \"IA_NA\","
         "\"user-context\": { \"foobar\": 1234 },"
         "\"valid-lft\": 800"
@@ -1026,6 +1026,7 @@ TEST(Lease6Test, toElementAddress) {
     // Now let's try with a lease without hardware address and user context.
     lease.hwaddr_.reset();
     lease.setContext(ConstElementPtr());
+    lease.pool_id_ = 5;
 
     expected = "{"
         "\"cltt\": 12345678,"
@@ -1038,7 +1039,7 @@ TEST(Lease6Test, toElementAddress) {
         "\"preferred-lft\": 400,"
         "\"state\": 1,"
         "\"subnet-id\": 5678,"
-        "\"pool-id\": 0,"
+        "\"pool-id\": 5,"
         "\"type\": \"IA_NA\","
         "\"valid-lft\": 800"
         "}";
@@ -1060,7 +1061,7 @@ TEST(Lease6Test, toElementAddress) {
         "\"preferred-lft\": 400,"
         "\"state\": 1,"
         "\"subnet-id\": 5678,"
-        "\"pool-id\": 0,"
+        "\"pool-id\": 5,"
         "\"type\": \"IA_NA\","
         "\"valid-lft\": 800"
         "}";
@@ -1117,9 +1118,6 @@ TEST(Lease6Test, toElementPrefix) {
     ASSERT_TRUE(l->contains("subnet-id"));
     EXPECT_EQ(5678, l->get("subnet-id")->intValue());
 
-    ASSERT_TRUE(l->contains("pool-id"));
-    EXPECT_EQ(0, l->get("pool-id")->intValue());
-
     ASSERT_TRUE(l->contains("state"));
     EXPECT_EQ(static_cast<int>(Lease::STATE_DEFAULT),
               l->get("state")->intValue());
@@ -1136,15 +1134,23 @@ TEST(Lease6Test, toElementPrefix) {
     ASSERT_TRUE(l->contains("user-context"));
     EXPECT_EQ("{ \"foobar\": 1234 }", l->get("user-context")->str());
 
+    ASSERT_FALSE(l->contains("pool-id"));
+
     // Now let's try with a lease without hardware address or user context.
     lease.hwaddr_.reset();
     lease.setContext(ConstElementPtr());
+    lease.pool_id_ = 5;
+
     l = lease.toElement();
     EXPECT_FALSE(l->contains("hw-address"));
     EXPECT_FALSE(l->contains("user-context"));
 
+    ASSERT_TRUE(l->contains("pool-id"));
+    EXPECT_EQ(5, l->get("pool-id")->intValue());
+
     // And to finish try with a comment.
     lease.setContext(Element::fromJSON("{ \"comment\": \"a comment\" }"));
+
     l = lease.toElement();
     EXPECT_FALSE(l->contains("hw-address"));
     ConstElementPtr ctx = l->get("user-context");
@@ -1153,6 +1159,9 @@ TEST(Lease6Test, toElementPrefix) {
     EXPECT_EQ(1, ctx->size());
     ASSERT_TRUE(ctx->contains("comment"));
     EXPECT_EQ("a comment", ctx->get("comment")->stringValue());
+
+    ASSERT_TRUE(l->contains("pool-id"));
+    EXPECT_EQ(5, l->get("pool-id")->intValue());
 }
 
 // Verify that the IA_NA can be created from JSON.
@@ -1302,6 +1311,7 @@ TEST(Lease6Test, fromElementInvalidValues) {
     testInvalidElement<Lease6>(json, "subnet-id", 0x100000000, false);
     testInvalidElement<Lease6>(json, "pool-id", std::string("xyz"), false);
     testInvalidElement<Lease6>(json, "pool-id", -5, false);
+    testInvalidElement<Lease6>(json, "pool-id", 0, false);
     testInvalidElement<Lease6>(json, "pool-id", 0x100000000, false);
     testInvalidElement<Lease6>(json, "type", std::string("IA_XY"));
     testInvalidElement<Lease6>(json, "type", -3, false);
index 4fe7d86d9316ef1d43ae8af1b03290dc5ec9f323..14edc7dd9bab693089ecca1b41f0b5664e26f067 100644 (file)
@@ -53,6 +53,7 @@ detailCompareLease(const Lease4Ptr& first, const Lease4Ptr& second) {
     EXPECT_EQ(first->valid_lft_, second->valid_lft_);
     EXPECT_EQ(first->cltt_, second->cltt_);
     EXPECT_EQ(first->subnet_id_, second->subnet_id_);
+    EXPECT_EQ(first->pool_id_, second->pool_id_);
     EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_);
     EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_);
     EXPECT_EQ(first->hostname_, second->hostname_);
@@ -86,6 +87,7 @@ detailCompareLease(const Lease6Ptr& first, const Lease6Ptr& second) {
     EXPECT_EQ(first->valid_lft_, second->valid_lft_);
     EXPECT_EQ(first->cltt_, second->cltt_);
     EXPECT_EQ(first->subnet_id_, second->subnet_id_);
+    EXPECT_EQ(first->pool_id_, second->pool_id_);
     EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_);
     EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_);
     EXPECT_EQ(first->hostname_, second->hostname_);