]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2738] Checkpoint: create methods and factor UTs, todo alloc engine and v4 UTs
authorFrancis Dupont <fdupont@isc.org>
Fri, 27 Jan 2023 10:31:37 +0000 (11:31 +0100)
committerFrancis Dupont <fdupont@isc.org>
Wed, 8 Feb 2023 15:52:03 +0000 (16:52 +0100)
src/lib/dhcpsrv/memfile_lease_mgr.cc
src/lib/dhcpsrv/memfile_lease_storage.h
src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc

index 4a0dc246a32a65ae2cbffe8f82b5799c4183a29f..02e6e5b801150d554ab808a335f710311cd93f44 100644 (file)
@@ -2487,6 +2487,17 @@ Memfile_LeaseMgr::getLeases4ByRelayId(const OptionBuffer& relay_id,
                   << lower_bound_address);
     }
 
+    // Catch 2038 bug with 32 bit time_t.
+    if ((qry_start_time < 0) || (qry_end_time < 0)) {
+        isc_throw(BadValue, "negative time value");
+    }
+
+    // Start time must be before end time.
+    if ((qry_start_time > 0) && (qry_end_time > 0) &&
+        (qry_start_time > qry_end_time)) {
+        isc_throw(BadValue, "start time must be before end time");
+    }
+
     LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
               DHCPSRV_MEMFILE_GET_RELAYID4)
         .arg(page_size.page_size_)
@@ -2512,12 +2523,41 @@ Memfile_LeaseMgr::getLeases4ByRelayId(const OptionBuffer& relay_id,
 }
 
 Lease4Collection
-Memfile_LeaseMgr::getLeases4ByRelayIdInternal(const OptionBuffer&,
-                                              const IOAddress&,
-                                              const LeasePageSize&,
-                                              const time_t&,
-                                              const time_t&) {
-    isc_throw(NotImplemented, "Memfile_LeaseMgr::getLeases4ByRelayId not implemented");
+Memfile_LeaseMgr::getLeases4ByRelayIdInternal(const OptionBuffer& relay_id,
+                                              const IOAddress& lower_bound_address,
+                                              const LeasePageSize& page_size,
+                                              const time_t& qry_start_time,
+                                              const time_t& qry_end_time) {
+    Lease4Collection collection;
+    const Lease4StorageRelayIdIndex& idx = storage4_.get<RelayIdIndexTag>();
+    Lease4StorageRelayIdIndex::const_iterator lb =
+        idx.lower_bound(boost::make_tuple(relay_id, lower_bound_address));
+    // Return all convenient leases being within the page size.
+    IOAddress last_addr = lower_bound_address;
+    for (; lb != idx.end(); ++lb) {
+        if ((*lb)->addr_ == last_addr) {
+            // Already seen: skip it.
+            continue;
+        }
+        if ((*lb)->relay_id_ != relay_id) {
+            // Gone after the relay id index.
+            break;
+        }
+        last_addr = (*lb)->addr_;
+        if ((qry_start_time > 0) && ((*lb)->cltt_ < qry_start_time)) {
+            // Too old.
+            continue;
+        }
+        if ((qry_end_time > 0) && ((*lb)->cltt_ < qry_end_time)) {
+            // Too young.
+            continue;
+        }
+        collection.push_back(Lease4Ptr(new Lease4(**lb)));
+        if (collection.size() >= page_size.page_size_) {
+            break;
+        }
+    }
+    return (collection);
 }
 
 Lease4Collection
@@ -2533,6 +2573,17 @@ Memfile_LeaseMgr::getLeases4ByRemoteId(const OptionBuffer& remote_id,
                   << lower_bound_address);
     }
 
+    // Catch 2038 bug with 32 bit time_t.
+    if ((qry_start_time < 0) || (qry_end_time < 0)) {
+        isc_throw(BadValue, "negative time value");
+    }
+
+    // Start time must be before end time.
+    if ((qry_start_time > 0) && (qry_end_time > 0) &&
+        (qry_start_time > qry_end_time)) {
+        isc_throw(BadValue, "start time must be before end time");
+    }
+
     LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
               DHCPSRV_MEMFILE_GET_REMOTEID4)
         .arg(page_size.page_size_)
@@ -2558,12 +2609,41 @@ Memfile_LeaseMgr::getLeases4ByRemoteId(const OptionBuffer& remote_id,
 }
 
 Lease4Collection
