tools: implement 'nfdc cs erase' command

refs #4318

Change-Id: If4dc401a3efff44a5bf4b3074d21797f8384cf9f
diff --git a/tests/tools/nfdc/cs-module.t.cpp b/tests/tools/nfdc/cs-module.t.cpp
index 33d846a..d96f5f6 100644
--- a/tests/tools/nfdc/cs-module.t.cpp
+++ b/tests/tools/nfdc/cs-module.t.cpp
@@ -93,6 +93,83 @@
 
 BOOST_AUTO_TEST_SUITE_END() // ConfigCommand
 
+BOOST_FIXTURE_TEST_SUITE(EraseCommand, ExecuteCommandFixture)
+
+BOOST_AUTO_TEST_CASE(NoCount)
+{
+  this->processInterest = [this] (const Interest& interest) {
+    ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/cs/erase");
+    BOOST_REQUIRE(req.hasName());
+    BOOST_CHECK_EQUAL(req.getName(), "/S2NrUoNJcQ");
+    BOOST_CHECK(!req.hasCount());
+
+    ControlParameters resp;
+    resp.setName("/S2NrUoNJcQ");
+    resp.setCount(152);
+    this->succeedCommand(interest, resp);
+  };
+
+  this->execute("cs erase /S2NrUoNJcQ");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal("cs-erased prefix=/S2NrUoNJcQ count=152 has-more=no\n"));
+  BOOST_CHECK(err.is_empty());
+}
+
+BOOST_AUTO_TEST_CASE(WithCount)
+{
+  this->processInterest = [this] (const Interest& interest) {
+    ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/cs/erase");
+    BOOST_REQUIRE(req.hasName());
+    BOOST_CHECK_EQUAL(req.getName(), "/gr7ADmIq");
+    BOOST_REQUIRE(req.hasCount());
+    BOOST_CHECK_EQUAL(req.getCount(), 7568);
+
+    ControlParameters resp;
+    resp.setName("/gr7ADmIq");
+    resp.setCount(141);
+    this->succeedCommand(interest, resp);
+  };
+
+  this->execute("cs erase /gr7ADmIq count 7568");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal("cs-erased prefix=/gr7ADmIq count=141 has-more=no\n"));
+  BOOST_CHECK(err.is_empty());
+}
+
+BOOST_AUTO_TEST_CASE(HasMore)
+{
+  this->processInterest = [this] (const Interest& interest) {
+    ControlParameters req = MOCK_NFD_MGMT_REQUIRE_COMMAND_IS("/localhost/nfd/cs/erase");
+    BOOST_REQUIRE(req.hasName());
+    BOOST_CHECK_EQUAL(req.getName(), "/8Rq1Merv");
+    BOOST_REQUIRE(req.hasCount());
+    BOOST_CHECK_EQUAL(req.getCount(), 16519);
+
+    ControlParameters resp;
+    resp.setName("/8Rq1Merv");
+    resp.setCount(256);
+    resp.setCapacity(256);
+    this->succeedCommand(interest, resp);
+  };
+
+  this->execute("cs erase /8Rq1Merv count 16519");
+  BOOST_CHECK_EQUAL(exitCode, 0);
+  BOOST_CHECK(out.is_equal("cs-erased prefix=/8Rq1Merv count=256 has-more=yes\n"));
+  BOOST_CHECK(err.is_empty());
+}
+
+BOOST_AUTO_TEST_CASE(ErrorCommand)
+{
+  this->processInterest = nullptr; // no response to command
+
+  this->execute("cs erase /8Rq1Merv count 16519");
+  BOOST_CHECK_EQUAL(exitCode, 1);
+  BOOST_CHECK(out.is_empty());
+  BOOST_CHECK(err.is_equal("Error 10060 when erasing cached Data: request timed out\n"));
+}
+
+BOOST_AUTO_TEST_SUITE_END() // EraseCommand
+
 const std::string STATUS_XML = stripXmlSpaces(R"XML(
   <cs>
     <capacity>31807</capacity>