tests: Improving ManagementTool test suite and fixing discovered bugs
Change-Id: I1c7e51cf105544325657825474f9ee85d61396ed
Refs: #2226
diff --git a/src/mgmt/management-tool.cpp b/src/mgmt/management-tool.cpp
index 619d1c0..10e8aae 100644
--- a/src/mgmt/management-tool.cpp
+++ b/src/mgmt/management-tool.cpp
@@ -28,6 +28,7 @@
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/algorithm/string/replace.hpp>
+#include <boost/lexical_cast.hpp>
#include <ndn-cxx/util/io.hpp>
#include <ndn-cxx/util/regex.hpp>
@@ -39,8 +40,9 @@
NDNS_LOG_INIT("ManagementTool");
-ManagementTool::ManagementTool(const std::string& dbFile)
- : m_dbMgr(dbFile)
+ManagementTool::ManagementTool(const std::string& dbFile, KeyChain& keyChain)
+ : m_keyChain(keyChain)
+ , m_dbMgr(dbFile)
{
}
@@ -48,7 +50,7 @@
ManagementTool::createZone(const Name &zoneName,
const Name& parentZoneName,
const time::seconds& cacheTtl,
- const time::seconds& certTtl,
+ const time::seconds& certValidity,
const Name& kskCertName,
const Name& dskCertName)
{
@@ -87,7 +89,7 @@
//first generate KSK and DSK to the keyChain system, and add DSK as default
NDNS_LOG_INFO("Start generating KSK and DSK and their corresponding certificates");
time::system_clock::TimePoint notBefore = time::system_clock::now();
- time::system_clock::TimePoint notAfter = notBefore + certTtl;
+ time::system_clock::TimePoint notAfter = notBefore + certValidity;
shared_ptr<IdentityCertificate> kskCert;
if (kskCertName == DEFAULT_CERT) {
@@ -95,18 +97,12 @@
Name kskName = m_keyChain.generateRsaKeyPair(zoneName, true);
std::vector<CertificateSubjectDescription> kskDesc;
kskCert = m_keyChain.prepareUnsignedIdentityCertificate(kskName, zoneName, notBefore, notAfter,
- kskDesc);
- //prepare the correct name for the ksk certificate
- Name newScertName = parentZoneName;
- newScertName.append(label::NDNS_CERT_QUERY);
- newScertName.append(zoneName.getSubName(parentZoneName.size()));
- //remove the zone prefix and KEY
- newScertName.append(kskCert->getName().getSubName(zoneName.size()+1));
- kskCert->setName(newScertName);
+ kskDesc, parentZoneName);
+ kskCert->setFreshnessPeriod(cacheTtl);
m_keyChain.selfSign(*kskCert);
m_keyChain.addCertificate(*kskCert);
- NDNS_LOG_INFO("Generated KSK: " << kskCert->getName().toUri());
+ NDNS_LOG_INFO("Generated KSK: " << kskCert->getName());
}
else {
kskCert = m_keyChain.getCertificate(kskCertName);
@@ -119,10 +115,11 @@
//create DSK's certificate
std::vector<CertificateSubjectDescription> dskDesc;
dskCert = m_keyChain.prepareUnsignedIdentityCertificate(dskName, zoneName, notBefore, notAfter,
- dskDesc);
+ dskDesc, zoneName);
+ dskCert->setFreshnessPeriod(cacheTtl);
m_keyChain.sign(*dskCert, kskCert->getName());
m_keyChain.addCertificateAsKeyDefault(*dskCert);
- NDNS_LOG_INFO("Generated DSK: " << dskCert->getName().toUri());
+ NDNS_LOG_INFO("Generated DSK: " << dskCert->getName());
}
else {
dskCert = m_keyChain.getCertificate(dskCertName);
@@ -157,9 +154,6 @@
//second remove zone from local ndns database
removeZone(zone);
-
- //third remove identity
- m_keyChain.deleteIdentity(zoneName);
}
void
@@ -249,14 +243,15 @@
}
}
+ time::seconds actualTtl = ttl;
+ if (ttl == DEFAULT_RR_TTL)
+ actualTtl = zone.getTtl();
+
// set rrset
Rrset rrset(&zone);
rrset.setLabel(label);
rrset.setType(type);
- if (ttl == DEFAULT_RR_TTL)
- rrset.setTtl(zone.getTtl());
- else
- rrset.setTtl(ttl);
+ rrset.setTtl(actualTtl);
// set response
Response re;
@@ -265,6 +260,7 @@
re.setRrLabel(label);
re.setRrType(type);
re.setNdnsType(ndnsType);
+ re.setFreshnessPeriod(actualTtl);
//set content according to ndns type
if (ndnsType == NDNS_RAW) {
@@ -282,21 +278,21 @@
}
}
- shared_ptr<Data> data = re.toData();
if (version != VERSION_USE_UNIX_TIMESTAMP) {
name::Component tmp = name::Component::fromVersion(version);
re.setVersion(tmp);
}
+ shared_ptr<Data> data = re.toData();
m_keyChain.sign(*data, dskCertName);
rrset.setVersion(re.getVersion());
rrset.setData(data->wireEncode());
if (m_dbMgr.find(rrset)) {
- throw Error("Rrset with label=" + label.toUri() + " is already in local NDNS databse");
+ throw Error("Duplicate " + boost::lexical_cast<std::string>(rrset));
}
- NDNS_LOG_INFO("Add rrset with zone-id: " << zone.getId() << " label: " << label << " type: "
- << type);
+ NDNS_LOG_INFO("Added " << rrset);
+
m_dbMgr.insert(rrset);
}
@@ -389,19 +385,18 @@
rrset.setData(data->wireEncode());
if (m_dbMgr.find(rrset)) {
- throw Error("Rrset with label=" + label.toUri() + " is already in local NDNS databse");
+ throw Error("Duplicate " + boost::lexical_cast<std::string>(rrset));
}
- NDNS_LOG_INFO("Add rrset with zone-id: " << zone.getId() << " label: " << label << " type: "
- << type);
+ NDNS_LOG_INFO("Added " << rrset);
m_dbMgr.insert(rrset);
}
void
-ManagementTool::listZone(const Name& zoneName, std::ostream& os, const bool printRaw) {
+ManagementTool::listZone(const Name& zoneName, std::ostream& os, const bool printRaw)
+{
Zone zone(zoneName);
if (!m_dbMgr.find(zone)) {
- os << "No record is found" << std::endl;
- return;
+ throw Error("Zone " + zoneName.toUri() + " is not found in the database");
}
//first output the zone name
@@ -500,9 +495,8 @@
os << "; " << token << std::endl;
content.erase(0, pos + delimiter.length());
}
-
- os << std::endl;
}
+ os << std::endl;
}
else {
os << std::endl;
diff --git a/src/mgmt/management-tool.hpp b/src/mgmt/management-tool.hpp
index f962b11..54a1407 100644
--- a/src/mgmt/management-tool.hpp
+++ b/src/mgmt/management-tool.hpp
@@ -65,8 +65,7 @@
/** @param certDir Path to the directory to store certificates
* @param dbFile Path to the local database
*/
- explicit
- ManagementTool(const std::string& dbFile);
+ ManagementTool(const std::string& dbFile, KeyChain& keyChain);
/** @brief Create a Zone according to a given name.
*
@@ -88,15 +87,17 @@
*
* @param zoneName zone's name
* @param parentZoneName parent zone's name
- * @param ttl ttl for the created zone
+ * @param cacheTtl default TTL for RR sets in the zone
+ * @param certValidity validity for automatically created DSK certificate (@p dskCertName
+ * should not be empty)
* @param kskCertName if given, a zone will be created with this ksk certificate and its key
- * @param kskCertName if given, a zone will be created with this dsk certificate and its key
+ * @param dskCertName if given, a zone will be created with this dsk certificate and its key
*/
void
createZone(const Name& zoneName,
const Name& parentZoneName,
const time::seconds& cacheTtl = DEFAULT_CACHE_TTL,
- const time::seconds& certTtl = DEFAULT_CERT_TTL,
+ const time::seconds& certValidity = DEFAULT_CERT_TTL,
const Name& kskCertName = DEFAULT_CERT,
const Name& dskCertName = DEFAULT_CERT);
@@ -178,7 +179,7 @@
* @param type rrset's type
* @param os the ostream to print information to
* @param isPP indicate pretty print
- */
+ */
void
getRrSet(const Name& zoneName,
const Name& label,
@@ -191,7 +192,8 @@
* @param zoneName the name of the zone to investigate
* @param os the ostream to print information to
* @param printRaw set to print content of ndns-raw rrset
- */
+ * @throw Error if zoneName does not exist in the database
+ */
void
listZone(const Name& zoneName, std::ostream& os, const bool printRaw = false);
@@ -224,10 +226,11 @@
matchCertificate(const Name& certName, const Name& identity);
private:
- KeyChain m_keyChain;
+ KeyChain& m_keyChain;
DbMgr m_dbMgr;
};
} // namespace ndns
} // namespace ndn
+
#endif // NDNS_MGMT_MANAGEMENT_TOOL_HPP