#include <asiolink/io_address.h>
#include <cc/data.h>
-#include <dhcpsrv/cfg_consistency.h>
-#include <dhcpsrv/cfgmgr.h>
-#include <dhcpsrv/lease_mgr_factory.h>
-#include <dhcpsrv/mysql_lease_mgr.h>
+#include <dhcpsrv/testutils/generic_extended_info_unittest.h>
#include <mysql/testutils/mysql_schema.h>
-#include <testutils/gtest_utils.h>
-#include <testutils/multi_threading_utils.h>
-
-#include <gtest/gtest.h>
+#include <dhcpsrv/mysql_lease_mgr.h>
using namespace isc;
using namespace isc::asiolink;
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::", "2001:db8::1", "2001:db8::2", "2001:db8::3",
- "2001:db8::4", "2001:db8::5", "2001:db8::6", "2001:db8::7"
-};
-
-/// @brief DUIDs used in the tests.
-const vector<string> DUIDS = {
- "wwwwwwww", "BBBBBBBB", "::::::::", "0123456789acdef",
- "BBBBBBBB", "$$$$$$$$", "^^^^^^^^", "\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5"
-};
-
/// @brief A derivation of the lease manager exposing protected methods.
class NakedMySqlLeaseMgr : public MySqlLeaseMgr {
public:
using MySqlLeaseMgr::deleteExtendedInfo6;
using MySqlLeaseMgr::addRelayId6;
using MySqlLeaseMgr::addRemoteId6;
-};
-/// @brief Type of unique pointers to naked lease manager.
-typedef unique_ptr<NakedMySqlLeaseMgr> NakedMySqlLeaseMgrPtr;
+ /// @brief Return valid connection string.
+ static string validConnectionString() {
+ return (validMySQLConnectionString());
+ }
-/// @brief Test fixture class for extended info tests.
-class MySqlExtendedInfoTest : public ::testing::Test {
-public:
- /// @brief Constructor.
- MySqlExtendedInfoTest() {
- // Ensure we have the proper schema with no transient data.
+ /// @brief Create the database schema.
+ static void createSchema() {
createMySQLSchema();
-
- pmap_ = DatabaseConnection::parse(validMySQLConnectionString());
- lease_mgr_.reset();
- leases4.clear();
- leases6.clear();
- MultiThreadingMgr::instance().setMode(false);
- now_ = time(0);
}
- /// @brief Destructor.
- ~MySqlExtendedInfoTest() {
- pmap_.clear();
- lease_mgr_.reset();
- leases4.clear();
- leases6.clear();
- MultiThreadingMgr::instance().setMode(false);
-
- // If data wipe enabled, delete transient data otherwise destroy
- // the schema.
+ /// @brief Destroy the database schema.
+ static void destroySchema() {
destroyMySQLSchema();
}
-
- /// @brief Create and set v4 leases.
- ///
- /// @param insert When true insert in the database.
- void initLease4(bool insert = true) {
- ASSERT_EQ(ADDRESS4.size(), DUIDS.size());
- for (size_t i = 0; i < ADDRESS4.size(); ++i) {
- Lease4Ptr lease;
- vector<uint8_t> hwaddr_data(5, 0x08);
- hwaddr_data.push_back(0x80 + i);
- HWAddrPtr hwaddr(new HWAddr(hwaddr_data, HTYPE_ETHER));
- vector<uint8_t> client_id = createFromString(DUIDS[i]);
- IOAddress address(ADDRESS4[i]);
- ASSERT_NO_THROW(lease.reset(new Lease4(address, hwaddr,
- &client_id[0],
- client_id.size(),
- 1000, now_,
- static_cast<SubnetID>(i))));
- leases4.push_back(lease);
- if (insert) {
- EXPECT_TRUE(lease_mgr_->addLease(lease));
- }
- }
- ASSERT_EQ(ADDRESS4.size(), leases4.size());
- }
-
- /// @brief Create and set v6 leases.
- void initLease6() {
- ASSERT_EQ(ADDRESS6.size(), DUIDS.size());
- for (size_t i = 0; i < ADDRESS6.size(); ++i) {
- Lease6Ptr lease;
- 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,
- 123, 1000, 2000,
- static_cast<SubnetID>(i))));
- leases6.push_back(lease);
- EXPECT_TRUE(lease_mgr_->addLease(lease));
- }
- ASSERT_EQ(ADDRESS6.size(), leases6.size());
- }
-
- /// @brief Check v6 leases (using get page to keep order).
- void checkLease6() {
- EXPECT_EQ(8, leases6.size());
- Lease6Collection got;
- IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
- LeasePageSize ps100(100);
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6(zero, ps100));
- 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";
- }
- }
-
- /// @brief Start lease manager.
- ///
- /// @param enable When true enable extended info tables.
- void start(bool enable) {
- // Do not set unused pmap_["universe"].
- if (enable) {
- pmap_["extended-info-tables"] = "true";
- }
-
- ASSERT_NO_THROW(lease_mgr_.reset(new NakedMySqlLeaseMgr(pmap_)));
- if (enable) {
- EXPECT_TRUE(lease_mgr_->getExtendedInfoTablesEnabled());
- } else {
- EXPECT_FALSE(lease_mgr_->getExtendedInfoTablesEnabled());
- }
- }
-
- /// @brief Create a vector of uint8_t from a string.
- ///
- /// @param content A not empty string holding the content.
- /// @return A vector of uint8_t with the given content.
- inline vector<uint8_t> createFromString(const string& content) {
- vector<uint8_t> v;
- v.resize(content.size());
- memmove(&v[0], &content[0], v.size());
- return (v);
- }
-
- /// @brief Test initLease4.
- void testInitLease4();
-
- /// @brief Test initLease6.
- void testInitLease6();
-
- /// @brief Test getLease4ByRelayId.
- void testGetLeases4ByRelayId();
-
- /// @brief Test getLease4ByRemoteId.
- void testGetLeases4ByRemoteId();
-
- /// @brief Test upgradeExtendedInfo4.
- void testUpgradeExtendedInfo4(const CfgConsistency::ExtendedInfoSanity& check,
- const LeasePageSize& page_size);
-
- /// @brief Test initLease6 with tables.
- void testEnableTables();
-
- /// @brief Test getLeases6ByRelayId.
- void testGetLeases6ByRelayId();
-
- /// @brief Test getLeases6ByRemoteId.
- void testGetLeases6ByRemoteId();
-
- /// @brief Test getLeases6ByLink.
- void testGetLeases6ByLink();
-
- /// @brief Test upgradeExtendedInfo6.
- void testUpgradeExtendedInfo6(const CfgConsistency::ExtendedInfoSanity& check,
- bool extended_info_table_enable,
- const LeasePageSize& page_size);
-
- /// @brief Parameter map.
- DatabaseConnection::ParameterMap pmap_;
-
- /// @brief Lease manager.
- NakedMySqlLeaseMgrPtr lease_mgr_;
-
- /// @brief V4 leases.
- Lease4Collection leases4;
-
- /// @brief V6 leases.
- Lease6Collection leases6;
-
- /// @brief Current timestamp.
- time_t now_;
};
+/// @brief Test fixture class for extended info tests.
+class MySqlExtendedInfoTest :
+ public isc::dhcp::test::GenericExtendedInfoTest<NakedMySqlLeaseMgr> { };
+
/// @brief Verifies that the lease manager can start.
TEST_F(MySqlExtendedInfoTest, startWithoutExtendedTables) {
start(false);
start(true);
}
-/// @brief Verifies that the lease manager can add the v4 leases.
-void
-MySqlExtendedInfoTest::testInitLease4() {
- start(false);
- initLease4();
- EXPECT_EQ(8, leases4.size());
- IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
- Lease4Collection got;
- // Use the page version as it returns leases in order.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4(zero, LeasePageSize(100)));
- ASSERT_EQ(leases4.size(), got.size());
- auto compare = [](Lease4Ptr const& left, Lease4Ptr const& right) {
- return (left->addr_ < right->addr_);
- };
- std::sort(got.begin(), got.end(), compare);
- for (size_t i = 0; i < leases4.size(); ++i) {
- ConstElementPtr expected = leases4[i]->toElement();
- LeasePtr lease = got[i];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected->equals(*lease->toElement()))
- << "expected: " << expected->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
- }
-}
-
TEST_F(MySqlExtendedInfoTest, initLease4) {
testInitLease4();
}
testInitLease4();
}
-/// @brief Verifies that getLeases4ByRelayId works as expected.
-void
-MySqlExtendedInfoTest::testGetLeases4ByRelayId() {
- // Lease manager is created with empty tables.
- start(false);
- initLease4(false);
-
- // Create leases.
- IOAddress addr0(ADDRESS4[0]);
- IOAddress addr1(ADDRESS4[1]);
- IOAddress addr2(ADDRESS4[2]);
- IOAddress addr3(ADDRESS4[3]);
- IOAddress addr4(ADDRESS4[4]);
- IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
- vector<uint8_t> relay_id0 = { 0xaa, 0xbb, 0xcc };
- vector<uint8_t> relay_id1 = { 1, 2, 3, 4 };
- vector<uint8_t> relay_id2 = createFromString(DUIDS[2]);
- string user_context_txt0 = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_txt0 += " \"sub-options\": \"0C03AABBCC\",";
- user_context_txt0 += " \"relay-id\": \"AABBCC\" } } }";
- ElementPtr user_context0;
- ASSERT_NO_THROW(user_context0 = Element::fromJSON(user_context_txt0));
- string user_context_txt1 = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_txt1 += " \"sub-options\": \"0C0401020304\",";
- user_context_txt1 += " \"relay-id\": \"01020304\" } } }";
- ElementPtr user_context1;
- ASSERT_NO_THROW(user_context1 = Element::fromJSON(user_context_txt1));
-
- Lease4Ptr lease;
- // lease0: addr0, id0, now.
- lease = leases4[0];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id0;
- lease->setContext(user_context0);
-
- // lease1: addr1, id1, now.
- lease = leases4[1];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id1;
- lease->setContext(user_context1);
-
- // lease2: addr2, id0, now - 500.
- lease = leases4[2];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id0;
- lease->setContext(user_context0);
- lease->cltt_ = now_ - 500;
-
- // lease3: addr3, id0, now - 800.
- lease = leases4[3];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id0;
- lease->setContext(user_context0);
- lease->cltt_ = now_ - 800;
-
- // lease4: addr4, id0, now - 100.
- lease = leases4[4];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id0;
- lease->setContext(user_context0);
- lease->cltt_ = now_ - 100;
-
- // Add leases.
- for (size_t i = 0; i < leases4.size(); ++i) {
- EXPECT_TRUE(lease_mgr_->addLease(leases4[i]));
- }
-
- Lease4Collection got;
- // Unknown relay id #2: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id2,
- zero,
- LeasePageSize(100)));
- EXPECT_EQ(0, got.size());
-
- // Unknown relay id #2, now - 1000, now + 1000: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id2,
- zero,
- LeasePageSize(100),
- now_ - 1000,
- now_ + 1000));
- EXPECT_EQ(0, got.size());
-
- // Relay id #0, now - 2000, now - 1000: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(100),
- now_ - 2000,
- now_ - 1000));
- EXPECT_EQ(0, got.size());
-
- // Relay id #0, now + 1000, now + 2000: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(100),
- now_ + 1000,
- now_ + 2000));
- EXPECT_EQ(0, got.size());
-
- // Relay id #0: 3 entries (0, 2, 3, 4).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(100)));
- ASSERT_EQ(4, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[2];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[3]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[3];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, partial: 2 entries (0, 2).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(2)));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, partial from previous: 2 entries (3, 4).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- addr2,
- LeasePageSize(2)));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[3]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, final partial: no entries.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- addr4,
- LeasePageSize(2)));
- EXPECT_EQ(0, got.size());
-
- // Relay id #0, from now - 500: 3 entries (0, 2, 4).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(100),
- now_ - 500));
- ASSERT_EQ(3, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[2];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, to now - 200: 3 entries (2, 3).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(100),
- 0, now_ - 200));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[3]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, from now - 500 to now - 100, partial: 1 entry.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- zero,
- LeasePageSize(1),
- now_ - 500,
- now_ - 100));
- ASSERT_EQ(1, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, from now - 500 to now - 100, partial from 2: 1 entry.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- addr2,
- LeasePageSize(1),
- now_ - 500,
- now_ - 100));
- ASSERT_EQ(1, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(relay_id0, lease->relay_id_);
-
- // Relay id #0, from now - 500 to now - 100, final partial.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
- addr4,
- LeasePageSize(1),
- now_ - 500,
- now_ - 100));
- EXPECT_EQ(0, got.size());
-}
-
TEST_F(MySqlExtendedInfoTest, getLeases4ByRelayId) {
testGetLeases4ByRelayId();
}
testGetLeases4ByRelayId();
}
-/// @brief Verifies that getLeases4ByRemoteId works as expected.
-void
-MySqlExtendedInfoTest::testGetLeases4ByRemoteId() {
- // Lease manager is created with empty tables.
- start(false);
- initLease4(true);
-
- // Update leases.
- IOAddress addr0(ADDRESS4[0]);
- IOAddress addr1(ADDRESS4[1]);
- IOAddress addr2(ADDRESS4[2]);
- IOAddress addr3(ADDRESS4[3]);
- IOAddress addr4(ADDRESS4[4]);
- IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
- vector<uint8_t> remote_id0 = { 1, 2, 3, 4 };
- vector<uint8_t> remote_id1 = { 0xaa, 0xbb, 0xcc };
- vector<uint8_t> remote_id2 = createFromString(DUIDS[2]);
- string user_context_txt0 = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_txt0 += " \"sub-options\": \"020401020304\",";
- user_context_txt0 += " \"remote-id\": \"01020304\" } } }";
- ElementPtr user_context0;
- ASSERT_NO_THROW(user_context0 = Element::fromJSON(user_context_txt0));
- string user_context_txt1 = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_txt1 += " \"sub-options\": \"0203AABBCC\",";
- user_context_txt1 += " \"remote-id\": \"AABBCC\" } } }";
- ElementPtr user_context1;
- ASSERT_NO_THROW(user_context1 = Element::fromJSON(user_context_txt1));
-
- Lease4Ptr lease;
- // lease0: addr0, id0, now.
- lease = leases4[0];
- lease->remote_id_ = remote_id0;
- lease->setContext(user_context0);
-
- // lease1: addr1, id1, now.
- lease = leases4[1];
- lease->remote_id_ = remote_id1;
- lease->setContext(user_context1);
-
- // lease2: addr2, id0, now - 500.
- lease = leases4[2];
- lease->remote_id_ = remote_id0;
- lease->setContext(user_context0);
- lease->cltt_ = now_ - 500;
-
- // lease3: addr3, id0, now - 800.
- lease = leases4[3];
- lease->remote_id_ = remote_id0;
- lease->setContext(user_context0);
- lease->cltt_ = now_ - 800;
-
- // lease4: addr4, id0, now - 100.
- lease = leases4[4];
- lease->remote_id_ = remote_id0;
- lease->setContext(user_context0);
- lease->cltt_ = now_ - 100;
-
- // Update leases.
- for (size_t i = 0; i < leases4.size(); ++i) {
- EXPECT_NO_THROW(lease_mgr_->updateLease4(leases4[i]));
- }
-
- Lease4Collection got;
- // Unknown remote id #2: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id2,
- zero,
- LeasePageSize(100)));
- EXPECT_EQ(0, got.size());
-
- // Unknown remote id #2, now - 1000, now + 1000: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id2,
- zero,
- LeasePageSize(100),
- now_ - 1000,
- now_ + 1000));
- EXPECT_EQ(0, got.size());
-
- // Remote id #0, now - 2000, now - 1000: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(100),
- now_ - 2000,
- now_ - 1000));
- EXPECT_EQ(0, got.size());
-
- // Remote id #0, now + 1000, now + 2000: nothing.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(100),
- now_ + 1000,
- now_ + 2000));
- EXPECT_EQ(0, got.size());
-
- // Remote id #0: 3 entries (0, 2, 3, 4).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(100)));
- ASSERT_EQ(4, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[2];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[3]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[3];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, partial: 2 entries (0, 2).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(2)));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, partial from previous: 2 entries (3, 4).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- addr2,
- LeasePageSize(2)));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[3]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, final partial: no entries.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- addr4,
- LeasePageSize(2)));
- EXPECT_EQ(0, got.size());
-
- // Remote id #0, from now - 500: 3 entries (0, 2, 4).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(100),
- now_ - 500));
- ASSERT_EQ(3, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[2];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, to now - 200: 3 entries (2, 3).
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(100),
- 0, now_ - 200));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[3]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, from now - 500 to now - 100, partial: 1 entry.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- zero,
- LeasePageSize(1),
- now_ - 500,
- now_ - 100));
- ASSERT_EQ(1, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[2]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, from now - 500 to now - 100, partial from 2: 1 entry.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- addr2,
- LeasePageSize(1),
- now_ - 500,
- now_ - 100));
- ASSERT_EQ(1, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_EQ(*lease, *leases4[4]);
- EXPECT_EQ(remote_id0, lease->remote_id_);
-
- // Remote id #0, from now - 500 to now - 100, final partial.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
- addr4,
- LeasePageSize(1),
- now_ - 500,
- now_ - 100));
- EXPECT_EQ(0, got.size());
-}
-
TEST_F(MySqlExtendedInfoTest, getLeases4ByRemoteId) {
testGetLeases4ByRemoteId();
}
testGetLeases4ByRemoteId();
}
-void
-MySqlExtendedInfoTest::testUpgradeExtendedInfo4(const CfgConsistency::ExtendedInfoSanity& check,
- const LeasePageSize& page_size) {
- // Lease manager is created with empty tables.
- start(false);
- initLease4(false);
-
- // Create leases.
- IOAddress addr0(ADDRESS4[0]);
- IOAddress addr1(ADDRESS4[1]);
- IOAddress addr2(ADDRESS4[2]);
- IOAddress addr3(ADDRESS4[3]);
- IOAddress addr4(ADDRESS4[4]);
- IOAddress addr5(ADDRESS4[5]);
- IOAddress addr6(ADDRESS4[6]);
- IOAddress addr7(ADDRESS4[7]);
- IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
- vector<uint8_t> relay_id = { 0xaa, 0xbb, 0xcc };
- vector<uint8_t> relay_id2 = { 0xdd, 0xee, 0xff };
- vector<uint8_t> remote_id = { 1, 2, 3, 4 };
- vector<uint8_t> remote_id2 = { 5, 6, 7, 8 };
- string user_context_txt = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_txt += " \"sub-options\": \"0204010203040C03AABBCC\",";
- user_context_txt += " \"relay-id\": \"AABBCC\",";
- user_context_txt += " \"remote-id\": \"01020304\" } } }";
- ElementPtr user_context;
- ASSERT_NO_THROW(user_context = Element::fromJSON(user_context_txt));
- string user_context_txt_old = "{ \"ISC\": { \"relay-agent-info\":";
- user_context_txt_old += " \"0204010203040C03AABBCC\" } }";
- ElementPtr user_context_old;
- ASSERT_NO_THROW(user_context_old = Element::fromJSON(user_context_txt_old));
- string user_context_list_txt = "{ \"ISC\": { \"relay-agent-info\": [ ] } }";
- ElementPtr user_context_list;
- ASSERT_NO_THROW(user_context_list = Element::fromJSON(user_context_list_txt));
- string user_context_lower_txt = "{ \"isc\": { \"relay-agent-info\":";
- user_context_lower_txt += " \"0204010203040c03aabbcc\" } }";
- ElementPtr user_context_lower;
- ASSERT_NO_THROW(user_context_lower = Element::fromJSON(user_context_lower_txt));
- string user_context_badsub_txt = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_badsub_txt += " \"sub-options\": \"foobar\",";
- user_context_badsub_txt += " \"relay-id\": \"AABBCC\",";
- user_context_badsub_txt += " \"remote-id\": \"01020304\" } } }";
- ElementPtr user_context_badsub;
- ASSERT_NO_THROW(user_context_badsub = Element::fromJSON(user_context_badsub_txt));
- string user_context_extra_txt = "{ \"ISC\": { \"relay-agent-info\": {";
- user_context_extra_txt += " \"foo\": \"bar\", ";
- user_context_extra_txt += " \"sub-options\": \"0204010203040C03AABBCC\",";
- user_context_extra_txt += " \"relay-id\": \"AABBCC\",";
- user_context_extra_txt += " \"remote-id\": \"01020304\" } } }";
- ElementPtr user_context_extra;
- ASSERT_NO_THROW(user_context_extra = Element::fromJSON(user_context_extra_txt));
-
- Lease4Ptr lease;
- // lease0: addr0, ids, before: always not updated.
- lease = leases4[0];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id;
- lease->remote_id_ = remote_id;
- lease->setContext(user_context);
- lease->cltt_ = now_ - 500;
-
- // lease1: addr1, ids, after: always not updated.
- lease = leases4[1];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id;
- lease->remote_id_ = remote_id;
- lease->setContext(user_context);
- lease->cltt_ = now_ + 500;
-
- // lease2: addr2, no id, old user context: updated on check > NONE.
- lease = leases4[2];
- ASSERT_TRUE(lease);
- lease->setContext(user_context_old);
-
- // lease3: addr3, ids, lower case old user context: always updated.
- lease = leases4[3];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id;
- lease->remote_id_ = remote_id;
- lease->setContext(user_context_lower);
-
- // Lease4: addr4, ids, bad (list) user context: updated on check > NONE.
- lease = leases4[4];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id;
- lease->remote_id_ = remote_id;
- lease->setContext(user_context_list);
-
- // Lease5: addr5, other ids: always updated.
- lease = leases4[5];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id2;
- lease->remote_id_ = remote_id2;
- lease->setContext(user_context);
-
- // Lease6: addr6, ids, bad sub-options: updated on check > FIX.
- lease = leases4[6];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id;
- lease->remote_id_ = remote_id;
- lease->setContext(user_context_badsub);
-
- // Lease7: addr7, ids, extra in ISC: updated on check > STRICT.
- lease = leases4[7];
- ASSERT_TRUE(lease);
- lease->relay_id_ = relay_id;
- lease->remote_id_ = remote_id;
- lease->setContext(user_context_extra);
-
- // Add leases.
- for (size_t i = 0; i < leases4.size(); ++i) {
- EXPECT_TRUE(lease_mgr_->addLease(leases4[i]));
- }
-
- // Set extended info consistency.
- CfgMgr::instance().getCurrentCfg()->getConsistency()->
- setExtendedInfoSanityCheck(check);
-
- size_t updated;
- ASSERT_NO_THROW(updated = lease_mgr_->upgradeExtendedInfo4(page_size));
-
- // Verify result.
- switch (check) {
- case CfgConsistency::EXTENDED_INFO_CHECK_NONE:
- // Updated leases: 3, 5.
- EXPECT_EQ(updated, 2);
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_FIX:
- // Updated leases: 2, 3, 4, 5.
- EXPECT_EQ(updated, 4);
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_STRICT:
- // Updated leases: 2, 3, 4, 5, 6.
- EXPECT_EQ(updated, 5);
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC:
- default:
- // Updated leases: 2, 3, 4, 5, 6, 7.
- EXPECT_EQ(updated, 6);
- break;
- }
-
- // Verify stored leases.
- Lease4Collection got;
- // Use the page version as it returns leases in order.
- EXPECT_NO_THROW(got = lease_mgr_->getLeases4(zero, LeasePageSize(100)));
- ASSERT_EQ(leases4.size(), got.size());
-
- // Check lease0.
- lease = got[0];
- EXPECT_EQ(*lease, *leases4[0]);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
-
- // Check lease1.
- lease = got[1];
- EXPECT_EQ(*lease, *leases4[1]);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
-
- // Check lease2.
- lease = got[2];
- Lease4Ptr expected2(new Lease4(*leases4[2]));
- if (check == CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
- EXPECT_EQ(*lease, *expected2);
- EXPECT_TRUE(lease->relay_id_.empty());
- EXPECT_TRUE(lease->remote_id_.empty());
- } else {
- expected2->setContext(user_context);
- expected2->relay_id_ = relay_id;
- expected2->remote_id_ = remote_id;
- EXPECT_EQ(*lease, *expected2);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
- }
-
- // Check lease3.
- lease = got[3];
- Lease4Ptr expected3(new Lease4(*leases4[3]));
- expected3->relay_id_.clear();
- expected3->remote_id_.clear();
- EXPECT_EQ(*lease, *expected3);
- EXPECT_TRUE(lease->relay_id_.empty());
- EXPECT_TRUE(lease->remote_id_.empty());
-
- // Check lease4.
- lease = got[4];
- Lease4Ptr expected4(new Lease4(*leases4[4]));
- if (check == CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
- EXPECT_EQ(*lease, *expected4);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
- } else {
- expected4->relay_id_.clear();
- expected4->remote_id_.clear();
- expected4->setContext(ElementPtr());
- EXPECT_EQ(*lease, *expected4);
- EXPECT_TRUE(lease->relay_id_.empty());
- EXPECT_TRUE(lease->remote_id_.empty());
- }
-
- // Check lease5.
- lease = got[5];
- Lease4Ptr expected5(new Lease4(*leases4[5]));
- expected5->relay_id_ = relay_id;
- expected5->remote_id_ = remote_id;
- EXPECT_EQ(*lease, *expected5);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
-
- // Check lease6.
- lease = got[6];
- Lease4Ptr expected6(new Lease4(*leases4[6]));
- if ((check != CfgConsistency::EXTENDED_INFO_CHECK_STRICT) &&
- (check != CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC)) {
- EXPECT_EQ(*lease, *expected6);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
- } else {
- expected6->relay_id_.clear();
- expected6->remote_id_.clear();
- expected6->setContext(ElementPtr());
- EXPECT_EQ(*lease, *expected6);
- EXPECT_TRUE(lease->relay_id_.empty());
- EXPECT_TRUE(lease->remote_id_.empty());
- }
-
- // Check lease7.
- lease = got[7];
- Lease4Ptr expected7(new Lease4(*leases4[7]));
- if (check != CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC) {
- EXPECT_EQ(*lease, *expected7);
- EXPECT_EQ(relay_id, lease->relay_id_);
- EXPECT_EQ(remote_id, lease->remote_id_);
- } else {
- expected7->relay_id_.clear();
- expected7->remote_id_.clear();
- expected7->setContext(ElementPtr());
- EXPECT_EQ(*lease, *expected7);
- EXPECT_TRUE(lease->relay_id_.empty());
- EXPECT_TRUE(lease->remote_id_.empty());
- }
-
- // Verify getLeases4ByRelayId.
- Lease4Collection by_relay_id;
- EXPECT_NO_THROW(by_relay_id =
- lease_mgr_->getLeases4ByRelayId(relay_id,
- zero,
- LeasePageSize(100)));
- switch (check) {
- case CfgConsistency::EXTENDED_INFO_CHECK_NONE:
- // Got leases: 0, 1, 4, 5, 6, 7.
- EXPECT_EQ(6, by_relay_id.size());
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_FIX:
- // Got leases: 0, 1, 2, 5, 6, 7.
- EXPECT_EQ(6, by_relay_id.size());
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_STRICT:
- // Got leases: 0, 1, 2, 4, 7.
- EXPECT_EQ(5, by_relay_id.size());
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC:
- default:
- // Got leases: 0, 1, 2, 4.
- EXPECT_EQ(4, by_relay_id.size());
- break;
- }
-
- // Verify getLeases4ByRemoteId.
- Lease4Collection by_remote_id;
- EXPECT_NO_THROW(by_remote_id =
- lease_mgr_->getLeases4ByRemoteId(remote_id,
- zero,
- LeasePageSize(100)));
- switch (check) {
- case CfgConsistency::EXTENDED_INFO_CHECK_NONE:
- // Got leases: 0, 1, 4, 5, 6, 7.
- EXPECT_EQ(6, by_remote_id.size());
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_FIX:
- // Got leases: 0, 1, 2, 5, 6, 7.
- EXPECT_EQ(6, by_remote_id.size());
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_STRICT:
- // Got leases: 0, 1, 2, 4, 7.
- EXPECT_EQ(5, by_remote_id.size());
- break;
-
- case CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC:
- default:
- // Got leases: 0, 1, 2, 4.
- EXPECT_EQ(4, by_remote_id.size());
- break;
- }
-
-}
-
TEST_F(MySqlExtendedInfoTest, upgradeExtendedInfo4None) {
testUpgradeExtendedInfo4(CfgConsistency::EXTENDED_INFO_CHECK_NONE,
LeasePageSize(100));
LeasePageSize(1));
}
-/// @brief Verifies that the lease manager can add the v6 leases.
-void
-MySqlExtendedInfoTest::testInitLease6() {
- start(false);
- initLease6();
- checkLease6();
-}
-
TEST_F(MySqlExtendedInfoTest, initLease6) {
testInitLease6();
}
testInitLease6();
}
-/// @brief Verifies that the lease manager can add the v6 leases with tables.
-void
-MySqlExtendedInfoTest::testEnableTables() {
- start(true);
- 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";
- }
-}
-
TEST_F(MySqlExtendedInfoTest, enableTables) {
testEnableTables();
}
testEnableTables();
}
-/// @brief Verifies that getLeases6ByRelayId works as expected.
-void
-MySqlExtendedInfoTest::testGetLeases6ByRelayId() {
- // Lease manager is created with empty tables.
- start(true);
- initLease6();
- EXPECT_EQ(0, lease_mgr_->byRelayId6size());
-
- // 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(DUIDS[0]);
- DUID relay_id0(relay_id_data0);
- vector<uint8_t> relay_id_data1 = createFromString(DUIDS[1]);
- DUID relay_id1(relay_id_data1);
- vector<uint8_t> relay_id_data2 = createFromString(DUIDS[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_->byRelayId6size());
-
- 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_->byRelayId6size());
-
- // 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());
-}
-
TEST_F(MySqlExtendedInfoTest, getLeases6ByRelayId) {
testGetLeases6ByRelayId();
}
testGetLeases6ByRelayId();
}
-/// @brief Verifies that getLeases6ByRemoteId works as expected.
-void
-MySqlExtendedInfoTest::testGetLeases6ByRemoteId() {
- // Lease manager is created with empty tables.
- start(true);
- initLease6();
- EXPECT_EQ(0, lease_mgr_->byRemoteId6size());
-
- // 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(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));
- 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_->byRemoteId6size());
-
- 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_->byRemoteId6size());
-
- // 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());
-}
-
TEST_F(MySqlExtendedInfoTest, getLeases6ByRemoteId) {
testGetLeases6ByRemoteId();
}
testGetLeases6ByRemoteId();
}
-/// @brief Verifies that getLeases6ByLink works as expected.
-void
-MySqlExtendedInfoTest::testGetLeases6ByLink() {
- // Lease manager is created with empty tables.
- start(false);
- 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());
-}
-
TEST_F(MySqlExtendedInfoTest, getLeases6ByLink) {
testGetLeases6ByLink();
}
testGetLeases6ByLink();
}
-void
-MySqlExtendedInfoTest::testUpgradeExtendedInfo6(const CfgConsistency::ExtendedInfoSanity& check,
- bool extended_info_table_enable,
- const LeasePageSize& page_size) {
- // Lease manager is created with empty tables.
- start(false);
- initLease6();
-
- IOAddress zero = IOAddress::IPV6_ZERO_ADDRESS();
- LeasePageSize ps100(100);
- Lease6Collection got;
-
- // Set empty map user context to first lease.
- leases6[0]->setContext(Element::createMap());
-
- // Set old extended info format to second lease.
- string txt1 = "{ \"ISC\": { \"relays\": [ { \"hop\": 44,";
- txt1 += " \"link\": \"2001:db8::4\", \"peer\": \"2001:db8::5\",";
- txt1 += " \"options\": \"0x00250006010203040506003500086464646464646464\"";
- txt1 += " } ] } }";
- EXPECT_NO_THROW(leases6[1]->setContext(Element::fromJSON(txt1)));
-
- // Set third lease with two relays.
- string txt2 = "{ \"ISC\": { \"relay-info\": [ { \"hop\": 33,";
- txt2 += " \"link\": \"2001:db8::1\", \"peer\": \"2001:db8::2\",";
- txt2 += " \"options\": \"0x00C800080102030405060708\" }, { \"hop\": 100,";
- txt2 += " \"options\": \"0x00250006010203040506003500086464646464646464\",";
- txt2 += " \"link\": \"2001:db8::5\", \"peer\": \"2001:db8::6\",";
- txt2 += " \"remote-id\": \"010203040506\",";
- txt2 += " \"relay-id\": \"6464646464646464\" } ] } }";
- EXPECT_NO_THROW(leases6[2]->setContext(Element::fromJSON(txt2)));
-
- // Update leases.
- for (size_t i = 0; i < leases6.size(); ++i) {
- Lease6Ptr copy(new Lease6(*leases6[i]));
- EXPECT_NO_THROW(lease_mgr_->updateLease6(copy));
- }
-
- // Check we have expected leases.
- checkLease6();
-
- // Set expected lease6.
- if (check != CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
- // Reset user context for first lease.
- leases6[0]->setContext(ConstElementPtr());
-
- // Compute upgraded extended info for second lease.
- EXPECT_TRUE(LeaseMgr::upgradeLease6ExtendedInfo(leases6[1], check));
- }
-
- // Set extended info consistency.
- CfgMgr::instance().getCurrentCfg()->getConsistency()->
- setExtendedInfoSanityCheck(check);
-
- // Set extended info table enable flag.
- lease_mgr_->setExtendedInfoTablesEnabled(extended_info_table_enable);
-
- // Put something in extended info tables.
- ASSERT_NO_THROW(lease_mgr_->wipeExtendedInfoTables6());
- ASSERT_NO_THROW(lease_mgr_->addRelayId6(ADDRESS6[4],
- createFromString(DUIDS[4])));
- ASSERT_NO_THROW(lease_mgr_->addRemoteId6(ADDRESS6[5],
- createFromString(DUIDS[5])));
-
- // Run upgrade command.
- size_t updated;
- ASSERT_NO_THROW(updated = lease_mgr_->upgradeExtendedInfo6(page_size));
-
- // Verify result.
- checkLease6();
-
- // If extended info tables were not enabled they are not touched.
- if (!extended_info_table_enable) {
- EXPECT_EQ(1, lease_mgr_->byRelayId6size());
- EXPECT_EQ(1, lease_mgr_->byRemoteId6size());
-
- // Check relay id.
- vector<uint8_t> relay_id_data = createFromString(DUIDS[4]);
- DUID relay_id(relay_id_data);
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id,
- zero,
- 0,
- zero,
- ps100));
- ASSERT_EQ(1, got.size());
- EXPECT_EQ(IOAddress(ADDRESS6[4]), got[0]->addr_);
-
- // Check remote id.
- vector<uint8_t> remote_id = createFromString(DUIDS[5]);
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id,
- zero,
- 0,
- zero,
- ps100));
- ASSERT_EQ(1, got.size());
- EXPECT_EQ(IOAddress(ADDRESS6[5]), got[0]->addr_);
- }
-
- if (check == CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
- if (!extended_info_table_enable) {
- // Nothing was done.
- EXPECT_EQ(0, updated);
- } else {
- // Tables were rebuilt with only the third lease.
- EXPECT_EQ(1, updated);
- EXPECT_EQ(1, lease_mgr_->byRelayId6size());
- EXPECT_EQ(1, lease_mgr_->byRemoteId6size());
-
- DUID relay_id(vector<uint8_t>(8, 0x64));
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id,
- zero,
- 0,
- zero,
- ps100));
- ASSERT_EQ(1, got.size());
- ConstElementPtr expected2 = leases6[2]->toElement();
- LeasePtr lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected2->equals(*lease->toElement()))
- << "expected2: " << expected2->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
-
- vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id,
- zero,
- 0,
- zero,
- ps100));
- ASSERT_EQ(1, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected2->equals(*lease->toElement()))
- << "expected2: " << expected2->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
- }
- } else {
- // Updated first and second.
- if (!extended_info_table_enable) {
- // and nothing else.
- EXPECT_EQ(2, updated);
- } else {
- // Second and third leases were added to extended info tables.
- EXPECT_EQ(3, updated);
- EXPECT_EQ(2, lease_mgr_->byRelayId6size());
- EXPECT_EQ(2, lease_mgr_->byRemoteId6size());
-
- DUID relay_id(vector<uint8_t>(8, 0x64));
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id,
- zero,
- 0,
- zero,
- ps100));
- ASSERT_EQ(2, got.size());
- ConstElementPtr expected1 = leases6[1]->toElement();
- LeasePtr lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected1->equals(*lease->toElement()))
- << "expected1: " << expected1->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
- ConstElementPtr expected2 = leases6[2]->toElement();
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected2->equals(*lease->toElement()))
- << "expected2: " << expected2->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
-
- vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
- EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id,
- zero,
- 0,
- zero,
- ps100));
- ASSERT_EQ(2, got.size());
- lease = got[0];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected1->equals(*lease->toElement()))
- << "expected1: " << expected1->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
- lease = got[1];
- ASSERT_TRUE(lease);
- EXPECT_TRUE(expected2->equals(*lease->toElement()))
- << "expected2: " << expected2->str() << "\n"
- << "got: " << lease->toElement()->str() << "\n";
- }
- }
-}
-
TEST_F(MySqlExtendedInfoTest, upgradeExtendedInfo6NoCheckDisabled) {
testUpgradeExtendedInfo6(CfgConsistency::EXTENDED_INFO_CHECK_NONE,
false,
libdhcpsrvtest_la_SOURCES += test_config_backend.h
libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp4.cc test_config_backend_dhcp4.h
libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp6.cc test_config_backend_dhcp6.h
+libdhcpsrvtest_la_SOURCES += generic_extended_info_unittest.h
if HAVE_MYSQL
libdhcpsrvtest_la_SOURCES += mysql_generic_backend_unittest.cc mysql_generic_backend_unittest.h
--- /dev/null
+// Copyright (C) 2023 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef GENERIC_EXTENDED_INFO_UNITTEST_H
+#define GENERIC_EXTENDED_INFO_UNITTEST_H
+
+#include <asiolink/io_address.h>
+#include <cc/data.h>
+#include <dhcpsrv/cfg_consistency.h>
+#include <dhcpsrv/cfgmgr.h>
+#include <dhcpsrv/lease_mgr_factory.h>
+#include <testutils/gtest_utils.h>
+#include <testutils/multi_threading_utils.h>
+
+#include <gtest/gtest.h>
+
+namespace isc {
+namespace dhcp {
+namespace test {
+
+/// @brief Base test fixture class for extended info tests.
+template<typename NakedLeaseMgrType>
+class GenericExtendedInfoTest : public ::testing::Test {
+public:
+ /// @brief IPv4 addresses used in the tests.
+ static const std::vector<std::string> ADDRESS4;
+
+ /// @brief IPv6 addresses used in the tests.
+ static const std::vector<std::string> ADDRESS6;
+
+ /// @brief DUIDs used in the tests.
+ static const std::vector<std::string> DUIDS;
+
+ /// @brief Return valid connection string.
+ virtual std::string validConnectionString() {
+ isc_throw(isc::NotImplemented, "attempt to use base test fixture?");
+ }
+
+ /// @brief Create the database schema.
+ virtual void createSchema() { }
+
+ /// @brief Destroy the database schema.
+ virtual void destroySchema() { }
+
+ /// @brief Constructor.
+ GenericExtendedInfoTest() {
+ // Ensure we have the proper schema with no transient data.
+ NakedLeaseMgrType::createSchema();
+
+ const std::string& conn = NakedLeaseMgrType::validConnectionString();
+ pmap_ = db::DatabaseConnection::parse(conn);
+ lease_mgr_.reset();
+ leases4.clear();
+ leases6.clear();
+ util::MultiThreadingMgr::instance().setMode(false);
+ now_ = time(0);
+ }
+
+ /// @brief Destructor.
+ ~GenericExtendedInfoTest() {
+ pmap_.clear();
+ lease_mgr_.reset();
+ leases4.clear();
+ leases6.clear();
+ util::MultiThreadingMgr::instance().setMode(false);
+
+ // If data wipe enabled, delete transient data otherwise destroy
+ // the schema.
+ NakedLeaseMgrType::destroySchema();
+ }
+
+ /// @brief Create and set v4 leases.
+ ///
+ /// @param insert When true insert in the database.
+ void initLease4(bool insert = true) {
+ ASSERT_EQ(ADDRESS4.size(), DUIDS.size());
+ for (size_t i = 0; i < ADDRESS4.size(); ++i) {
+ Lease4Ptr lease;
+ std::vector<uint8_t> hwaddr_data(5, 0x08);
+ hwaddr_data.push_back(0x80 + i);
+ HWAddrPtr hwaddr(new HWAddr(hwaddr_data, HTYPE_ETHER));
+ std::vector<uint8_t> client_id = createFromString(DUIDS[i]);
+ asiolink::IOAddress address(ADDRESS4[i]);
+ ASSERT_NO_THROW(lease.reset(new Lease4(address, hwaddr,
+ &client_id[0],
+ client_id.size(),
+ 1000, now_,
+ static_cast<SubnetID>(i))));
+ leases4.push_back(lease);
+ if (insert) {
+ EXPECT_TRUE(lease_mgr_->addLease(lease));
+ }
+ }
+ ASSERT_EQ(ADDRESS4.size(), leases4.size());
+ }
+
+ /// @brief Create and set v6 leases.
+ void initLease6() {
+ ASSERT_EQ(ADDRESS6.size(), DUIDS.size());
+ for (size_t i = 0; i < ADDRESS6.size(); ++i) {
+ Lease6Ptr lease;
+ std::vector<uint8_t> duid_data = createFromString(DUIDS[i]);
+ DuidPtr duid(new DUID(duid_data));
+ asiolink::IOAddress addr(ADDRESS6[i]);
+ ASSERT_NO_THROW(lease.reset(new Lease6(((i % 2) ? Lease::TYPE_NA : Lease::TYPE_PD), addr, duid,
+ 123, 1000, 2000,
+ static_cast<SubnetID>(i))));
+ leases6.push_back(lease);
+ EXPECT_TRUE(lease_mgr_->addLease(lease));
+ }
+ ASSERT_EQ(ADDRESS6.size(), leases6.size());
+ }
+
+ /// @brief Check v6 leases (using get page to keep order).
+ void checkLease6() {
+ EXPECT_EQ(8, leases6.size());
+ Lease6Collection got;
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV6_ZERO_ADDRESS();
+ LeasePageSize ps100(100);
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6(zero, ps100));
+ ASSERT_EQ(leases6.size(), got.size());
+ for (size_t i = 0; i < leases6.size(); ++i) {
+ data::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";
+ }
+ }
+
+ /// @brief Start lease manager.
+ ///
+ /// @param enable When true enable extended info tables.
+ void start(bool enable) {
+ // Do not set unused pmap_["universe"].
+ if (enable) {
+ pmap_["extended-info-tables"] = "true";
+ }
+
+ ASSERT_NO_THROW(lease_mgr_.reset(new NakedLeaseMgrType(pmap_)));
+ if (enable) {
+ EXPECT_TRUE(lease_mgr_->getExtendedInfoTablesEnabled());
+ } else {
+ EXPECT_FALSE(lease_mgr_->getExtendedInfoTablesEnabled());
+ }
+ }
+
+ /// @brief Create a vector of uint8_t from a string.
+ ///
+ /// @param content A not empty string holding the content.
+ /// @return A vector of uint8_t with the given content.
+ inline std::vector<uint8_t> createFromString(const std::string& content) {
+ std::vector<uint8_t> v;
+ v.resize(content.size());
+ memmove(&v[0], &content[0], v.size());
+ return (v);
+ }
+
+ /// @brief Test initLease4.
+ void testInitLease4();
+
+ /// @brief Test initLease6.
+ void testInitLease6();
+
+ /// @brief Test getLease4ByRelayId.
+ void testGetLeases4ByRelayId();
+
+ /// @brief Test getLease4ByRemoteId.
+ void testGetLeases4ByRemoteId();
+
+ /// @brief Test upgradeExtendedInfo4.
+ void testUpgradeExtendedInfo4(const CfgConsistency::ExtendedInfoSanity& check,
+ const LeasePageSize& page_size);
+
+ /// @brief Test initLease6 with tables.
+ void testEnableTables();
+
+ /// @brief Test getLeases6ByRelayId.
+ void testGetLeases6ByRelayId();
+
+ /// @brief Test getLeases6ByRemoteId.
+ void testGetLeases6ByRemoteId();
+
+ /// @brief Test getLeases6ByLink.
+ void testGetLeases6ByLink();
+
+ /// @brief Test upgradeExtendedInfo6.
+ void testUpgradeExtendedInfo6(const CfgConsistency::ExtendedInfoSanity& check,
+ bool extended_info_table_enable,
+ const LeasePageSize& page_size);
+
+ /// @brief Parameter map.
+ db::DatabaseConnection::ParameterMap pmap_;
+
+ /// @brief Lease manager.
+ boost::shared_ptr<NakedLeaseMgrType> lease_mgr_;
+
+ /// @brief V4 leases.
+ Lease4Collection leases4;
+
+ /// @brief V6 leases.
+ Lease6Collection leases6;
+
+ /// @brief Current timestamp.
+ time_t now_;
+};
+
+template<typename NakedLeaseMgrType>
+const std::vector<std::string>
+GenericExtendedInfoTest<NakedLeaseMgrType>::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"
+};
+
+template<typename NakedLeaseMgrType>
+const std::vector<std::string>
+GenericExtendedInfoTest<NakedLeaseMgrType>::ADDRESS6 = {
+ "2001:db8::", "2001:db8::1", "2001:db8::2", "2001:db8::3",
+ "2001:db8::4", "2001:db8::5", "2001:db8::6", "2001:db8::7"
+};
+
+template<typename NakedLeaseMgrType>
+const std::vector<std::string>
+GenericExtendedInfoTest<NakedLeaseMgrType>::DUIDS = {
+ "wwwwwwww", "BBBBBBBB", "::::::::", "0123456789acdef",
+ "BBBBBBBB", "$$$$$$$$", "^^^^^^^^", "\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5"
+};
+
+/// @brief Verifies that the lease manager can add the v4 leases.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testInitLease4() {
+ start(false);
+ initLease4();
+ EXPECT_EQ(8, leases4.size());
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV4_ZERO_ADDRESS();
+ Lease4Collection got;
+ // Use the page version as it returns leases in order.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4(zero, LeasePageSize(100)));
+ ASSERT_EQ(leases4.size(), got.size());
+ auto compare = [](Lease4Ptr const& left, Lease4Ptr const& right) {
+ return (left->addr_ < right->addr_);
+ };
+ std::sort(got.begin(), got.end(), compare);
+ for (size_t i = 0; i < leases4.size(); ++i) {
+ data::ConstElementPtr expected = leases4[i]->toElement();
+ LeasePtr lease = got[i];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected->equals(*lease->toElement()))
+ << "expected: " << expected->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+ }
+}
+
+/// @brief Verifies that getLeases4ByRelayId works as expected.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases4ByRelayId() {
+ // Lease manager is created with empty tables.
+ start(false);
+ initLease4(false);
+
+ // Create leases.
+ asiolink::IOAddress addr0(ADDRESS4[0]);
+ asiolink::IOAddress addr1(ADDRESS4[1]);
+ asiolink::IOAddress addr2(ADDRESS4[2]);
+ asiolink::IOAddress addr3(ADDRESS4[3]);
+ asiolink::IOAddress addr4(ADDRESS4[4]);
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV4_ZERO_ADDRESS();
+ std::vector<uint8_t> relay_id0 = { 0xaa, 0xbb, 0xcc };
+ std::vector<uint8_t> relay_id1 = { 1, 2, 3, 4 };
+ std::vector<uint8_t> relay_id2 = createFromString(DUIDS[2]);
+ std::string user_context_txt0 = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_txt0 += " \"sub-options\": \"0C03AABBCC\",";
+ user_context_txt0 += " \"relay-id\": \"AABBCC\" } } }";
+ data::ElementPtr user_context0;
+ ASSERT_NO_THROW(user_context0 = data::Element::fromJSON(user_context_txt0));
+ std::string user_context_txt1 = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_txt1 += " \"sub-options\": \"0C0401020304\",";
+ user_context_txt1 += " \"relay-id\": \"01020304\" } } }";
+ data::ElementPtr user_context1;
+ ASSERT_NO_THROW(user_context1 = data::Element::fromJSON(user_context_txt1));
+
+ Lease4Ptr lease;
+ // lease0: addr0, id0, now.
+ lease = leases4[0];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id0;
+ lease->setContext(user_context0);
+
+ // lease1: addr1, id1, now.
+ lease = leases4[1];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id1;
+ lease->setContext(user_context1);
+
+ // lease2: addr2, id0, now - 500.
+ lease = leases4[2];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id0;
+ lease->setContext(user_context0);
+ lease->cltt_ = now_ - 500;
+
+ // lease3: addr3, id0, now - 800.
+ lease = leases4[3];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id0;
+ lease->setContext(user_context0);
+ lease->cltt_ = now_ - 800;
+
+ // lease4: addr4, id0, now - 100.
+ lease = leases4[4];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id0;
+ lease->setContext(user_context0);
+ lease->cltt_ = now_ - 100;
+
+ // Add leases.
+ for (size_t i = 0; i < leases4.size(); ++i) {
+ EXPECT_TRUE(lease_mgr_->addLease(leases4[i]));
+ }
+
+ Lease4Collection got;
+ // Unknown relay id #2: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id2,
+ zero,
+ LeasePageSize(100)));
+ EXPECT_EQ(0, got.size());
+
+ // Unknown relay id #2, now - 1000, now + 1000: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id2,
+ zero,
+ LeasePageSize(100),
+ now_ - 1000,
+ now_ + 1000));
+ EXPECT_EQ(0, got.size());
+
+ // Relay id #0, now - 2000, now - 1000: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(100),
+ now_ - 2000,
+ now_ - 1000));
+ EXPECT_EQ(0, got.size());
+
+ // Relay id #0, now + 1000, now + 2000: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(100),
+ now_ + 1000,
+ now_ + 2000));
+ EXPECT_EQ(0, got.size());
+
+ // Relay id #0: 3 entries (0, 2, 3, 4).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(100)));
+ ASSERT_EQ(4, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[2];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[3]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[3];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, partial: 2 entries (0, 2).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(2)));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, partial from previous: 2 entries (3, 4).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ addr2,
+ LeasePageSize(2)));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[3]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, final partial: no entries.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ addr4,
+ LeasePageSize(2)));
+ EXPECT_EQ(0, got.size());
+
+ // Relay id #0, from now - 500: 3 entries (0, 2, 4).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(100),
+ now_ - 500));
+ ASSERT_EQ(3, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[2];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, to now - 200: 3 entries (2, 3).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(100),
+ 0, now_ - 200));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[3]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, from now - 500 to now - 100, partial: 1 entry.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ zero,
+ LeasePageSize(1),
+ now_ - 500,
+ now_ - 100));
+ ASSERT_EQ(1, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, from now - 500 to now - 100, partial from 2: 1 entry.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ addr2,
+ LeasePageSize(1),
+ now_ - 500,
+ now_ - 100));
+ ASSERT_EQ(1, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(relay_id0, lease->relay_id_);
+
+ // Relay id #0, from now - 500 to now - 100, final partial.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRelayId(relay_id0,
+ addr4,
+ LeasePageSize(1),
+ now_ - 500,
+ now_ - 100));
+ EXPECT_EQ(0, got.size());
+}
+
+/// @brief Verifies that getLeases4ByRemoteId works as expected.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases4ByRemoteId() {
+ // Lease manager is created with empty tables.
+ start(false);
+ initLease4(true);
+
+ // Update leases.
+ asiolink::IOAddress addr0(ADDRESS4[0]);
+ asiolink::IOAddress addr1(ADDRESS4[1]);
+ asiolink::IOAddress addr2(ADDRESS4[2]);
+ asiolink::IOAddress addr3(ADDRESS4[3]);
+ asiolink::IOAddress addr4(ADDRESS4[4]);
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV4_ZERO_ADDRESS();
+ std::vector<uint8_t> remote_id0 = { 1, 2, 3, 4 };
+ std::vector<uint8_t> remote_id1 = { 0xaa, 0xbb, 0xcc };
+ std::vector<uint8_t> remote_id2 = createFromString(DUIDS[2]);
+ std::string user_context_txt0 = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_txt0 += " \"sub-options\": \"020401020304\",";
+ user_context_txt0 += " \"remote-id\": \"01020304\" } } }";
+ data::ElementPtr user_context0;
+ ASSERT_NO_THROW(user_context0 = data::Element::fromJSON(user_context_txt0));
+ std::string user_context_txt1 = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_txt1 += " \"sub-options\": \"0203AABBCC\",";
+ user_context_txt1 += " \"remote-id\": \"AABBCC\" } } }";
+ data::ElementPtr user_context1;
+ ASSERT_NO_THROW(user_context1 = data::Element::fromJSON(user_context_txt1));
+
+ Lease4Ptr lease;
+ // lease0: addr0, id0, now.
+ lease = leases4[0];
+ lease->remote_id_ = remote_id0;
+ lease->setContext(user_context0);
+
+ // lease1: addr1, id1, now.
+ lease = leases4[1];
+ lease->remote_id_ = remote_id1;
+ lease->setContext(user_context1);
+
+ // lease2: addr2, id0, now - 500.
+ lease = leases4[2];
+ lease->remote_id_ = remote_id0;
+ lease->setContext(user_context0);
+ lease->cltt_ = now_ - 500;
+
+ // lease3: addr3, id0, now - 800.
+ lease = leases4[3];
+ lease->remote_id_ = remote_id0;
+ lease->setContext(user_context0);
+ lease->cltt_ = now_ - 800;
+
+ // lease4: addr4, id0, now - 100.
+ lease = leases4[4];
+ lease->remote_id_ = remote_id0;
+ lease->setContext(user_context0);
+ lease->cltt_ = now_ - 100;
+
+ // Update leases.
+ for (size_t i = 0; i < leases4.size(); ++i) {
+ EXPECT_NO_THROW(lease_mgr_->updateLease4(leases4[i]));
+ }
+
+ Lease4Collection got;
+ // Unknown remote id #2: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id2,
+ zero,
+ LeasePageSize(100)));
+ EXPECT_EQ(0, got.size());
+
+ // Unknown remote id #2, now - 1000, now + 1000: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id2,
+ zero,
+ LeasePageSize(100),
+ now_ - 1000,
+ now_ + 1000));
+ EXPECT_EQ(0, got.size());
+
+ // Remote id #0, now - 2000, now - 1000: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(100),
+ now_ - 2000,
+ now_ - 1000));
+ EXPECT_EQ(0, got.size());
+
+ // Remote id #0, now + 1000, now + 2000: nothing.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(100),
+ now_ + 1000,
+ now_ + 2000));
+ EXPECT_EQ(0, got.size());
+
+ // Remote id #0: 3 entries (0, 2, 3, 4).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(100)));
+ ASSERT_EQ(4, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[2];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[3]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[3];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, partial: 2 entries (0, 2).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(2)));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, partial from previous: 2 entries (3, 4).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ addr2,
+ LeasePageSize(2)));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[3]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, final partial: no entries.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ addr4,
+ LeasePageSize(2)));
+ EXPECT_EQ(0, got.size());
+
+ // Remote id #0, from now - 500: 3 entries (0, 2, 4).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(100),
+ now_ - 500));
+ ASSERT_EQ(3, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[2];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, to now - 200: 3 entries (2, 3).
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(100),
+ 0, now_ - 200));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[3]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, from now - 500 to now - 100, partial: 1 entry.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ zero,
+ LeasePageSize(1),
+ now_ - 500,
+ now_ - 100));
+ ASSERT_EQ(1, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[2]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, from now - 500 to now - 100, partial from 2: 1 entry.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ addr2,
+ LeasePageSize(1),
+ now_ - 500,
+ now_ - 100));
+ ASSERT_EQ(1, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_EQ(*lease, *leases4[4]);
+ EXPECT_EQ(remote_id0, lease->remote_id_);
+
+ // Remote id #0, from now - 500 to now - 100, final partial.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4ByRemoteId(remote_id0,
+ addr4,
+ LeasePageSize(1),
+ now_ - 500,
+ now_ - 100));
+ EXPECT_EQ(0, got.size());
+}
+
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testUpgradeExtendedInfo4(
+ const CfgConsistency::ExtendedInfoSanity& check,
+ const LeasePageSize& page_size) {
+
+ // Lease manager is created with empty tables.
+ start(false);
+ initLease4(false);
+
+ // Create leases.
+ asiolink::IOAddress addr0(ADDRESS4[0]);
+ asiolink::IOAddress addr1(ADDRESS4[1]);
+ asiolink::IOAddress addr2(ADDRESS4[2]);
+ asiolink::IOAddress addr3(ADDRESS4[3]);
+ asiolink::IOAddress addr4(ADDRESS4[4]);
+ asiolink::IOAddress addr5(ADDRESS4[5]);
+ asiolink::IOAddress addr6(ADDRESS4[6]);
+ asiolink::IOAddress addr7(ADDRESS4[7]);
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV4_ZERO_ADDRESS();
+ std::vector<uint8_t> relay_id = { 0xaa, 0xbb, 0xcc };
+ std::vector<uint8_t> relay_id2 = { 0xdd, 0xee, 0xff };
+ std::vector<uint8_t> remote_id = { 1, 2, 3, 4 };
+ std::vector<uint8_t> remote_id2 = { 5, 6, 7, 8 };
+ std::string user_context_txt = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_txt += " \"sub-options\": \"0204010203040C03AABBCC\",";
+ user_context_txt += " \"relay-id\": \"AABBCC\",";
+ user_context_txt += " \"remote-id\": \"01020304\" } } }";
+ data::ElementPtr user_context;
+ ASSERT_NO_THROW(user_context = data::Element::fromJSON(user_context_txt));
+ std::string user_context_txt_old = "{ \"ISC\": { \"relay-agent-info\":";
+ user_context_txt_old += " \"0204010203040C03AABBCC\" } }";
+ data::ElementPtr user_context_old;
+ ASSERT_NO_THROW(user_context_old = data::Element::fromJSON(user_context_txt_old));
+ std::string user_context_list_txt = "{ \"ISC\": { \"relay-agent-info\": [ ] } }";
+ data::ElementPtr user_context_list;
+ ASSERT_NO_THROW(user_context_list = data::Element::fromJSON(user_context_list_txt));
+ std::string user_context_lower_txt = "{ \"isc\": { \"relay-agent-info\":";
+ user_context_lower_txt += " \"0204010203040c03aabbcc\" } }";
+ data::ElementPtr user_context_lower;
+ ASSERT_NO_THROW(user_context_lower = data::Element::fromJSON(user_context_lower_txt));
+ std::string user_context_badsub_txt = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_badsub_txt += " \"sub-options\": \"foobar\",";
+ user_context_badsub_txt += " \"relay-id\": \"AABBCC\",";
+ user_context_badsub_txt += " \"remote-id\": \"01020304\" } } }";
+ data::ElementPtr user_context_badsub;
+ ASSERT_NO_THROW(user_context_badsub = data::Element::fromJSON(user_context_badsub_txt));
+ std::string user_context_extra_txt = "{ \"ISC\": { \"relay-agent-info\": {";
+ user_context_extra_txt += " \"foo\": \"bar\", ";
+ user_context_extra_txt += " \"sub-options\": \"0204010203040C03AABBCC\",";
+ user_context_extra_txt += " \"relay-id\": \"AABBCC\",";
+ user_context_extra_txt += " \"remote-id\": \"01020304\" } } }";
+ data::ElementPtr user_context_extra;
+ ASSERT_NO_THROW(user_context_extra = data::Element::fromJSON(user_context_extra_txt));
+
+ Lease4Ptr lease;
+ // lease0: addr0, ids, before: always not updated.
+ lease = leases4[0];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id;
+ lease->remote_id_ = remote_id;
+ lease->setContext(user_context);
+ lease->cltt_ = now_ - 500;
+
+ // lease1: addr1, ids, after: always not updated.
+ lease = leases4[1];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id;
+ lease->remote_id_ = remote_id;
+ lease->setContext(user_context);
+ lease->cltt_ = now_ + 500;
+
+ // lease2: addr2, no id, old user context: updated on check > NONE.
+ lease = leases4[2];
+ ASSERT_TRUE(lease);
+ lease->setContext(user_context_old);
+
+ // lease3: addr3, ids, lower case old user context: always updated.
+ lease = leases4[3];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id;
+ lease->remote_id_ = remote_id;
+ lease->setContext(user_context_lower);
+
+ // Lease4: addr4, ids, bad (list) user context: updated on check > NONE.
+ lease = leases4[4];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id;
+ lease->remote_id_ = remote_id;
+ lease->setContext(user_context_list);
+
+ // Lease5: addr5, other ids: always updated.
+ lease = leases4[5];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id2;
+ lease->remote_id_ = remote_id2;
+ lease->setContext(user_context);
+
+ // Lease6: addr6, ids, bad sub-options: updated on check > FIX.
+ lease = leases4[6];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id;
+ lease->remote_id_ = remote_id;
+ lease->setContext(user_context_badsub);
+
+ // Lease7: addr7, ids, extra in ISC: updated on check > STRICT.
+ lease = leases4[7];
+ ASSERT_TRUE(lease);
+ lease->relay_id_ = relay_id;
+ lease->remote_id_ = remote_id;
+ lease->setContext(user_context_extra);
+
+ // Add leases.
+ for (size_t i = 0; i < leases4.size(); ++i) {
+ EXPECT_TRUE(lease_mgr_->addLease(leases4[i]));
+ }
+
+ // Set extended info consistency.
+ CfgMgr::instance().getCurrentCfg()->getConsistency()->
+ setExtendedInfoSanityCheck(check);
+
+ size_t updated;
+ ASSERT_NO_THROW(updated = lease_mgr_->upgradeExtendedInfo4(page_size));
+
+ // Verify result.
+ switch (check) {
+ case CfgConsistency::EXTENDED_INFO_CHECK_NONE:
+ // Updated leases: 3, 5.
+ EXPECT_EQ(updated, 2);
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_FIX:
+ // Updated leases: 2, 3, 4, 5.
+ EXPECT_EQ(updated, 4);
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_STRICT:
+ // Updated leases: 2, 3, 4, 5, 6.
+ EXPECT_EQ(updated, 5);
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC:
+ default:
+ // Updated leases: 2, 3, 4, 5, 6, 7.
+ EXPECT_EQ(updated, 6);
+ break;
+ }
+
+ // Verify stored leases.
+ Lease4Collection got;
+ // Use the page version as it returns leases in order.
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases4(zero, LeasePageSize(100)));
+ ASSERT_EQ(leases4.size(), got.size());
+
+ // Check lease0.
+ lease = got[0];
+ EXPECT_EQ(*lease, *leases4[0]);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+
+ // Check lease1.
+ lease = got[1];
+ EXPECT_EQ(*lease, *leases4[1]);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+
+ // Check lease2.
+ lease = got[2];
+ Lease4Ptr expected2(new Lease4(*leases4[2]));
+ if (check == CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
+ EXPECT_EQ(*lease, *expected2);
+ EXPECT_TRUE(lease->relay_id_.empty());
+ EXPECT_TRUE(lease->remote_id_.empty());
+ } else {
+ expected2->setContext(user_context);
+ expected2->relay_id_ = relay_id;
+ expected2->remote_id_ = remote_id;
+ EXPECT_EQ(*lease, *expected2);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+ }
+
+ // Check lease3.
+ lease = got[3];
+ Lease4Ptr expected3(new Lease4(*leases4[3]));
+ expected3->relay_id_.clear();
+ expected3->remote_id_.clear();
+ EXPECT_EQ(*lease, *expected3);
+ EXPECT_TRUE(lease->relay_id_.empty());
+ EXPECT_TRUE(lease->remote_id_.empty());
+
+ // Check lease4.
+ lease = got[4];
+ Lease4Ptr expected4(new Lease4(*leases4[4]));
+ if (check == CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
+ EXPECT_EQ(*lease, *expected4);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+ } else {
+ expected4->relay_id_.clear();
+ expected4->remote_id_.clear();
+ expected4->setContext(data::ElementPtr());
+ EXPECT_EQ(*lease, *expected4);
+ EXPECT_TRUE(lease->relay_id_.empty());
+ EXPECT_TRUE(lease->remote_id_.empty());
+ }
+
+ // Check lease5.
+ lease = got[5];
+ Lease4Ptr expected5(new Lease4(*leases4[5]));
+ expected5->relay_id_ = relay_id;
+ expected5->remote_id_ = remote_id;
+ EXPECT_EQ(*lease, *expected5);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+
+ // Check lease6.
+ lease = got[6];
+ Lease4Ptr expected6(new Lease4(*leases4[6]));
+ if ((check != CfgConsistency::EXTENDED_INFO_CHECK_STRICT) &&
+ (check != CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC)) {
+ EXPECT_EQ(*lease, *expected6);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+ } else {
+ expected6->relay_id_.clear();
+ expected6->remote_id_.clear();
+ expected6->setContext(data::ElementPtr());
+ EXPECT_EQ(*lease, *expected6);
+ EXPECT_TRUE(lease->relay_id_.empty());
+ EXPECT_TRUE(lease->remote_id_.empty());
+ }
+
+ // Check lease7.
+ lease = got[7];
+ Lease4Ptr expected7(new Lease4(*leases4[7]));
+ if (check != CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC) {
+ EXPECT_EQ(*lease, *expected7);
+ EXPECT_EQ(relay_id, lease->relay_id_);
+ EXPECT_EQ(remote_id, lease->remote_id_);
+ } else {
+ expected7->relay_id_.clear();
+ expected7->remote_id_.clear();
+ expected7->setContext(data::ElementPtr());
+ EXPECT_EQ(*lease, *expected7);
+ EXPECT_TRUE(lease->relay_id_.empty());
+ EXPECT_TRUE(lease->remote_id_.empty());
+ }
+
+ // Verify getLeases4ByRelayId.
+ Lease4Collection by_relay_id;
+ EXPECT_NO_THROW(by_relay_id =
+ lease_mgr_->getLeases4ByRelayId(relay_id,
+ zero,
+ LeasePageSize(100)));
+ switch (check) {
+ case CfgConsistency::EXTENDED_INFO_CHECK_NONE:
+ // Got leases: 0, 1, 4, 5, 6, 7.
+ EXPECT_EQ(6, by_relay_id.size());
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_FIX:
+ // Got leases: 0, 1, 2, 5, 6, 7.
+ EXPECT_EQ(6, by_relay_id.size());
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_STRICT:
+ // Got leases: 0, 1, 2, 4, 7.
+ EXPECT_EQ(5, by_relay_id.size());
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC:
+ default:
+ // Got leases: 0, 1, 2, 4.
+ EXPECT_EQ(4, by_relay_id.size());
+ break;
+ }
+
+ // Verify getLeases4ByRemoteId.
+ Lease4Collection by_remote_id;
+ EXPECT_NO_THROW(by_remote_id =
+ lease_mgr_->getLeases4ByRemoteId(remote_id,
+ zero,
+ LeasePageSize(100)));
+ switch (check) {
+ case CfgConsistency::EXTENDED_INFO_CHECK_NONE:
+ // Got leases: 0, 1, 4, 5, 6, 7.
+ EXPECT_EQ(6, by_remote_id.size());
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_FIX:
+ // Got leases: 0, 1, 2, 5, 6, 7.
+ EXPECT_EQ(6, by_remote_id.size());
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_STRICT:
+ // Got leases: 0, 1, 2, 4, 7.
+ EXPECT_EQ(5, by_remote_id.size());
+ break;
+
+ case CfgConsistency::EXTENDED_INFO_CHECK_PEDANTIC:
+ default:
+ // Got leases: 0, 1, 2, 4.
+ EXPECT_EQ(4, by_remote_id.size());
+ break;
+ }
+
+}
+
+/// @brief Verifies that the lease manager can add the v6 leases.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testInitLease6() {
+ start(false);
+ initLease6();
+ checkLease6();
+}
+
+/// @brief Verifies that the lease manager can add the v6 leases with tables.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testEnableTables() {
+ start(true);
+ 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) {
+ data::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";
+ }
+}
+
+/// @brief Verifies that getLeases6ByRelayId works as expected.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases6ByRelayId() {
+ // Lease manager is created with empty tables.
+ start(true);
+ initLease6();
+ EXPECT_EQ(0, lease_mgr_->byRelayId6size());
+
+ // Create parameter values.
+ asiolink::IOAddress lease_addr0(ADDRESS6[0]);
+ asiolink::IOAddress lease_addr1(ADDRESS6[1]);
+ asiolink::IOAddress lease_addr2(ADDRESS6[2]);
+ asiolink::IOAddress link_addr(ADDRESS6[4]);
+ asiolink::IOAddress other_link_addr("2001:db8:1::4");
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV6_ZERO_ADDRESS();
+ std::vector<uint8_t> relay_id_data0 = createFromString(DUIDS[0]);
+ DUID relay_id0(relay_id_data0);
+ std::vector<uint8_t> relay_id_data1 = createFromString(DUIDS[1]);
+ DUID relay_id1(relay_id_data1);
+ std::vector<uint8_t> relay_id_data2 = createFromString(DUIDS[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_->byRelayId6size());
+
+ 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_->byRelayId6size());
+
+ // 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());
+}
+
+/// @brief Verifies that getLeases6ByRemoteId works as expected.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases6ByRemoteId() {
+ // Lease manager is created with empty tables.
+ start(true);
+ initLease6();
+ EXPECT_EQ(0, lease_mgr_->byRemoteId6size());
+
+ // Create parameter values.
+ asiolink::IOAddress lease_addr0(ADDRESS6[0]);
+ asiolink::IOAddress lease_addr1(ADDRESS6[1]);
+ asiolink::IOAddress lease_addr2(ADDRESS6[2]);
+ asiolink::IOAddress link_addr(ADDRESS6[4]);
+ asiolink::IOAddress other_link_addr("2001:db8:1::4");
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV6_ZERO_ADDRESS();
+ std::vector<uint8_t> remote_id0 = createFromString(DUIDS[0]);
+ std::vector<uint8_t> remote_id1 = createFromString(DUIDS[1]);
+ std::vector<uint8_t> remote_id2 = createFromString(DUIDS[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_->byRemoteId6size());
+
+ 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_->byRemoteId6size());
+
+ // 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());
+}
+
+/// @brief Verifies that getLeases6ByLink works as expected.
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases6ByLink() {
+ // Lease manager is created with empty tables.
+ start(false);
+ initLease6();
+
+ // Create parameter values.
+ asiolink::IOAddress link_addr(ADDRESS6[4]);
+ asiolink::IOAddress other_link_addr("2001:db8:1::4");
+ asiolink::IOAddress zero = asiolink::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(asiolink::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(asiolink::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(asiolink::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());
+}
+
+template<typename NakedLeaseMgrType> void
+GenericExtendedInfoTest<NakedLeaseMgrType>::testUpgradeExtendedInfo6(
+ const CfgConsistency::ExtendedInfoSanity& check,
+ bool extended_info_table_enable,
+ const LeasePageSize& page_size) {
+
+ // Lease manager is created with empty tables.
+ start(false);
+ initLease6();
+
+ asiolink::IOAddress zero = asiolink::IOAddress::IPV6_ZERO_ADDRESS();
+ LeasePageSize ps100(100);
+ Lease6Collection got;
+
+ // Set empty map user context to first lease.
+ leases6[0]->setContext(data::Element::createMap());
+
+ // Set old extended info format to second lease.
+ std::string txt1 = "{ \"ISC\": { \"relays\": [ { \"hop\": 44,";
+ txt1 += " \"link\": \"2001:db8::4\", \"peer\": \"2001:db8::5\",";
+ txt1 += " \"options\": \"0x00250006010203040506003500086464646464646464\"";
+ txt1 += " } ] } }";
+ EXPECT_NO_THROW(leases6[1]->setContext(data::Element::fromJSON(txt1)));
+
+ // Set third lease with two relays.
+ std::string txt2 = "{ \"ISC\": { \"relay-info\": [ { \"hop\": 33,";
+ txt2 += " \"link\": \"2001:db8::1\", \"peer\": \"2001:db8::2\",";
+ txt2 += " \"options\": \"0x00C800080102030405060708\" }, { \"hop\": 100,";
+ txt2 += " \"options\": \"0x00250006010203040506003500086464646464646464\",";
+ txt2 += " \"link\": \"2001:db8::5\", \"peer\": \"2001:db8::6\",";
+ txt2 += " \"remote-id\": \"010203040506\",";
+ txt2 += " \"relay-id\": \"6464646464646464\" } ] } }";
+ EXPECT_NO_THROW(leases6[2]->setContext(data::Element::fromJSON(txt2)));
+
+ // Update leases.
+ for (size_t i = 0; i < leases6.size(); ++i) {
+ Lease6Ptr copy(new Lease6(*leases6[i]));
+ EXPECT_NO_THROW(lease_mgr_->updateLease6(copy));
+ }
+
+ // Check we have expected leases.
+ checkLease6();
+
+ // Set expected lease6.
+ if (check != CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
+ // Reset user context for first lease.
+ leases6[0]->setContext(data::ConstElementPtr());
+
+ // Compute upgraded extended info for second lease.
+ EXPECT_TRUE(LeaseMgr::upgradeLease6ExtendedInfo(leases6[1], check));
+ }
+
+ // Set extended info consistency.
+ CfgMgr::instance().getCurrentCfg()->getConsistency()->
+ setExtendedInfoSanityCheck(check);
+
+ // Set extended info table enable flag.
+ lease_mgr_->setExtendedInfoTablesEnabled(extended_info_table_enable);
+
+ // Put something in extended info tables.
+ ASSERT_NO_THROW(lease_mgr_->wipeExtendedInfoTables6());
+ ASSERT_NO_THROW(lease_mgr_->addRelayId6(ADDRESS6[4],
+ createFromString(DUIDS[4])));
+ ASSERT_NO_THROW(lease_mgr_->addRemoteId6(ADDRESS6[5],
+ createFromString(DUIDS[5])));
+
+ // Run upgrade command.
+ size_t updated;
+ ASSERT_NO_THROW(updated = lease_mgr_->upgradeExtendedInfo6(page_size));
+
+ // Verify result.
+ checkLease6();
+
+ // If extended info tables were not enabled they are not touched.
+ if (!extended_info_table_enable) {
+ EXPECT_EQ(1, lease_mgr_->byRelayId6size());
+ EXPECT_EQ(1, lease_mgr_->byRemoteId6size());
+
+ // Check relay id.
+ std::vector<uint8_t> relay_id_data = createFromString(DUIDS[4]);
+ DUID relay_id(relay_id_data);
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id,
+ zero,
+ 0,
+ zero,
+ ps100));
+ ASSERT_EQ(1, got.size());
+ EXPECT_EQ(asiolink::IOAddress(ADDRESS6[4]), got[0]->addr_);
+
+ // Check remote id.
+ std::vector<uint8_t> remote_id = createFromString(DUIDS[5]);
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id,
+ zero,
+ 0,
+ zero,
+ ps100));
+ ASSERT_EQ(1, got.size());
+ EXPECT_EQ(asiolink::IOAddress(ADDRESS6[5]), got[0]->addr_);
+ }
+
+ if (check == CfgConsistency::EXTENDED_INFO_CHECK_NONE) {
+ if (!extended_info_table_enable) {
+ // Nothing was done.
+ EXPECT_EQ(0, updated);
+ } else {
+ // Tables were rebuilt with only the third lease.
+ EXPECT_EQ(1, updated);
+ EXPECT_EQ(1, lease_mgr_->byRelayId6size());
+ EXPECT_EQ(1, lease_mgr_->byRemoteId6size());
+
+ DUID relay_id(std::vector<uint8_t>(8, 0x64));
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id,
+ zero,
+ 0,
+ zero,
+ ps100));
+ ASSERT_EQ(1, got.size());
+ data::ConstElementPtr expected2 = leases6[2]->toElement();
+ LeasePtr lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected2->equals(*lease->toElement()))
+ << "expected2: " << expected2->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+
+ std::vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id,
+ zero,
+ 0,
+ zero,
+ ps100));
+ ASSERT_EQ(1, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected2->equals(*lease->toElement()))
+ << "expected2: " << expected2->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+ }
+ } else {
+ // Updated first and second.
+ if (!extended_info_table_enable) {
+ // and nothing else.
+ EXPECT_EQ(2, updated);
+ } else {
+ // Second and third leases were added to extended info tables.
+ EXPECT_EQ(3, updated);
+ EXPECT_EQ(2, lease_mgr_->byRelayId6size());
+ EXPECT_EQ(2, lease_mgr_->byRemoteId6size());
+
+ DUID relay_id(std::vector<uint8_t>(8, 0x64));
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRelayId(relay_id,
+ zero,
+ 0,
+ zero,
+ ps100));
+ ASSERT_EQ(2, got.size());
+ data::ConstElementPtr expected1 = leases6[1]->toElement();
+ LeasePtr lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected1->equals(*lease->toElement()))
+ << "expected1: " << expected1->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+ data::ConstElementPtr expected2 = leases6[2]->toElement();
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected2->equals(*lease->toElement()))
+ << "expected2: " << expected2->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+
+ std::vector<uint8_t> remote_id = { 1, 2, 3, 4, 5, 6 };
+ EXPECT_NO_THROW(got = lease_mgr_->getLeases6ByRemoteId(remote_id,
+ zero,
+ 0,
+ zero,
+ ps100));
+ ASSERT_EQ(2, got.size());
+ lease = got[0];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected1->equals(*lease->toElement()))
+ << "expected1: " << expected1->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+ lease = got[1];
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(expected2->equals(*lease->toElement()))
+ << "expected2: " << expected2->str() << "\n"
+ << "got: " << lease->toElement()->str() << "\n";
+ }
+ }
+}
+
+} // end of namespace isc::dhcp::test
+} // end of namespace isc::dhcp
+} // end of namespace isc
+
+#endif // GENERIC_EXTENDED_INFO_UNITTEST_H