util: split RttEstimator into two classes

Also remove afterMeasurement signal, effectively reverting
commit 4ad933a757836b7f7418359cff5ae87610f39d55

Refs: #4887
Change-Id: I6c9b1620250992e07bed0773ee8f043e8e1e1f04
diff --git a/tests/unit/util/rtt-estimator.t.cpp b/tests/unit/util/rtt-estimator.t.cpp
index 10c2c74..b819c9b 100644
--- a/tests/unit/util/rtt-estimator.t.cpp
+++ b/tests/unit/util/rtt-estimator.t.cpp
@@ -34,9 +34,109 @@
 BOOST_AUTO_TEST_SUITE(Util)
 BOOST_AUTO_TEST_SUITE(TestRttEstimator)
 
-BOOST_AUTO_TEST_CASE(MinAvgMaxRtt)
+BOOST_AUTO_TEST_CASE(CopyAssign)
 {
-  RttEstimator rttEstimator;
+  RttEstimator est1;
+  RttEstimator est2;
+
+  est1.addMeasurement(100_ms);
+  est1.addMeasurement(150_ms);
+  est2.addMeasurement(75_ms);
+  est2.addMeasurement(70_ms);
+
+  BOOST_CHECK_NE(est1.getEstimatedRto(), est2.getEstimatedRto());
+  BOOST_CHECK_NE(est1.getRttVariation(), est2.getRttVariation());
+  BOOST_CHECK_NE(est1.getSmoothedRtt(), est2.getSmoothedRtt());
+
+  est1 = est2;
+
+  BOOST_CHECK_EQUAL(est1.getEstimatedRto(), est2.getEstimatedRto());
+  BOOST_CHECK_EQUAL(est1.getRttVariation(), est2.getRttVariation());
+  BOOST_CHECK_EQUAL(est1.getSmoothedRtt(), est2.getSmoothedRtt());
+}
+
+BOOST_AUTO_TEST_CASE(EstimatedRto)
+{
+  auto opts = make_shared<RttEstimator::Options>();
+  opts->initialRto = 400_ms;
+  opts->maxRto = 2_s;
+  RttEstimator rttEstimator(opts);
+
+  // check initial values
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), false);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), -1_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), -1_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts->initialRto);
+
+  // first measurement
+  rttEstimator.addMeasurement(200_ms);
+
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), true);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 200_ms);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100_ms);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 600_ms);
+
+  rttEstimator.addMeasurement(100_ms, 1);
+
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), true);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 187500_us);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100000_us);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 587500_us);
+
+  // expected samples larger than 1
+  rttEstimator.addMeasurement(50_ms, 5);
+
+  BOOST_CHECK_EQUAL(rttEstimator.hasSamples(), true);
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 184062500_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 101875000_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 591562500_ns);
+
+  // check if minRto works
+  for (int i = 0; i < 20; i++) {
+    rttEstimator.addMeasurement(10_ms);
+  }
+
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 22046646_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts->minRto);
+
+  // check if maxRto works
+  for (int i = 0; i < 10; i++) {
+    rttEstimator.addMeasurement(1_s);
+    rttEstimator.addMeasurement(10_ms);
+  }
+
+  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 440859284_ns);
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts->maxRto);
+}
+
+BOOST_AUTO_TEST_CASE(BackoffRto)
+{
+  auto opts = make_shared<RttEstimator::Options>();
+  opts->initialRto = 500_ms;
+  opts->maxRto = 4_s;
+  RttEstimator rttEstimator(opts);
+
+  rttEstimator.backoffRto();
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 1_s);
+
+  // check if minRto works
+  for (int i = 0; i < 10; i++) {
+    rttEstimator.addMeasurement(5_ms);
+  }
+  rttEstimator.backoffRto();
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 400_ms);
+
+  // check if maxRto works
+  for (int i = 0; i < 10; i++) {
+    rttEstimator.addMeasurement(5_s);
+  }
+  rttEstimator.backoffRto();
+  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 4_s);
+}
+
+BOOST_AUTO_TEST_CASE(Stats)
+{
+  RttEstimatorWithStats rttEstimator;
 
   // check initial values
   BOOST_CHECK_EQUAL(rttEstimator.getMinRtt().count(), std::numeric_limits<time::nanoseconds::rep>::max());
@@ -44,9 +144,9 @@
   BOOST_CHECK_EQUAL(rttEstimator.getMaxRtt().count(), std::numeric_limits<time::nanoseconds::rep>::min());
 
   // start with three samples
-  rttEstimator.addMeasurement(100_ms, 1);
-  rttEstimator.addMeasurement(400_ms, 1);
-  rttEstimator.addMeasurement(250_ms, 1);
+  rttEstimator.addMeasurement(100_ms);
+  rttEstimator.addMeasurement(400_ms);
+  rttEstimator.addMeasurement(250_ms);
 
   BOOST_CHECK_EQUAL(rttEstimator.getMinRtt(), 100_ms);
   BOOST_CHECK_EQUAL(rttEstimator.getAvgRtt(), 250_ms);
@@ -65,109 +165,6 @@
   BOOST_CHECK_EQUAL(rttEstimator.getMaxRtt(), 700_ms);
 }
 
