2014-01-10 11:11:15 -05:00
|
|
|
// Copyright (C) 2012-2014 Internet Systems Consortium, Inc. ("ISC")
|
2012-10-16 16:39:32 +01:00
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
|
|
// copyright notice and this permission notice appear in all copies.
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
|
|
|
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
|
|
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
|
|
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
|
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
|
|
|
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
// PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
|
|
|
#include <config.h>
|
2012-11-16 11:19:19 +00:00
|
|
|
|
|
|
|
#include <asiolink/io_address.h>
|
|
|
|
#include <dhcpsrv/lease_mgr_factory.h>
|
|
|
|
#include <dhcpsrv/mysql_lease_mgr.h>
|
2012-12-18 16:32:34 +01:00
|
|
|
#include <dhcpsrv/tests/test_utils.h>
|
2013-03-15 14:19:42 -04:00
|
|
|
#include <exceptions/exceptions.h>
|
2012-11-16 11:19:19 +00:00
|
|
|
|
2013-08-14 13:48:19 +02:00
|
|
|
|
2012-11-16 14:15:45 +00:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
2012-12-03 21:23:48 +00:00
|
|
|
#include <algorithm>
|
2012-10-16 16:39:32 +01:00
|
|
|
#include <iostream>
|
|
|
|
#include <sstream>
|
2012-10-20 22:52:25 +01:00
|
|
|
#include <string>
|
2012-11-16 14:15:45 +00:00
|
|
|
#include <utility>
|
2012-10-16 16:39:32 +01:00
|
|
|
|
|
|
|
using namespace isc;
|
|
|
|
using namespace isc::asiolink;
|
|
|
|
using namespace isc::dhcp;
|
2012-12-18 16:32:34 +01:00
|
|
|
using namespace isc::dhcp::test;
|
2012-10-16 16:39:32 +01:00
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
// This holds statements to create and destroy the schema.
|
2012-11-05 19:29:39 +00:00
|
|
|
#include "schema_copy.h"
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
// Connection strings.
|
2012-10-24 22:14:42 +01:00
|
|
|
// Database: keatest
|
2012-11-23 18:23:21 +00:00
|
|
|
// Host: localhost
|
2012-10-24 22:14:42 +01:00
|
|
|
// Username: keatest
|
|
|
|
// Password: keatest
|
2012-10-16 16:39:32 +01:00
|
|
|
const char* VALID_TYPE = "type=mysql";
|
|
|
|
const char* INVALID_TYPE = "type=unknown";
|
2012-10-17 18:37:22 +01:00
|
|
|
const char* VALID_NAME = "name=keatest";
|
2012-10-16 16:39:32 +01:00
|
|
|
const char* INVALID_NAME = "name=invalidname";
|
|
|
|
const char* VALID_HOST = "host=localhost";
|
|
|
|
const char* INVALID_HOST = "host=invalidhost";
|
|
|
|
const char* VALID_USER = "user=keatest";
|
|
|
|
const char* INVALID_USER = "user=invaliduser";
|
|
|
|
const char* VALID_PASSWORD = "password=keatest";
|
|
|
|
const char* INVALID_PASSWORD = "password=invalid";
|
|
|
|
|
|
|
|
// Given a combination of strings above, produce a connection string.
|
|
|
|
string connectionString(const char* type, const char* name, const char* host,
|
|
|
|
const char* user, const char* password) {
|
|
|
|
const string space = " ";
|
2012-10-24 19:34:38 +01:00
|
|
|
string result = "";
|
|
|
|
|
|
|
|
if (type != NULL) {
|
|
|
|
result += string(type);
|
|
|
|
}
|
2012-12-03 15:35:36 +00:00
|
|
|
if (name != NULL) {
|
2012-10-24 19:34:38 +01:00
|
|
|
if (! result.empty()) {
|
|
|
|
result += space;
|
|
|
|
}
|
|
|
|
result += string(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (host != NULL) {
|
|
|
|
if (! result.empty()) {
|
|
|
|
result += space;
|
|
|
|
}
|
|
|
|
result += string(host);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (user != NULL) {
|
|
|
|
if (! result.empty()) {
|
|
|
|
result += space;
|
|
|
|
}
|
|
|
|
result += string(user);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (password != NULL) {
|
|
|
|
if (! result.empty()) {
|
|
|
|
result += space;
|
|
|
|
}
|
|
|
|
result += string(password);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (result);
|
2012-10-16 16:39:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return valid connection string
|
2012-10-24 22:14:42 +01:00
|
|
|
string
|
|
|
|
validConnectionString() {
|
2012-10-16 16:39:32 +01:00
|
|
|
return (connectionString(VALID_TYPE, VALID_NAME, VALID_HOST,
|
|
|
|
VALID_USER, VALID_PASSWORD));
|
|
|
|
}
|
|
|
|
|
2012-11-05 19:29:39 +00:00
|
|
|
// @brief Clear everything from the database
|
|
|
|
//
|
|
|
|
// There is no error checking in this code: if something fails, one of the
|
2012-11-23 18:23:21 +00:00
|
|
|
// tests will (should) fall over.
|
2012-11-05 19:29:39 +00:00
|
|
|
void destroySchema() {
|
2013-03-08 12:01:03 +01:00
|
|
|
MySqlHolder mysql;
|
2012-11-05 19:29:39 +00:00
|
|
|
|
|
|
|
// Open database
|
2013-03-08 12:01:03 +01:00
|
|
|
(void) mysql_real_connect(mysql, "localhost", "keatest",
|
2012-11-05 19:29:39 +00:00
|
|
|
"keatest", "keatest", 0, NULL, 0);
|
|
|
|
|
|
|
|
// Get rid of everything in it.
|
|
|
|
for (int i = 0; destroy_statement[i] != NULL; ++i) {
|
2013-03-08 12:01:03 +01:00
|
|
|
(void) mysql_query(mysql, destroy_statement[i]);
|
2012-11-05 19:29:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// @brief Create the Schema
|
|
|
|
//
|
|
|
|
// Creates all the tables in what is assumed to be an empty database.
|
|
|
|
//
|
|
|
|
// There is no error checking in this code: if it fails, one of the tests
|
|
|
|
// will fall over.
|
|
|
|
void createSchema() {
|
2013-03-08 12:01:03 +01:00
|
|
|
MySqlHolder mysql;
|
2012-11-05 19:29:39 +00:00
|
|
|
|
|
|
|
// Open database
|
2013-03-08 12:01:03 +01:00
|
|
|
(void) mysql_real_connect(mysql, "localhost", "keatest",
|
2012-11-05 19:29:39 +00:00
|
|
|
"keatest", "keatest", 0, NULL, 0);
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
// Execute creation statements.
|
2012-11-05 19:29:39 +00:00
|
|
|
for (int i = 0; create_statement[i] != NULL; ++i) {
|
2013-03-08 12:01:03 +01:00
|
|
|
(void) mysql_query(mysql, create_statement[i]);
|
2012-11-05 19:29:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Test fixture class for testing MySQL Lease Manager
|
|
|
|
///
|
|
|
|
/// Opens the database prior to each test and closes it afterwards.
|
|
|
|
/// All pending transactions are deleted prior to closure.
|
2012-10-20 22:52:25 +01:00
|
|
|
|
2013-08-14 13:48:19 +02:00
|
|
|
class MySqlLeaseMgrTest : public GenericLeaseMgrTest {
|
2012-10-20 22:52:25 +01:00
|
|
|
public:
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Constructor
|
|
|
|
///
|
|
|
|
/// Deletes everything from the database and opens it.
|
2012-11-19 19:37:07 +00:00
|
|
|
MySqlLeaseMgrTest() {
|
2012-11-08 13:14:19 +00:00
|
|
|
|
2012-12-03 15:35:36 +00:00
|
|
|
// Ensure schema is the correct one.
|
2012-11-05 19:29:39 +00:00
|
|
|
destroySchema();
|
|
|
|
createSchema();
|
2012-11-21 12:44:18 +00:00
|
|
|
|
2012-12-03 15:35:36 +00:00
|
|
|
// Connect to the database
|
2012-11-08 13:14:19 +00:00
|
|
|
try {
|
|
|
|
LeaseMgrFactory::create(validConnectionString());
|
|
|
|
} catch (...) {
|
|
|
|
std::cerr << "*** ERROR: unable to open database. The test\n"
|
|
|
|
"*** environment is broken and must be fixed before\n"
|
|
|
|
"*** the MySQL tests will run correctly.\n"
|
|
|
|
"*** The reason for the problem is described in the\n"
|
|
|
|
"*** accompanying exception output.\n";
|
|
|
|
throw;
|
|
|
|
}
|
2012-10-24 22:14:42 +01:00
|
|
|
lmptr_ = &(LeaseMgrFactory::instance());
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Destructor
|
|
|
|
///
|
2012-12-03 15:35:36 +00:00
|
|
|
/// Rolls back all pending transactions. The deletion of lmptr_ will close
|
|
|
|
/// the database. Then reopen it and delete everything created by the test.
|
2012-10-29 19:19:36 +00:00
|
|
|
virtual ~MySqlLeaseMgrTest() {
|
|
|
|
lmptr_->rollback();
|
|
|
|
LeaseMgrFactory::destroy();
|
2012-11-05 19:29:39 +00:00
|
|
|
destroySchema();
|
2012-10-29 19:19:36 +00:00
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Reopen the database
|
|
|
|
///
|
|
|
|
/// Closes the database and re-open it. Anything committed should be
|
|
|
|
/// visible.
|
2012-10-24 22:14:42 +01:00
|
|
|
void reopen() {
|
|
|
|
LeaseMgrFactory::destroy();
|
2012-10-24 14:12:06 +01:00
|
|
|
LeaseMgrFactory::create(validConnectionString());
|
|
|
|
lmptr_ = &(LeaseMgrFactory::instance());
|
2012-10-20 22:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check that database can be opened
|
|
|
|
///
|
|
|
|
/// This test checks if the MySqlLeaseMgr can be instantiated. This happens
|
|
|
|
/// only if the database can be opened. Note that this is not part of the
|
|
|
|
/// MySqlLeaseMgr test fixure set. This test checks that the database can be
|
|
|
|
/// opened: the fixtures assume that and check basic operations.
|
2012-10-20 22:52:25 +01:00
|
|
|
|
|
|
|
TEST(MySqlOpenTest, OpenDatabase) {
|
2012-11-05 19:29:39 +00:00
|
|
|
|
|
|
|
// Schema needs to be created for the test to work.
|
|
|
|
destroySchema();
|
|
|
|
createSchema();
|
|
|
|
|
|
|
|
// Check that lease manager open the database opens correctly and tidy up.
|
|
|
|
// If it fails, print the error message.
|
2012-10-24 21:18:13 +01:00
|
|
|
try {
|
|
|
|
LeaseMgrFactory::create(validConnectionString());
|
|
|
|
EXPECT_NO_THROW((void) LeaseMgrFactory::instance());
|
|
|
|
LeaseMgrFactory::destroy();
|
|
|
|
} catch (const isc::Exception& ex) {
|
|
|
|
FAIL() << "*** ERROR: unable to open database, reason:\n"
|
2012-11-08 13:14:19 +00:00
|
|
|
<< " " << ex.what() << "\n"
|
2012-10-24 21:18:13 +01:00
|
|
|
<< "*** The test environment is broken and must be fixed\n"
|
|
|
|
<< "*** before the MySQL tests will run correctly.\n";
|
|
|
|
}
|
|
|
|
|
2012-10-24 14:12:06 +01:00
|
|
|
// Check that attempting to get an instance of the lease manager when
|
|
|
|
// none is set throws an exception.
|
|
|
|
EXPECT_THROW(LeaseMgrFactory::instance(), NoLeaseManager);
|
2012-10-16 16:39:32 +01:00
|
|
|
|
2012-10-17 18:37:22 +01:00
|
|
|
// Check that wrong specification of backend throws an exception.
|
|
|
|
// (This is really a check on LeaseMgrFactory, but is convenient to
|
|
|
|
// perform here.)
|
2012-10-24 19:34:38 +01:00
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
|
|
|
NULL, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
|
|
|
|
InvalidParameter);
|
2012-10-24 14:12:06 +01:00
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
2012-10-16 16:39:32 +01:00
|
|
|
INVALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)),
|
2012-10-24 14:12:06 +01:00
|
|
|
InvalidType);
|
2012-10-17 18:37:22 +01:00
|
|
|
|
|
|
|
// Check that invalid login data causes an exception.
|
2012-10-24 14:12:06 +01:00
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
2012-10-16 16:39:32 +01:00
|
|
|
VALID_TYPE, INVALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)),
|
|
|
|
DbOpenError);
|
2012-10-24 14:12:06 +01:00
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
2012-10-16 16:39:32 +01:00
|
|
|
VALID_TYPE, VALID_NAME, INVALID_HOST, VALID_USER, VALID_PASSWORD)),
|
|
|
|
DbOpenError);
|
2012-10-24 14:12:06 +01:00
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
2012-10-16 16:39:32 +01:00
|
|
|
VALID_TYPE, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
|
|
|
|
DbOpenError);
|
2012-10-24 14:12:06 +01:00
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
2012-10-16 16:39:32 +01:00
|
|
|
VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, INVALID_PASSWORD)),
|
|
|
|
DbOpenError);
|
|
|
|
|
2012-10-24 19:34:38 +01:00
|
|
|
// Check for missing parameters
|
|
|
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
|
|
|
VALID_TYPE, NULL, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
|
|
|
|
NoDatabaseName);
|
2012-11-05 19:29:39 +00:00
|
|
|
|
|
|
|
// Tidy up after the test
|
|
|
|
destroySchema();
|
2012-10-18 11:33:51 +01:00
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check the getType() method
|
|
|
|
///
|
|
|
|
/// getType() returns a string giving the type of the backend, which should
|
|
|
|
/// always be "mysql".
|
2012-11-13 15:43:42 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getType) {
|
2012-11-13 12:14:55 +00:00
|
|
|
EXPECT_EQ(std::string("mysql"), lmptr_->getType());
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check conversion functions
|
|
|
|
///
|
|
|
|
/// The server works using cltt and valid_filetime. In the database, the
|
|
|
|
/// information is stored as expire_time and valid-lifetime, which are
|
|
|
|
/// related by
|
|
|
|
///
|
|
|
|
/// expire_time = cltt + valid_lifetime
|
|
|
|
///
|
|
|
|
/// This test checks that the conversion is correct. It does not check that the
|
|
|
|
/// data is entered into the database correctly, only that the MYSQL_TIME
|
|
|
|
/// structure used for the entry is correctly set up.
|
2012-11-14 14:30:46 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, checkTimeConversion) {
|
2012-10-20 22:52:25 +01:00
|
|
|
const time_t cltt = time(NULL);
|
|
|
|
const uint32_t valid_lft = 86400; // 1 day
|
2012-10-24 21:18:13 +01:00
|
|
|
struct tm tm_expire;
|
|
|
|
MYSQL_TIME mysql_expire;
|
|
|
|
|
|
|
|
// Work out what the broken-down time will be for one day
|
|
|
|
// after the current time.
|
|
|
|
time_t expire_time = cltt + valid_lft;
|
|
|
|
(void) localtime_r(&expire_time, &tm_expire);
|
|
|
|
|
|
|
|
// Convert to the database time
|
|
|
|
MySqlLeaseMgr::convertToDatabaseTime(cltt, valid_lft, mysql_expire);
|
|
|
|
|
|
|
|
// Are the times the same?
|
|
|
|
EXPECT_EQ(tm_expire.tm_year + 1900, mysql_expire.year);
|
|
|
|
EXPECT_EQ(tm_expire.tm_mon + 1, mysql_expire.month);
|
|
|
|
EXPECT_EQ(tm_expire.tm_mday, mysql_expire.day);
|
|
|
|
EXPECT_EQ(tm_expire.tm_hour, mysql_expire.hour);
|
|
|
|
EXPECT_EQ(tm_expire.tm_min, mysql_expire.minute);
|
|
|
|
EXPECT_EQ(tm_expire.tm_sec, mysql_expire.second);
|
|
|
|
EXPECT_EQ(0, mysql_expire.second_part);
|
|
|
|
EXPECT_EQ(0, mysql_expire.neg);
|
2012-10-16 16:39:32 +01:00
|
|
|
|
2012-10-20 22:52:25 +01:00
|
|
|
// Convert back
|
|
|
|
time_t converted_cltt = 0;
|
2012-10-24 21:18:13 +01:00
|
|
|
MySqlLeaseMgr::convertFromDatabaseTime(mysql_expire, valid_lft, converted_cltt);
|
2012-10-20 22:52:25 +01:00
|
|
|
EXPECT_EQ(cltt, converted_cltt);
|
|
|
|
}
|
|
|
|
|
2012-10-29 19:19:36 +00:00
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check getName() returns correct database name
|
2012-10-29 19:19:36 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getName) {
|
|
|
|
EXPECT_EQ(std::string("keatest"), lmptr_->getName());
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check that getVersion() returns the expected version
|
2012-11-14 14:30:46 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, checkVersion) {
|
2012-10-18 11:33:51 +01:00
|
|
|
// Check version
|
2012-10-20 22:52:25 +01:00
|
|
|
pair<uint32_t, uint32_t> version;
|
|
|
|
ASSERT_NO_THROW(version = lmptr_->getVersion());
|
2012-10-24 21:18:13 +01:00
|
|
|
EXPECT_EQ(CURRENT_VERSION_VERSION, version.first);
|
|
|
|
EXPECT_EQ(CURRENT_VERSION_MINOR, version.second);
|
2012-10-20 22:52:25 +01:00
|
|
|
}
|
|
|
|
|
2012-12-03 15:35:36 +00:00
|
|
|
/// @brief Basic Lease4 Checks
|
2012-11-23 18:23:21 +00:00
|
|
|
///
|
2012-12-10 11:21:24 +00:00
|
|
|
/// Checks that the addLease, getLease4 (by address) and deleteLease (with an
|
|
|
|
/// IPv4 address) works.
|
2012-11-21 12:44:18 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, basicLease4) {
|
2014-03-06 10:05:19 +00:00
|
|
|
testBasicLease4();
|
|
|
|
}
|
2012-11-21 12:44:18 +00:00
|
|
|
|
2014-03-06 10:05:19 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, testAddGetDelete6) {
|
|
|
|
testAddGetDelete6(false);
|
2012-11-21 12:44:18 +00:00
|
|
|
}
|
|
|
|
|
2014-03-06 10:14:26 +00:00
|
|
|
|
2013-02-21 16:50:59 +01:00
|
|
|
/// @brief Basic Lease4 Checks
|
|
|
|
///
|
|
|
|
/// Checks that the addLease, getLease4(by address), getLease4(hwaddr,subnet_id),
|
|
|
|
/// updateLease4() and deleteLease (IPv4 address) can handle NULL client-id.
|
|
|
|
/// (client-id is optional and may not be present)
|
|
|
|
TEST_F(MySqlLeaseMgrTest, lease4NullClientId) {
|
2014-03-06 10:14:26 +00:00
|
|
|
testLease4NullClientId();
|
2013-02-21 16:50:59 +01:00
|
|
|
}
|
|
|
|
|
2013-08-27 16:00:16 +02:00
|
|
|
/// @brief Verify that too long hostname for Lease4 is not accepted.
|
|
|
|
///
|
|
|
|
/// Checks that the it is not possible to create a lease when the hostname
|
|
|
|
/// length exceeds 255 characters.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, lease4InvalidHostname) {
|
2014-03-06 10:35:35 +00:00
|
|
|
testLease4InvalidHostname();
|
2013-08-27 16:00:16 +02:00
|
|
|
}
|
|
|
|
|
2012-12-03 15:35:36 +00:00
|
|
|
/// @brief Basic Lease6 Checks
|
2012-11-23 18:23:21 +00:00
|
|
|
///
|
2012-12-10 11:21:24 +00:00
|
|
|
/// Checks that the addLease, getLease6 (by address) and deleteLease (with an
|
|
|
|
/// IPv6 address) works.
|
2012-11-14 14:30:46 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, basicLease6) {
|
2014-03-06 10:28:46 +00:00
|
|
|
testBasicLease6();
|
2012-10-20 22:52:25 +01:00
|
|
|
}
|
|
|
|
|
2013-08-27 16:00:16 +02:00
|
|
|
/// @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
|
|
|
|
/// length exceeds 255 characters.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, lease6InvalidHostname) {
|
2014-03-06 10:35:35 +00:00
|
|
|
testLease6InvalidHostname();
|
2013-08-27 16:00:16 +02:00
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check GetLease4 methods - access by Hardware Address
|
2014-03-06 10:28:46 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4HWAddr1) {
|
|
|
|
testGetLease4HWAddr1();
|
|
|
|
}
|
2012-11-23 12:47:40 +00:00
|
|
|
|
2014-03-06 10:28:46 +00:00
|
|
|
/// @brief Check GetLease4 methods - access by Hardware Address
|
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4HWAddr2) {
|
|
|
|
testGetLease4HWAddr2();
|
2012-12-03 21:23:48 +00:00
|
|
|
}
|
2012-11-23 12:47:40 +00:00
|
|
|
|
2012-12-03 21:23:48 +00:00
|
|
|
// @brief Get lease4 by hardware address (2)
|
|
|
|
//
|
|
|
|
// Check that the system can cope with getting a hardware address of
|
|
|
|
// any size.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4HwaddrSize) {
|
|
|
|
|
|
|
|
// Create leases, although we need only one.
|
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
|
|
|
|
// Now add leases with increasing hardware address size.
|
2013-03-15 14:19:42 -04:00
|
|
|
for (uint8_t i = 0; i <= HWAddr::MAX_HWADDR_LEN; ++i) {
|
2012-12-03 21:23:48 +00:00
|
|
|
leases[1]->hwaddr_.resize(i, i);
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-08-27 16:00:16 +02:00
|
|
|
Lease4Collection returned =
|
2013-03-15 14:19:42 -04:00
|
|
|
lmptr_->getLease4(HWAddr(leases[1]->hwaddr_, HTYPE_ETHER));
|
|
|
|
|
2012-12-03 21:23:48 +00:00
|
|
|
ASSERT_EQ(1, returned.size());
|
|
|
|
detailCompareLease(leases[1], *returned.begin());
|
2012-12-10 11:21:24 +00:00
|
|
|
(void) lmptr_->deleteLease(leases[1]->addr_);
|
2012-12-03 21:23:48 +00:00
|
|
|
}
|
|
|
|
|
2013-03-15 14:19:42 -04:00
|
|
|
// Database should not let us add one that is too big
|
|
|
|
// (The 42 is a random value put in each byte of the address.)
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: 2589 will make this test impossible
|
2013-03-15 14:19:42 -04:00
|
|
|
leases[1]->hwaddr_.resize(HWAddr::MAX_HWADDR_LEN + 100, 42);
|
|
|
|
EXPECT_THROW(lmptr_->addLease(leases[1]), isc::dhcp::DbOperationError);
|
2012-11-23 12:47:40 +00:00
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check GetLease4 methods - access by Hardware Address & Subnet ID
|
|
|
|
///
|
|
|
|
/// Adds leases to the database and checks that they can be accessed via
|
|
|
|
/// a combination of hardware address and subnet ID
|
2012-11-23 12:23:17 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4HwaddrSubnetId) {
|
|
|
|
// Get the leases to be used for the test and add to the database
|
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
for (int i = 0; i < leases.size(); ++i) {
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the leases matching the hardware address of lease 1 and
|
|
|
|
// subnet ID of lease 1. Result should be a single lease - lease 1.
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-08-27 16:00:16 +02:00
|
|
|
Lease4Ptr returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_,
|
2013-03-15 14:19:42 -04:00
|
|
|
HTYPE_ETHER), leases[1]->subnet_id_);
|
|
|
|
|
2012-11-23 12:23:17 +00:00
|
|
|
ASSERT_TRUE(returned);
|
|
|
|
detailCompareLease(leases[1], returned);
|
|
|
|
|
|
|
|
// Try for a match to the hardware address of lease 1 and the wrong
|
|
|
|
// subnet ID.
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-01-10 16:32:24 +01:00
|
|
|
returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_, HTYPE_ETHER),
|
2012-11-23 12:23:17 +00:00
|
|
|
leases[1]->subnet_id_ + 1);
|
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
|
|
|
|
// Try for a match to the subnet ID of lease 1 (and lease 4) but
|
|
|
|
// the wrong hardware address.
|
|
|
|
vector<uint8_t> invalid_hwaddr(15, 0x77);
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-01-10 16:32:24 +01:00
|
|
|
returned = lmptr_->getLease4(HWAddr(invalid_hwaddr, HTYPE_ETHER),
|
2012-11-23 12:23:17 +00:00
|
|
|
leases[1]->subnet_id_);
|
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
|
|
|
|
// Try for a match to an unknown hardware address and an unknown
|
|
|
|
// subnet ID.
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-01-10 16:32:24 +01:00
|
|
|
returned = lmptr_->getLease4(HWAddr(invalid_hwaddr, HTYPE_ETHER),
|
2012-11-23 12:23:17 +00:00
|
|
|
leases[1]->subnet_id_ + 1);
|
|
|
|
EXPECT_FALSE(returned);
|
2012-11-23 18:23:21 +00:00
|
|
|
|
|
|
|
// Add a second lease with the same values as the first and check that
|
|
|
|
// an attempt to access the database by these parameters throws a
|
|
|
|
// "multiple records" exception. (We expect there to be only one record
|
|
|
|
// with that combination, so getting them via getLeaseX() (as opposed
|
|
|
|
// to getLeaseXCollection() should throw an exception.)
|
2012-12-10 11:21:24 +00:00
|
|
|
EXPECT_TRUE(lmptr_->deleteLease(leases[2]->addr_));
|
2012-11-23 18:23:21 +00:00
|
|
|
leases[1]->addr_ = leases[2]->addr_;
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-08-27 16:00:16 +02:00
|
|
|
EXPECT_THROW(returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_,
|
|
|
|
HTYPE_ETHER),
|
|
|
|
leases[1]->subnet_id_),
|
2012-11-23 18:23:21 +00:00
|
|
|
isc::dhcp::MultipleRecords);
|
2012-12-03 21:23:48 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// @brief Get lease4 by hardware address and subnet ID (2)
|
|
|
|
//
|
|
|
|
// Check that the system can cope with getting a hardware address of
|
|
|
|
// any size.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4HwaddrSubnetIdSize) {
|
|
|
|
|
|
|
|
// Create leases, although we need only one.
|
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
|
|
|
|
// Now add leases with increasing hardware address size and check
|
|
|
|
// that they can be retrieved.
|
2013-03-15 14:19:42 -04:00
|
|
|
for (uint8_t i = 0; i <= HWAddr::MAX_HWADDR_LEN; ++i) {
|
2012-12-03 21:23:48 +00:00
|
|
|
leases[1]->hwaddr_.resize(i, i);
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
2014-01-10 11:11:15 -05:00
|
|
|
/// @todo: Simply use HWAddr directly once 2589 is implemented
|
2013-08-27 16:00:16 +02:00
|
|
|
Lease4Ptr returned = lmptr_->getLease4(HWAddr(leases[1]->hwaddr_,
|
|
|
|
HTYPE_ETHER),
|
2012-12-03 21:23:48 +00:00
|
|
|
leases[1]->subnet_id_);
|
|
|
|
ASSERT_TRUE(returned);
|
|
|
|
detailCompareLease(leases[1], returned);
|
2012-12-10 11:21:24 +00:00
|
|
|
(void) lmptr_->deleteLease(leases[1]->addr_);
|
2012-12-03 21:23:48 +00:00
|
|
|
}
|
|
|
|
|
2013-03-15 14:19:42 -04:00
|
|
|
// Database should not let us add one that is too big
|
|
|
|
// (The 42 is a random value put in each byte of the address.)
|
|
|
|
leases[1]->hwaddr_.resize(HWAddr::MAX_HWADDR_LEN + 100, 42);
|
|
|
|
EXPECT_THROW(lmptr_->addLease(leases[1]), isc::dhcp::DbOperationError);
|
2012-11-23 12:23:17 +00:00
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check GetLease4 methods - access by Client ID
|
|
|
|
///
|
|
|
|
/// Adds leases to the database and checks that they can be accessed via
|
|
|
|
/// the Client ID.
|
2012-11-23 12:47:40 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4ClientId) {
|
2012-11-23 12:05:55 +00:00
|
|
|
// Get the leases to be used for the test and add to the database
|
2012-11-21 19:38:26 +00:00
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
for (int i = 0; i < leases.size(); ++i) {
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[i]));
|
|
|
|
}
|
|
|
|
|
2012-11-23 12:47:40 +00:00
|
|
|
// Get the leases matching the Client ID address of lease 1
|
|
|
|
Lease4Collection returned = lmptr_->getLease4(*leases[1]->client_id_);
|
2012-11-21 19:38:26 +00:00
|
|
|
|
2012-11-23 12:47:40 +00:00
|
|
|
// Should be four leases, matching leases[1], [4], [5] and [6].
|
|
|
|
ASSERT_EQ(4, returned.size());
|
2012-11-21 19:38:26 +00:00
|
|
|
|
2012-11-23 12:05:55 +00:00
|
|
|
// Easiest way to check is to look at the addresses.
|
|
|
|
vector<string> addresses;
|
|
|
|
for (Lease4Collection::const_iterator i = returned.begin();
|
|
|
|
i != returned.end(); ++i) {
|
|
|
|
addresses.push_back((*i)->addr_.toText());
|
|
|
|
}
|
|
|
|
sort(addresses.begin(), addresses.end());
|
|
|
|
EXPECT_EQ(straddress4_[1], addresses[0]);
|
2012-11-23 12:47:40 +00:00
|
|
|
EXPECT_EQ(straddress4_[4], addresses[1]);
|
2012-11-23 12:05:55 +00:00
|
|
|
EXPECT_EQ(straddress4_[5], addresses[2]);
|
2012-11-23 12:47:40 +00:00
|
|
|
EXPECT_EQ(straddress4_[6], addresses[3]);
|
2012-11-23 12:05:55 +00:00
|
|
|
|
|
|
|
// Repeat test with just one expected match
|
2012-11-23 12:47:40 +00:00
|
|
|
returned = lmptr_->getLease4(*leases[3]->client_id_);
|
2013-02-21 16:50:59 +01:00
|
|
|
ASSERT_EQ(1, returned.size());
|
2012-11-23 12:47:40 +00:00
|
|
|
detailCompareLease(leases[3], *returned.begin());
|
2012-11-23 12:05:55 +00:00
|
|
|
|
2013-02-27 12:13:04 +01:00
|
|
|
// Check that client-id is NULL
|
|
|
|
EXPECT_FALSE(leases[7]->client_id_);
|
|
|
|
HWAddr tmp(leases[7]->hwaddr_, HTYPE_ETHER);
|
|
|
|
returned = lmptr_->getLease4(tmp);
|
2013-02-21 16:50:59 +01:00
|
|
|
ASSERT_EQ(1, returned.size());
|
2012-11-23 12:05:55 +00:00
|
|
|
detailCompareLease(leases[7], *returned.begin());
|
|
|
|
|
2012-11-23 12:47:40 +00:00
|
|
|
// Try to get something with invalid client ID
|
|
|
|
const uint8_t invalid_data[] = {0, 0, 0};
|
|
|
|
ClientId invalid(invalid_data, sizeof(invalid_data));
|
2012-11-23 12:05:55 +00:00
|
|
|
returned = lmptr_->getLease4(invalid);
|
|
|
|
EXPECT_EQ(0, returned.size());
|
2012-11-21 19:38:26 +00:00
|
|
|
}
|
|
|
|
|
2012-12-03 21:23:48 +00:00
|
|
|
// @brief Get Lease4 by client ID (2)
|
|
|
|
//
|
|
|
|
// Check that the system can cope with a client ID of any size.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4ClientIdSize) {
|
|
|
|
|
|
|
|
// Create leases, although we need only one.
|
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
|
|
|
|
// Now add leases with increasing Client ID size can be retrieved.
|
|
|
|
// For speed, go from 0 to 128 is steps of 16.
|
|
|
|
// Intermediate client_id_max is to overcome problem if
|
|
|
|
// ClientId::MAX_CLIENT_ID_LEN is used in an EXPECT_EQ.
|
|
|
|
int client_id_max = ClientId::MAX_CLIENT_ID_LEN;
|
|
|
|
EXPECT_EQ(128, client_id_max);
|
2013-02-27 12:13:04 +01:00
|
|
|
|
|
|
|
int client_id_min = ClientId::MIN_CLIENT_ID_LEN;
|
|
|
|
EXPECT_EQ(2, client_id_min); // See RFC2132, section 9.14
|
|
|
|
|
|
|
|
for (uint8_t i = client_id_min; i <= client_id_max; i += 16) {
|
2012-12-03 21:23:48 +00:00
|
|
|
vector<uint8_t> clientid_vec(i, i);
|
|
|
|
leases[1]->client_id_.reset(new ClientId(clientid_vec));
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
|
|
|
Lease4Collection returned = lmptr_->getLease4(*leases[1]->client_id_);
|
|
|
|
ASSERT_TRUE(returned.size() == 1);
|
|
|
|
detailCompareLease(leases[1], *returned.begin());
|
2012-12-10 11:21:24 +00:00
|
|
|
(void) lmptr_->deleteLease(leases[1]->addr_);
|
2012-12-03 21:23:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Don't bother to check client IDs longer than the maximum -
|
|
|
|
// these cannot be constructed, and that limitation is tested
|
|
|
|
// in the DUID/Client ID unit tests.
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check GetLease4 methods - access by Client ID & Subnet ID
|
|
|
|
///
|
|
|
|
/// Adds leases to the database and checks that they can be accessed via
|
|
|
|
/// a combination of client and subnet IDs.
|
2012-11-23 13:48:42 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease4ClientIdSubnetId) {
|
|
|
|
// Get the leases to be used for the test and add to the database
|
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
for (int i = 0; i < leases.size(); ++i) {
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the leases matching the client ID of lease 1 and
|
|
|
|
// subnet ID of lease 1. Result should be a single lease - lease 1.
|
|
|
|
Lease4Ptr returned = lmptr_->getLease4(*leases[1]->client_id_,
|
|
|
|
leases[1]->subnet_id_);
|
|
|
|
ASSERT_TRUE(returned);
|
|
|
|
detailCompareLease(leases[1], returned);
|
|
|
|
|
|
|
|
// Try for a match to the client ID of lease 1 and the wrong
|
|
|
|
// subnet ID.
|
|
|
|
returned = lmptr_->getLease4(*leases[1]->client_id_,
|
|
|
|
leases[1]->subnet_id_ + 1);
|
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
|
|
|
|
// Try for a match to the subnet ID of lease 1 (and lease 4) but
|
|
|
|
// the wrong client ID
|
|
|
|
const uint8_t invalid_data[] = {0, 0, 0};
|
|
|
|
ClientId invalid(invalid_data, sizeof(invalid_data));
|
|
|
|
returned = lmptr_->getLease4(invalid, leases[1]->subnet_id_);
|
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
|
|
|
|
// Try for a match to an unknown hardware address and an unknown
|
|
|
|
// subnet ID.
|
|
|
|
returned = lmptr_->getLease4(invalid, leases[1]->subnet_id_ + 1);
|
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check GetLease6 methods - access by DUID/IAID
|
|
|
|
///
|
|
|
|
/// Adds leases to the database and checks that they can be accessed via
|
|
|
|
/// a combination of DIUID and IAID.
|
2013-09-13 10:05:28 -04:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLeases6DuidIaid) {
|
2012-11-03 18:26:57 +00:00
|
|
|
// Get the leases to be used for the test.
|
|
|
|
vector<Lease6Ptr> leases = createLeases6();
|
2012-11-21 19:38:26 +00:00
|
|
|
ASSERT_LE(6, leases.size()); // Expect to access leases 0 through 5
|
2012-11-03 18:26:57 +00:00
|
|
|
|
|
|
|
// Add them to the database
|
|
|
|
for (int i = 0; i < leases.size(); ++i) {
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the leases matching the DUID and IAID of lease[1].
|
2013-09-06 19:30:35 +02:00
|
|
|
Lease6Collection returned = lmptr_->getLeases6(leasetype6_[1],
|
|
|
|
*leases[1]->duid_,
|
|
|
|
leases[1]->iaid_);
|
2012-11-03 18:26:57 +00:00
|
|
|
|
2013-09-13 10:05:28 -04:00
|
|
|
// Should be two leases, matching leases[1] and [4].
|
|
|
|
ASSERT_EQ(2, returned.size());
|
2012-11-03 18:26:57 +00:00
|
|
|
|
|
|
|
// Easiest way to check is to look at the addresses.
|
|
|
|
vector<string> addresses;
|
|
|
|
for (Lease6Collection::const_iterator i = returned.begin();
|
|
|
|
i != returned.end(); ++i) {
|
|
|
|
addresses.push_back((*i)->addr_.toText());
|
|
|
|
}
|
|
|
|
sort(addresses.begin(), addresses.end());
|
2012-11-19 19:37:07 +00:00
|
|
|
EXPECT_EQ(straddress6_[1], addresses[0]);
|
|
|
|
EXPECT_EQ(straddress6_[4], addresses[1]);
|
2012-11-04 19:57:05 +00:00
|
|
|
|
|
|
|
// Check that nothing is returned when either the IAID or DUID match
|
|
|
|
// nothing.
|
2013-09-06 19:30:35 +02:00
|
|
|
returned = lmptr_->getLeases6(leasetype6_[1], *leases[1]->duid_,
|
|
|
|
leases[1]->iaid_ + 1);
|
2012-11-04 19:57:05 +00:00
|
|
|
EXPECT_EQ(0, returned.size());
|
|
|
|
|
|
|
|
// Alter the leases[1] DUID to match nothing in the database.
|
|
|
|
vector<uint8_t> duid_vector = leases[1]->duid_->getDuid();
|
|
|
|
++duid_vector[0];
|
|
|
|
DUID new_duid(duid_vector);
|
2013-09-06 19:30:35 +02:00
|
|
|
returned = lmptr_->getLeases6(leasetype6_[1], new_duid, leases[1]->iaid_);
|
2012-11-04 19:57:05 +00:00
|
|
|
EXPECT_EQ(0, returned.size());
|
|
|
|
}
|
|
|
|
|
2012-12-03 21:23:48 +00:00
|
|
|
// @brief Get Lease4 by DUID and IAID (2)
|
|
|
|
//
|
|
|
|
// Check that the system can cope with a DUID of any size.
|
2013-09-13 10:05:28 -04:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLeases6DuidIaidSize) {
|
2012-12-03 21:23:48 +00:00
|
|
|
|
|
|
|
// Create leases, although we need only one.
|
|
|
|
vector<Lease6Ptr> leases = createLeases6();
|
|
|
|
|
|
|
|
// Now add leases with increasing DUID size can be retrieved.
|
|
|
|
// For speed, go from 0 to 128 is steps of 16.
|
|
|
|
int duid_max = DUID::MAX_DUID_LEN;
|
|
|
|
EXPECT_EQ(128, duid_max);
|
2013-02-27 12:13:04 +01:00
|
|
|
|
|
|
|
int duid_min = DUID::MIN_DUID_LEN;
|
|
|
|
EXPECT_EQ(1, duid_min);
|
|
|
|
|
|
|
|
for (uint8_t i = duid_min; i <= duid_max; i += 16) {
|
2012-12-03 21:23:48 +00:00
|
|
|
vector<uint8_t> duid_vec(i, i);
|
|
|
|
leases[1]->duid_.reset(new DUID(duid_vec));
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
2013-09-06 19:30:35 +02:00
|
|
|
Lease6Collection returned = lmptr_->getLeases6(leasetype6_[1],
|
|
|
|
*leases[1]->duid_,
|
|
|
|
leases[1]->iaid_);
|
2013-02-21 16:50:59 +01:00
|
|
|
ASSERT_EQ(1, returned.size());
|
2012-12-03 21:23:48 +00:00
|
|
|
detailCompareLease(leases[1], *returned.begin());
|
2012-12-10 11:21:24 +00:00
|
|
|
(void) lmptr_->deleteLease(leases[1]->addr_);
|
2012-12-03 21:23:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Don't bother to check DUIDs longer than the maximum - these cannot be
|
|
|
|
// constructed, and that limitation is tested in the DUID/Client ID unit
|
|
|
|
// tests.
|
|
|
|
}
|
|
|
|
|
2013-09-13 10:05:28 -04:00
|
|
|
/// @brief Check that getLease6 methods discriminate by lease type.
|
|
|
|
///
|
|
|
|
/// Adds six leases, two per lease type all with the same duid and iad but
|
|
|
|
/// with alternating subnet_ids.
|
|
|
|
/// It then verifies that all of getLeases6() method variants correctly
|
|
|
|
/// discriminate between the leases based on lease type alone.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, lease6LeaseTypeCheck) {
|
|
|
|
|
|
|
|
Lease6Ptr empty_lease(new Lease6());
|
|
|
|
|
|
|
|
DuidPtr duid(new DUID(vector<uint8_t>(8, 0x77)));
|
|
|
|
|
|
|
|
// Initialize unused fields.
|
|
|
|
empty_lease->t1_ = 0; // Not saved
|
|
|
|
empty_lease->t2_ = 0; // Not saved
|
|
|
|
empty_lease->fixed_ = false; // Unused
|
|
|
|
empty_lease->comments_ = std::string(""); // Unused
|
|
|
|
empty_lease->iaid_ = 142;
|
|
|
|
empty_lease->duid_ = DuidPtr(new DUID(*duid));
|
|
|
|
empty_lease->subnet_id_ = 23;
|
|
|
|
empty_lease->preferred_lft_ = 100;
|
|
|
|
empty_lease->valid_lft_ = 100;
|
|
|
|
empty_lease->cltt_ = 100;
|
|
|
|
empty_lease->fqdn_fwd_ = true;
|
|
|
|
empty_lease->fqdn_rev_ = true;
|
|
|
|
empty_lease->hostname_ = "myhost.example.com.";
|
|
|
|
empty_lease->prefixlen_ = 4;
|
|
|
|
|
2013-09-18 06:06:37 -04:00
|
|
|
// Make Two leases per lease type, all with the same DUID, IAID but
|
2013-09-13 10:05:28 -04:00
|
|
|
// alternate the subnet_ids.
|
|
|
|
vector<Lease6Ptr> leases;
|
2013-09-18 06:06:37 -04:00
|
|
|
for (int i = 0; i < 6; ++i) {
|
|
|
|
Lease6Ptr lease(new Lease6(*empty_lease));
|
|
|
|
lease->type_ = leasetype6_[i / 2];
|
|
|
|
lease->addr_ = IOAddress(straddress6_[i]);
|
|
|
|
lease->subnet_id_ += (i % 2);
|
|
|
|
leases.push_back(lease);
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(lease));
|
|
|
|
}
|
2013-09-13 10:05:28 -04:00
|
|
|
|
|
|
|
// Verify getting a single lease by type and address.
|
2013-09-18 06:06:37 -04:00
|
|
|
for (int i = 0; i < 6; ++i) {
|
2013-09-13 10:05:28 -04:00
|
|
|
// Look for exact match for each lease type.
|
2013-09-18 06:06:37 -04:00
|
|
|
Lease6Ptr returned = lmptr_->getLease6(leasetype6_[i / 2],
|
|
|
|
leases[i]->addr_);
|
2013-09-13 10:05:28 -04:00
|
|
|
// We should match one per lease type.
|
|
|
|
ASSERT_TRUE(returned);
|
2013-09-18 06:06:37 -04:00
|
|
|
EXPECT_TRUE(*returned == *leases[i]);
|
2013-09-13 10:05:28 -04:00
|
|
|
|
|
|
|
// Same address but wrong lease type, should not match.
|
2013-09-18 06:06:37 -04:00
|
|
|
returned = lmptr_->getLease6(leasetype6_[i / 2 + 1], leases[i]->addr_);
|
2013-09-13 10:05:28 -04:00
|
|
|
ASSERT_FALSE(returned);
|
|
|
|
}
|
|
|
|
|
2013-09-18 06:06:37 -04:00
|
|
|
// Verify getting a collection of leases by type, DUID, and IAID.
|
2013-09-13 10:05:28 -04:00
|
|
|
// Iterate over the lease types, asking for leases based on
|
2013-09-18 06:06:37 -04:00
|
|
|
// lease type, DUID, and IAID.
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
2013-09-13 10:05:28 -04:00
|
|
|
Lease6Collection returned = lmptr_->getLeases6(leasetype6_[i],
|
|
|
|
*duid, 142);
|
|
|
|
// We should match two per lease type.
|
|
|
|
ASSERT_EQ(2, returned.size());
|
2013-09-18 06:06:37 -04:00
|
|
|
|
|
|
|
// Collection order returned is not guaranteed.
|
|
|
|
// Easiest way to check is to look at the addresses.
|
|
|
|
vector<string> addresses;
|
|
|
|
for (Lease6Collection::const_iterator it = returned.begin();
|
|
|
|
it != returned.end(); ++it) {
|
|
|
|
addresses.push_back((*it)->addr_.toText());
|
|
|
|
}
|
|
|
|
sort(addresses.begin(), addresses.end());
|
|
|
|
|
|
|
|
// Now verify that the lease addresses match.
|
|
|
|
EXPECT_EQ(addresses[0], leases[(i * 2)]->addr_.toText());
|
|
|
|
EXPECT_EQ(addresses[1], leases[(i * 2 + 1)]->addr_.toText());
|
2013-09-13 10:05:28 -04:00
|
|
|
}
|
|
|
|
|
2013-09-18 06:06:37 -04:00
|
|
|
// Verify getting a collection of leases by type, DUID, IAID, and subnet id.
|
2013-09-13 10:05:28 -04:00
|
|
|
// Iterate over the lease types, asking for leases based on
|
2013-09-18 06:06:37 -04:00
|
|
|
// lease type, DUID, IAID, and subnet_id.
|
|
|
|
for (int i = 0; i < 3; ++i) {
|
2013-09-13 10:05:28 -04:00
|
|
|
Lease6Collection returned = lmptr_->getLeases6(leasetype6_[i],
|
|
|
|
*duid, 142, 23);
|
|
|
|
// We should match one per lease type.
|
|
|
|
ASSERT_EQ(1, returned.size());
|
2013-09-18 06:06:37 -04:00
|
|
|
EXPECT_TRUE(*(returned[0]) == *leases[i * 2]);
|
2013-09-13 10:05:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Verify getting a single lease by type, duid, iad, and subnet id.
|
2013-09-18 06:06:37 -04:00
|
|
|
for (int i = 0; i < 6; ++i) {
|
|
|
|
Lease6Ptr returned = lmptr_->getLease6(leasetype6_[i / 2],
|
|
|
|
*duid, 142, (23 + (i % 2)));
|
2013-09-13 10:05:28 -04:00
|
|
|
// We should match one per lease type.
|
|
|
|
ASSERT_TRUE(returned);
|
2013-09-18 06:06:37 -04:00
|
|
|
EXPECT_TRUE(*returned == *leases[i]);
|
2013-09-13 10:05:28 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Check GetLease6 methods - access by DUID/IAID/SubnetID
|
|
|
|
///
|
|
|
|
/// Adds leases to the database and checks that they can be accessed via
|
|
|
|
/// a combination of DIUID and IAID.
|
2012-11-21 19:38:26 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease6DuidIaidSubnetId) {
|
2012-11-23 14:08:00 +00:00
|
|
|
// Get the leases to be used for the test and add them to the database.
|
2012-11-04 19:57:05 +00:00
|
|
|
vector<Lease6Ptr> leases = createLeases6();
|
|
|
|
for (int i = 0; i < leases.size(); ++i) {
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the leases matching the DUID and IAID of lease[1].
|
2013-09-06 14:51:59 +02:00
|
|
|
Lease6Ptr returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
|
2012-11-04 19:57:05 +00:00
|
|
|
leases[1]->iaid_,
|
|
|
|
leases[1]->subnet_id_);
|
|
|
|
ASSERT_TRUE(returned);
|
|
|
|
EXPECT_TRUE(*returned == *leases[1]);
|
|
|
|
|
|
|
|
// Modify each of the three parameters (DUID, IAID, Subnet ID) and
|
|
|
|
// check that nothing is returned.
|
2013-09-06 14:51:59 +02:00
|
|
|
returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
|
|
|
|
leases[1]->iaid_ + 1, leases[1]->subnet_id_);
|
2012-11-04 19:57:05 +00:00
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
|
2013-09-06 14:51:59 +02:00
|
|
|
returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
|
|
|
|
leases[1]->iaid_, leases[1]->subnet_id_ + 1);
|
2012-11-04 19:57:05 +00:00
|
|
|
EXPECT_FALSE(returned);
|
|
|
|
|
|
|
|
// Alter the leases[1] DUID to match nothing in the database.
|
|
|
|
vector<uint8_t> duid_vector = leases[1]->duid_->getDuid();
|
|
|
|
++duid_vector[0];
|
|
|
|
DUID new_duid(duid_vector);
|
2013-09-06 14:51:59 +02:00
|
|
|
returned = lmptr_->getLease6(leasetype6_[1], new_duid, leases[1]->iaid_,
|
2012-11-04 19:57:05 +00:00
|
|
|
leases[1]->subnet_id_);
|
|
|
|
EXPECT_FALSE(returned);
|
2012-11-03 18:26:57 +00:00
|
|
|
}
|
|
|
|
|
2013-09-13 10:05:28 -04:00
|
|
|
|
2012-12-03 21:23:48 +00:00
|
|
|
// @brief Get Lease4 by DUID, IAID & subnet ID (2)
|
|
|
|
//
|
|
|
|
// Check that the system can cope with a DUID of any size.
|
|
|
|
TEST_F(MySqlLeaseMgrTest, getLease6DuidIaidSubnetIdSize) {
|
|
|
|
|
|
|
|
// Create leases, although we need only one.
|
|
|
|
vector<Lease6Ptr> leases = createLeases6();
|
|
|
|
|
|
|
|
// Now add leases with increasing DUID size can be retrieved.
|
|
|
|
// For speed, go from 0 to 128 is steps of 16.
|
|
|
|
int duid_max = DUID::MAX_DUID_LEN;
|
|
|
|
EXPECT_EQ(128, duid_max);
|
2013-02-27 12:13:04 +01:00
|
|
|
|
|
|
|
int duid_min = DUID::MIN_DUID_LEN;
|
|
|
|
EXPECT_EQ(1, duid_min);
|
|
|
|
|
|
|
|
for (uint8_t i = duid_min; i <= duid_max; i += 16) {
|
2012-12-03 21:23:48 +00:00
|
|
|
vector<uint8_t> duid_vec(i, i);
|
|
|
|
leases[1]->duid_.reset(new DUID(duid_vec));
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
2013-09-06 14:51:59 +02:00
|
|
|
Lease6Ptr returned = lmptr_->getLease6(leasetype6_[1], *leases[1]->duid_,
|
2012-12-03 21:23:48 +00:00
|
|
|
leases[1]->iaid_,
|
|
|
|
leases[1]->subnet_id_);
|
|
|
|
ASSERT_TRUE(returned);
|
|
|
|
detailCompareLease(leases[1], returned);
|
2012-12-10 11:21:24 +00:00
|
|
|
(void) lmptr_->deleteLease(leases[1]->addr_);
|
2012-12-03 21:23:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Don't bother to check DUIDs longer than the maximum - these cannot be
|
|
|
|
// constructed, and that limitation is tested in the DUID/Client ID unit
|
|
|
|
// tests.
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Lease4 update tests
|
|
|
|
///
|
|
|
|
/// Checks that we are able to update a lease in the database.
|
2012-11-23 14:08:00 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, updateLease4) {
|
|
|
|
// Get the leases to be used for the test and add them to the database.
|
|
|
|
vector<Lease4Ptr> leases = createLeases4();
|
|
|
|
for (int i = 0; i < leases.size(); ++i) {
|
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[i]));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Modify some fields in lease 1 (not the address) and update it.
|
|
|
|
++leases[1]->subnet_id_;
|
|
|
|
leases[1]->valid_lft_ *= 2;
|
2013-08-27 14:23:52 +02:00
|
|
|
leases[1]->hostname_ = "modified.hostname.";
|
|
|
|
leases[1]->fqdn_fwd_ = !leases[1]->fqdn_fwd_;
|
|
|
|
leases[1]->fqdn_rev_ = !leases[1]->fqdn_rev_;;
|
2012-11-23 14:08:00 +00:00
|
|
|
lmptr_->updateLease4(leases[1]);
|
|
|
|
|
|
|
|
// ... and check what is returned is what is expected.
|
|
|
|
Lease4Ptr l_returned = lmptr_->getLease4(ioaddress4_[1]);
|
|
|
|
ASSERT_TRUE(l_returned);
|
|
|
|
detailCompareLease(leases[1], l_returned);
|
|
|
|
|
|
|
|
// Alter the lease again and check.
|
|
|
|
++leases[1]->subnet_id_;
|
|
|
|
leases[1]->cltt_ += 6;
|
|
|
|
lmptr_->updateLease4(leases[1]);
|
|
|
|
|
|
|
|
// Explicitly clear the returned pointer before getting new data to ensure
|
|
|
|
// that the new data is returned.
|
|
|
|
l_returned.reset();
|
|
|
|
l_returned = lmptr_->getLease4(ioaddress4_[1]);
|
|
|
|
ASSERT_TRUE(l_returned);
|
|
|
|
detailCompareLease(leases[1], l_returned);
|
|
|
|
|
|
|
|
// Check we can do an update without changing data.
|
|
|
|
lmptr_->updateLease4(leases[1]);
|
|
|
|
l_returned.reset();
|
|
|
|
l_returned = lmptr_->getLease4(ioaddress4_[1]);
|
|
|
|
ASSERT_TRUE(l_returned);
|
|
|
|
detailCompareLease(leases[1], l_returned);
|
|
|
|
|
2013-08-27 16:00:16 +02:00
|
|
|
// Try to update the lease with the too long hostname.
|
|
|
|
leases[1]->hostname_.assign(256, 'a');
|
|
|
|
EXPECT_THROW(lmptr_->updateLease4(leases[1]), isc::dhcp::DbOperationError);
|
|
|
|
|
2012-11-23 14:08:00 +00:00
|
|
|
// Try updating a lease not in the database.
|
2012-12-10 11:21:24 +00:00
|
|
|
lmptr_->deleteLease(ioaddress4_[2]);
|
2012-11-23 14:08:00 +00:00
|
|
|
EXPECT_THROW(lmptr_->updateLease4(leases[2]), isc::dhcp::NoSuchLease);
|
|
|
|
}
|
|
|
|
|
2012-11-23 18:23:21 +00:00
|
|
|
/// @brief Lease6 update tests
|
|
|
|
///
|
|
|
|
/// Checks that we are able to update a lease in the database.
|
2012-11-14 14:30:46 +00:00
|
|
|
TEST_F(MySqlLeaseMgrTest, updateLease6) {
|
2012-11-03 18:26:57 +00:00
|
|
|
// Get the leases to be used for the test.
|
|
|
|
vector<Lease6Ptr> leases = createLeases6();
|
2012-11-21 19:38:26 +00:00
|
|
|
ASSERT_LE(3, leases.size()); // Expect to access leases 0 through 2
|
2012-10-29 19:19:36 +00:00
|
|
|
|
|
|
|
// Add a lease to the database and check that the lease is there.
|
2012-11-03 18:26:57 +00:00
|
|
|
EXPECT_TRUE(lmptr_->addLease(leases[1]));
|
2012-10-29 19:19:36 +00:00
|
|
|
lmptr_->commit();
|
|
|
|
|
2013-09-06 14:51:59 +02:00
|
|
|
Lease6Ptr l_returned = lmptr_->getLease6(leasetype6_[1], ioaddress6_[1]);
|
2012-11-21 19:38:26 +00:00
|
|
|
ASSERT_TRUE(l_returned);
|
2012-11-19 19:37:07 +00:00
|
|
|
detailCompareLease(leases[1], l_returned);
|
2012-10-29 19:19:36 +00:00
|
|
|
|
|
|
|
// Modify some fields in lease 1 (not the address) and update it.
|
2012-11-03 18:26:57 +00:00
|
|
|
++leases[1]->iaid_;
|
2013-09-18 15:44:48 +02:00
|
|
|
leases[1]->type_ = Lease::TYPE_PD;
|
2012-11-03 18:26:57 +00:00
|
|
|
leases[1]->valid_lft_ *= 2;
|
2013-08-27 14:23:52 +02:00
|
|
|
leases[1]->hostname_ = "modified.hostname.v6.";
|
|
|
|
leases[1]->fqdn_fwd_ = !leases[1]->fqdn_fwd_;
|
|
|
|
leases[1]->fqdn_rev_ = !leases[1]->fqdn_rev_;;
|
2012-11-03 18:26:57 +00:00
|
|
|
lmptr_->updateLease6(leases[1]);
|
2012-10-29 19:19:36 +00:00
|
|
|
lmptr_->commit();
|
|
|
|
|
|
|
|
// ... and check what is returned is what is expected.
|
|
|
|
l_returned.reset();
|
2013-09-18 15:44:48 +02:00
|
|
|
l_returned = lmptr_->getLease6(Lease::TYPE_PD, ioaddress6_[1]);
|
2012-11-21 19:38:26 +00:00
|
|
|
ASSERT_TRUE(l_returned);
|
2012-11-19 19:37:07 +00:00
|
|
|
detailCompareLease(leases[1], l_returned);
|
2012-10-29 19:19:36 +00:00
|
|
|
|
|
|
|
// Alter the lease again and check.
|
2012-11-03 18:26:57 +00:00
|
|
|
++leases[1]->iaid_;
|
2013-09-18 15:44:48 +02:00
|
|
|
leases[1]->type_ = Lease::TYPE_TA;
|
2012-11-03 18:26:57 +00:00
|
|
|
leases[1]->cltt_ += 6;
|
|
|
|
leases[1]->prefixlen_ = 93;
|
|
|
|
lmptr_->updateLease6(leases[1]);
|
2012-10-29 19:19:36 +00:00
|
|
|
|
|
|
|
l_returned.reset();
|
2013-09-18 15:44:48 +02:00
|
|
|
l_returned = lmptr_->getLease6(Lease::TYPE_TA, ioaddress6_[1]);
|
2012-11-21 19:38:26 +00:00
|
|
|
ASSERT_TRUE(l_returned);
|
2012-11-19 19:37:07 +00:00
|
|
|
detailCompareLease(leases[1], l_returned);
|
2012-10-29 19:19:36 +00:00
|
|
|
|
|
|
|
// Check we can do an update without changing data.
|
2012-11-03 18:26:57 +00:00
|
|
|
lmptr_->updateLease6(leases[1]);
|
2012-10-29 19:19:36 +00:00
|
|
|
l_returned.reset();
|
2013-09-18 15:44:48 +02:00
|
|
|
l_returned = lmptr_->getLease6(Lease::TYPE_TA, ioaddress6_[1]);
|
2012-11-21 19:38:26 +00:00
|
|
|
ASSERT_TRUE(l_returned);
|
2012-11-19 19:37:07 +00:00
|
|
|
detailCompareLease(leases[1], l_returned);
|
2012-10-29 19:19:36 +00:00
|
|
|
|
2013-08-27 16:00:16 +02:00
|
|
|
// Try to update the lease with the too long hostname.
|
|
|
|
leases[1]->hostname_.assign(256, 'a');
|
|
|
|
EXPECT_THROW(lmptr_->updateLease6(leases[1]), isc::dhcp::DbOperationError);
|
|
|
|
|
2012-11-03 18:26:57 +00:00
|
|
|
// Try updating a lease not in the database.
|
|
|
|
EXPECT_THROW(lmptr_->updateLease6(leases[2]), isc::dhcp::NoSuchLease);
|
2012-10-24 19:18:33 +01:00
|
|
|
}
|
|
|
|
|
2012-11-05 19:29:39 +00:00
|
|
|
}; // Of anonymous namespace
|