-Memfile_LeaseMgr::getLeases4ByRemoteIdInternal(const OptionBuffer&,
-                                               const IOAddress&,
-                                               const LeasePageSize&,
-                                               const time_t&,
-                                               const time_t&) {
-    isc_throw(NotImplemented, "Memfile_LeaseMgr::getLeases4ByRemoteId not implemented");
+Memfile_LeaseMgr::getLeases4ByRemoteIdInternal(const OptionBuffer& remote_id,
+                                               const IOAddress& lower_bound_address,
+                                               const LeasePageSize& page_size,
+                                               const time_t& qry_start_time,
+                                               const time_t& qry_end_time) {
+    Lease4Collection collection;
+    std::map<IOAddress, Lease4Ptr> sorted;
+    const Lease4StorageRemoteIdIndex& idx = storage4_.get<RemoteIdIndexTag>();
+    Lease4StorageRemoteIdRange er = idx.equal_range(remote_id);
+    // Store all convenient leases being within the page size.
+    for (auto it = er.first; it != er.second; ++it) {
+        const IOAddress& addr = (*it)->addr_;
+        if (addr <= lower_bound_address) {
+            // Not greater than lower_bound_address.
+            continue;
+        }
+        if ((qry_start_time > 0) && ((*it)->cltt_ < qry_start_time)) {
+            // Too old.
+            continue;
+        }
+        if ((qry_end_time > 0) && ((*it)->cltt_ < qry_end_time)) {
+            // Too young.
+            continue;
+        }
+        sorted[addr] = *it;
+    }
+
+    // Return all leases being within the page size.
+    for (auto it : sorted) {
+        collection.push_back(Lease4Ptr(new Lease4(*it.second)));
+        if (collection.size() >= page_size.page_size_) {
+            break;
+        }
+    }
+    return (collection);
 }
 
 Lease6Collection
index bfff724ac45c7be501a34b20a7bf0356f61418fd..285be092c6cd40f19e1cdf1e3b72e8b52a98cf8d 100644 (file)
@@ -323,6 +323,10 @@ typedef Lease4Storage::index<HostnameIndexTag>::type Lease4StorageHostnameIndex;
 /// @brief DHCPv4 lease storage index by remote identifier.
 typedef Lease4Storage::index<RemoteIdIndexTag>::type Lease4StorageRemoteIdIndex;
 
+/// @brief DHCPv4 lease storage range by remote identifier.
+typedef std::pair<Lease4StorageRemoteIdIndex::const_iterator,
+                  Lease4StorageRemoteIdIndex::const_iterator> Lease4StorageRemoteIdRange;
+
 /// @brief DHCPv4 lease storage index by relay identifier.
 typedef Lease4Storage::index<RelayIdIndexTag>::type Lease4StorageRelayIdIndex;
 
index aac944cdc1b7287b4b7cd136551d8c22d9be14fe..8c04c13f67e6697a7789288eac6eec834c0f9c33 100644 (file)
@@ -26,6 +26,12 @@ using namespace std;
 
 namespace {
 
+/// @brief IPv4 addresses used in the tests.
+const vector<string> ADDRESS4 = {
+    "192.0.2.0", "192.0.2.1", "192.0.2.2", "192.0.2.3",
+    "192.0.2.4", "192.0.2.5", "192.0.2.6", "192.0.2.7"
+};
+
 /// @brief IPv6 addresses used in the tests.
 const vector<string> ADDRESS6 = {
     "2001:db8::0", "2001:db8::1", "2001:db8::2", "2001:db8::3",
@@ -33,7 +39,7 @@ const vector<string> ADDRESS6 = {
 };
 
 /// @brief DUIDs used in the tests.
-const vector<string> DUID6 = {
+const vector<string> DUIDS = {
     "wwwwwwww", "BBBBBBBB", "::::::::", "0123456789acdef",
     "BBBBBBBB", "$$$$$$$$", "^^^^^^^^", "\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5"
 };
@@ -73,6 +79,7 @@ public:
     MemfileExtendedInfoTest() {
         pmap_.clear();
         lease_mgr_.reset();
+       leases4.clear();
         leases6.clear();
         MultiThreadingMgr::instance().setMode(false);
     }
@@ -81,6 +88,7 @@ public:
     ~MemfileExtendedInfoTest() {
         pmap_.clear();
         lease_mgr_.reset();
+       leases4.clear();
         leases6.clear();
         MultiThreadingMgr::instance().setMode(false);
     }
@@ -100,10 +108,10 @@ public:
 
     /// @brief Create and set v6 leases.
     void initLease6() {
-        ASSERT_EQ(ADDRESS6.size(), DUID6.size());
+        ASSERT_EQ(ADDRESS6.size(), DUIDS.size());
         for (size_t i = 0; i < ADDRESS6.size(); ++i) {
             Lease6Ptr lease;
-            vector<uint8_t> duid_data = createFromString(DUID6[i]);
+            vector<uint8_t> duid_data = createFromString(DUIDS[i]);
             DuidPtr duid(new DUID(duid_data));
             IOAddress addr(ADDRESS6[i]);
             ASSERT_NO_THROW(lease.reset(new Lease6(((i % 2) ? Lease::TYPE_NA : Lease::TYPE_PD), addr, duid,
@@ -126,12 +134,27 @@ public:
         return (v);
     }
 
+    /// @brief Test initLease6.
+    void testInitLease6();
+
+    /// @brief Test getLeases6ByRelayId.
+    void testGetLeases6ByRelayId();
+
+    /// @brief Test getLeases6ByRemoteId.
+    void testGetLeases6ByRemoteId();
+
+    /// @brief Test getLeases6ByLink.
+    void testGetLeases6ByLink();
+
     /// @brief Parameter map.
     DatabaseConnection::ParameterMap pmap_;
 
     /// @brief Lease manager.
     NakedMemfileLeaseMgrPtr lease_mgr_;
 
+    /// @brief V4 leases.
+    Lease4Collection leases4;
+
     /// @brief V6 leases.
     Lease6Collection leases6;
 };
@@ -159,7 +182,8 @@ TEST_F(MemfileExtendedInfoTest, startV6MultiThreading) {
 }
 
 /// @brief Verifies that the lease manager can add the v6 leases.
-TEST_F(MemfileExtendedInfoTest, initLease6) {
+void
+MemfileExtendedInfoTest::testInitLease6() {
     start(Memfile_LeaseMgr::V6);
     initLease6();
     EXPECT_EQ(8, leases6.size());
@@ -176,23 +200,13 @@ TEST_F(MemfileExtendedInfoTest, initLease6) {
     }
 }
 
-/// @brief Verifies that the lease manager can add the v6 leases with MT.
+TEST_F(MemfileExtendedInfoTest, initLease6) {
+    testInitLease6();
+}
+
 TEST_F(MemfileExtendedInfoTest, initLease6MultiThreading) {
     MultiThreadingTest mt(true);
-    start(Memfile_LeaseMgr::V6);
-    initLease6();
-    EXPECT_EQ(8, leases6.size());
-    Lease6Collection got;
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6());
-    ASSERT_EQ(leases6.size(), got.size());
-    for (size_t i = 0; i < leases6.size(); ++i) {
-        ConstElementPtr expected = leases6[i]->toElement();
-        LeasePtr lease = got[i];
-        ASSERT_TRUE(lease);
-        EXPECT_TRUE(expected->equals(*lease->toElement()))
-            << "expected: " << expected->str() << "\n"
-            << "got: " << lease->toElement()->str() << "\n";
-    }
+    testInitLease6();
 }
 
 /// @brief Verifies that add and delete work on the by relay id table.
@@ -206,8 +220,8 @@ TEST_F(MemfileExtendedInfoTest, relayIdTable6) {
     IOAddress lease_addr1(ADDRESS6[1]);
     IOAddress lease_addr2(ADDRESS6[2]);
     IOAddress other_lease_addr("2001:db8:1::4");
-    vector<uint8_t> relay_id0 = createFromString(DUID6[0]);
-    vector<uint8_t> relay_id1 = createFromString(DUID6[1]);
+    vector<uint8_t> relay_id0 = createFromString(DUIDS[0]);
+    vector<uint8_t> relay_id1 = createFromString(DUIDS[1]);
 
     // Fill the table.
     EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr0, relay_id0));
@@ -250,8 +264,8 @@ TEST_F(MemfileExtendedInfoTest, remoteIdTable6) {
     IOAddress lease_addr1(ADDRESS6[1]);
     IOAddress lease_addr2(ADDRESS6[2]);
     IOAddress other_lease_addr("2001:db8:1::4");
-    vector<uint8_t> remote_id0 = createFromString(DUID6[0]);
-    vector<uint8_t> remote_id1 = createFromString(DUID6[1]);
+    vector<uint8_t> remote_id0 = createFromString(DUIDS[0]);
+    vector<uint8_t> remote_id1 = createFromString(DUIDS[1]);
 
     // Fill the table.
     EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr0, remote_id0));
@@ -284,7 +298,8 @@ TEST_F(MemfileExtendedInfoTest, remoteIdTable6) {
 }
 
 /// @brief Verifies that getLeases6ByRelayId works as expected.
-TEST_F(MemfileExtendedInfoTest, getLeases6ByRelayId) {
+void
+MemfileExtendedInfoTest::testGetLeases6ByRelayId() {
     // Lease manager is created with empty tables.
     start(Memfile_LeaseMgr::V6);
     initLease6();
@@ -297,11 +312,11 @@ TEST_F(MemfileExtendedInfoTest, getLeases6ByRelayId) {
     IOAddress link_addr(ADDRESS6[4]);
     IOAddress other_link_addr("2001:db8:1::4");
     IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
-    vector<uint8_t> relay_id_data0 = createFromString(DUID6[0]);
+    vector<uint8_t> relay_id_data0 = createFromString(DUIDS[0]);
     DUID relay_id0(relay_id_data0);
-    vector<uint8_t> relay_id_data1 = createFromString(DUID6[1]);
+    vector<uint8_t> relay_id_data1 = createFromString(DUIDS[1]);
     DUID relay_id1(relay_id_data1);
-    vector<uint8_t> relay_id_data2 = createFromString(DUID6[2]);
+    vector<uint8_t> relay_id_data2 = createFromString(DUIDS[2]);
     DUID relay_id2(relay_id_data2);
 
     // Fill the table.
@@ -440,166 +455,18 @@ TEST_F(MemfileExtendedInfoTest, getLeases6ByRelayId) {
     EXPECT_EQ(0, got.size());
 }
 
-/// @brief Verifies that getLeases6ByRelayId works as expected with MT.
+TEST_F(MemfileExtendedInfoTest, getLeases6ByRelayId) {
+    testGetLeases6ByRelayId();
+}
+
 TEST_F(MemfileExtendedInfoTest, getLeases6ByRelayIdMultiThreading) {
     MultiThreadingTest mt(true);
-    // Lease manager is created with empty tables.
-    start(Memfile_LeaseMgr::V6);
-    initLease6();
-    EXPECT_EQ(0, lease_mgr_->relay_id6_.size());
-
-    // Create parameter values.
-    IOAddress lease_addr0(ADDRESS6[0]);
-    IOAddress lease_addr1(ADDRESS6[1]);
-    IOAddress lease_addr2(ADDRESS6[2]);
-    IOAddress link_addr(ADDRESS6[4]);
-    IOAddress other_link_addr("2001:db8:1::4");
-    IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
-    vector<uint8_t> relay_id_data0 = createFromString(DUID6[0]);
-    DUID relay_id0(relay_id_data0);
-    vector<uint8_t> relay_id_data1 = createFromString(DUID6[1]);
-    DUID relay_id1(relay_id_data1);
-    vector<uint8_t> relay_id_data2 = createFromString(DUID6[2]);
-    DUID relay_id2(relay_id_data2);
-
-    // Fill the table.
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr0, relay_id_data0));
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr0, relay_id_data0));
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr0, relay_id_data1));
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr1, relay_id_data0));
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr1, relay_id_data1));
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr2, relay_id_data1));
-    EXPECT_EQ(6, lease_mgr_->relay_id6_.size());
-
-    Lease6Collection got;
-    // Unknown relay id #2, no link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id2,
-                                                          zero,
-                                                          0,
-                                                          zero,
-                                                          LeasePageSize(100)));
-    EXPECT_EQ(0, got.size());
-
-    // Unknown relay id #2, link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id2,
-                                                          link_addr,
-                                                          64,
-                                                          zero,
-                                                          LeasePageSize(100)));
-    EXPECT_EQ(0, got.size());
-
-    // Relay id #0, other link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id0,
-                                                          other_link_addr,
-                                                          64,
-                                                          zero,
-                                                          LeasePageSize(100)));
-    EXPECT_EQ(0, got.size());
-
-    // Relay id #0, no link: 3 entries but 2 addresses.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id0,
-                                                          zero,
-                                                          0,
-                                                          zero,
-                                                          LeasePageSize(100)));
-    ASSERT_EQ(2, got.size());
-    Lease6Ptr lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-    lease = got[1];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-
-    // Relay id #1, no link, partial: 2 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          zero,
-                                                          0,
-                                                          zero,
-                                                          LeasePageSize(2)));
-    ASSERT_EQ(2, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-    lease = got[1];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-
-    // Relay id #1, no link, partial from previous: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          zero,
-                                                          0,
-                                                          lease->addr_,
-                                                          LeasePageSize(2)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr2, lease->addr_);
-
-    // Add another entry for last tests.
-    EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr0, relay_id_data1));
-    EXPECT_EQ(7, lease_mgr_->relay_id6_.size());
-
-    // Relay id #1, link: 3 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          link_addr,
-                                                          64,
-                                                          zero,
-                                                          LeasePageSize(100)));
-    ASSERT_EQ(3, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-    lease = got[1];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-    lease = got[2];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr2, lease->addr_);
-
-    // Relay id #1, link, initial partial: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          link_addr,
-                                                          64,
-                                                          zero,
-                                                          LeasePageSize(1)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-
-    // Relay id #1, link, next partial: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          link_addr,
-                                                          64,
-                                                          lease->addr_,
-                                                          LeasePageSize(1)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-
-    // Relay id #1, link, next partial: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          link_addr,
-                                                          64,
-                                                          lease->addr_,
-                                                          LeasePageSize(1)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr2, lease->addr_);
-
-    // Relay id #1, link, final partial: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id1,
-                                                          link_addr,
-                                                          64,
-                                                          lease->addr_,
-                                                          LeasePageSize(1)));
-    EXPECT_EQ(0, got.size());
+    testGetLeases6ByRelayId();
 }
 
 /// @brief Verifies that getLeases6ByRemoteId works as expected.