-BOOST_AUTO_TEST_CASE(EstimatedRto)
-{
-  RttEstimator::Options opts;
-  opts.initialRto = 400_ms;
-  opts.maxRto = 2_s;
-  RttEstimator rttEstimator(opts);
-
-  // check initial values
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 0_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 0_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts.initialRto);
-
-  // first measurement
-  rttEstimator.addMeasurement(200_ms, 1);
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 200_ms);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100_ms);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 600_ms);
-
-  rttEstimator.addMeasurement(100_ms, 1);
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 187500_us);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 100000_us);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 587500_us);
-
-  // expected samples larger than 1
-  rttEstimator.addMeasurement(50_ms, 5);
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 184062500_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getRttVariation(), 101875000_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 591562500_ns);
-
-  // check if minRto works
-  for (int i = 0; i < 20; i++) {
-    rttEstimator.addMeasurement(10_ms, 1);
-  }
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 22046646_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts.minRto);
-
-  // check if maxRto works
-  for (int i = 0; i < 10; i++) {
-    rttEstimator.addMeasurement(1_s, 1);
-    rttEstimator.addMeasurement(10_ms, 1);
-  }
-
-  BOOST_CHECK_EQUAL(rttEstimator.getSmoothedRtt(), 440859284_ns);
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), opts.maxRto);
-}
-
-BOOST_AUTO_TEST_CASE(BackoffRto)
-{
-  RttEstimator::Options opts;
-  opts.initialRto = 500_ms;
-  opts.maxRto = 4_s;
-  RttEstimator rttEstimator(opts);
-
-  rttEstimator.backoffRto();
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 1_s);
-
-  // check if minRto works
-  for (int i = 0; i < 10; i++) {
-    rttEstimator.addMeasurement(5_ms, 1);
-  }
-  rttEstimator.backoffRto();
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 400_ms);
-
-  // check if maxRto works
-  for (int i = 0; i < 10; i++) {
-    rttEstimator.addMeasurement(5_s, 1);
-  }
-  rttEstimator.backoffRto();
-  BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), 4_s);
-}
-
-BOOST_AUTO_TEST_CASE(AfterMeasurement)
-{
-  RttEstimator rttEstimator;
-
-  int nHandlerInvocations = 0;
-  rttEstimator.afterMeasurement.connectSingleShot([&nHandlerInvocations] (const auto& sample) {
-    ++nHandlerInvocations;
-    BOOST_CHECK_EQUAL(sample.rtt, 80_ms);
-    BOOST_CHECK_EQUAL(sample.sRtt, 80_ms);
-    BOOST_CHECK_EQUAL(sample.rttVar, 40_ms);
-    BOOST_CHECK_EQUAL(sample.rto, 240_ms);
-    BOOST_CHECK(!sample.segNum.has_value());
-  });
-  rttEstimator.addMeasurement(80_ms, 1);
-  BOOST_CHECK_EQUAL(nHandlerInvocations, 1);
-
-  rttEstimator.afterMeasurement.connectSingleShot([&nHandlerInvocations] (const auto& sample) {
-    ++nHandlerInvocations;
-    BOOST_CHECK_EQUAL(sample.rtt, 40_ms);
-    BOOST_CHECK_EQUAL(sample.sRtt, 75_ms);
-    BOOST_CHECK_EQUAL(sample.rttVar, 40_ms);
-    BOOST_CHECK_EQUAL(sample.rto, 235_ms);
-    BOOST_CHECK(sample.segNum == 42U);
-  });
-  rttEstimator.addMeasurement(40_ms, 1, 42);
-  BOOST_CHECK_EQUAL(nHandlerInvocations, 2);
-}
-
 BOOST_AUTO_TEST_SUITE_END() // TestRttEstimator
 BOOST_AUTO_TEST_SUITE_END() // Util