management: Controller accepts CommandOptions

refs #2039

The following are deprecated:

* Controller::start overloads, except the overload taking CommandOptions
* Controller::Sign typedef
* Controller::getDefaultCommandTimeout
* ControlCommand::getPrefix
* ControlCommand::getRequestName(ControlParameters)

Change-Id: I8c405498597bdca115b71eec87acf23d28a266b1
diff --git a/tests/unit-tests/management/test-nfd-control-command.cpp b/tests/unit-tests/management/test-nfd-control-command.cpp
index 045cd68..a0ea8c1 100644
--- a/tests/unit-tests/management/test-nfd-control-command.cpp
+++ b/tests/unit-tests/management/test-nfd-control-command.cpp
@@ -31,7 +31,6 @@
 BOOST_AUTO_TEST_CASE(FaceCreate)
 {
   FaceCreateCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/faces/create");
 
   ControlParameters p1;
   p1.setUri("tcp4://192.0.2.1")
@@ -48,12 +47,17 @@
   p3.setUri("tcp4://192.0.2.1")
     .setFaceId(0);
   BOOST_CHECK_THROW(command.validateResponse(p3), ControlCommand::ArgumentError);
+
+  ControlParameters p4;
+  p4.setUri("tcp4://192.0.2.1:6363");
+  Name n4;
+  BOOST_CHECK_NO_THROW(n4 = command.getRequestName("/PREFIX", p4));
+  BOOST_CHECK(Name("ndn:/PREFIX/faces/create").isPrefixOf(n4));
 }
 
 BOOST_AUTO_TEST_CASE(FaceDestroy)
 {
   FaceDestroyCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/faces/destroy");
 
   ControlParameters p1;
   p1.setUri("tcp4://192.0.2.1")
@@ -70,17 +74,22 @@
   p3.setFaceId(6);
   BOOST_CHECK_NO_THROW(command.validateRequest(p3));
   BOOST_CHECK_NO_THROW(command.validateResponse(p3));
+  Name n3;
+  BOOST_CHECK_NO_THROW(n3 = command.getRequestName("/PREFIX", p3));
+  BOOST_CHECK(Name("ndn:/PREFIX/faces/destroy").isPrefixOf(n3));
 }
 
 BOOST_AUTO_TEST_CASE(FaceEnableLocalControl)
 {
   FaceEnableLocalControlCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/faces/enable-local-control");
 
   ControlParameters p1;
   p1.setLocalControlFeature(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID);
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_NO_THROW(command.validateResponse(p1));
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/faces/enable-local-control").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setLocalControlFeature(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID)
@@ -97,12 +106,14 @@
 BOOST_AUTO_TEST_CASE(FaceDisableLocalControl)
 {
   FaceDisableLocalControlCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/faces/disable-local-control");
 
   ControlParameters p1;
   p1.setLocalControlFeature(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID);
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_NO_THROW(command.validateResponse(p1));
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/faces/disable-local-control").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setLocalControlFeature(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID)
@@ -119,13 +130,15 @@
 BOOST_AUTO_TEST_CASE(FibAddNextHop)
 {
   FibAddNextHopCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/fib/add-nexthop");
 
   ControlParameters p1;
   p1.setName("ndn:/")
     .setFaceId(22);
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_THROW(command.validateResponse(p1), ControlCommand::ArgumentError);
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/fib/add-nexthop").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setName("ndn:/example")
@@ -148,13 +161,15 @@
 BOOST_AUTO_TEST_CASE(FibRemoveNextHop)
 {
   FibRemoveNextHopCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/fib/remove-nexthop");
 
   ControlParameters p1;
   p1.setName("ndn:/")
     .setFaceId(22);
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_NO_THROW(command.validateResponse(p1));
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/fib/remove-nexthop").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setName("ndn:/example")
@@ -172,13 +187,15 @@
 BOOST_AUTO_TEST_CASE(StrategyChoiceSet)
 {
   StrategyChoiceSetCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/strategy-choice/set");
 
   ControlParameters p1;
   p1.setName("ndn:/")
     .setStrategy("ndn:/strategy/P");
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_NO_THROW(command.validateResponse(p1));
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/strategy-choice/set").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setName("ndn:/example");
@@ -189,12 +206,14 @@
 BOOST_AUTO_TEST_CASE(StrategyChoiceUnset)
 {
   StrategyChoiceUnsetCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/strategy-choice/unset");
 
   ControlParameters p1;
   p1.setName("ndn:/example");
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_NO_THROW(command.validateResponse(p1));
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/strategy-choice/unset").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setName("ndn:/example")
@@ -211,12 +230,14 @@
 BOOST_AUTO_TEST_CASE(RibRegister)
 {
   RibRegisterCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/rib/register");
 
   ControlParameters p1;
   p1.setName("ndn:/");
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_THROW(command.validateResponse(p1), ControlCommand::ArgumentError);
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/rib/register").isPrefixOf(n1));
 
   command.applyDefaultsToRequest(p1);
   BOOST_REQUIRE(p1.hasOrigin());
@@ -240,7 +261,6 @@
 BOOST_AUTO_TEST_CASE(RibUnregister)
 {
   RibUnregisterCommand command;
-  BOOST_CHECK_EQUAL(command.getPrefix(), "ndn:/localhost/nfd/rib/unregister");
 
   ControlParameters p1;
   p1.setName("ndn:/")
@@ -248,6 +268,9 @@
     .setOrigin(ROUTE_ORIGIN_STATIC);
   BOOST_CHECK_NO_THROW(command.validateRequest(p1));
   BOOST_CHECK_NO_THROW(command.validateResponse(p1));
+  Name n1;
+  BOOST_CHECK_NO_THROW(n1 = command.getRequestName("/PREFIX", p1));
+  BOOST_CHECK(Name("ndn:/PREFIX/rib/unregister").isPrefixOf(n1));
 
   ControlParameters p2;
   p2.setName("ndn:/example")
diff --git a/tests/unit-tests/management/test-nfd-controller.cpp b/tests/unit-tests/management/test-nfd-controller.cpp
index 2ec9285..478fdaa 100644
--- a/tests/unit-tests/management/test-nfd-controller.cpp
+++ b/tests/unit-tests/management/test-nfd-controller.cpp
@@ -76,7 +76,7 @@
 BOOST_FIXTURE_TEST_CASE(CommandSuccess, CommandFixture)
 {
   ControlParameters parameters;
-  parameters.setUri("tcp://example.com");
+  parameters.setUri("tcp4://192.0.2.1:6363");
 
   BOOST_CHECK_NO_THROW(controller.start<FaceCreateCommand>(
                        parameters,
@@ -88,8 +88,8 @@
   const Interest& requestInterest = face->m_sentInterests[0];
 
   FaceCreateCommand command;
-  BOOST_CHECK(command.getPrefix().isPrefixOf(requestInterest.getName()));
-  // 9 components: ndn:/localhost/nfd/face/create/<parameters>/<signed Interest x4>
+  BOOST_CHECK(Name("/localhost/nfd/faces/create").isPrefixOf(requestInterest.getName()));
+  // 9 components: ndn:/localhost/nfd/faces/create/<parameters>/<signed Interest x4>
   BOOST_REQUIRE_EQUAL(requestInterest.getName().size(), 9);
   ControlParameters request;
   // 4th component: <parameters>
@@ -133,7 +133,7 @@
 BOOST_FIXTURE_TEST_CASE(CommandErrorCode, CommandFixture)
 {
   ControlParameters parameters;
-  parameters.setUri("tcp://example.com");
+  parameters.setUri("tcp4://192.0.2.1:6363");
 
   BOOST_CHECK_NO_THROW(controller.start<FaceCreateCommand>(
                          parameters,
@@ -160,7 +160,7 @@
 BOOST_FIXTURE_TEST_CASE(CommandInvalidResponse, CommandFixture)
 {
   ControlParameters parameters;
-  parameters.setUri("tcp://example.com");
+  parameters.setUri("tcp4://192.0.2.1:6363");
 
   BOOST_CHECK_NO_THROW(controller.start<FaceCreateCommand>(
                          parameters,
@@ -188,6 +188,49 @@
   BOOST_REQUIRE_EQUAL(commandFailHistory.size(), 1);
 }
 
+BOOST_FIXTURE_TEST_CASE(OptionsPrefix, CommandFixture)
+{
+  ControlParameters parameters;
+  parameters.setName("/ndn/com/example");
+  parameters.setFaceId(400);
+
+  CommandOptions options;
+  options.setPrefix("/localhop/net/example/router1/nfd");
+
+  BOOST_CHECK_NO_THROW(controller.start<RibRegisterCommand>(
+                       parameters,
+                       commandSucceedCallback,
+                       commandFailCallback,
+                       options));
+  face->processEvents(time::milliseconds(1));
+
+  BOOST_REQUIRE_EQUAL(face->m_sentInterests.size(), 1);
+  const Interest& requestInterest = face->m_sentInterests[0];
+
+  FaceCreateCommand command;
+  BOOST_CHECK(Name("/localhop/net/example/router1/nfd/rib/register").isPrefixOf(
+              requestInterest.getName()));
+}
+
+BOOST_FIXTURE_TEST_CASE(OptionsTimeout, CommandFixture)
+{
+  ControlParameters parameters;
+  parameters.setUri("tcp4://192.0.2.1:6363");
+
+  CommandOptions options;
+  options.setTimeout(time::milliseconds(50));
+
+  BOOST_CHECK_NO_THROW(controller.start<FaceCreateCommand>(
+                       parameters,
+                       commandSucceedCallback,
+                       commandFailCallback,
+                       options));
+  face->processEvents(time::milliseconds(300));
+
+  BOOST_REQUIRE_EQUAL(commandFailHistory.size(), 1);
+  BOOST_CHECK_EQUAL(commandFailHistory[0].get<0>(), Controller::ERROR_TIMEOUT);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests