Commit fbce7dd4 authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[3671] Added unit test for loading v6 leases from multiple files.

Also, prevented opening the optional lease files if they don't exist.
parent f4201692
......@@ -491,10 +491,16 @@ loadLeasesFromFiles(const std::string& filename,
s << "." << i;
}
lease_file.reset(new LeaseFileType(s.str()));
// If the file doesn't exist it will be created as an empty
// file (with no leases).
lease_file->open();
LeaseFileLoader::load<LeaseObjectType>(*lease_file, storage,
MAX_LEASE_ERRORS);
// Don't open the file if it doesn't exist and it is not the
// primary lease file - not ending with .1 or .2. Those files
// are optional and we don't want to create them if they don't
// exist.
if (i == 0 || lease_file->exists()) {
// If the file doesn't exist it will be created as an empty
// file (with no leases).
lease_file->open();
LeaseFileLoader::load<LeaseObjectType>(*lease_file, storage,
MAX_LEASE_ERRORS);
}
}
}
......@@ -481,8 +481,9 @@ TEST_F(MemfileLeaseMgrTest, versionCheck) {
LeaseMgrFactory::destroy();
}
// This test checks that the backend reads lease data from multiple files.
TEST_F(MemfileLeaseMgrTest, loadMultipleLeaseFiles) {
// This test checks that the backend reads DHCPv4 lease data from multiple
// files.
TEST_F(MemfileLeaseMgrTest, load4MultipleLeaseFiles) {
LeaseFileIO io2("leasefile4_0.csv.2");
io2.writeFile("address,hwaddr,client_id,valid_lifetime,expire,subnet_id,"
"fqdn_fwd,fqdn_rev,hostname\n"
......@@ -504,25 +505,99 @@ TEST_F(MemfileLeaseMgrTest, loadMultipleLeaseFiles) {
startBackend(V4);
// This lease only exists in the second file and the cltt should
// be 0.
Lease4Ptr lease = lmptr_->getLease4(IOAddress("192.0.2.1"));
ASSERT_TRUE(lease);
EXPECT_EQ(0, lease->cltt_);
// This lease only exists in the first file and the cltt should
// be 0.
lease = lmptr_->getLease4(IOAddress("192.0.2.2"));
ASSERT_TRUE(lease);
EXPECT_EQ(0, lease->cltt_);
// This lease only exists in the third file and the cltt should
// be 0.
lease = lmptr_->getLease4(IOAddress("192.0.2.10"));
ASSERT_TRUE(lease);
EXPECT_EQ(0, lease->cltt_);
// This lease exists in the first and second file and the cltt
// should be calculated using the expiration time and the
// valid lifetime from the second file.
lease = lmptr_->getLease4(IOAddress("192.0.2.11"));
ASSERT_TRUE(lease);
EXPECT_EQ(200, lease->cltt_);
// Thsi lease exists in the second and third file and the cltt
// should be calculated using the expiration time and the
// valid lifetime from the third file.
lease = lmptr_->getLease4(IOAddress("192.0.2.12"));
ASSERT_TRUE(lease);
EXPECT_EQ(200, lease->cltt_);
}
// This test checks that the backend reads DHCPv6 lease data from multiple
// files.
TEST_F(MemfileLeaseMgrTest, load6MultipleLeaseFiles) {
LeaseFileIO io2("leasefile6_0.csv.2");
io2.writeFile("address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,"
"lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,hwaddr\n"
"2001:db8:1::1,01:01:01:01:01:01:01:01:01:01:01:01:01,"
"200,200,8,100,0,7,0,1,1,,\n"
"2001:db8:1::2,02:02:02:02:02:02:02:02:02:02:02:02:02,"
"200,200,8,100,0,7,0,1,1,,\n");
LeaseFileIO io1("leasefile6_0.csv.1");
io1.writeFile("address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,"
"lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,hwaddr\n"
"2001:db8:1::3,03:03:03:03:03:03:03:03:03:03:03:03:03,"
"200,200,8,100,0,7,0,1,1,,\n"
"2001:db8:1::2,02:02:02:02:02:02:02:02:02:02:02:02:02,"
"300,800,8,100,0,7,0,1,1,,\n"
"2001:db8:1::4,04:04:04:04:04:04:04:04:04:04:04:04:04,"
"200,200,8,100,0,7,0,1,1,,\n");
LeaseFileIO io("leasefile6_0.csv");
io.writeFile("address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,"
"lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,hwaddr\n"
"2001:db8:1::4,04:04:04:04:04:04:04:04:04:04:04:04:04,"
"400,1000,8,100,0,7,0,1,1,,\n"
"2001:db8:1::5,05:05:05:05:05:05:05:05:05:05:05:05:05,"
"200,200,8,100,0,7,0,1,1,,\n");
startBackend(V6);
// This lease only exists in the first file and the cltt should be 0.
Lease6Ptr lease = lmptr_->getLease6(Lease::TYPE_NA,
IOAddress("2001:db8:1::1"));
ASSERT_TRUE(lease);
EXPECT_EQ(0, lease->cltt_);
// This lease exists in the first and second file and the cltt should
// be calculated using the expiration time and the valid lifetime
// from the second file.
lease = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2"));
ASSERT_TRUE(lease);
EXPECT_EQ(500, lease->cltt_);
// This lease only exists in the second file and the cltt should be 0.
lease = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
ASSERT_TRUE(lease);
EXPECT_EQ(0, lease->cltt_);
// This lease exists in the second and third file and the cltt should
// be calculated using the expiration time and the valid lifetime
// from the third file.
lease = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::4"));
ASSERT_TRUE(lease);
EXPECT_EQ(600, lease->cltt_);
// This lease only exists in the third file and the cltt should be 0.
lease = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::5"));
ASSERT_TRUE(lease);
EXPECT_EQ(0, lease->cltt_);
}
}; // end of anonymous namespace
// Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
......@@ -97,6 +97,17 @@ CSVFile::close() {
}
}
bool
CSVFile::exists() const {
std::ifstream fs(filename_);
if (fs.good()) {
fs.close();
return (true);
}
fs.close();
return (false);
}
void
CSVFile::flush() const {
checkStreamStatusAndReset("flush");
......
// Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
......@@ -320,6 +320,14 @@ public:
/// @brief Closes the CSV file.
void close();
/// @brief Checks if the CSV file exists.
///
/// This method doesn't check if the existing file has a correct file
/// format.
///
/// @return true if file exists, false otherwise.
bool exists() const;
/// @brief Flushes a file.
void flush() const;
......
// Copyright (C) 2014 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
......@@ -454,5 +454,29 @@ TEST_F(CSVFileTest, validateHeader) {
EXPECT_THROW(csv->open(), CSVFileError);
}
// This test checks that the exists method of the CSVFile class properly
// checks that the file exists.
TEST_F(CSVFileTest, exists) {
// Create a new CSV file that contains a header and two data rows.
writeFile("animal,age,color\n"
"cat,10,white\n"
"lion,15,yellow\n");
boost::scoped_ptr<CSVFile> csv(new CSVFile(testfile_));
// The CSVFile class should return true even if the file hasn't been
// opened.
EXPECT_TRUE(csv->exists());
// Now open the file and make sure it still returns true.
ASSERT_NO_THROW(csv->open());
EXPECT_TRUE(csv->exists());
// Close the file and remove it.
csv->close();
removeFile();
// The file should not exist.
EXPECT_FALSE(csv->exists());
}
} // 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