10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "net/quic/congestion_control/rtt_stats.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/logging.h"
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace net {
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace test {
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass RttStatsPeer {
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static QuicTime::Delta GetHalfWindowRtt(const RttStats* rtt_stats) {
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return rtt_stats->half_window_rtt_.rtt;
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static QuicTime::Delta GetQuarterWindowRtt(const RttStats* rtt_stats) {
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return rtt_stats->quarter_window_rtt_.rtt;
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass RttStatsTest : public ::testing::Test {
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RttStats rtt_stats_;
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(RttStatsTest, MinRtt) {
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Delta::Zero(),
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Zero());
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats_.min_rtt());
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100),
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            rtt_stats_.recent_min_rtt());
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Delta::Zero(),
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       QuicTime::Zero().Add(
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           QuicTime::Delta::FromMilliseconds(10)));
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Delta::Zero(),
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       QuicTime::Zero().Add(
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           QuicTime::Delta::FromMilliseconds(20)));
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       QuicTime::Delta::Zero(),
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       QuicTime::Zero().Add(
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           QuicTime::Delta::FromMilliseconds(30)));
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       QuicTime::Delta::Zero(),
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       QuicTime::Zero().Add(
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           QuicTime::Delta::FromMilliseconds(40)));
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
620529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(RttStatsTest, RecentMinRtt) {
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Delta::Zero(),
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Zero());
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rtt_stats_.SampleNewRecentMinRtt(4);
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (int i = 0; i < 3; ++i) {
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Delta::Zero(),
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       QuicTime::Zero());
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10),
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch              rtt_stats_.recent_min_rtt());
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        QuicTime::Delta::Zero(),
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        QuicTime::Zero());
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50), rtt_stats_.recent_min_rtt());
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(RttStatsTest, WindowedRecentMinRtt) {
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Set the window to 99ms, so 25ms is more than a quarter rtt.
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_stats_.set_recent_min_rtt_window(QuicTime::Delta::FromMilliseconds(99));
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  QuicTime now = QuicTime::Zero();
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  QuicTime::Delta rtt_sample = QuicTime::Delta::FromMilliseconds(10);
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Gradually increase the rtt samples and ensure the recent_min_rtt starts
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // rising.
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (int i = 0; i < 8; ++i) {
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    now = now.Add(QuicTime::Delta::FromMilliseconds(25));
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    rtt_sample = rtt_sample.Add(QuicTime::Delta::FromMilliseconds(10));
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(10)),
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (i < 3) {
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10),
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                rtt_stats_.recent_min_rtt());
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    } else if (i < 5) {
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(QuicTime::Delta::FromMilliseconds(30),
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                rtt_stats_.recent_min_rtt());
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    } else if (i < 7) {
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50),
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                rtt_stats_.recent_min_rtt());
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    } else {
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      EXPECT_EQ(QuicTime::Delta::FromMilliseconds(70),
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                rtt_stats_.recent_min_rtt());
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A new quarter rtt low sets that, but nothing else.
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_sample = rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(5));
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(5)),
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(70),
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            rtt_stats_.recent_min_rtt());
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A new half rtt low sets that and the quarter rtt low.
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_sample = rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(15));
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(70),
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            rtt_stats_.recent_min_rtt());
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A new full window loss sets the recent_min_rtt, but not min_rtt.
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_sample = QuicTime::Delta::FromMilliseconds(65);
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, rtt_stats_.recent_min_rtt());
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A new all time low sets both the min_rtt and the recent_min_rtt.
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_sample = QuicTime::Delta::FromMilliseconds(5);
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, rtt_stats_.min_rtt());
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(rtt_sample, rtt_stats_.recent_min_rtt());
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
157116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(RttStatsTest, ExpireSmoothedMetrics) {
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10);
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt());
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(initial_rtt, rtt_stats_.recent_min_rtt());
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(initial_rtt, rtt_stats_.SmoothedRtt());
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(initial_rtt.Multiply(0.5), rtt_stats_.mean_deviation());
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Update once with a 20ms RTT.
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  QuicTime::Delta doubled_rtt = initial_rtt.Multiply(2);
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  rtt_stats_.UpdateRtt(doubled_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(initial_rtt.Multiply(1.125), rtt_stats_.SmoothedRtt());
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Expire the smoothed metrics, increasing smoothed rtt and mean deviation.
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  rtt_stats_.ExpireSmoothedMetrics();
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(doubled_rtt, rtt_stats_.SmoothedRtt());
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(initial_rtt.Multiply(0.875), rtt_stats_.mean_deviation());
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Now go back down to 5ms and expire the smoothed metrics, and ensure the
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // mean deviation increases to 15ms.
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QuicTime::Delta half_rtt = initial_rtt.Multiply(0.5);
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  rtt_stats_.UpdateRtt(half_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_GT(doubled_rtt, rtt_stats_.SmoothedRtt());
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_LT(initial_rtt, rtt_stats_.mean_deviation());
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace test
1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace net
186