rib: change FIB mocking mechanism

Previously, RIB test suites mock FIB updates by invoking RibManager
or Rib's private methods from a callback. In this commit, Rib class
exposes a `mockFibResponse` function variable, so that test cases
can directly specify FibUpdater's response without needing to invoke
private methods. This further allows replacing these private methods
with lambdas.

Also, logic for beginning RibUpdateBatch is abstracted out of control
command handlers, in preparation for PrefixAnnouncement-based RIB
update functions.

refs #4683

Change-Id: I0c95d8daa1458c704c7352a7809e6bed69134642
diff --git a/rib/rib-manager.hpp b/rib/rib-manager.hpp
index 6ef6d6b..169c9ec 100644
--- a/rib/rib-manager.hpp
+++ b/rib/rib-manager.hpp
@@ -87,28 +87,56 @@
   void
   enableLocalFields();
 
-PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+private: // RIB and FibUpdater actions
+  enum class RibUpdateResult
+  {
+    OK,
+    ERROR,
+    EXPIRED,
+  };
+
+  /** \brief Start adding a route to RIB and FIB.
+   *  \param name route name
+   *  \param route route parameters; may contain absolute expiration time
+   *  \param expires relative expiration time; if specified, overwrites \c route.expires
+   *  \param done completion callback
+   */
   void
-  onRibUpdateSuccess(const RibUpdate& update);
+  beginAddRoute(const Name& name, Route route, optional<time::nanoseconds> expires,
+                const std::function<void(RibUpdateResult)>& done);
+
+  /** \brief Start removing a route from RIB and FIB.
+   *  \param name route name
+   *  \param route route parameters
+   *  \param done completion callback
+   */
+  void
+  beginRemoveRoute(const Name& name, const Route& route,
+                   const std::function<void(RibUpdateResult)>& done);
 
   void
-  onRibUpdateFailure(const RibUpdate& update, uint32_t code, const std::string& error);
+  beginRibUpdate(const RibUpdate& update, const std::function<void(RibUpdateResult)>& done);
 
-private: // initialization helpers
+private: // management Dispatcher related
   void
   registerTopPrefix(const Name& topPrefix);
 
-private: // ControlCommand and StatusDataset
+  /** \brief Serve rib/register command.
+   */
   void
   registerEntry(const Name& topPrefix, const Interest& interest,
                 ControlParameters parameters,
                 const ndn::mgmt::CommandContinuation& done);
 
+  /** \brief Serve rib/unregister command.
+   */
   void
   unregisterEntry(const Name& topPrefix, const Interest& interest,
                   ControlParameters parameters,
                   const ndn::mgmt::CommandContinuation& done);
 
+  /** \brief Serve rib/list dataset.
+   */
   void
   listEntries(const Name& topPrefix, const Interest& interest,
               ndn::mgmt::StatusDatasetContext& context);
@@ -150,19 +178,6 @@
   onNotification(const ndn::nfd::FaceEventNotification& notification);
 
 private:
-  void
-  onCommandPrefixAddNextHopSuccess(const Name& prefix, const ControlParameters& result);
-
-  void
-  onCommandPrefixAddNextHopError(const Name& name, const ControlResponse& response);
-
-  void
-  onEnableLocalFieldsSuccess();
-
-  void
-  onEnableLocalFieldsError(const ControlResponse& response);
-
-private:
   Rib& m_rib;
   ndn::nfd::Controller& m_nfdController;
   Dispatcher& m_dispatcher;