-TEST_F(MemfileExtendedInfoTest, getLeases6ByRemoteId) {
+void
+MemfileExtendedInfoTest::testGetLeases6ByRemoteId() {
     // Lease manager is created with empty tables.
     start(Memfile_LeaseMgr::V6);
     initLease6();
@@ -612,9 +479,9 @@ TEST_F(MemfileExtendedInfoTest, getLeases6ByRemoteId) {
     IOAddress link_addr(ADDRESS6[4]);
     IOAddress other_link_addr("2001:db8:1::4");
     IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
-    vector<uint8_t> remote_id0 = createFromString(DUID6[0]);
-    vector<uint8_t> remote_id1 = createFromString(DUID6[1]);
-    vector<uint8_t> remote_id2 = createFromString(DUID6[2]);
+    vector<uint8_t> remote_id0 = createFromString(DUIDS[0]);
+    vector<uint8_t> remote_id1 = createFromString(DUIDS[1]);
+    vector<uint8_t> remote_id2 = createFromString(DUIDS[2]);
 
     // Fill the table.
     EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr0, remote_id0));
@@ -752,163 +619,18 @@ TEST_F(MemfileExtendedInfoTest, getLeases6ByRemoteId) {
     EXPECT_EQ(0, got.size());
 }
 
-/// @brief Verifies that getLeases6ByRemoteId works as expected with MT.
+TEST_F(MemfileExtendedInfoTest, getLeases6ByRemoteId) {
+    testGetLeases6ByRemoteId();
+}
+
 TEST_F(MemfileExtendedInfoTest, getLeases6ByRemoteIdMultiThreading) {
     MultiThreadingTest mt(true);
-    // Lease manager is created with empty tables.
-    start(Memfile_LeaseMgr::V6);
-    initLease6();
-    EXPECT_EQ(0, lease_mgr_->remote_id6_.size());
-
-    // Create parameter values.
-    IOAddress lease_addr0(ADDRESS6[0]);
-    IOAddress lease_addr1(ADDRESS6[1]);
-    IOAddress lease_addr2(ADDRESS6[2]);
-    IOAddress link_addr(ADDRESS6[4]);
-    IOAddress other_link_addr("2001:db8:1::4");
-    IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
-    vector<uint8_t> remote_id0 = createFromString(DUID6[0]);
-    vector<uint8_t> remote_id1 = createFromString(DUID6[1]);
-    vector<uint8_t> remote_id2 = createFromString(DUID6[2]);
-
-    // Fill the table.
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr0, remote_id0));
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr0, remote_id0));
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr0, remote_id1));
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr1, remote_id0));
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr1, remote_id1));
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr2, remote_id1));
-    EXPECT_EQ(6, lease_mgr_->remote_id6_.size());
-
-    Lease6Collection got;
-    // Unknown remote id #2, no link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id2,
-                                                           zero,
-                                                           0,
-                                                           zero,
-                                                           LeasePageSize(10)));
-    EXPECT_EQ(0, got.size());
-
-    // Unknown remote id #2, link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id2,
-                                                           link_addr,
-                                                           64,
-                                                           zero,
-                                                           LeasePageSize(10)));
-    EXPECT_EQ(0, got.size());
-
-    // Remote id #0, other link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id0,
-                                                           other_link_addr,
-                                                           64,
-                                                           zero,
-                                                           LeasePageSize(10)));
-    EXPECT_EQ(0, got.size());
-
-    // Remote id #0, no link: 3 entries but 2 addresses.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id0,
-                                                           zero,
-                                                           0,
-                                                           zero,
-                                                           LeasePageSize(10)));
-    ASSERT_EQ(2, got.size());
-    Lease6Ptr lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-    lease = got[1];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-
-    // Remote id #1, no link, partial: 2 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           zero,
-                                                           0,
-                                                           zero,
-                                                           LeasePageSize(2)));
-    ASSERT_EQ(2, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-    lease = got[1];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-
-    // Remote id #1, no link, partial from previous: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           zero,
-                                                           0,
-                                                           lease->addr_,
-                                                           LeasePageSize(2)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr2, lease->addr_);
-
-    // Add another entry for last tests.
-    EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr0, remote_id1));
-    EXPECT_EQ(7, lease_mgr_->remote_id6_.size());
-
-    // Remote id #1, link: 3 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           link_addr,
-                                                           64,
-                                                           zero,
-                                                           LeasePageSize(10)));
-    ASSERT_EQ(3, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-    lease = got[1];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-    lease = got[2];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr2, lease->addr_);
-
-    // Remote id #1, link, initial partial: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           link_addr,
-                                                           64,
-                                                           zero,
-                                                           LeasePageSize(1)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr0, lease->addr_);
-
-    // Remote id #1, link, next partial: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           link_addr,
-                                                           64,
-                                                           lease->addr_,
-                                                           LeasePageSize(1)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr1, lease->addr_);
-
-    // Remote id #1, link, next partial: 1 entry.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           link_addr,
-                                                           64,
-                                                           lease->addr_,
-                                                           LeasePageSize(1)));
-    ASSERT_EQ(1, got.size());
-    lease = got[0];
-    ASSERT_TRUE(lease);
-    EXPECT_EQ(lease_addr2, lease->addr_);
-
-    // Remote id #1, link, final partial: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id1,
-                                                           link_addr,
-                                                           64,
-                                                           lease->addr_,
-                                                           LeasePageSize(1)));
-    EXPECT_EQ(0, got.size());
+    testGetLeases6ByRemoteId();
 }
 
 /// @brief Verifies that getLeases6ByLink works as expected.
