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

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

Issue 2403233003: Automated rollback of internal change 130388085. (Closed)
Patch Set: Created 4 years, 2 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 | « net/quic/core/quic_protocol.cc ('k') | net/tools/quic/quic_client.cc » ('j') | 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 bool buffer_packet_till_chlo)
107 bool small_client_mtu)
108 : client_supported_versions(client_supported_versions), 107 : client_supported_versions(client_supported_versions),
109 server_supported_versions(server_supported_versions), 108 server_supported_versions(server_supported_versions),
110 negotiated_version(negotiated_version), 109 negotiated_version(negotiated_version),
111 client_supports_stateless_rejects(client_supports_stateless_rejects), 110 client_supports_stateless_rejects(client_supports_stateless_rejects),
112 server_uses_stateless_rejects_if_peer_supported( 111 server_uses_stateless_rejects_if_peer_supported(
113 server_uses_stateless_rejects_if_peer_supported), 112 server_uses_stateless_rejects_if_peer_supported),
114 congestion_control_tag(congestion_control_tag), 113 congestion_control_tag(congestion_control_tag),
115 disable_hpack_dynamic_table(disable_hpack_dynamic_table), 114 disable_hpack_dynamic_table(disable_hpack_dynamic_table),
116 force_hol_blocking(force_hol_blocking), 115 force_hol_blocking(force_hol_blocking),
117 use_cheap_stateless_reject(use_cheap_stateless_reject), 116 use_cheap_stateless_reject(use_cheap_stateless_reject),
118 buffer_packet_till_chlo(buffer_packet_till_chlo), 117 buffer_packet_till_chlo(buffer_packet_till_chlo) {}
119 small_client_mtu(small_client_mtu) {}
120 118
121 friend ostream& operator<<(ostream& os, const TestParams& p) { 119 friend ostream& operator<<(ostream& os, const TestParams& p) {
122 os << "{ server_supported_versions: " 120 os << "{ server_supported_versions: "
123 << QuicVersionVectorToString(p.server_supported_versions); 121 << QuicVersionVectorToString(p.server_supported_versions);
124 os << " client_supported_versions: " 122 os << " client_supported_versions: "
125 << QuicVersionVectorToString(p.client_supported_versions); 123 << QuicVersionVectorToString(p.client_supported_versions);
126 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); 124 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version);
127 os << " client_supports_stateless_rejects: " 125 os << " client_supports_stateless_rejects: "
128 << p.client_supports_stateless_rejects; 126 << p.client_supports_stateless_rejects;
129 os << " server_uses_stateless_rejects_if_peer_supported: " 127 os << " server_uses_stateless_rejects_if_peer_supported: "
130 << p.server_uses_stateless_rejects_if_peer_supported; 128 << p.server_uses_stateless_rejects_if_peer_supported;
131 os << " congestion_control_tag: " 129 os << " congestion_control_tag: "
132 << QuicUtils::TagToString(p.congestion_control_tag); 130 << QuicUtils::TagToString(p.congestion_control_tag);
133 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table; 131 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table;
134 os << " force_hol_blocking: " << p.force_hol_blocking; 132 os << " force_hol_blocking: " << p.force_hol_blocking;
135 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject; 133 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject;
136 os << " buffer_packet_till_chlo: " << p.buffer_packet_till_chlo; 134 os << " buffer_packet_till_chlo: " << p.buffer_packet_till_chlo << " }";
137 os << " small_client_mtu: " << p.small_client_mtu << " }";
138 return os; 135 return os;
139 } 136 }
140 137
141 QuicVersionVector client_supported_versions; 138 QuicVersionVector client_supported_versions;
142 QuicVersionVector server_supported_versions; 139 QuicVersionVector server_supported_versions;
143 QuicVersion negotiated_version; 140 QuicVersion negotiated_version;
144 bool client_supports_stateless_rejects; 141 bool client_supports_stateless_rejects;
145 bool server_uses_stateless_rejects_if_peer_supported; 142 bool server_uses_stateless_rejects_if_peer_supported;
146 QuicTag congestion_control_tag; 143 QuicTag congestion_control_tag;
147 bool disable_hpack_dynamic_table; 144 bool disable_hpack_dynamic_table;
148 bool force_hol_blocking; 145 bool force_hol_blocking;
149 bool use_cheap_stateless_reject; 146 bool use_cheap_stateless_reject;
150 bool buffer_packet_till_chlo; 147 bool buffer_packet_till_chlo;
151 bool small_client_mtu;
152 }; 148 };
153 149
154 // Constructs various test permutations. 150 // Constructs various test permutations.
155 vector<TestParams> GetTestParams() { 151 vector<TestParams> GetTestParams() {
156 // Divide the versions into buckets in which the intra-frame format 152 // Divide the versions into buckets in which the intra-frame format
157 // is compatible. When clients encounter QUIC version negotiation 153 // is compatible. When clients encounter QUIC version negotiation
158 // they simply retransmit all packets using the new version's 154 // they simply retransmit all packets using the new version's
159 // QUIC framing. However, they are unable to change the intra-frame 155 // QUIC framing. However, they are unable to change the intra-frame
160 // layout (for example to change HTTP2 headers to SPDY/3). So 156 // layout (for example to change HTTP2 headers to SPDY/3). So
161 // these tests need to ensure that clients are never attempting 157 // these tests need to ensure that clients are never attempting
(...skipping 14 matching lines...) Expand all
176 } else { 172 } else {
177 // Versions: 34+ 173 // Versions: 34+
178 // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting 174 // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting
179 // wire formats. 175 // wire formats.
180 version_buckets[2].push_back(version); 176 version_buckets[2].push_back(version);
181 } 177 }
182 } 178 }
183 179
184 // This must be kept in sync with the number of nested for-loops below as it 180 // This must be kept in sync with the number of nested for-loops below as it
185 // is used to prune the number of tests that are run. 181 // is used to prune the number of tests that are run.
186 const int kMaxEnabledOptions = 7; 182 const int kMaxEnabledOptions = 6;
187 int max_enabled_options = 0; 183 int max_enabled_options = 0;
188 vector<TestParams> params; 184 vector<TestParams> params;
189 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { 185 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
190 for (bool client_supports_stateless_rejects : {true, false}) { 186 for (bool client_supports_stateless_rejects : {true, false}) {
191 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) { 187 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) {
192 for (bool disable_hpack_dynamic_table : {false}) { 188 for (bool disable_hpack_dynamic_table : {false}) {
193 for (bool force_hol_blocking : {true, false}) { 189 for (bool force_hol_blocking : {true, false}) {
194 for (bool use_cheap_stateless_reject : {true, false}) { 190 for (bool use_cheap_stateless_reject : {true, false}) {
195 for (bool buffer_packet_till_chlo : {true, false}) { 191 for (bool buffer_packet_till_chlo : {true, false}) {
196 for (bool small_client_mtu : {true, false}) { 192 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) {
197 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) { 193 // Doing stateless reject while not buffering packet
198 // Doing stateless reject while not buffering packet 194 // before CHLO is not allowed.
199 // before CHLO is not allowed. 195 break;
200 break; 196 }
197 int enabled_options = 0;
198 if (force_hol_blocking) {
199 ++enabled_options;
200 }
201 if (congestion_control_tag != kQBIC) {
202 ++enabled_options;
203 }
204 if (disable_hpack_dynamic_table) {
205 ++enabled_options;
206 }
207 if (client_supports_stateless_rejects) {
208 ++enabled_options;
209 }
210 if (server_uses_stateless_rejects_if_peer_supported) {
211 ++enabled_options;
212 }
213 if (buffer_packet_till_chlo) {
214 ++enabled_options;
215 }
216 if (use_cheap_stateless_reject) {
217 ++enabled_options;
218 }
219 CHECK_GE(kMaxEnabledOptions, enabled_options);
220 if (enabled_options > max_enabled_options) {
221 max_enabled_options = enabled_options;
222 }
223
224 // Run tests with no options, a single option, or all the
225 // options enabled to avoid a combinatorial explosion.
226 if (enabled_options > 1 &&
227 enabled_options < kMaxEnabledOptions) {
228 continue;
229 }
230
231 for (const QuicVersionVector& client_versions :
232 version_buckets) {
233 CHECK(!client_versions.empty());
234 if (FilterSupportedVersions(client_versions).empty()) {
235 continue;
201 } 236 }
202 int enabled_options = 0; 237 // Add an entry for server and client supporting all
203 if (force_hol_blocking) { 238 // versions.
204 ++enabled_options; 239 params.push_back(TestParams(
205 } 240 client_versions, all_supported_versions,
206 if (congestion_control_tag != kQBIC) { 241 client_versions.front(),
207 ++enabled_options; 242 client_supports_stateless_rejects,
208 } 243 server_uses_stateless_rejects_if_peer_supported,
209 if (disable_hpack_dynamic_table) { 244 congestion_control_tag, disable_hpack_dynamic_table,
210 ++enabled_options; 245 force_hol_blocking, use_cheap_stateless_reject,
211 } 246 buffer_packet_till_chlo));
212 if (client_supports_stateless_rejects) {
213 ++enabled_options;
214 }
215 if (server_uses_stateless_rejects_if_peer_supported) {
216 ++enabled_options;
217 }
218 if (buffer_packet_till_chlo) {
219 ++enabled_options;
220 }
221 if (use_cheap_stateless_reject) {
222 ++enabled_options;
223 }
224 if (small_client_mtu) {
225 ++enabled_options;
226 }
227 CHECK_GE(kMaxEnabledOptions, enabled_options);
228 if (enabled_options > max_enabled_options) {
229 max_enabled_options = enabled_options;
230 }
231 247
232 // Run tests with no options, a single option, or all the 248 // Run version negotiation tests tests with no options, or
233 // options enabled to avoid a combinatorial explosion. 249 // all the options enabled to avoid a combinatorial
250 // explosion.
234 if (enabled_options > 1 && 251 if (enabled_options > 1 &&
235 enabled_options < kMaxEnabledOptions) { 252 enabled_options < kMaxEnabledOptions) {
236 continue; 253 continue;
237 } 254 }
238 255
239 for (const QuicVersionVector& client_versions : 256 // Test client supporting all versions and server supporting
240 version_buckets) { 257 // 1 version. Simulate an old server and exercise version
241 CHECK(!client_versions.empty()); 258 // downgrade in the client. Protocol negotiation should
242 if (FilterSupportedVersions(client_versions).empty()) { 259 // occur. Skip the i = 0 case because it is essentially the
260 // same as the default case.
261 for (size_t i = 1; i < client_versions.size(); ++i) {
262 QuicVersionVector server_supported_versions;
263 server_supported_versions.push_back(client_versions[i]);
264 if (FilterSupportedVersions(server_supported_versions)
265 .empty()) {
243 continue; 266 continue;
244 } 267 }
245 // Add an entry for server and client supporting all
246 // versions.
247 params.push_back(TestParams( 268 params.push_back(TestParams(
248 client_versions, all_supported_versions, 269 client_versions, server_supported_versions,
249 client_versions.front(), 270 server_supported_versions.front(),
250 client_supports_stateless_rejects, 271 client_supports_stateless_rejects,
251 server_uses_stateless_rejects_if_peer_supported, 272 server_uses_stateless_rejects_if_peer_supported,
252 congestion_control_tag, disable_hpack_dynamic_table, 273 congestion_control_tag, disable_hpack_dynamic_table,
253 force_hol_blocking, use_cheap_stateless_reject, 274 force_hol_blocking, use_cheap_stateless_reject,
254 buffer_packet_till_chlo, small_client_mtu)); 275 buffer_packet_till_chlo));
255 276 } // End of version for loop.
256 // Run version negotiation tests tests with no options, or 277 } // End of 2nd version for loop.
257 // all the options enabled to avoid a combinatorial
258 // explosion.
259 if (enabled_options > 1 &&
260 enabled_options < kMaxEnabledOptions) {
261 continue;
262 }
263
264 // Test client supporting all versions and server supporting
265 // 1 version. Simulate an old server and exercise version
266 // downgrade in the client. Protocol negotiation should
267 // occur. Skip the i = 0 case because it is essentially the
268 // same as the default case.
269 for (size_t i = 1; i < client_versions.size(); ++i) {
270 QuicVersionVector server_supported_versions;
271 server_supported_versions.push_back(client_versions[i]);
272 if (FilterSupportedVersions(server_supported_versions)
273 .empty()) {
274 continue;
275 }
276 params.push_back(TestParams(
277 client_versions, server_supported_versions,
278 server_supported_versions.front(),
279 client_supports_stateless_rejects,
280 server_uses_stateless_rejects_if_peer_supported,
281 congestion_control_tag, disable_hpack_dynamic_table,
282 force_hol_blocking, use_cheap_stateless_reject,
283 buffer_packet_till_chlo, small_client_mtu));
284 } // End of version for loop.
285 } // End of 2nd version for loop.
286 } // End of small_client_mtu loop.
287 } // End of buffer_packet_till_chlo loop. 278 } // End of buffer_packet_till_chlo loop.
288 } // End of use_cheap_stateless_reject for loop. 279 } // End of use_cheap_stateless_reject for loop.
289 } // End of force_hol_blocking loop. 280 } // End of force_hol_blocking loop.
290 } // End of disable_hpack_dynamic_table for loop. 281 } // End of disable_hpack_dynamic_table for loop.
291 } // End of congestion_control_tag for loop. 282 } // End of congestion_control_tag for loop.
292 } // End of client_supports_stateless_rejects for loop. 283 } // End of client_supports_stateless_rejects for loop.
293 CHECK_EQ(kMaxEnabledOptions, max_enabled_options); 284 CHECK_EQ(kMaxEnabledOptions, max_enabled_options);
294 } // End of server_uses_stateless_rejects_if_peer_supported for loop. 285 } // End of server_uses_stateless_rejects_if_peer_supported for loop.
295 return params; 286 return params;
296 } 287 }
297 288
298 class SmallMtuPacketReader : public QuicPacketReader {
299 public:
300 bool ReadAndDispatchPackets(int fd,
301 int port,
302 bool potentially_small_mtu,
303 const QuicClock& clock,
304 ProcessPacketInterface* processor,
305 QuicPacketCount* packets_dropped) override {
306 return QuicPacketReader::ReadAndDispatchPackets(fd, port, true, clock,
307 processor, packets_dropped);
308 }
309 };
310
311 class ServerDelegate : public PacketDroppingTestWriter::Delegate { 289 class ServerDelegate : public PacketDroppingTestWriter::Delegate {
312 public: 290 public:
313 explicit ServerDelegate(QuicDispatcher* dispatcher) 291 explicit ServerDelegate(QuicDispatcher* dispatcher)
314 : dispatcher_(dispatcher) {} 292 : dispatcher_(dispatcher) {}
315 ~ServerDelegate() override {} 293 ~ServerDelegate() override {}
316 void OnCanWrite() override { dispatcher_->OnCanWrite(); } 294 void OnCanWrite() override { dispatcher_->OnCanWrite(); }
317 295
318 private: 296 private:
319 QuicDispatcher* dispatcher_; 297 QuicDispatcher* dispatcher_;
320 }; 298 };
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 void StartServer() { 472 void StartServer() {
495 FLAGS_quic_buffer_packet_till_chlo = GetParam().buffer_packet_till_chlo; 473 FLAGS_quic_buffer_packet_till_chlo = GetParam().buffer_packet_till_chlo;
496 FLAGS_quic_use_cheap_stateless_rejects = 474 FLAGS_quic_use_cheap_stateless_rejects =
497 GetParam().use_cheap_stateless_reject; 475 GetParam().use_cheap_stateless_reject;
498 if (!FLAGS_quic_buffer_packet_till_chlo) { 476 if (!FLAGS_quic_buffer_packet_till_chlo) {
499 FLAGS_quic_limit_num_new_sessions_per_epoll_loop = false; 477 FLAGS_quic_limit_num_new_sessions_per_epoll_loop = false;
500 } 478 }
501 auto test_server = 479 auto test_server =
502 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(), 480 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(),
503 server_config_, server_supported_versions_); 481 server_config_, server_supported_versions_);
504 if (GetParam().small_client_mtu) {
505 FLAGS_quic_enforce_mtu_limit = true;
506 QuicServerPeer::SetReader(test_server, new SmallMtuPacketReader);
507 server_writer_->set_max_allowed_packet_size(kMinimumSupportedPacketSize);
508 }
509 server_thread_.reset(new ServerThread(test_server, server_address_, 482 server_thread_.reset(new ServerThread(test_server, server_address_,
510 strike_register_no_startup_period_)); 483 strike_register_no_startup_period_));
511 if (chlo_multiplier_ != 0) { 484 if (chlo_multiplier_ != 0) {
512 server_thread_->server()->SetChloMultiplier(chlo_multiplier_); 485 server_thread_->server()->SetChloMultiplier(chlo_multiplier_);
513 } 486 }
514 server_thread_->Initialize(); 487 server_thread_->Initialize();
515 server_address_ = 488 server_address_ =
516 IPEndPoint(server_address_.address(), server_thread_->GetPort()); 489 IPEndPoint(server_address_.address(), server_thread_->GetPort());
517 QuicDispatcher* dispatcher = 490 QuicDispatcher* dispatcher =
518 QuicServerPeer::GetDispatcher(server_thread_->server()); 491 QuicServerPeer::GetDispatcher(server_thread_->server());
(...skipping 2432 matching lines...) Expand 10 before | Expand all | Expand 10 after
2951 // Send a request before handshake finishes. 2924 // Send a request before handshake finishes.
2952 HTTPMessage request(HttpConstants::HTTP_1_1, HttpConstants::GET, "/bar"); 2925 HTTPMessage request(HttpConstants::HTTP_1_1, HttpConstants::GET, "/bar");
2953 client_->SendMessage(request); 2926 client_->SendMessage(request);
2954 client_->WaitForResponse(); 2927 client_->WaitForResponse();
2955 EXPECT_EQ(kBarResponseBody, client_->response_body()); 2928 EXPECT_EQ(kBarResponseBody, client_->response_body());
2956 QuicConnectionStats client_stats = 2929 QuicConnectionStats client_stats =
2957 client_->client()->session()->connection()->GetStats(); 2930 client_->client()->session()->connection()->GetStats();
2958 EXPECT_EQ(0u, client_stats.packets_lost); 2931 EXPECT_EQ(0u, client_stats.packets_lost);
2959 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); 2932 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos());
2960 } 2933 }
2961
2962 } // namespace 2934 } // namespace
2963 } // namespace test 2935 } // namespace test
2964 } // namespace net 2936 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_protocol.cc ('k') | net/tools/quic/quic_client.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698