face+mgmt: allow congestion marking parameters to be enabled and set

refs #4465

Change-Id: I9d49135ab32bacb2885b70031c573f7c8709ac1f
diff --git a/tests/daemon/mgmt/face-manager-update-face.t.cpp b/tests/daemon/mgmt/face-manager-update-face.t.cpp
index 9a6825e..dd34fd8 100644
--- a/tests/daemon/mgmt/face-manager-update-face.t.cpp
+++ b/tests/daemon/mgmt/face-manager-update-face.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017,  Regents of the University of California,
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -32,6 +32,8 @@
 
 #include <thread>
 
+#include <boost/logic/tribool.hpp>
+
 namespace nfd {
 namespace tests {
 
@@ -54,15 +56,31 @@
   void
   createFace(const std::string& uri = "tcp4://127.0.0.1:26363",
              ndn::nfd::FacePersistency persistency = ndn::nfd::FACE_PERSISTENCY_PERSISTENT,
+             ndn::optional<time::nanoseconds> baseCongestionMarkingInterval = {},
+             ndn::optional<uint64_t> defaultCongestionThreshold = {},
              bool enableLocalFields = false,
-             bool enableReliability = false)
+             bool enableReliability = false,
+             boost::logic::tribool enableCongestionMarking = boost::logic::indeterminate)
   {
     ControlParameters params;
     params.setUri(uri);
     params.setFacePersistency(persistency);
+
+    if (baseCongestionMarkingInterval) {
+      params.setBaseCongestionMarkingInterval(*baseCongestionMarkingInterval);
+    }
+
+    if (defaultCongestionThreshold) {
+      params.setDefaultCongestionThreshold(*defaultCongestionThreshold);
+    }
+
     params.setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, enableLocalFields);
     params.setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, enableReliability);
 
+    if (!boost::logic::indeterminate(enableCongestionMarking)) {
+      params.setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, enableCongestionMarking);
+    }
+
     createFace(params);
   }
 
@@ -474,7 +492,8 @@
   typedef typename T::first TestType;
   typedef typename T::second ResultType;
 
-  createFace(TestType().getUri(), TestType().getPersistency(), TestType().getInitLocalFieldsEnabled());
+  createFace(TestType().getUri(), TestType().getPersistency(), {}, {},
+             TestType().getInitLocalFieldsEnabled());
 
   ControlParameters requestParams;
   requestParams.setFaceId(faceId);
@@ -601,6 +620,71 @@
   });
 }
 
+BOOST_AUTO_TEST_CASE(UpdateCongestionMarkingEnableDisable)
+{
+  createFace("udp4://127.0.0.1:26363");
+
+  ControlParameters enableParams;
+  enableParams.setFaceId(faceId);
+  enableParams.setBaseCongestionMarkingInterval(time::milliseconds(50));
+  enableParams.setDefaultCongestionThreshold(10000);
+  enableParams.setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true);
+
+  ControlParameters disableParams;
+  disableParams.setFaceId(faceId);
+  disableParams.setBaseCongestionMarkingInterval(time::milliseconds(70));
+  disableParams.setDefaultCongestionThreshold(5000);
+  disableParams.setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, false);
+
+  updateFace(enableParams, false, [] (const ControlResponse& actual) {
+    ControlResponse expected(200, "OK");
+    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
+    BOOST_TEST_MESSAGE(actual.getText());
+
+    if (actual.getBody().hasWire()) {
+      ControlParameters actualParams(actual.getBody());
+
+      BOOST_CHECK(actualParams.hasFaceId());
+      BOOST_CHECK(actualParams.hasFacePersistency());
+      // Check that congestion marking parameters changed
+      BOOST_REQUIRE(actualParams.hasBaseCongestionMarkingInterval());
+      BOOST_CHECK_EQUAL(actualParams.getBaseCongestionMarkingInterval(), time::milliseconds(50));
+      BOOST_REQUIRE(actualParams.hasDefaultCongestionThreshold());
+      BOOST_CHECK_EQUAL(actualParams.getDefaultCongestionThreshold(), 10000);
+      BOOST_REQUIRE(actualParams.hasFlags());
+      // Check if flags indicate congestion marking enabled
+      BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+    }
+    else {
+      BOOST_ERROR("Enable: Response does not contain ControlParameters");
+    }
+  });
+
+  updateFace(disableParams, false, [] (const ControlResponse& actual) {
+    ControlResponse expected(200, "OK");
+    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
+    BOOST_TEST_MESSAGE(actual.getText());
+
+    if (actual.getBody().hasWire()) {
+      ControlParameters actualParams(actual.getBody());
+
+      BOOST_CHECK(actualParams.hasFaceId());
+      BOOST_CHECK(actualParams.hasFacePersistency());
+      // Check that congestion marking parameters changed, even though feature disabled
+      BOOST_REQUIRE(actualParams.hasBaseCongestionMarkingInterval());
+      BOOST_CHECK_EQUAL(actualParams.getBaseCongestionMarkingInterval(), time::milliseconds(70));
+      BOOST_REQUIRE(actualParams.hasDefaultCongestionThreshold());
+      BOOST_CHECK_EQUAL(actualParams.getDefaultCongestionThreshold(), 5000);
+      BOOST_REQUIRE(actualParams.hasFlags());
+      // Check if flags indicate marking disabled
+      BOOST_CHECK(!actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+    }
+    else {
+      BOOST_ERROR("Disable: Response does not contain ControlParameters");
+    }
+  });
+}
+
 BOOST_AUTO_TEST_CASE(SelfUpdating)
 {
   createFace();