Commit e3d5529c authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[2983] lease4_release tests implemented.

parent 37d09d31
......@@ -2048,10 +2048,25 @@ public:
return (0);
}
/// Test callback that stores received callout name passed parameters
/// @param callout_handle handle passed by the hooks framework
/// @return always 0
static int
lease4_release_callout(CalloutHandle& callout_handle) {
callback_name_ = string("lease4_release");
callout_handle.getArgument("query4", callback_pkt4_);
callout_handle.getArgument("lease4", callback_lease4_);
callback_argument_names_ = callout_handle.getArgumentNames();
return (0);
}
/// resets buffers used to store data received by callouts
void resetCalloutBuffers() {
callback_name_ = string("");
callback_pkt4_.reset();
callback_lease4_.reset();
callback_subnet4_.reset();
callback_subnet4collection_ = NULL;
callback_argument_names_.clear();
......@@ -2068,6 +2083,9 @@ public:
/// Pkt4 structure returned in the callout
static Pkt4Ptr callback_pkt4_;
/// Lease4 structure returned in the callout
static Lease4Ptr callback_lease4_;
/// Pointer to a subnet received by callout
static Subnet4Ptr callback_subnet4_;
......@@ -2083,6 +2101,7 @@ public:
string HooksDhcpv4SrvTest::callback_name_;
Pkt4Ptr HooksDhcpv4SrvTest::callback_pkt4_;
Subnet4Ptr HooksDhcpv4SrvTest::callback_subnet4_;
Lease4Ptr HooksDhcpv4SrvTest::callback_lease4_;
const Subnet4Collection* HooksDhcpv4SrvTest::callback_subnet4collection_;
vector<string> HooksDhcpv4SrvTest::callback_argument_names_;
......@@ -2599,7 +2618,7 @@ TEST_F(HooksDhcpv4SrvTest, subnet4_select) {
// a different subnet.
TEST_F(HooksDhcpv4SrvTest, subnet_select_change) {
// Install pkt4_receive_callout
// Install a callout
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"subnet4_select", subnet4_select_different_subnet_callout));
......@@ -2654,6 +2673,156 @@ TEST_F(HooksDhcpv4SrvTest, subnet_select_change) {
EXPECT_TRUE((*subnets)[1]->inPool(addr));
}
// This test verifies that valid RELEASE triggers lease4_release callouts
TEST_F(HooksDhcpv4SrvTest, basic_lease4_release) {
const IOAddress addr("192.0.2.106");
const uint32_t temp_t1 = 50;
const uint32_t temp_t2 = 75;
const uint32_t temp_valid = 100;
const time_t temp_timestamp = time(NULL) - 10;
// Install a callout
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease4_release", lease4_release_callout));
// Generate client-id also duid_
OptionPtr clientid = generateClientId();
// Check that the address we are about to use is indeed in pool
ASSERT_TRUE(subnet_->inPool(addr));
// Let's create a lease and put it in the LeaseMgr
uint8_t mac_addr[] = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
HWAddrPtr hw(new HWAddr(mac_addr, sizeof(mac_addr), HTYPE_ETHER));
Lease4Ptr used(new Lease4(addr, mac_addr, sizeof(mac_addr),
&client_id_->getDuid()[0], client_id_->getDuid().size(),
temp_valid, temp_t1, temp_t2, temp_timestamp,
subnet_->getID()));
ASSERT_TRUE(LeaseMgrFactory::instance().addLease(used));
// Check that the lease is really in the database
Lease4Ptr l = LeaseMgrFactory::instance().getLease4(addr);
ASSERT_TRUE(l);
// Let's create a RELEASE
// Generate client-id also duid_
Pkt4Ptr rel = Pkt4Ptr(new Pkt4(DHCPRELEASE, 1234));
rel->setRemoteAddr(addr);
rel->setYiaddr(addr);
rel->addOption(clientid);
rel->addOption(srv_->getServerID());
rel->setHWAddr(hw);
// Pass it to the server and hope for a REPLY
// Note: this is no response to RELEASE in DHCPv4
EXPECT_NO_THROW(srv_->processRelease(rel));
// The lease should be gone from LeaseMgr
l = LeaseMgrFactory::instance().getLease4(addr);
EXPECT_FALSE(l);
// Try to get the lease by hardware address
// @todo: Uncomment this once trac2592 is implemented
// Lease4Collection leases = LeaseMgrFactory::instance().getLease4(hw->hwaddr_);
// EXPECT_EQ(leases.size(), 0);
// Try to get it by hw/subnet_id combination
l = LeaseMgrFactory::instance().getLease4(hw->hwaddr_, subnet_->getID());
EXPECT_FALSE(l);
// Try by client-id
// @todo: Uncomment this once trac2592 is implemented
//Lease4Collection leases = LeaseMgrFactory::instance().getLease4(*client_id_);
//EXPECT_EQ(leases.size(), 0);
// Try by client-id/subnet-id
l = LeaseMgrFactory::instance().getLease4(*client_id_, subnet_->getID());
EXPECT_FALSE(l);
// Ok, the lease is *really* not there.
// Check that the callback called is indeed the one we installed
EXPECT_EQ("lease4_release", callback_name_);
// Check that pkt4 argument passing was successful and returned proper value
EXPECT_TRUE(callback_pkt4_.get() == rel.get());
// Check if all expected parameters were really received
vector<string> expected_argument_names;
expected_argument_names.push_back("query4");
expected_argument_names.push_back("lease4");
sort(callback_argument_names_.begin(), callback_argument_names_.end());
sort(expected_argument_names.begin(), expected_argument_names.end());
EXPECT_TRUE(callback_argument_names_ == expected_argument_names);
}
// This test verifies that skip flag returned by a callout installed on the
// lease4_release hook point will keep the lease
TEST_F(HooksDhcpv4SrvTest, skip_lease4_release) {
const IOAddress addr("192.0.2.106");
const uint32_t temp_t1 = 50;
const uint32_t temp_t2 = 75;
const uint32_t temp_valid = 100;
const time_t temp_timestamp = time(NULL) - 10;
// Install a callout
EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout(
"lease4_release", skip_callout));
// Generate client-id also duid_
OptionPtr clientid = generateClientId();
// Check that the address we are about to use is indeed in pool
ASSERT_TRUE(subnet_->inPool(addr));
// Let's create a lease and put it in the LeaseMgr
uint8_t mac_addr[] = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
HWAddrPtr hw(new HWAddr(mac_addr, sizeof(mac_addr), HTYPE_ETHER));
Lease4Ptr used(new Lease4(addr, mac_addr, sizeof(mac_addr),
&client_id_->getDuid()[0], client_id_->getDuid().size(),
temp_valid, temp_t1, temp_t2, temp_timestamp,
subnet_->getID()));
ASSERT_TRUE(LeaseMgrFactory::instance().addLease(used));
// Check that the lease is really in the database
Lease4Ptr l = LeaseMgrFactory::instance().getLease4(addr);
ASSERT_TRUE(l);
// Let's create a RELEASE
// Generate client-id also duid_
Pkt4Ptr rel = Pkt4Ptr(new Pkt4(DHCPRELEASE, 1234));
rel->setRemoteAddr(addr);
rel->setYiaddr(addr);
rel->addOption(clientid);
rel->addOption(srv_->getServerID());
rel->setHWAddr(hw);
// Pass it to the server and hope for a REPLY
// Note: this is no response to RELEASE in DHCPv4
EXPECT_NO_THROW(srv_->processRelease(rel));
// The lease should be still there
l = LeaseMgrFactory::instance().getLease4(addr);
EXPECT_TRUE(l);
// Try by client-id/subnet-id
l = LeaseMgrFactory::instance().getLease4(*client_id_, subnet_->getID());
EXPECT_TRUE(l);
// Try to get the lease by hardware address
// @todo: Uncomment this once trac2592 is implemented
// Lease4Collection leases = LeaseMgrFactory::instance().getLease4(hw->hwaddr_);
// EXPECT_EQ(leases.size(), 1);
// Try by client-id
// @todo: Uncomment this once trac2592 is implemented
//Lease4Collection leases = LeaseMgrFactory::instance().getLease4(*client_id_);
//EXPECT_EQ(leases.size(), 1);
}
} // end of anonymous namespace
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment