OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/quic/congestion_control/rtt_stats.h" | |
6 | |
7 #include <vector> | |
8 | |
9 #include "base/logging.h" | |
10 #include "base/test/mock_log.h" | |
11 #include "net/quic/quic_flags.h" | |
12 #include "net/quic/test_tools/rtt_stats_peer.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 using logging::LOG_WARNING; | |
16 using std::vector; | |
17 using testing::HasSubstr; | |
18 using testing::Message; | |
19 using testing::_; | |
20 | |
21 namespace net { | |
22 namespace test { | |
23 | |
24 class RttStatsTest : public ::testing::Test { | |
25 protected: | |
26 RttStats rtt_stats_; | |
27 }; | |
28 | |
29 TEST_F(RttStatsTest, DefaultsBeforeUpdate) { | |
30 EXPECT_LT(0u, rtt_stats_.initial_rtt_us()); | |
31 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.min_rtt()); | |
32 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.smoothed_rtt()); | |
33 } | |
34 | |
35 TEST_F(RttStatsTest, SmoothedRtt) { | |
36 // Verify that ack_delay is corrected for in Smoothed RTT. | |
37 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(300), | |
38 QuicTime::Delta::FromMilliseconds(100), | |
39 QuicTime::Zero()); | |
40 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); | |
41 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); | |
42 // Verify that effective RTT of zero does not change Smoothed RTT. | |
43 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200), | |
44 QuicTime::Delta::FromMilliseconds(200), | |
45 QuicTime::Zero()); | |
46 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); | |
47 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); | |
48 // Verify that large erroneous ack_delay does not change Smoothed RTT. | |
49 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200), | |
50 QuicTime::Delta::FromMilliseconds(300), | |
51 QuicTime::Zero()); | |
52 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); | |
53 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); | |
54 } | |
55 | |
56 TEST_F(RttStatsTest, PreviousSmoothedRtt) { | |
57 // Verify that ack_delay is corrected for in Smoothed RTT. | |
58 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(300), | |
59 QuicTime::Delta::FromMilliseconds(100), | |
60 QuicTime::Zero()); | |
61 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); | |
62 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); | |
63 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.previous_srtt()); | |
64 // Ensure the previous SRTT is 200ms after a 100ms sample. | |
65 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(100), | |
66 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
67 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats_.latest_rtt()); | |
68 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(187500).ToMicroseconds(), | |
69 rtt_stats_.smoothed_rtt().ToMicroseconds()); | |
70 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.previous_srtt()); | |
71 } | |
72 | |
73 TEST_F(RttStatsTest, MinRtt) { | |
74 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200), | |
75 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
76 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.min_rtt()); | |
77 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), | |
78 rtt_stats_.WindowedMinRtt()); | |
79 rtt_stats_.UpdateRtt( | |
80 QuicTime::Delta::FromMilliseconds(10), QuicTime::Delta::Zero(), | |
81 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(10)); | |
82 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
83 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
84 rtt_stats_.UpdateRtt( | |
85 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), | |
86 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(20)); | |
87 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
88 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
89 rtt_stats_.UpdateRtt( | |
90 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), | |
91 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(30)); | |
92 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
93 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
94 rtt_stats_.UpdateRtt( | |
95 QuicTime::Delta::FromMilliseconds(50), QuicTime::Delta::Zero(), | |
96 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(40)); | |
97 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
98 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
99 // Verify that ack_delay does not go into recording of min_rtt_. | |
100 rtt_stats_.UpdateRtt( | |
101 QuicTime::Delta::FromMilliseconds(7), | |
102 QuicTime::Delta::FromMilliseconds(2), | |
103 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(50)); | |
104 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.min_rtt()); | |
105 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.WindowedMinRtt()); | |
106 } | |
107 | |
108 TEST_F(RttStatsTest, WindowedMinRtt) { | |
109 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(10), | |
110 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
111 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
112 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.WindowedMinRtt()); | |
113 | |
114 rtt_stats_.SampleNewWindowedMinRtt(4); | |
115 for (int i = 0; i < 3; ++i) { | |
116 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50), | |
117 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
118 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
119 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), | |
120 rtt_stats_.WindowedMinRtt()); | |
121 } | |
122 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50), | |
123 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
124 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt()); | |
125 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50), rtt_stats_.WindowedMinRtt()); | |
126 } | |
127 | |
128 TEST_F(RttStatsTest, ExpireSmoothedMetrics) { | |
129 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10); | |
130 rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | |
131 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); | |
132 EXPECT_EQ(initial_rtt, rtt_stats_.WindowedMinRtt()); | |
133 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); | |
134 | |
135 EXPECT_EQ(0.5 * initial_rtt, rtt_stats_.mean_deviation()); | |
136 | |
137 // Update once with a 20ms RTT. | |
138 QuicTime::Delta doubled_rtt = 2 * initial_rtt; | |
139 rtt_stats_.UpdateRtt(doubled_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | |
140 EXPECT_EQ(1.125 * initial_rtt, rtt_stats_.smoothed_rtt()); | |
141 | |
142 // Expire the smoothed metrics, increasing smoothed rtt and mean deviation. | |
143 rtt_stats_.ExpireSmoothedMetrics(); | |
144 EXPECT_EQ(doubled_rtt, rtt_stats_.smoothed_rtt()); | |
145 EXPECT_EQ(0.875 * initial_rtt, rtt_stats_.mean_deviation()); | |
146 | |
147 // Now go back down to 5ms and expire the smoothed metrics, and ensure the | |
148 // mean deviation increases to 15ms. | |
149 QuicTime::Delta half_rtt = 0.5 * initial_rtt; | |
150 rtt_stats_.UpdateRtt(half_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | |
151 EXPECT_GT(doubled_rtt, rtt_stats_.smoothed_rtt()); | |
152 EXPECT_LT(initial_rtt, rtt_stats_.mean_deviation()); | |
153 } | |
154 | |
155 TEST_F(RttStatsTest, UpdateRttWithBadSendDeltas) { | |
156 // Make sure we ignore bad RTTs. | |
157 base::test::MockLog log; | |
158 | |
159 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10); | |
160 rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero()); | |
161 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); | |
162 EXPECT_EQ(initial_rtt, rtt_stats_.WindowedMinRtt()); | |
163 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); | |
164 | |
165 vector<QuicTime::Delta> bad_send_deltas; | |
166 bad_send_deltas.push_back(QuicTime::Delta::Zero()); | |
167 bad_send_deltas.push_back(QuicTime::Delta::Infinite()); | |
168 bad_send_deltas.push_back(QuicTime::Delta::FromMicroseconds(-1000)); | |
169 log.StartCapturingLogs(); | |
170 | |
171 for (QuicTime::Delta bad_send_delta : bad_send_deltas) { | |
172 SCOPED_TRACE(Message() << "bad_send_delta = " | |
173 << bad_send_delta.ToMicroseconds()); | |
174 EXPECT_CALL(log, Log(LOG_WARNING, _, _, _, HasSubstr("Ignoring"))); | |
175 rtt_stats_.UpdateRtt(bad_send_delta, QuicTime::Delta::Zero(), | |
176 QuicTime::Zero()); | |
177 EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt()); | |
178 EXPECT_EQ(initial_rtt, rtt_stats_.WindowedMinRtt()); | |
179 EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt()); | |
180 } | |
181 } | |
182 | |
183 TEST_F(RttStatsTest, ResetAfterConnectionMigrations) { | |
184 rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(300), | |
185 QuicTime::Delta::FromMilliseconds(100), | |
186 QuicTime::Zero()); | |
187 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt()); | |
188 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt()); | |
189 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(300), rtt_stats_.min_rtt()); | |
190 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(300), | |
191 rtt_stats_.WindowedMinRtt()); | |
192 | |
193 // Reset rtt stats on connection migrations. | |
194 rtt_stats_.OnConnectionMigration(); | |
195 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.latest_rtt()); | |
196 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.smoothed_rtt()); | |
197 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.min_rtt()); | |
198 EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.WindowedMinRtt()); | |
199 } | |
200 | |
201 } // namespace test | |
202 } // namespace net | |
OLD | NEW |