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