LOG_INFO(lease4_logger, DHCP4_LEASE_ADVERT)
.arg(query->getLabel())
.arg(lease->addr_.toText());
- } else {
+ } else if (lease->valid_lft_ != Lease::INFINITY_LFT) {
LOG_INFO(lease4_logger, DHCP4_LEASE_ALLOC)
.arg(query->getLabel())
.arg(lease->addr_.toText())
.arg(lease->valid_lft_);
+ } else {
+ LOG_INFO(lease4_logger, DHCP4_LEASE_ALLOC)
+ .arg(query->getLabel())
+ .arg(lease->addr_.toText())
+ .arg("infinity");
}
// We're logging this here, because this is the place where we know
.arg(query->getLabel())
.arg(lease->addr_.toText())
.arg(ia->getIAID());
- } else {
+ } else if (lease->valid_lft_ != Lease::INFINITY_LFT) {
LOG_INFO(lease6_logger, DHCP6_LEASE_ALLOC)
.arg(query->getLabel())
.arg(lease->addr_.toText())
.arg(ia->getIAID())
.arg(lease->valid_lft_);
+ } else {
+ LOG_INFO(lease6_logger, DHCP6_LEASE_ALLOC)
+ .arg(query->getLabel())
+ .arg(lease->addr_.toText())
+ .arg(ia->getIAID())
+ .arg("infinity");
}
LOG_DEBUG(lease6_logger, DBG_DHCP6_DETAIL_DATA, DHCP6_LEASE_DATA)
.arg(query->getLabel())
.arg((*l)->addr_.toText())
.arg(static_cast<int>((*l)->prefixlen_))
.arg(ia->getIAID());
- } else {
+ } else if ((*l)->valid_lft_ != Lease::INFINITY_LFT) {
LOG_INFO(lease6_logger, DHCP6_PD_LEASE_ALLOC)
.arg(query->getLabel())
.arg((*l)->addr_.toText())
.arg(static_cast<int>((*l)->prefixlen_))
.arg(ia->getIAID())
.arg((*l)->valid_lft_);
+ } else {
+ LOG_INFO(lease6_logger, DHCP6_PD_LEASE_ALLOC)
+ .arg(query->getLabel())
+ .arg((*l)->addr_.toText())
+ .arg(static_cast<int>((*l)->prefixlen_))
+ .arg(ia->getIAID())
+ .arg("infinity");
}
boost::shared_ptr<Option6IAPrefix>
"FROM lease4 "
"WHERE state = ? "
"AND expire < ? "
+ "AND valid_lifetime < 4294967295 "
"LIMIT ? "
"ALLOW FILTERING "}},
// For convenience for external tools, this is converted to lease
// expiry time (expire). The relationship is given by:
// expire = cltt_ + valid_lft_
- CqlExchange::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
- expire_);
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ CqlExchange::convertToDatabaseTime(lease_->cltt_, valid_lft, expire_);
// subnet_id: int
subnet_id_ = static_cast<cass_int32_t>(lease_->subnet_id_);
// For convenience for external tools, this is converted to lease
// expiry time (expire). The relationship is given by:
// expire = cltt_ + valid_lft_
- CqlExchange::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
- expire_);
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ CqlExchange::convertToDatabaseTime(lease_->cltt_, valid_lft, expire_);
// subnet_id: int
subnet_id_ = static_cast<cass_int32_t>(lease_->subnet_id_);
}
time_t cltt = 0;
- CqlExchange::convertFromDatabaseTime(expire_, valid_lifetime_, cltt);
+ // Recover from overflow
+ uint32_t valid_lft = valid_lifetime_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ CqlExchange::convertFromDatabaseTime(expire_, valid_lft, cltt);
HWAddrPtr hwaddr(new HWAddr(hwaddr_, HTYPE_ETHER));
"FROM lease6 "
"WHERE state = ? "
"AND expire < ? "
+ "AND valid_lifetime < 4294967295 "
"LIMIT ? "
"ALLOW FILTERING "}},
// For convenience for external tools, this is converted to lease
// expiry time (expire). The relationship is given by:
// expire = cltt_ + valid_lft_
- CqlExchange::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_, expire_);
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ CqlExchange::convertToDatabaseTime(lease_->cltt_, valid_lft, expire_);
// subnet_id: int
subnet_id_ = static_cast<cass_int32_t>(lease_->subnet_id_);
// For convenience for external tools, this is converted to lease
// expiry time (expire). The relationship is given by:
// expire = cltt_ + valid_lft_
- CqlExchange::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
- expire_);
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ CqlExchange::convertToDatabaseTime(lease_->cltt_, valid_lft, expire_);
// subnet_id: int
subnet_id_ = static_cast<cass_int32_t>(lease_->subnet_id_);
fqdn_fwd_, fqdn_rev_, hostname_, hwaddr, prefix_len_));
time_t cltt = 0;
- CqlExchange::convertFromDatabaseTime(expire_, valid_lifetime_, cltt);
+ // Recover from overflow
+ uint32_t valid_lft = valid_lifetime_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ CqlExchange::convertFromDatabaseTime(expire_, valid_lft, cltt);
result->cltt_ = cltt;
result->state_ = state_;
// Set up the WHERE clause value
AnyArray data;
-
CassBlob duid_data(duid.getDuid());
data.add(&duid_data);
///
/// @return Lease collection (may be empty if no IPv6 lease found).
virtual Lease6Collection getLeases6(const DUID& duid) const override;
-
+
/// @brief Returns range of IPv6 leases using paging.
///
/// This method implements paged browsing of the lease database. The first
}
row.writeAt(getColumnIndex("valid_lifetime"), lease.valid_lft_);
- row.writeAt(getColumnIndex("expire"), static_cast<uint64_t>(lease.cltt_ + lease.valid_lft_));
+ row.writeAt(getColumnIndex("expire"), static_cast<uint64_t>(lease.cltt_) + lease.valid_lft_);
row.writeAt(getColumnIndex("subnet_id"), lease.subnet_id_);
row.writeAt(getColumnIndex("fqdn_fwd"), lease.fqdn_fwd_);
row.writeAt(getColumnIndex("fqdn_rev"), lease.fqdn_rev_);
row.writeAt(getColumnIndex("address"), lease.addr_.toText());
row.writeAt(getColumnIndex("duid"), lease.duid_->toText());
row.writeAt(getColumnIndex("valid_lifetime"), lease.valid_lft_);
- row.writeAt(getColumnIndex("expire"), static_cast<uint64_t>(lease.cltt_ + lease.valid_lft_));
+ row.writeAt(getColumnIndex("expire"), static_cast<uint64_t>(lease.cltt_) + lease.valid_lft_);
row.writeAt(getColumnIndex("subnet_id"), lease.subnet_id_);
row.writeAt(getColumnIndex("pref_lifetime"), lease.preferred_lft_);
row.writeAt(getColumnIndex("lease_type"), lease.type_);
bool
Lease::expired() const {
- return (getExpirationTime() < time(NULL));
+ return ((valid_lft_ != INFINITY_LFT) && (getExpirationTime() < time(NULL)));
}
bool
<< "Address: " << addr_ << "\n"
<< "Prefix length: " << static_cast<int>(prefixlen_) << "\n"
<< "IAID: " << iaid_ << "\n"
- << "Pref life: " << preferred_lft_ << "\n"
- << "Valid life: " << valid_lft_ << "\n"
- << "Cltt: " << cltt_ << "\n"
+ << "Pref life: " << preferred_lft_ << "\n";
+ if (valid_lft_ != INFINITY_LFT) {
+ stream << "Valid life: " << valid_lft_ << "\n";
+ } else {
+ stream << "Valid life: " << "infinity" << "\n";
+ }
+ stream << "Cltt: " << cltt_ << "\n"
<< "DUID: " << (duid_?duid_->toText():"(none)") << "\n"
<< "Hardware addr: " << (hwaddr_?hwaddr_->toText(false):"(none)") << "\n"
<< "Subnet ID: " << subnet_id_ << "\n"
Lease4::toText() const {
ostringstream stream;
- stream << "Address: " << addr_ << "\n"
- << "Valid life: " << valid_lft_ << "\n"
- << "Cltt: " << cltt_ << "\n"
+ stream << "Address: " << addr_ << "\n";
+ if (valid_lft_ != INFINITY_LFT) {
+ stream << "Valid life: " << valid_lft_ << "\n";
+ } else {
+ stream << "Valid life: " << "infinity" << "\n";
+ }
+ stream << "Cltt: " << cltt_ << "\n"
<< "Hardware addr: " << (hwaddr_ ? hwaddr_->toText(false) : "(none)") << "\n"
<< "Client id: " << (client_id_ ? client_id_->toText() : "(none)") << "\n"
<< "Subnet ID: " << subnet_id_ << "\n"
/// leases.
struct Lease : public isc::data::UserContext, public isc::data::CfgToElement {
+ /// @brief Infinity (means static, i.e. never expire)
+ static const uint32_t INFINITY_LFT = 0xffffffff;
+
+ /// @brief Five hundred days (infinity overflows in 32 bits)
+ static const uint32_t FIVEHUNDREDDAYS = 500 * 24 * 60 * 60;
+
/// @brief Type of lease or pool
typedef enum {
TYPE_NA = 0, ///< the lease contains non-temporary IPv6 address
/// @brief Returns collection of leases for matching DUID
///
- /// @return Lease collection
+ /// @return Lease collection
/// (may be empty if no IPv6 lease found for the DUID).
- virtual Lease6Collection getLeases6(const DUID& duid) const = 0;
+ virtual Lease6Collection getLeases6(const DUID& duid) const = 0;
/// @brief Returns range of IPv6 leases using paging.
///
/// @brief Returns IPv6 leases for the DUID.
///
/// @todo: implement an optimised of the query using index.
- /// @return Lease collection (may be empty if no IPv6 lease found)
+ /// @return Lease collection (may be empty if no IPv6 lease found)
/// for the DUID.
virtual Lease6Collection getLeases6(const DUID& duid) const;
-
+
/// @brief Returns range of IPv6 leases using paging.
///
/// This method implements paged browsing of the lease database. The first
struct SubnetIdIndexTag { };
/// @brief Tag for index using DUID.
-struct DuidIndexTag { };
+struct DuidIndexTag { };
/// @name Multi index containers holding DHCPv4 and DHCPv6 leases.
///
//@{
"fqdn_fwd, fqdn_rev, hostname, "
"state, user_context "
"FROM lease4 "
- "WHERE state != ? AND expire < ? "
+ "WHERE state != ? AND expire < ?"
+ " AND valid_lifetime != 4294967295 "
"ORDER BY expire ASC "
"LIMIT ?"},
{MySqlLeaseMgr::GET_LEASE6,
"hwaddr, hwtype, hwaddr_source, "
"state, user_context "
"FROM lease6 "
- "WHERE state != ? AND expire < ? "
+ "WHERE state != ? AND expire < ?"
+ " AND valid_lifetime != 4294967295 "
"ORDER BY expire ASC "
"LIMIT ?"},
{MySqlLeaseMgr::INSERT_LEASE4,
// expiry time (expire). The relationship is given by:
//
// expire = cltt_ + valid_lft_
- MySqlConnection::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ MySqlConnection::convertToDatabaseTime(lease_->cltt_, valid_lft,
expire_);
bind_[4].buffer_type = MYSQL_TYPE_TIMESTAMP;
bind_[4].buffer = reinterpret_cast<char*>(&expire_);
// Convert times received from the database to times for the lease
// structure
time_t cltt = 0;
- MySqlConnection::convertFromDatabaseTime(expire_, valid_lifetime_, cltt);
+ // Recover from overflow
+ uint32_t valid_lft = valid_lifetime_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ MySqlConnection::convertFromDatabaseTime(expire_, valid_lft, cltt);
if (client_id_null_ == MLM_TRUE) {
// There's no client-id, so we pass client-id_length_ set to 0
/// expiry time (expire). The relationship is given by:
//
// expire = cltt_ + valid_lft_
- MySqlConnection::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ MySqlConnection::convertToDatabaseTime(lease_->cltt_, valid_lft,
expire_);
bind_[3].buffer_type = MYSQL_TYPE_TIMESTAMP;
bind_[3].buffer = reinterpret_cast<char*>(&expire_);
subnet_id_, fqdn_fwd_, fqdn_rev_,
hostname, hwaddr, prefixlen_));
time_t cltt = 0;
- MySqlConnection::convertFromDatabaseTime(expire_, valid_lifetime_, cltt);
+ // Recover from overflow
+ uint32_t valid_lft = valid_lifetime_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ MySqlConnection::convertFromDatabaseTime(expire_, valid_lft, cltt);
result->cltt_ = cltt;
// Set state.
MySqlLeaseMgr::getLeases6(const DUID& duid) const {
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_GET_DUID)
.arg(duid.toText());
-
+
// Set up the WHERE clause value
MYSQL_BIND inbind[1];
memset(inbind, 0, sizeof(inbind));
const_cast<uint8_t*>(&duid_vector[0]));
inbind[0].buffer_length = duid_length;
inbind[0].length = &duid_length;
-
+
Lease6Collection result;
-
getLeaseCollection(GET_LEASE6_DUID, inbind, result);
return result;
/// @return Lease collection (may be empty if no IPv6 lease found)
/// for the DUID.
virtual Lease6Collection getLeases6(const DUID& duid) const;
-
+
/// @brief Returns range of IPv6 leases using paging.
///
/// This method implements paged browsing of the lease database. The first
-// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2019 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
DHCPSRV_QUEUE_NCR_SKIP)
.arg(label)
.arg(lease->addr_.toText());
-
+
return;
}
D2Dhcid dhcid = D2Dhcid(identifier, hostname_wire);
// Create name change request.
+ uint32_t valid_lft = lease->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
NameChangeRequestPtr ncr
(new NameChangeRequest(chg_type, lease->fqdn_fwd_, lease->fqdn_rev_,
lease->hostname_, lease->addr_.toText(),
- dhcid, lease->cltt_ + lease->valid_lft_,
- lease->valid_lft_));
+ dhcid, lease->cltt_ + valid_lft,
+ valid_lft));
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL_DATA, DHCPSRV_QUEUE_NCR)
.arg(label)
"fqdn_fwd, fqdn_rev, hostname, "
"state, user_context "
"FROM lease4 "
- "WHERE state != $1 AND expire < $2 "
+ "WHERE state != $1 AND expire < $2 AND valid_lifetime != 4294967295 "
"ORDER BY expire "
"LIMIT $3"},
"hwaddr, hwtype, hwaddr_source, "
"state, user_context "
"FROM lease6 "
- "WHERE state != $1 AND expire < $2 "
+ "WHERE state != $1 AND expire < $2 AND valid_lifetime != 4294967295 "
"ORDER BY expire "
"LIMIT $3"},
valid_lifetime_str_ = boost::lexical_cast<std::string>(lease->valid_lft_);
bind_array.add(valid_lifetime_str_);
- expire_str_ = convertToDatabaseTime(lease->cltt_, lease_->valid_lft_);
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ expire_str_ = convertToDatabaseTime(lease->cltt_, valid_lft);
bind_array.add(expire_str_);
subnet_id_str_ = boost::lexical_cast<std::string>(lease->subnet_id_);
getColumnValue(r, row , SUBNET_ID_COL, subnet_id_);
- cltt_ = expire_ - valid_lifetime_;
+ // Recover from overflow
+ uint32_t valid_lft = valid_lifetime_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ cltt_ = expire_ - valid_lft;
getColumnValue(r, row, FQDN_FWD_COL, fqdn_fwd_);
valid_lifetime_str_ = boost::lexical_cast<std::string>(lease->valid_lft_);
bind_array.add(valid_lifetime_str_);
- expire_str_ = convertToDatabaseTime(lease->cltt_, lease_->valid_lft_);
+ // Avoid overflow
+ uint32_t valid_lft = lease_->valid_lft_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ expire_str_ = convertToDatabaseTime(lease->cltt_, valid_lft);
bind_array.add(expire_str_);
subnet_id_str_ = boost::lexical_cast<std::string>(lease->subnet_id_);
expire_ = convertFromDatabaseTime(getRawColumnValue(r, row,
EXPIRE_COL));
- cltt_ = expire_ - valid_lifetime_;
+ // Recover from overflow
+ uint32_t valid_lft = valid_lifetime_;
+ if (valid_lft == Lease::INFINITY_LFT) {
+ valid_lft = Lease::FIVEHUNDREDDAYS;
+ }
+ cltt_ = expire_ - valid_lft;
getColumnValue(r, row , SUBNET_ID_COL, subnet_id_);
/// @return Lease collection (may be empty if no IPv6 lease found)
/// for the DUID
virtual Lease6Collection getLeases6(const DUID& duid) const;
-
+
/// @brief Returns range of IPv6 leases using paging.
///
/// This method implements paged browsing of the lease database. The first
testMaxDate4();
}
+/// @brief checks that infinite lifetimes do not overflow.
+TEST_F(CqlLeaseMgrTest, infiniteLifeTime4) {
+ testInfiniteLifeTime4();
+}
+
/// @brief Lease4 update tests
///
/// Checks that we are able to update a lease in the database.
testCqlGetExpiredLeases4();
}
+/// @brief Checks that the static (i.e. with infinite valid lifetime) DHCPv4
+/// leases will never expire.
+TEST_F(CqlLeaseMgrTest, staticLeases4) {
+ testStaticLeases4();
+}
+
/// @brief Check that expired reclaimed DHCPv4 leases are removed.
TEST_F(CqlLeaseMgrTest, deleteExpiredReclaimedLeases4) {
testDeleteExpiredReclaimedLeases4();
testMaxDate6();
}
+/// @brief checks that infinite lifetimes do not overflow.
+TEST_F(CqlLeaseMgrTest, infiniteLifeTime6) {
+ testInfiniteLifeTime6();
+}
+
/// @brief Verify that too long hostname for Lease6 is not accepted.
///
/// Checks that the it is not possible to create a lease when the hostname
testCqlGetExpiredLeases6();
}
+/// @brief Checks that the static (i.e. with infinite valid lifetime) DHCPv6
+/// leases will never expire.
+TEST_F(CqlLeaseMgrTest, staticLeases6) {
+ testStaticLeases6();
+}
+
/// @brief Check that expired reclaimed DHCPv6 leases are removed.
TEST_F(CqlLeaseMgrTest, deleteExpiredReclaimedLeases6) {
testDeleteExpiredReclaimedLeases6();
// The times used in the next tests are deliberately restricted - we
// should be able to cope with valid lifetimes up to 0xffffffff.
// However, this will lead to overflows.
- // @TODO: test overflow conditions when code has been fixed
+ // @TODO: test overflow conditions as now the code was fixed.
lease->valid_lft_ = 7000;
lease->cltt_ = 234567;
lease->subnet_id_ = 37;
// The times used in the next tests are deliberately restricted - we
// should be able to cope with valid lifetimes up to 0xffffffff.
// However, this will lead to overflows.
- // @TODO: test overflow conditions when code has been fixed
+ // @TODO: test overflow conditions as now the code was fixed.
lease->preferred_lft_ = 7200;
lease->valid_lft_ = 7000;
lease->cltt_ = 234567;
detailCompareLease(leases[1], l_returned);
}
+void
+GenericLeaseMgrTest::testInfiniteLifeTime4() {
+ // Get the leases to be used for the test.
+ vector<Lease4Ptr> leases = createLeases4();
+ Lease4Ptr lease = leases[1];
+
+ // Set valid_lft_ to infinite, cllt_ to now.
+ lease->valid_lft_ = Lease::INFINITY_LFT;
+ lease->cltt_ = time(NULL);
+
+ // Insert should not throw.
+ EXPECT_TRUE(lmptr_->addLease(leases[1]));
+ Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
+ ASSERT_TRUE(l_returned);
+ detailCompareLease(leases[1], l_returned);
+}
+
void
GenericLeaseMgrTest::testBasicLease4() {
// Get the leases to be used for the test.
detailCompareLease(leases[1], l_returned);
}
+void
+GenericLeaseMgrTest::testInfiniteLifeTime6() {
+ // Get the leases to be used for the test.
+ vector<Lease6Ptr> leases = createLeases6();
+ Lease6Ptr lease = leases[1];
+
+ // Set valid_lft_ to infinite, cllt_ to now.
+ lease->valid_lft_ = Lease::INFINITY_LFT;
+ lease->cltt_ = time(NULL);
+
+ // Insert should not throw.
+ EXPECT_TRUE(lmptr_->addLease(leases[1]));
+ Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
+ ASSERT_TRUE(l_returned);
+ detailCompareLease(leases[1], l_returned);
+}
+
// Checks whether a MAC address can be stored and retrieved together with
// a lease.
void
}
}
+void
+GenericLeaseMgrTest::testStaticLeases4() {
+ // Get the leases to be used for the test.
+ vector<Lease4Ptr> leases = createLeases4();
+ Lease4Ptr lease = leases[1];
+
+ // Set valid_lft_ to infinite. Leave the small cltt even it won't happen
+ // in the real world to catch more possible issues.
+ lease->valid_lft_ = Lease::INFINITY_LFT;
+
+ // Add it to the database.
+ ASSERT_TRUE(lmptr_->addLease(leases[1]));
+
+ // Retrieve at most 10 expired leases.
+ Lease4Collection expired_leases;
+ ASSERT_NO_THROW(lmptr_->getExpiredLeases4(expired_leases, 10));
+
+ // No lease should be returned.
+ EXPECT_EQ(0, expired_leases.size());
+}
+
+void
+GenericLeaseMgrTest::testStaticLeases6() {
+ // Get the leases to be used for the test.
+ vector<Lease6Ptr> leases = createLeases6();
+ Lease6Ptr lease = leases[1];
+
+ // Set valid_lft_ to infinite. Leave the small cltt even it won't happen
+ // in the real world to catch more possible issues.
+ lease->valid_lft_ = Lease::INFINITY_LFT;
+
+ // Add it to the database.
+ ASSERT_TRUE(lmptr_->addLease(leases[1]));
+
+ // Retrieve at most 10 expired leases.
+ Lease6Collection expired_leases;
+ ASSERT_NO_THROW(lmptr_->getExpiredLeases6(expired_leases, 10));
+
+ // No lease should be returned.
+ EXPECT_EQ(0, expired_leases.size());
+}
+
void
GenericLeaseMgrTest::testDeleteExpiredReclaimedLeases4() {
// Get the leases to be used for the test.
/// @param address Address to use for the initialization
///
/// @return Lease6Ptr. This will not point to anything if the
- /// initialization
- /// failed (e.g. unknown address).
+ /// initialization failed (e.g. unknown address).
Lease6Ptr initializeLease6(std::string address);
/// @brief Check Leases present and different
/// @brief checks that invalid dates are safely handled.
void testMaxDate4();
+ /// @brief checks that infinite lifetimes do not overflow.
+ void testInfiniteLifeTime4();
+
/// @brief Test lease retrieval using client id.
void testGetLease4ClientId();
/// @brief Checks that invalid dates are safely handled.
void testMaxDate6();
+ /// @brief checks that infinite lifetimes do not overflow.
+ void testInfiniteLifeTime6();
+
/// @brief Checks that Lease6 can be stored with and without a hardware address.
void testLease6MAC();
/// - reclaimed leases are not returned.
void testGetExpiredLeases6();
+ /// @brief Checks that the static (i.e. with infinite valid lifetime)
+ /// DHCPv4 leases will never expire.
+ void testStaticLeases4();
+
+ /// @brief Checks that the static (i.e. with infinite valid lifetime)
+ /// DHCPv4 leases will never expire.
+ void testStaticLeases6();
+
/// @brief Checks that declined IPv4 leases that have expired can be retrieved.
///
/// This test checks that the following:
// Case 3: the lease is expired
lease.cltt_ = time(NULL) - 102;
EXPECT_TRUE(lease.expired());
+
+ // Case 4: the lease is static
+ lease.cltt_ = 1;
+ lease.valid_lft_ = Lease::INFINITY_LFT;
+ EXPECT_FALSE(lease.expired());
}
// Verify that the DUID can be returned as a vector object and if DUID is NULL
testMaxDate4();
}
+/// @brief checks that infinite lifetimes do not overflow.
+TEST_F(MySqlLeaseMgrTest, infiniteLifeTime4) {
+ testInfiniteLifeTime4();
+}
+
/// @brief Lease4 update tests
///
/// Checks that we are able to update a lease in the database.
testGetExpiredLeases4();
}
+/// @brief Checks that the static (i.e. with infinite valid lifetime) DHCPv4
+/// leases will never expire.
+TEST_F(MySqlLeaseMgrTest, staticLeases4) {
+ testStaticLeases4();
+}
+
/// @brief Check that expired reclaimed DHCPv4 leases are removed.
TEST_F(MySqlLeaseMgrTest, deleteExpiredReclaimedLeases4) {
testDeleteExpiredReclaimedLeases4();
testMaxDate6();
}
+/// @brief checks that infinite lifetimes do not overflow.
+TEST_F(MySqlLeaseMgrTest, infiniteLifeTime6) {
+ testInfiniteLifeTime6();
+}
+
/// @brief Verify that too long hostname for Lease6 is not accepted.
///
/// Checks that the it is not possible to create a lease when the hostname
testGetExpiredLeases6();
}
+/// @brief Checks that the static (i.e. with infinite valid lifetime) DHCPv6
+/// leases will never expire.
+TEST_F(MySqlLeaseMgrTest, staticLeases6) {
+ testStaticLeases6();
+}
+
/// @brief Check that expired reclaimed DHCPv6 leases are removed.
TEST_F(MySqlLeaseMgrTest, deleteExpiredReclaimedLeases6) {
testDeleteExpiredReclaimedLeases6();
testMaxDate4();
}
+/// @brief checks that infinite lifetimes do not overflow.
+TEST_F(PgSqlLeaseMgrTest, infiniteLifeTime4) {
+ testInfiniteLifeTime4();
+}
+
/// @brief Lease4 update tests
///
/// Checks that we are able to update a lease in the database.
testGetExpiredLeases4();
}
+/// @brief Checks that the static (i.e. with infinite valid lifetime) DHCPv4
+/// leases will never expire.
+TEST_F(PgSqlLeaseMgrTest, staticLeases4) {
+ testStaticLeases4();
+}
+
/// @brief Check that expired reclaimed DHCPv4 leases are removed.
TEST_F(PgSqlLeaseMgrTest, deleteExpiredReclaimedLeases4) {
testDeleteExpiredReclaimedLeases4();
testMaxDate6();
}
+/// @brief checks that infinite lifetimes do not overflow.
+TEST_F(PgSqlLeaseMgrTest, infiniteLifeTime6) {
+ testInfiniteLifeTime6();
+}
+
/// @brief Verify that too long hostname for Lease6 is not accepted.
///
/// Checks that the it is not possible to create a lease when the hostname
testGetExpiredLeases6();
}
+/// @brief Checks that the static (i.e. with infinite valid lifetime) DHCPv6
+/// leases will never expire.
+TEST_F(PgSqlLeaseMgrTest, staticLeases6) {
+ testStaticLeases6();
+}
+
/// @brief Check that expired reclaimed DHCPv6 leases are removed.
TEST_F(PgSqlLeaseMgrTest, deleteExpiredReclaimedLeases6) {
testDeleteExpiredReclaimedLeases6();