|
@@ -20,6 +20,7 @@
|
|
|
#include <dhcpsrv/tests/test_utils.h>
|
|
|
#include <exceptions/exceptions.h>
|
|
|
|
|
|
+
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
#include <algorithm>
|
|
@@ -39,18 +40,6 @@ namespace {
|
|
|
// This holds statements to create and destroy the schema.
|
|
|
#include "schema_copy.h"
|
|
|
|
|
|
-// IPv4 and IPv6 addresses used in the tests
|
|
|
-const char* 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",
|
|
|
- NULL
|
|
|
-};
|
|
|
-const char* ADDRESS6[] = {
|
|
|
- "2001:db8::0", "2001:db8::1", "2001:db8::2", "2001:db8::3",
|
|
|
- "2001:db8::4", "2001:db8::5", "2001:db8::6", "2001:db8::7",
|
|
|
- NULL
|
|
|
-};
|
|
|
-
|
|
|
// Connection strings.
|
|
|
// Database: keatest
|
|
|
// Host: localhost
|
|
@@ -155,26 +144,12 @@ void createSchema() {
|
|
|
/// Opens the database prior to each test and closes it afterwards.
|
|
|
/// All pending transactions are deleted prior to closure.
|
|
|
|
|
|
-class MySqlLeaseMgrTest : public ::testing::Test {
|
|
|
+class MySqlLeaseMgrTest : public GenericLeaseMgrTest {
|
|
|
public:
|
|
|
/// @brief Constructor
|
|
|
///
|
|
|
/// Deletes everything from the database and opens it.
|
|
|
MySqlLeaseMgrTest() {
|
|
|
- // Initialize address strings and IOAddresses
|
|
|
- for (int i = 0; ADDRESS4[i] != NULL; ++i) {
|
|
|
- string addr(ADDRESS4[i]);
|
|
|
- straddress4_.push_back(addr);
|
|
|
- IOAddress ioaddr(addr);
|
|
|
- ioaddress4_.push_back(ioaddr);
|
|
|
- }
|
|
|
-
|
|
|
- for (int i = 0; ADDRESS6[i] != NULL; ++i) {
|
|
|
- string addr(ADDRESS6[i]);
|
|
|
- straddress6_.push_back(addr);
|
|
|
- IOAddress ioaddr(addr);
|
|
|
- ioaddress6_.push_back(ioaddr);
|
|
|
- }
|
|
|
|
|
|
// Ensure schema is the correct one.
|
|
|
destroySchema();
|
|
@@ -214,361 +189,6 @@ public:
|
|
|
lmptr_ = &(LeaseMgrFactory::instance());
|
|
|
}
|
|
|
|
|
|
- /// @brief Initialize Lease4 Fields
|
|
|
- ///
|
|
|
- /// Returns a pointer to a Lease4 structure. Different values are put into
|
|
|
- /// the lease according to the address passed.
|
|
|
- ///
|
|
|
- /// This is just a convenience function for the test methods.
|
|
|
- ///
|
|
|
- /// @param address Address to use for the initialization
|
|
|
- ///
|
|
|
- /// @return Lease4Ptr. This will not point to anything if the
|
|
|
- /// initialization failed (e.g. unknown address).
|
|
|
- Lease4Ptr initializeLease4(std::string address) {
|
|
|
- Lease4Ptr lease(new Lease4());
|
|
|
-
|
|
|
- // Set the address of the lease
|
|
|
- lease->addr_ = IOAddress(address);
|
|
|
-
|
|
|
- // Initialize unused fields.
|
|
|
- lease->ext_ = 0; // Not saved
|
|
|
- lease->t1_ = 0; // Not saved
|
|
|
- lease->t2_ = 0; // Not saved
|
|
|
- lease->fixed_ = false; // Unused
|
|
|
- lease->comments_ = std::string(""); // Unused
|
|
|
-
|
|
|
- // Set other parameters. For historical reasons, address 0 is not used.
|
|
|
- if (address == straddress4_[0]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x08);
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x42)));
|
|
|
- lease->valid_lft_ = 8677;
|
|
|
- lease->cltt_ = 168256;
|
|
|
- lease->subnet_id_ = 23;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress4_[1]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x19);
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x53)));
|
|
|
- lease->valid_lft_ = 3677;
|
|
|
- lease->cltt_ = 123456;
|
|
|
- lease->subnet_id_ = 73;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress4_[2]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x2a);
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x64)));
|
|
|
- lease->valid_lft_ = 5412;
|
|
|
- lease->cltt_ = 234567;
|
|
|
- lease->subnet_id_ = 73; // Same as lease 1
|
|
|
- lease->fqdn_rev_ = false;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->hostname_ = "";
|
|
|
-
|
|
|
- } else if (address == straddress4_[3]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x75)));
|
|
|
-
|
|
|
- // 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
|
|
|
- lease->valid_lft_ = 7000;
|
|
|
- lease->cltt_ = 234567;
|
|
|
- lease->subnet_id_ = 37;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->hostname_ = "otherhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress4_[4]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x4c);
|
|
|
- // Same ClientId as straddr4_[1]
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
|
|
|
- lease->valid_lft_ = 7736;
|
|
|
- lease->cltt_ = 222456;
|
|
|
- lease->subnet_id_ = 85;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->hostname_ = "otherhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress4_[5]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
|
|
|
- // Same ClientId and IAID as straddress4_1
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
|
|
|
- lease->valid_lft_ = 7832;
|
|
|
- lease->cltt_ = 227476;
|
|
|
- lease->subnet_id_ = 175;
|
|
|
- lease->fqdn_rev_ = false;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->hostname_ = "otherhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress4_[6]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(6, 0x6e);
|
|
|
- // Same ClientId as straddress4_1
|
|
|
- lease->client_id_ = ClientIdPtr(
|
|
|
- new ClientId(vector<uint8_t>(8, 0x53))); // Same as lease 1
|
|
|
- lease->valid_lft_ = 1832;
|
|
|
- lease->cltt_ = 627476;
|
|
|
- lease->subnet_id_ = 112;
|
|
|
- lease->fqdn_rev_ = false;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress4_[7]) {
|
|
|
- lease->hwaddr_ = vector<uint8_t>(); // Empty
|
|
|
- lease->client_id_ = ClientIdPtr(); // Empty
|
|
|
- lease->valid_lft_ = 7975;
|
|
|
- lease->cltt_ = 213876;
|
|
|
- lease->subnet_id_ = 19;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else {
|
|
|
- // Unknown address, return an empty pointer.
|
|
|
- lease.reset();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return (lease);
|
|
|
- }
|
|
|
-
|
|
|
- /// @brief Initialize Lease6 Fields
|
|
|
- ///
|
|
|
- /// Returns a pointer to a Lease6 structure. Different values are put into
|
|
|
- /// the lease according to the address passed.
|
|
|
- ///
|
|
|
- /// This is just a convenience function for the test methods.
|
|
|
- ///
|
|
|
- /// @param address Address to use for the initialization
|
|
|
- ///
|
|
|
- /// @return Lease6Ptr. This will not point to anything if the initialization
|
|
|
- /// failed (e.g. unknown address).
|
|
|
- Lease6Ptr initializeLease6(std::string address) {
|
|
|
- Lease6Ptr lease(new Lease6());
|
|
|
-
|
|
|
- // Set the address of the lease
|
|
|
- lease->addr_ = IOAddress(address);
|
|
|
-
|
|
|
- // Initialize unused fields.
|
|
|
- lease->t1_ = 0; // Not saved
|
|
|
- lease->t2_ = 0; // Not saved
|
|
|
- lease->fixed_ = false; // Unused
|
|
|
- lease->comments_ = std::string(""); // Unused
|
|
|
-
|
|
|
- // Set other parameters. For historical reasons, address 0 is not used.
|
|
|
- if (address == straddress6_[0]) {
|
|
|
- lease->type_ = Lease6::LEASE_IA_TA;
|
|
|
- lease->prefixlen_ = 4;
|
|
|
- lease->iaid_ = 142;
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x77)));
|
|
|
- lease->preferred_lft_ = 900;
|
|
|
- lease->valid_lft_ = 8677;
|
|
|
- lease->cltt_ = 168256;
|
|
|
- lease->subnet_id_ = 23;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[1]) {
|
|
|
- lease->type_ = Lease6::LEASE_IA_TA;
|
|
|
- lease->prefixlen_ = 0;
|
|
|
- lease->iaid_ = 42;
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
|
|
|
- lease->preferred_lft_ = 3600;
|
|
|
- lease->valid_lft_ = 3677;
|
|
|
- lease->cltt_ = 123456;
|
|
|
- lease->subnet_id_ = 73;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[2]) {
|
|
|
- lease->type_ = Lease6::LEASE_IA_PD;
|
|
|
- lease->prefixlen_ = 7;
|
|
|
- lease->iaid_ = 89;
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x3a)));
|
|
|
- lease->preferred_lft_ = 1800;
|
|
|
- lease->valid_lft_ = 5412;
|
|
|
- lease->cltt_ = 234567;
|
|
|
- lease->subnet_id_ = 73; // Same as lease 1
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->fqdn_rev_ = false;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[3]) {
|
|
|
- lease->type_ = Lease6::LEASE_IA_NA;
|
|
|
- lease->prefixlen_ = 28;
|
|
|
- lease->iaid_ = 0xfffffffe;
|
|
|
- vector<uint8_t> duid;
|
|
|
- for (uint8_t i = 31; i < 126; ++i) {
|
|
|
- duid.push_back(i);
|
|
|
- }
|
|
|
- lease->duid_ = DuidPtr(new DUID(duid));
|
|
|
-
|
|
|
- // 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
|
|
|
- lease->preferred_lft_ = 7200;
|
|
|
- lease->valid_lft_ = 7000;
|
|
|
- lease->cltt_ = 234567;
|
|
|
- lease->subnet_id_ = 37;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->fqdn_rev_ = false;
|
|
|
- lease->hostname_ = "myhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[4]) {
|
|
|
- // Same DUID and IAID as straddress6_1
|
|
|
- lease->type_ = Lease6::LEASE_IA_PD;
|
|
|
- lease->prefixlen_ = 15;
|
|
|
- lease->iaid_ = 42;
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
|
|
|
- lease->preferred_lft_ = 4800;
|
|
|
- lease->valid_lft_ = 7736;
|
|
|
- lease->cltt_ = 222456;
|
|
|
- lease->subnet_id_ = 671;
|
|
|
- lease->fqdn_fwd_ = true;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->hostname_ = "otherhost.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[5]) {
|
|
|
- // Same DUID and IAID as straddress6_1
|
|
|
- lease->type_ = Lease6::LEASE_IA_PD;
|
|
|
- lease->prefixlen_ = 24;
|
|
|
- lease->iaid_ = 42; // Same as lease 4
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
|
|
|
- // Same as lease 4
|
|
|
- lease->preferred_lft_ = 5400;
|
|
|
- lease->valid_lft_ = 7832;
|
|
|
- lease->cltt_ = 227476;
|
|
|
- lease->subnet_id_ = 175;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->hostname_ = "hostname.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[6]) {
|
|
|
- // Same DUID as straddress6_1
|
|
|
- lease->type_ = Lease6::LEASE_IA_PD;
|
|
|
- lease->prefixlen_ = 24;
|
|
|
- lease->iaid_ = 93;
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0x42)));
|
|
|
- // Same as lease 4
|
|
|
- lease->preferred_lft_ = 5400;
|
|
|
- lease->valid_lft_ = 1832;
|
|
|
- lease->cltt_ = 627476;
|
|
|
- lease->subnet_id_ = 112;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->hostname_ = "hostname.example.com.";
|
|
|
-
|
|
|
- } else if (address == straddress6_[7]) {
|
|
|
- // Same IAID as straddress6_1
|
|
|
- lease->type_ = Lease6::LEASE_IA_PD;
|
|
|
- lease->prefixlen_ = 24;
|
|
|
- lease->iaid_ = 42;
|
|
|
- lease->duid_ = DuidPtr(new DUID(vector<uint8_t>(8, 0xe5)));
|
|
|
- lease->preferred_lft_ = 5600;
|
|
|
- lease->valid_lft_ = 7975;
|
|
|
- lease->cltt_ = 213876;
|
|
|
- lease->subnet_id_ = 19;
|
|
|
- lease->fqdn_fwd_ = false;
|
|
|
- lease->fqdn_rev_ = true;
|
|
|
- lease->hostname_ = "hostname.example.com.";
|
|
|
-
|
|
|
- } else {
|
|
|
- // Unknown address, return an empty pointer.
|
|
|
- lease.reset();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return (lease);
|
|
|
- }
|
|
|
-
|
|
|
- /// @brief Check Leases present and different
|
|
|
- ///
|
|
|
- /// Checks a vector of lease pointers and ensures that all the leases
|
|
|
- /// they point to are present and different. If not, a GTest assertion
|
|
|
- /// will fail.
|
|
|
- ///
|
|
|
- /// @param leases Vector of pointers to leases
|
|
|
- template <typename T>
|
|
|
- void checkLeasesDifferent(const std::vector<T>& leases) const {
|
|
|
-
|
|
|
- // Check they were created
|
|
|
- for (int i = 0; i < leases.size(); ++i) {
|
|
|
- ASSERT_TRUE(leases[i]);
|
|
|
- }
|
|
|
-
|
|
|
- // Check they are different
|
|
|
- for (int i = 0; i < (leases.size() - 1); ++i) {
|
|
|
- for (int j = (i + 1); j < leases.size(); ++j) {
|
|
|
- stringstream s;
|
|
|
- s << "Comparing leases " << i << " & " << j << " for equality";
|
|
|
- SCOPED_TRACE(s.str());
|
|
|
- EXPECT_TRUE(*leases[i] != *leases[j]);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// @brief Creates leases for the test
|
|
|
- ///
|
|
|
- /// Creates all leases for the test and checks that they are different.
|
|
|
- ///
|
|
|
- /// @return vector<Lease4Ptr> Vector of pointers to leases
|
|
|
- vector<Lease4Ptr> createLeases4() {
|
|
|
-
|
|
|
- // Create leases for each address
|
|
|
- vector<Lease4Ptr> leases;
|
|
|
- for (int i = 0; i < straddress4_.size(); ++i) {
|
|
|
- leases.push_back(initializeLease4(straddress4_[i]));
|
|
|
- }
|
|
|
- EXPECT_EQ(8, leases.size());
|
|
|
-
|
|
|
- // Check all were created and that they are different.
|
|
|
- checkLeasesDifferent(leases);
|
|
|
-
|
|
|
- return (leases);
|
|
|
- }
|
|
|
-
|
|
|
- /// @brief Creates leases for the test
|
|
|
- ///
|
|
|
- /// Creates all leases for the test and checks that they are different.
|
|
|
- ///
|
|
|
- /// @return vector<Lease6Ptr> Vector of pointers to leases
|
|
|
- vector<Lease6Ptr> createLeases6() {
|
|
|
-
|
|
|
- // Create leases for each address
|
|
|
- vector<Lease6Ptr> leases;
|
|
|
- for (int i = 0; i < straddress6_.size(); ++i) {
|
|
|
- leases.push_back(initializeLease6(straddress6_[i]));
|
|
|
- }
|
|
|
- EXPECT_EQ(8, leases.size());
|
|
|
-
|
|
|
- // Check all were created and that they are different.
|
|
|
- checkLeasesDifferent(leases);
|
|
|
-
|
|
|
- return (leases);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // Member variables
|
|
|
-
|
|
|
- LeaseMgr* lmptr_; ///< Pointer to the lease manager
|
|
|
- vector<string> straddress4_; ///< String forms of IPv4 addresses
|
|
|
- vector<IOAddress> ioaddress4_; ///< IOAddress forms of IPv4 addresses
|
|
|
- vector<string> straddress6_; ///< String forms of IPv6 addresses
|
|
|
- vector<IOAddress> ioaddress6_; ///< IOAddress forms of IPv6 addresses
|
|
|
};
|
|
|
|
|
|
/// @brief Check that database can be opened
|
|
@@ -1051,11 +671,6 @@ TEST_F(MySqlLeaseMgrTest, getLease4HwaddrSubnetId) {
|
|
|
leases[1]->subnet_id_),
|
|
|
isc::dhcp::MultipleRecords);
|
|
|
|
|
|
- // Delete all leases in the database
|
|
|
- for (int i = 0; ADDRESS4[i] != NULL; ++i) {
|
|
|
- IOAddress addr(ADDRESS4[i]);
|
|
|
- (void) lmptr_->deleteLease(addr);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
// @brief Get lease4 by hardware address and subnet ID (2)
|