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 |