-TEST_F(MemfileExtendedInfoTest, getLeases6ByLink) {
+void
+MemfileExtendedInfoTest::testGetLeases6ByLink() {
     // Lease manager is created with empty tables.
     start(Memfile_LeaseMgr::V6);
     initLease6();
@@ -972,69 +694,13 @@ TEST_F(MemfileExtendedInfoTest, getLeases6ByLink) {
     EXPECT_EQ(0, got.size());
 }
 
-/// @brief Verifies that getLeases6ByLink works as expected with MT.
+TEST_F(MemfileExtendedInfoTest, getLeases6ByLink) {
+    testGetLeases6ByLink();
+}
+
 TEST_F(MemfileExtendedInfoTest, getLeases6ByLinkMultiThreading) {
     MultiThreadingTest mt(true);
-    start(Memfile_LeaseMgr::V6);
-    initLease6();
-
-    // Create parameter values.
-    IOAddress link_addr(ADDRESS6[4]);
-    IOAddress other_link_addr("2001:db8:1::4");
-    IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
-
-    Lease6Collection got;
-    // Other link: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByLink(other_link_addr,
-                                                       64,
-                                                       zero,
-                                                       LeasePageSize(10)));
-    EXPECT_EQ(0, got.size());
-
-    // Link: 8 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByLink(link_addr,
-                                                       64,
-                                                       zero,
-                                                       LeasePageSize(10)));
-
-    ASSERT_EQ(8, got.size());
-    Lease6Ptr lease;
-    for (size_t i = 0; i < 8; ++i) {
-        lease = got[i];
-        ASSERT_TRUE(lease);
-        EXPECT_EQ(IOAddress(ADDRESS6[i]), lease->addr_);
-    }
-
-    // Link: initial partial: 4 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByLink(link_addr,
-                                                       64,
-                                                       zero,
-                                                       LeasePageSize(4)));
-    ASSERT_EQ(4, got.size());
-    for (size_t i = 0; i < 4; ++i) {
-        lease = got[i];
-        ASSERT_TRUE(lease);
-        EXPECT_EQ(IOAddress(ADDRESS6[i]), lease->addr_);
-    }
-
-    // Link: next partial: 4 entries.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByLink(link_addr,
-                                                       64,
-                                                       lease->addr_,
-                                                       LeasePageSize(4)));
-    ASSERT_EQ(4, got.size());
-    for (size_t i = 0; i < 4; ++i) {
-        lease = got[i];
-        ASSERT_TRUE(lease);
-        EXPECT_EQ(IOAddress(ADDRESS6[i + 4]), lease->addr_);
-    }
-
-    // Link: further partial: nothing.
-    EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByLink(link_addr,
-                                                       64,
-                                                       lease->addr_,
-                                                       LeasePageSize(4)));
-    EXPECT_EQ(0, got.size());
+    testGetLeases6ByLink();
 }
 
 /// @brief Verifies that v6 deleteLease removes references from extended
