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