mgmt: implement cs/erase command
refs #4318
Change-Id: I2c8180cde940cc378a219f9aaecae71cd3b0b28c
diff --git a/tests/daemon/mgmt/cs-manager.t.cpp b/tests/daemon/mgmt/cs-manager.t.cpp
index c5d22f4..18e2cdc 100644
--- a/tests/daemon/mgmt/cs-manager.t.cpp
+++ b/tests/daemon/mgmt/cs-manager.t.cpp
@@ -96,6 +96,106 @@
BOOST_CHECK_EQUAL(m_cs.shouldServe(), false);
}
+BOOST_AUTO_TEST_CASE(Erase)
+{
+ m_cs.setLimit(CsManager::ERASE_LIMIT * 5);
+ m_cs.insert(*makeData("/B/C/1"));
+ m_cs.insert(*makeData("/B/C/2"));
+ m_cs.insert(*makeData("/B/D/3"));
+ m_cs.insert(*makeData("/B/D/4"));
+ for (size_t i = 0; i < CsManager::ERASE_LIMIT - 1; ++i) {
+ m_cs.insert(*makeData(Name("/E").appendSequenceNumber(i)));
+ }
+ for (size_t i = 0; i < CsManager::ERASE_LIMIT; ++i) {
+ m_cs.insert(*makeData(Name("/F").appendSequenceNumber(i)));
+ }
+ for (size_t i = 0; i < CsManager::ERASE_LIMIT + 1; ++i) {
+ m_cs.insert(*makeData(Name("/G").appendSequenceNumber(i)));
+ }
+ for (size_t i = 0; i < CsManager::ERASE_LIMIT + 1; ++i) {
+ m_cs.insert(*makeData(Name("/H").appendSequenceNumber(i)));
+ }
+ const Name cmdPrefix("/localhost/nfd/cs/erase");
+
+ // requested Name matches no Data
+ auto req = makeControlCommandRequest(cmdPrefix,
+ ControlParameters().setName("/A").setCount(1));
+ receiveInterest(req);
+
+ // response should include zero as actual Count
+ ControlParameters body;
+ body.setName("/A");
+ body.setCount(0);
+ BOOST_CHECK_EQUAL(checkResponse(0, req.getName(),
+ ControlResponse(200, "OK").setBody(body.wireEncode())),
+ CheckResponseResult::OK);
+
+ // requested Count is less than erase limit
+ req = makeControlCommandRequest(cmdPrefix,
+ ControlParameters().setName("/B").setCount(3));
+ receiveInterest(req);
+
+ // response should include actual Count and omit Capacity
+ body.setName("/B");
+ body.setCount(3);
+ BOOST_CHECK_EQUAL(checkResponse(1, req.getName(),
+ ControlResponse(200, "OK").setBody(body.wireEncode())),
+ CheckResponseResult::OK);
+
+ // requested Count equals erase limit
+ req = makeControlCommandRequest(cmdPrefix,
+ ControlParameters().setName("/E").setCount(CsManager::ERASE_LIMIT));
+ receiveInterest(req);
+
+ // response should include actual Count and omit Capacity
+ body.setName("/E");
+ body.setCount(CsManager::ERASE_LIMIT - 1);
+ BOOST_CHECK_EQUAL(checkResponse(2, req.getName(),
+ ControlResponse(200, "OK").setBody(body.wireEncode())),
+ CheckResponseResult::OK);
+
+ // requested Count exceeds erase limit, but there are no more Data
+ req = makeControlCommandRequest(cmdPrefix,
+ ControlParameters().setName("/F").setCount(CsManager::ERASE_LIMIT + 1));
+ receiveInterest(req);
+
+ // response should include actual Count and omit Capacity
+ body.setName("/F");
+ body.setCount(CsManager::ERASE_LIMIT);
+ BOOST_CHECK_EQUAL(checkResponse(3, req.getName(),
+ ControlResponse(200, "OK").setBody(body.wireEncode())),
+ CheckResponseResult::OK);
+
+ // requested Count exceeds erase limit, and there are more Data
+ req = makeControlCommandRequest(cmdPrefix,
+ ControlParameters().setName("/G").setCount(CsManager::ERASE_LIMIT + 1));
+ receiveInterest(req);
+
+ // response should include both actual Count and Capacity
+ body.setName("/G");
+ body.setCount(CsManager::ERASE_LIMIT);
+ body.setCapacity(CsManager::ERASE_LIMIT);
+ BOOST_CHECK_EQUAL(checkResponse(4, req.getName(),
+ ControlResponse(200, "OK").setBody(body.wireEncode())),
+ CheckResponseResult::OK);
+
+ // request omit Count, which implies "no limit" aka exceeds erase limit
+ req = makeControlCommandRequest(cmdPrefix,
+ ControlParameters().setName("/H"));
+ receiveInterest(req);
+
+ // response should include both actual Count and Capacity since there are more Data
+ body.setName("/H");
+ body.setCount(CsManager::ERASE_LIMIT);
+ body.setCapacity(CsManager::ERASE_LIMIT);
+ BOOST_CHECK_EQUAL(checkResponse(5, req.getName(),
+ ControlResponse(200, "OK").setBody(body.wireEncode())),
+ CheckResponseResult::OK);
+
+ // one Data each under /A, /G, /H remain, all other Data are erased
+ BOOST_CHECK_EQUAL(m_cs.size(), 3);
+}
+
BOOST_AUTO_TEST_CASE(Info)
{
m_cs.setLimit(2681);