@@ -1046,10 +712,10 @@ TEST_F(MemfileExtendedInfoTest, deleteLease6) {
 
     // Create parameter values.
     IOAddress lease_addr(ADDRESS6[0]);
-    vector<uint8_t> relay_id = createFromString(DUID6[0]);
-    vector<uint8_t> remote_id = createFromString(DUID6[1]);
-    vector<uint8_t> relay_id2 = createFromString(DUID6[2]);
-    vector<uint8_t> remote_id2 = createFromString(DUID6[3]);
+    vector<uint8_t> relay_id = createFromString(DUIDS[0]);
+    vector<uint8_t> remote_id = createFromString(DUIDS[1]);
+    vector<uint8_t> relay_id2 = createFromString(DUIDS[2]);
+    vector<uint8_t> remote_id2 = createFromString(DUIDS[3]);
 
     // Fill the table.
     EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr, relay_id));
@@ -1092,8 +758,8 @@ TEST_F(MemfileExtendedInfoTest, deleteLease6disabled) {
 
     // Create parameter values.
     IOAddress lease_addr(ADDRESS6[0]);
-    vector<uint8_t> relay_id = createFromString(DUID6[0]);
-    vector<uint8_t> remote_id = createFromString(DUID6[1]);
+    vector<uint8_t> relay_id = createFromString(DUIDS[0]);
+    vector<uint8_t> remote_id = createFromString(DUIDS[1]);
 
     // Fill the table.
     EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr, relay_id));
