Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: net/tools/quic/end_to_end_test.cc

Issue 2231463003: Test only. Fix quic e2e test flakiness caused by quic_buffer_packet_till_chlo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@129363578
Patch Set: git pull from upper stream Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <stddef.h> 5 #include <stddef.h>
6 #include <sys/epoll.h> 6 #include <sys/epoll.h>
7 7
8 #include <list> 8 #include <list>
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 // Run all tests with the cross products of all versions. 95 // Run all tests with the cross products of all versions.
96 struct TestParams { 96 struct TestParams {
97 TestParams(const QuicVersionVector& client_supported_versions, 97 TestParams(const QuicVersionVector& client_supported_versions,
98 const QuicVersionVector& server_supported_versions, 98 const QuicVersionVector& server_supported_versions,
99 QuicVersion negotiated_version, 99 QuicVersion negotiated_version,
100 bool client_supports_stateless_rejects, 100 bool client_supports_stateless_rejects,
101 bool server_uses_stateless_rejects_if_peer_supported, 101 bool server_uses_stateless_rejects_if_peer_supported,
102 QuicTag congestion_control_tag, 102 QuicTag congestion_control_tag,
103 bool disable_hpack_dynamic_table, 103 bool disable_hpack_dynamic_table,
104 bool force_hol_blocking, 104 bool force_hol_blocking,
105 bool use_cheap_stateless_reject) 105 bool use_cheap_stateless_reject,
106 bool buffer_packet_till_chlo)
106 : client_supported_versions(client_supported_versions), 107 : client_supported_versions(client_supported_versions),
107 server_supported_versions(server_supported_versions), 108 server_supported_versions(server_supported_versions),
108 negotiated_version(negotiated_version), 109 negotiated_version(negotiated_version),
109 client_supports_stateless_rejects(client_supports_stateless_rejects), 110 client_supports_stateless_rejects(client_supports_stateless_rejects),
110 server_uses_stateless_rejects_if_peer_supported( 111 server_uses_stateless_rejects_if_peer_supported(
111 server_uses_stateless_rejects_if_peer_supported), 112 server_uses_stateless_rejects_if_peer_supported),
112 congestion_control_tag(congestion_control_tag), 113 congestion_control_tag(congestion_control_tag),
113 disable_hpack_dynamic_table(disable_hpack_dynamic_table), 114 disable_hpack_dynamic_table(disable_hpack_dynamic_table),
114 force_hol_blocking(force_hol_blocking), 115 force_hol_blocking(force_hol_blocking),
115 use_cheap_stateless_reject(use_cheap_stateless_reject) {} 116 use_cheap_stateless_reject(use_cheap_stateless_reject),
117 buffer_packet_till_chlo(buffer_packet_till_chlo) {}
116 118
117 friend ostream& operator<<(ostream& os, const TestParams& p) { 119 friend ostream& operator<<(ostream& os, const TestParams& p) {
118 os << "{ server_supported_versions: " 120 os << "{ server_supported_versions: "
119 << QuicVersionVectorToString(p.server_supported_versions); 121 << QuicVersionVectorToString(p.server_supported_versions);
120 os << " client_supported_versions: " 122 os << " client_supported_versions: "
121 << QuicVersionVectorToString(p.client_supported_versions); 123 << QuicVersionVectorToString(p.client_supported_versions);
122 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); 124 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version);
123 os << " client_supports_stateless_rejects: " 125 os << " client_supports_stateless_rejects: "
124 << p.client_supports_stateless_rejects; 126 << p.client_supports_stateless_rejects;
125 os << " server_uses_stateless_rejects_if_peer_supported: " 127 os << " server_uses_stateless_rejects_if_peer_supported: "
126 << p.server_uses_stateless_rejects_if_peer_supported; 128 << p.server_uses_stateless_rejects_if_peer_supported;
127 os << " congestion_control_tag: " 129 os << " congestion_control_tag: "
128 << QuicUtils::TagToString(p.congestion_control_tag); 130 << QuicUtils::TagToString(p.congestion_control_tag);
129 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table; 131 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table;
130 os << " force_hol_blocking: " << p.force_hol_blocking; 132 os << " force_hol_blocking: " << p.force_hol_blocking;
131 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject 133 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject;
132 << " }"; 134 os << " buffer_packet_till_chlo: " << p.buffer_packet_till_chlo << " }";
133 return os; 135 return os;
134 } 136 }
135 137
136 QuicVersionVector client_supported_versions; 138 QuicVersionVector client_supported_versions;
137 QuicVersionVector server_supported_versions; 139 QuicVersionVector server_supported_versions;
138 QuicVersion negotiated_version; 140 QuicVersion negotiated_version;
139 bool client_supports_stateless_rejects; 141 bool client_supports_stateless_rejects;
140 bool server_uses_stateless_rejects_if_peer_supported; 142 bool server_uses_stateless_rejects_if_peer_supported;
141 QuicTag congestion_control_tag; 143 QuicTag congestion_control_tag;
142 bool disable_hpack_dynamic_table; 144 bool disable_hpack_dynamic_table;
143 bool force_hol_blocking; 145 bool force_hol_blocking;
144 bool use_cheap_stateless_reject; 146 bool use_cheap_stateless_reject;
147 bool buffer_packet_till_chlo;
145 }; 148 };
146 149
147 // Constructs various test permutations. 150 // Constructs various test permutations.
148 vector<TestParams> GetTestParams() { 151 vector<TestParams> GetTestParams() {
149 // Divide the versions into buckets in which the intra-frame format 152 // Divide the versions into buckets in which the intra-frame format
150 // is compatible. When clients encounter QUIC version negotiation 153 // is compatible. When clients encounter QUIC version negotiation
151 // they simply retransmit all packets using the new version's 154 // they simply retransmit all packets using the new version's
152 // QUIC framing. However, they are unable to change the intra-frame 155 // QUIC framing. However, they are unable to change the intra-frame
153 // layout (for example to change SPDY/4 headers to SPDY/3). So 156 // layout (for example to change SPDY/4 headers to SPDY/3). So
154 // these tests need to ensure that clients are never attempting 157 // these tests need to ensure that clients are never attempting
(...skipping 18 matching lines...) Expand all
173 } else { 176 } else {
174 // Versions: 34+ 177 // Versions: 34+
175 // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting 178 // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting
176 // wire formats. 179 // wire formats.
177 version_buckets[3].push_back(version); 180 version_buckets[3].push_back(version);
178 } 181 }
179 } 182 }
180 183
181 // This must be kept in sync with the number of nested for-loops below as it 184 // This must be kept in sync with the number of nested for-loops below as it
182 // is used to prune the number of tests that are run. 185 // is used to prune the number of tests that are run.
183 const int kMaxEnabledOptions = 5; 186 const int kMaxEnabledOptions = 6;
184 int max_enabled_options = 0; 187 int max_enabled_options = 0;
185 vector<TestParams> params; 188 vector<TestParams> params;
186 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { 189 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
187 for (bool client_supports_stateless_rejects : {true, false}) { 190 for (bool client_supports_stateless_rejects : {true, false}) {
188 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) { 191 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) {
189 for (bool disable_hpack_dynamic_table : {false}) { 192 for (bool disable_hpack_dynamic_table : {false}) {
190 for (bool force_hol_blocking : {true, false}) { 193 for (bool force_hol_blocking : {true, false}) {
191 for (bool use_cheap_stateless_reject : {true, false}) { 194 for (bool use_cheap_stateless_reject : {true, false}) {
192 int enabled_options = 0; 195 for (bool buffer_packet_till_chlo : {true, false}) {
193 if (force_hol_blocking) { 196 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) {
194 ++enabled_options; 197 // Doing stateless reject while not buffering packet
195 } 198 // before CHLO is not allowed.
196 if (congestion_control_tag != kQBIC) { 199 break;
197 ++enabled_options; 200 }
198 } 201 int enabled_options = 0;
199 if (disable_hpack_dynamic_table) { 202 if (force_hol_blocking) {
200 ++enabled_options; 203 ++enabled_options;
201 } 204 }
202 if (client_supports_stateless_rejects) { 205 if (congestion_control_tag != kQBIC) {
203 ++enabled_options; 206 ++enabled_options;
204 } 207 }
205 if (server_uses_stateless_rejects_if_peer_supported) { 208 if (disable_hpack_dynamic_table) {
206 ++enabled_options; 209 ++enabled_options;
207 } 210 }
208 if (use_cheap_stateless_reject) { 211 if (client_supports_stateless_rejects) {
209 ++enabled_options; 212 ++enabled_options;
210 } 213 }
211 CHECK_GE(kMaxEnabledOptions, enabled_options); 214 if (server_uses_stateless_rejects_if_peer_supported) {
212 if (enabled_options > max_enabled_options) { 215 ++enabled_options;
213 max_enabled_options = enabled_options; 216 }
214 } 217 if (buffer_packet_till_chlo) {
218 ++enabled_options;
219 }
220 if (use_cheap_stateless_reject) {
221 ++enabled_options;
222 }
223 CHECK_GE(kMaxEnabledOptions, enabled_options);
224 if (enabled_options > max_enabled_options) {
225 max_enabled_options = enabled_options;
226 }
215 227
216 // Run tests with no options, a single option, or all the 228 // Run tests with no options, a single option, or all the
217 // options enabled to avoid a combinatorial explosion. 229 // options enabled to avoid a combinatorial explosion.
218 if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) { 230 if (enabled_options > 1 &&
219 continue;
220 }
221
222 for (const QuicVersionVector& client_versions : version_buckets) {
223 CHECK(!client_versions.empty());
224 // Add an entry for server and client supporting all versions.
225 params.push_back(TestParams(
226 client_versions, all_supported_versions,
227 client_versions.front(), client_supports_stateless_rejects,
228 server_uses_stateless_rejects_if_peer_supported,
229 congestion_control_tag, disable_hpack_dynamic_table,
230 force_hol_blocking, use_cheap_stateless_reject));
231
232 // Run version negotiation tests tests with no options, or all
233 // the options enabled to avoid a combinatorial explosion.
234 if (enabled_options > 0 &&
235 enabled_options < kMaxEnabledOptions) { 231 enabled_options < kMaxEnabledOptions) {
236 continue; 232 continue;
237 } 233 }
238 234
239 // Test client supporting all versions and server supporting 1 235 for (const QuicVersionVector& client_versions :
240 // version. Simulate an old server and exercise version 236 version_buckets) {
241 // downgrade in the client. Protocol negotiation should occur. 237 CHECK(!client_versions.empty());
242 // Skip the i = 0 case because it is essentially the same as 238 // Add an entry for server and client supporting all versions.
243 // the default case.
244 for (size_t i = 1; i < client_versions.size(); ++i) {
245 QuicVersionVector server_supported_versions;
246 server_supported_versions.push_back(client_versions[i]);
247 params.push_back(TestParams( 239 params.push_back(TestParams(
248 client_versions, server_supported_versions, 240 client_versions, all_supported_versions,
249 server_supported_versions.front(), 241 client_versions.front(),
250 client_supports_stateless_rejects, 242 client_supports_stateless_rejects,
251 server_uses_stateless_rejects_if_peer_supported, 243 server_uses_stateless_rejects_if_peer_supported,
252 congestion_control_tag, disable_hpack_dynamic_table, 244 congestion_control_tag, disable_hpack_dynamic_table,
253 force_hol_blocking, use_cheap_stateless_reject)); 245 force_hol_blocking, use_cheap_stateless_reject,
254 } // End of version for loop. 246 buffer_packet_till_chlo));
255 } // End of 2nd version for loop. 247
256 } // End of use_cheap_stateless_reject for loop. 248 // Run version negotiation tests tests with no options, or all
257 } // End of force_hol_blocking loop. 249 // the options enabled to avoid a combinatorial explosion.
258 } // End of disable_hpack_dynamic_table for loop. 250 if (enabled_options > 0 &&
259 } // End of congestion_control_tag for loop. 251 enabled_options < kMaxEnabledOptions) {
260 } // End of client_supports_stateless_rejects for loop. 252 continue;
253 }
254
255 // Test client supporting all versions and server supporting 1
256 // version. Simulate an old server and exercise version
257 // downgrade in the client. Protocol negotiation should occur.
258 // Skip the i = 0 case because it is essentially the same as
259 // the default case.
260 for (size_t i = 1; i < client_versions.size(); ++i) {
261 QuicVersionVector server_supported_versions;
262 server_supported_versions.push_back(client_versions[i]);
263 params.push_back(TestParams(
264 client_versions, server_supported_versions,
265 server_supported_versions.front(),
266 client_supports_stateless_rejects,
267 server_uses_stateless_rejects_if_peer_supported,
268 congestion_control_tag, disable_hpack_dynamic_table,
269 force_hol_blocking, use_cheap_stateless_reject,
270 buffer_packet_till_chlo));
271 } // End of version for loop.
272 } // End of 2nd version for loop.
273 } // End of buffer_packet_till_chlo loop.
274 } // End of use_cheap_stateless_reject for loop.
275 } // End of force_hol_blocking loop.
276 } // End of disable_hpack_dynamic_table for loop.
277 } // End of congestion_control_tag for loop.
278 } // End of client_supports_stateless_rejects for loop.
261 CHECK_EQ(kMaxEnabledOptions, max_enabled_options); 279 CHECK_EQ(kMaxEnabledOptions, max_enabled_options);
262 } // End of server_uses_stateless_rejects_if_peer_supported for loop. 280 } // End of server_uses_stateless_rejects_if_peer_supported for loop.
263 return params; 281 return params;
264 } 282 }
265 283
266 class ServerDelegate : public PacketDroppingTestWriter::Delegate { 284 class ServerDelegate : public PacketDroppingTestWriter::Delegate {
267 public: 285 public:
268 explicit ServerDelegate(QuicDispatcher* dispatcher) 286 explicit ServerDelegate(QuicDispatcher* dispatcher)
269 : dispatcher_(dispatcher) {} 287 : dispatcher_(dispatcher) {}
270 ~ServerDelegate() override {} 288 ~ServerDelegate() override {}
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 server_writer_ = new PacketDroppingTestWriter(); 459 server_writer_ = new PacketDroppingTestWriter();
442 } 460 }
443 461
444 void TearDown() override { 462 void TearDown() override {
445 ASSERT_TRUE(initialized_) << "You must call Initialize() in every test " 463 ASSERT_TRUE(initialized_) << "You must call Initialize() in every test "
446 << "case. Otherwise, your test will leak memory."; 464 << "case. Otherwise, your test will leak memory.";
447 StopServer(); 465 StopServer();
448 } 466 }
449 467
450 void StartServer() { 468 void StartServer() {
469 FLAGS_quic_buffer_packet_till_chlo = GetParam().buffer_packet_till_chlo;
451 FLAGS_quic_use_cheap_stateless_rejects = 470 FLAGS_quic_use_cheap_stateless_rejects =
452 GetParam().use_cheap_stateless_reject; 471 GetParam().use_cheap_stateless_reject;
453 server_thread_.reset(new ServerThread( 472 server_thread_.reset(new ServerThread(
454 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(), 473 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(),
455 server_config_, server_supported_versions_), 474 server_config_, server_supported_versions_),
456 server_address_, strike_register_no_startup_period_)); 475 server_address_, strike_register_no_startup_period_));
457 if (chlo_multiplier_ != 0) { 476 if (chlo_multiplier_ != 0) {
458 server_thread_->server()->SetChloMultiplier(chlo_multiplier_); 477 server_thread_->server()->SetChloMultiplier(chlo_multiplier_);
459 } 478 }
460 server_thread_->Initialize(); 479 server_thread_->Initialize();
(...skipping 2397 matching lines...) Expand 10 before | Expand all | Expand 10 after
2858 EXPECT_EQ(kBarResponseBody, client_->response_body()); 2877 EXPECT_EQ(kBarResponseBody, client_->response_body());
2859 QuicConnectionStats client_stats = 2878 QuicConnectionStats client_stats =
2860 client_->client()->session()->connection()->GetStats(); 2879 client_->client()->session()->connection()->GetStats();
2861 EXPECT_EQ(0u, client_stats.packets_lost); 2880 EXPECT_EQ(0u, client_stats.packets_lost);
2862 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); 2881 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos());
2863 } 2882 }
2864 2883
2865 } // namespace 2884 } // namespace
2866 } // namespace test 2885 } // namespace test
2867 } // namespace net 2886 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698