| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/congestion_control/rtt_stats.h" | 5 #include "net/quic/core/congestion_control/rtt_stats.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats_.latest_rtt()); | 82 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats_.latest_rtt()); |
| 83 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(187500).ToMicroseconds(), | 83 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(187500).ToMicroseconds(), |
| 84 rtt_stats_.smoothed_rtt().ToMicroseconds()); | 84 rtt_stats_.smoothed_rtt().ToMicroseconds()); |
| 85 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.previous_srtt()); | 85 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.previous_srtt()); |
| 86 } | 86 } |
| 87 | 87 |
| 88 TEST_F(RttStatsTest, MinRtt) { | 88 TEST_F(RttStatsTest, MinRtt) { |
| 89 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200), | 89 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200), |
| 90 QuicTime::Delta::Zero(), QuicTime::Zero()); | 90 QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 91 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.min_rtt()); | 91 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.min_rtt()); |
| 92 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), | |
| 93 rtt_stats_.WindowedMinRtt()); | |
| 94 rtt_stats_.UpdateRtt( | 92 rtt_stats_.UpdateRtt( |
| 95 QuicTime::Delta::FromMilliseconds(10), QuicTime::Delta::Zero(), | 93 QuicTime::Delta::FromMilliseconds(10), QuicTime::Delta::Zero(), |
| 96 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(10)); | 94 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(10)); |
| 97 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | 95 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); |
| 98 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
| 99 rtt_stats_.UpdateRtt( | 96 rtt_stats_.UpdateRtt( |
| 100 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), | 97 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), |
| 101 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(20)); | 98 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(20)); |
| 102 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | 99 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); |
| 103 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
| 104 rtt_stats_.UpdateRtt( | 100 rtt_stats_.UpdateRtt( |
| 105 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), | 101 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), |
| 106 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(30)); | 102 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(30)); |
| 107 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | 103 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); |
| 108 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
| 109 rtt_stats_.UpdateRtt( | 104 rtt_stats_.UpdateRtt( |
| 110 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), | 105 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), |
| 111 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(40)); | 106 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(40)); |
| 112 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | 107 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); |
| 113 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
| 114 // Verify that ack_delay does not go into recording of min_rtt_. | 108 // Verify that ack_delay does not go into recording of min_rtt_. |
| 115 rtt_stats_.UpdateRtt( | 109 rtt_stats_.UpdateRtt( |
| 116 QuicTime::Delta::FromMilliseconds(7), | 110 QuicTime::Delta::FromMilliseconds(7), |
| 117 QuicTime::Delta::FromMilliseconds(2), | 111 QuicTime::Delta::FromMilliseconds(2), |
| 118 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(50)); | 112 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(50)); |
| 119 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.min_rtt()); | 113 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.min_rtt()); |
| 120 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.WindowedMinRtt()); | |
| 121 } | |
| 122 | |
| 123 TEST_F(RttStatsTest, WindowedMinRtt) { | |
| 124 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(10), | |
| 125 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
| 126 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
| 127 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
| 128 | |
| 129 rtt_stats_.SampleNewWindowedMinRtt(4); | |
| 130 for (int i = 0; i < 3; ++i) { | |
| 131 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50), | |
| 132 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
| 133 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
| 134 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), | |
| 135 rtt_stats_.WindowedMinRtt()); | |
| 136 } | |
| 137 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50), | |
| 138 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
| 139 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
| 140 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50), rtt_stats_.WindowedMinRtt()); | |
| 141 } | 114 } |
| 142 | 115 |
| 143 TEST_F(RttStatsTest, ExpireSmoothedMetrics) { | 116 TEST_F(RttStatsTest, ExpireSmoothedMetrics) { |
| 144 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10); | 117 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10); |
| 145 rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | 118 rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 146 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); | 119 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); |
| 147 EXPECT_EQ(initial_rtt, rtt_stats_.WindowedMinRtt()); | |
| 148 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); | 120 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); |
| 149 | 121 |
| 150 EXPECT_EQ(0.5 * initial_rtt, rtt_stats_.mean_deviation()); | 122 EXPECT_EQ(0.5 * initial_rtt, rtt_stats_.mean_deviation()); |
| 151 | 123 |
| 152 // Update once with a 20ms RTT. | 124 // Update once with a 20ms RTT. |
| 153 QuicTime::Delta doubled_rtt = 2 * initial_rtt; | 125 QuicTime::Delta doubled_rtt = 2 * initial_rtt; |
| 154 rtt_stats_.UpdateRtt(doubled_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | 126 rtt_stats_.UpdateRtt(doubled_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 155 EXPECT_EQ(1.125 * initial_rtt, rtt_stats_.smoothed_rtt()); | 127 EXPECT_EQ(1.125 * initial_rtt, rtt_stats_.smoothed_rtt()); |
| 156 | 128 |
| 157 // Expire the smoothed metrics, increasing smoothed rtt and mean deviation. | 129 // Expire the smoothed metrics, increasing smoothed rtt and mean deviation. |
| 158 rtt_stats_.ExpireSmoothedMetrics(); | 130 rtt_stats_.ExpireSmoothedMetrics(); |
| 159 EXPECT_EQ(doubled_rtt, rtt_stats_.smoothed_rtt()); | 131 EXPECT_EQ(doubled_rtt, rtt_stats_.smoothed_rtt()); |
| 160 EXPECT_EQ(0.875 * initial_rtt, rtt_stats_.mean_deviation()); | 132 EXPECT_EQ(0.875 * initial_rtt, rtt_stats_.mean_deviation()); |
| 161 | 133 |
| 162 // Now go back down to 5ms and expire the smoothed metrics, and ensure the | 134 // Now go back down to 5ms and expire the smoothed metrics, and ensure the |
| 163 // mean deviation increases to 15ms. | 135 // mean deviation increases to 15ms. |
| 164 QuicTime::Delta half_rtt = 0.5 * initial_rtt; | 136 QuicTime::Delta half_rtt = 0.5 * initial_rtt; |
| 165 rtt_stats_.UpdateRtt(half_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | 137 rtt_stats_.UpdateRtt(half_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 166 EXPECT_GT(doubled_rtt, rtt_stats_.smoothed_rtt()); | 138 EXPECT_GT(doubled_rtt, rtt_stats_.smoothed_rtt()); |
| 167 EXPECT_LT(initial_rtt, rtt_stats_.mean_deviation()); | 139 EXPECT_LT(initial_rtt, rtt_stats_.mean_deviation()); |
| 168 } | 140 } |
| 169 | 141 |
| 170 TEST_F(RttStatsTest, UpdateRttWithBadSendDeltas) { | 142 TEST_F(RttStatsTest, UpdateRttWithBadSendDeltas) { |
| 171 // Make sure we ignore bad RTTs. | 143 // Make sure we ignore bad RTTs. |
| 172 base::test::MockLog log; | 144 base::test::MockLog log; |
| 173 | 145 |
| 174 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10); | 146 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10); |
| 175 rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | 147 rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); |
| 176 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); | 148 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); |
| 177 EXPECT_EQ(initial_rtt, rtt_stats_.WindowedMinRtt()); | |
| 178 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); | 149 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); |
| 179 | 150 |
| 180 vector<QuicTime::Delta> bad_send_deltas; | 151 vector<QuicTime::Delta> bad_send_deltas; |
| 181 bad_send_deltas.push_back(QuicTime::Delta::Zero()); | 152 bad_send_deltas.push_back(QuicTime::Delta::Zero()); |
| 182 bad_send_deltas.push_back(QuicTime::Delta::Infinite()); | 153 bad_send_deltas.push_back(QuicTime::Delta::Infinite()); |
| 183 bad_send_deltas.push_back(QuicTime::Delta::FromMicroseconds(-1000)); | 154 bad_send_deltas.push_back(QuicTime::Delta::FromMicroseconds(-1000)); |
| 184 log.StartCapturingLogs(); | 155 log.StartCapturingLogs(); |
| 185 | 156 |
| 186 for (QuicTime::Delta bad_send_delta : bad_send_deltas) { | 157 for (QuicTime::Delta bad_send_delta : bad_send_deltas) { |
| 187 SCOPED_TRACE(Message() << "bad_send_delta = " | 158 SCOPED_TRACE(Message() << "bad_send_delta = " |
| 188 << bad_send_delta.ToMicroseconds()); | 159 << bad_send_delta.ToMicroseconds()); |
| 189 EXPECT_CALL(log, Log(LOG_WARNING, _, _, _, HasSubstr("Ignoring"))); | 160 EXPECT_CALL(log, Log(LOG_WARNING, _, _, _, HasSubstr("Ignoring"))); |
| 190 rtt_stats_.UpdateRtt(bad_send_delta, QuicTime::Delta::Zero(), | 161 rtt_stats_.UpdateRtt(bad_send_delta, QuicTime::Delta::Zero(), |
| 191 QuicTime::Zero()); | 162 QuicTime::Zero()); |
| 192 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); | 163 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); |
| 193 EXPECT_EQ(initial_rtt, rtt_stats_.WindowedMinRtt()); | |
| 194 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); | 164 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); |
| 195 } | 165 } |
| 196 } | 166 } |
| 197 | 167 |
| 198 TEST_F(RttStatsTest, ResetAfterConnectionMigrations) { | 168 TEST_F(RttStatsTest, ResetAfterConnectionMigrations) { |
| 199 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(300), | 169 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(300), |
| 200 QuicTime::Delta::FromMilliseconds(100), | 170 QuicTime::Delta::FromMilliseconds(100), |
| 201 QuicTime::Zero()); | 171 QuicTime::Zero()); |
| 202 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); | 172 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); |
| 203 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); | 173 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); |
| 204 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(300), rtt_stats_.min_rtt()); | 174 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(300), rtt_stats_.min_rtt()); |
| 205 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(300), | |
| 206 rtt_stats_.WindowedMinRtt()); | |
| 207 | 175 |
| 208 // Reset rtt stats on connection migrations. | 176 // Reset rtt stats on connection migrations. |
| 209 rtt_stats_.OnConnectionMigration(); | 177 rtt_stats_.OnConnectionMigration(); |
| 210 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.latest_rtt()); | 178 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.latest_rtt()); |
| 211 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.smoothed_rtt()); | 179 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.smoothed_rtt()); |
| 212 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.min_rtt()); | 180 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.min_rtt()); |
| 213 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.WindowedMinRtt()); | |
| 214 } | 181 } |
| 215 | 182 |
| 216 } // namespace test | 183 } // namespace test |
| 217 } // namespace net | 184 } // namespace net |
| OLD | NEW |