@@ -1126,7 +792,7 @@ TEST_F(MemfileExtendedInfoTest, addLease6) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1177,7 +843,7 @@ TEST_F(MemfileExtendedInfoTest, addLease6disabled) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1208,7 +874,7 @@ TEST_F(MemfileExtendedInfoTest, updateLease6ignore) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1254,7 +920,7 @@ TEST_F(MemfileExtendedInfoTest, updateLease6delete) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1295,7 +961,7 @@ TEST_F(MemfileExtendedInfoTest, updateLease6deleteDisabled) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1341,7 +1007,7 @@ TEST_F(MemfileExtendedInfoTest, updateLease6update) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1401,7 +1067,7 @@ TEST_F(MemfileExtendedInfoTest, updateLease6updateDisabled) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));
@@ -1443,7 +1109,7 @@ TEST_F(MemfileExtendedInfoTest, updateLease6update2) {
     // Create parameter values.
     Lease6Ptr lease;
     IOAddress lease_addr(ADDRESS6[1]);
-    vector<uint8_t> duid_data = createFromString(DUID6[0]);
+    vector<uint8_t> duid_data = createFromString(DUIDS[0]);
     DuidPtr duid(new DUID(duid_data));
     ASSERT_NO_THROW(lease.reset(new Lease6(Lease::TYPE_NA, lease_addr, duid,
                                            123, 1000, 2000, 1)));