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

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

Issue 2115033002: Adds QUIC_VERSION_36 which adds support to force HOL blocking between streams for measurement purpo… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@126085461
Patch Set: typo Created 4 years, 5 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
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 11 matching lines...) Expand all
22 #include "net/quic/crypto/null_encrypter.h" 22 #include "net/quic/crypto/null_encrypter.h"
23 #include "net/quic/quic_client_session_base.h" 23 #include "net/quic/quic_client_session_base.h"
24 #include "net/quic/quic_flags.h" 24 #include "net/quic/quic_flags.h"
25 #include "net/quic/quic_framer.h" 25 #include "net/quic/quic_framer.h"
26 #include "net/quic/quic_packet_creator.h" 26 #include "net/quic/quic_packet_creator.h"
27 #include "net/quic/quic_protocol.h" 27 #include "net/quic/quic_protocol.h"
28 #include "net/quic/quic_server_id.h" 28 #include "net/quic/quic_server_id.h"
29 #include "net/quic/quic_session.h" 29 #include "net/quic/quic_session.h"
30 #include "net/quic/quic_utils.h" 30 #include "net/quic/quic_utils.h"
31 #include "net/quic/test_tools/crypto_test_utils.h" 31 #include "net/quic/test_tools/crypto_test_utils.h"
32 #include "net/quic/test_tools/quic_config_peer.h"
32 #include "net/quic/test_tools/quic_connection_peer.h" 33 #include "net/quic/test_tools/quic_connection_peer.h"
33 #include "net/quic/test_tools/quic_flow_controller_peer.h" 34 #include "net/quic/test_tools/quic_flow_controller_peer.h"
34 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" 35 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
35 #include "net/quic/test_tools/quic_session_peer.h" 36 #include "net/quic/test_tools/quic_session_peer.h"
36 #include "net/quic/test_tools/quic_spdy_session_peer.h" 37 #include "net/quic/test_tools/quic_spdy_session_peer.h"
37 #include "net/quic/test_tools/quic_test_utils.h" 38 #include "net/quic/test_tools/quic_test_utils.h"
38 #include "net/quic/test_tools/reliable_quic_stream_peer.h" 39 #include "net/quic/test_tools/reliable_quic_stream_peer.h"
39 #include "net/test/gtest_util.h" 40 #include "net/test/gtest_util.h"
40 #include "net/tools/epoll_server/epoll_server.h" 41 #include "net/tools/epoll_server/epoll_server.h"
41 #include "net/tools/quic/quic_epoll_connection_helper.h" 42 #include "net/tools/quic/quic_epoll_connection_helper.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 93
93 // Run all tests with the cross products of all versions. 94 // Run all tests with the cross products of all versions.
94 struct TestParams { 95 struct TestParams {
95 TestParams(const QuicVersionVector& client_supported_versions, 96 TestParams(const QuicVersionVector& client_supported_versions,
96 const QuicVersionVector& server_supported_versions, 97 const QuicVersionVector& server_supported_versions,
97 QuicVersion negotiated_version, 98 QuicVersion negotiated_version,
98 bool client_supports_stateless_rejects, 99 bool client_supports_stateless_rejects,
99 bool server_uses_stateless_rejects_if_peer_supported, 100 bool server_uses_stateless_rejects_if_peer_supported,
100 QuicTag congestion_control_tag, 101 QuicTag congestion_control_tag,
101 bool auto_tune_flow_control_window, 102 bool auto_tune_flow_control_window,
102 bool disable_hpack_dynamic_table) 103 bool disable_hpack_dynamic_table,
104 bool force_hol_blocking)
103 : client_supported_versions(client_supported_versions), 105 : client_supported_versions(client_supported_versions),
104 server_supported_versions(server_supported_versions), 106 server_supported_versions(server_supported_versions),
105 negotiated_version(negotiated_version), 107 negotiated_version(negotiated_version),
106 client_supports_stateless_rejects(client_supports_stateless_rejects), 108 client_supports_stateless_rejects(client_supports_stateless_rejects),
107 server_uses_stateless_rejects_if_peer_supported( 109 server_uses_stateless_rejects_if_peer_supported(
108 server_uses_stateless_rejects_if_peer_supported), 110 server_uses_stateless_rejects_if_peer_supported),
109 congestion_control_tag(congestion_control_tag), 111 congestion_control_tag(congestion_control_tag),
110 auto_tune_flow_control_window(auto_tune_flow_control_window), 112 auto_tune_flow_control_window(auto_tune_flow_control_window),
111 disable_hpack_dynamic_table(disable_hpack_dynamic_table) {} 113 disable_hpack_dynamic_table(disable_hpack_dynamic_table),
114 force_hol_blocking(force_hol_blocking) {}
112 115
113 friend ostream& operator<<(ostream& os, const TestParams& p) { 116 friend ostream& operator<<(ostream& os, const TestParams& p) {
114 os << "{ server_supported_versions: " 117 os << "{ server_supported_versions: "
115 << QuicVersionVectorToString(p.server_supported_versions); 118 << QuicVersionVectorToString(p.server_supported_versions);
116 os << " client_supported_versions: " 119 os << " client_supported_versions: "
117 << QuicVersionVectorToString(p.client_supported_versions); 120 << QuicVersionVectorToString(p.client_supported_versions);
118 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); 121 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version);
119 os << " client_supports_stateless_rejects: " 122 os << " client_supports_stateless_rejects: "
120 << p.client_supports_stateless_rejects; 123 << p.client_supports_stateless_rejects;
121 os << " server_uses_stateless_rejects_if_peer_supported: " 124 os << " server_uses_stateless_rejects_if_peer_supported: "
122 << p.server_uses_stateless_rejects_if_peer_supported; 125 << p.server_uses_stateless_rejects_if_peer_supported;
123 os << " congestion_control_tag: " 126 os << " congestion_control_tag: "
124 << QuicUtils::TagToString(p.congestion_control_tag); 127 << QuicUtils::TagToString(p.congestion_control_tag);
125 os << " auto_tune_flow_control_window: " << p.auto_tune_flow_control_window; 128 os << " auto_tune_flow_control_window: " << p.auto_tune_flow_control_window;
126 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table 129 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table;
127 << " }"; 130 os << " force_hol_blocking: " << p.force_hol_blocking << " }";
128 return os; 131 return os;
129 } 132 }
130 133
131 QuicVersionVector client_supported_versions; 134 QuicVersionVector client_supported_versions;
132 QuicVersionVector server_supported_versions; 135 QuicVersionVector server_supported_versions;
133 QuicVersion negotiated_version; 136 QuicVersion negotiated_version;
134 bool client_supports_stateless_rejects; 137 bool client_supports_stateless_rejects;
135 bool server_uses_stateless_rejects_if_peer_supported; 138 bool server_uses_stateless_rejects_if_peer_supported;
136 QuicTag congestion_control_tag; 139 QuicTag congestion_control_tag;
137 bool auto_tune_flow_control_window; 140 bool auto_tune_flow_control_window;
138 bool disable_hpack_dynamic_table; 141 bool disable_hpack_dynamic_table;
142 bool force_hol_blocking;
139 }; 143 };
140 144
141 // Constructs various test permutations. 145 // Constructs various test permutations.
142 vector<TestParams> GetTestParams() { 146 vector<TestParams> GetTestParams() {
143 // Divide the versions into buckets in which the intra-frame format 147 // Divide the versions into buckets in which the intra-frame format
144 // is compatible. When clients encounter QUIC version negotiation 148 // is compatible. When clients encounter QUIC version negotiation
145 // they simply retransmit all packets using the new version's 149 // they simply retransmit all packets using the new version's
146 // QUIC framing. However, they are unable to change the intra-frame 150 // QUIC framing. However, they are unable to change the intra-frame
147 // layout (for example to change SPDY/4 headers to SPDY/3). So 151 // layout (for example to change SPDY/4 headers to SPDY/3). So
148 // these tests need to ensure that clients are never attempting 152 // these tests need to ensure that clients are never attempting
(...skipping 25 matching lines...) Expand all
174 178
175 // This must be kept in sync with the number of nested for-loops below as it 179 // This must be kept in sync with the number of nested for-loops below as it
176 // is used to prune the number of tests that are run. 180 // is used to prune the number of tests that are run.
177 const int kMaxEnabledOptions = 5; 181 const int kMaxEnabledOptions = 5;
178 int max_enabled_options = 0; 182 int max_enabled_options = 0;
179 vector<TestParams> params; 183 vector<TestParams> params;
180 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { 184 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
181 for (bool client_supports_stateless_rejects : {true, false}) { 185 for (bool client_supports_stateless_rejects : {true, false}) {
182 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) { 186 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) {
183 for (bool auto_tune_flow_control_window : {true, false}) { 187 for (bool auto_tune_flow_control_window : {true, false}) {
184 for (bool disable_hpack_dynamic_table : {true, false}) { 188 for (bool disable_hpack_dynamic_table : {false}) {
185 int enabled_options = 0; 189 for (bool force_hol_blocking : {true, false}) {
186 if (congestion_control_tag != kQBIC) { 190 int enabled_options = 0;
187 ++enabled_options; 191 if (force_hol_blocking) {
188 } 192 ++enabled_options;
189 if (auto_tune_flow_control_window) { 193 }
190 ++enabled_options; 194 if (congestion_control_tag != kQBIC) {
191 } 195 ++enabled_options;
192 if (disable_hpack_dynamic_table) { 196 }
193 ++enabled_options; 197 if (auto_tune_flow_control_window) {
194 } 198 ++enabled_options;
195 if (client_supports_stateless_rejects) { 199 }
196 ++enabled_options; 200 if (disable_hpack_dynamic_table) {
197 } 201 ++enabled_options;
198 if (server_uses_stateless_rejects_if_peer_supported) { 202 }
199 ++enabled_options; 203 if (client_supports_stateless_rejects) {
200 } 204 ++enabled_options;
201 CHECK_GE(kMaxEnabledOptions, enabled_options); 205 }
202 if (enabled_options > max_enabled_options) { 206 if (server_uses_stateless_rejects_if_peer_supported) {
203 max_enabled_options = enabled_options; 207 ++enabled_options;
204 } 208 }
209 CHECK_GE(kMaxEnabledOptions, enabled_options);
210 if (enabled_options > max_enabled_options) {
211 max_enabled_options = enabled_options;
212 }
205 213
206 // Run tests with no options, a single option, or all the options 214 // Run tests with no options, a single option, or all the options
207 // enabled to avoid a combinatorial explosion. 215 // enabled to avoid a combinatorial explosion.
208 if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) { 216 if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) {
209 continue;
210 }
211
212 for (const QuicVersionVector& client_versions : version_buckets) {
213 if (client_versions.front() < QUIC_VERSION_30 &&
214 FLAGS_quic_disable_pre_30) {
215 continue;
216 }
217 CHECK(!client_versions.empty());
218 // Add an entry for server and client supporting all versions.
219 params.push_back(TestParams(
220 client_versions, all_supported_versions,
221 client_versions.front(), client_supports_stateless_rejects,
222 server_uses_stateless_rejects_if_peer_supported,
223 congestion_control_tag, auto_tune_flow_control_window,
224 disable_hpack_dynamic_table));
225
226 // Run version negotiation tests tests with no options, or all
227 // the options enabled to avoid a combinatorial explosion.
228 if (enabled_options > 0 && enabled_options < kMaxEnabledOptions) {
229 continue; 217 continue;
230 } 218 }
231 219
232 // Test client supporting all versions and server supporting 1 220 for (const QuicVersionVector& client_versions : version_buckets) {
233 // version. Simulate an old server and exercise version downgrade 221 if (client_versions.front() < QUIC_VERSION_30 &&
234 // in the client. Protocol negotiation should occur. Skip the i =
235 // 0 case because it is essentially the same as the default case.
236 for (size_t i = 1; i < client_versions.size(); ++i) {
237 if (client_versions[i] < QUIC_VERSION_30 &&
238 FLAGS_quic_disable_pre_30) { 222 FLAGS_quic_disable_pre_30) {
239 continue; 223 continue;
240 } 224 }
241 QuicVersionVector server_supported_versions; 225 CHECK(!client_versions.empty());
242 server_supported_versions.push_back(client_versions[i]); 226 // Add an entry for server and client supporting all versions.
243 params.push_back(TestParams( 227 params.push_back(TestParams(
244 client_versions, server_supported_versions, 228 client_versions, all_supported_versions,
245 server_supported_versions.front(), 229 client_versions.front(), client_supports_stateless_rejects,
246 client_supports_stateless_rejects,
247 server_uses_stateless_rejects_if_peer_supported, 230 server_uses_stateless_rejects_if_peer_supported,
248 congestion_control_tag, auto_tune_flow_control_window, 231 congestion_control_tag, auto_tune_flow_control_window,
249 disable_hpack_dynamic_table)); 232 disable_hpack_dynamic_table, force_hol_blocking));
233
234 // Run version negotiation tests tests with no options, or all
235 // the options enabled to avoid a combinatorial explosion.
236 if (enabled_options > 0 &&
237 enabled_options < kMaxEnabledOptions) {
238 continue;
239 }
240
241 // Test client supporting all versions and server
242 // supporting 1 version. Simulate an old server and
243 // exercise version downgrade in the client. Protocol
244 // negotiation should occur. Skip the i = 0 case
245 // because it is essentially the same as the default
246 // case.
247 for (size_t i = 1; i < client_versions.size(); ++i) {
248 if (client_versions[i] < QUIC_VERSION_30 &&
249 FLAGS_quic_disable_pre_30) {
250 continue;
251 }
252 QuicVersionVector server_supported_versions;
253 server_supported_versions.push_back(client_versions[i]);
254 params.push_back(TestParams(
255 client_versions, server_supported_versions,
256 server_supported_versions.front(),
257 client_supports_stateless_rejects,
258 server_uses_stateless_rejects_if_peer_supported,
259 congestion_control_tag, auto_tune_flow_control_window,
260 disable_hpack_dynamic_table, force_hol_blocking));
261 }
250 } 262 }
251 } 263 }
252 } 264 }
253 } 265 }
254 } 266 }
255 } 267 }
256 CHECK_EQ(kMaxEnabledOptions, max_enabled_options); 268 CHECK_EQ(kMaxEnabledOptions, max_enabled_options);
257 } 269 }
258 return params; 270 return params;
259 } 271 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 if (GetParam().client_supports_stateless_rejects) { 407 if (GetParam().client_supports_stateless_rejects) {
396 copt.push_back(kSREJ); 408 copt.push_back(kSREJ);
397 } 409 }
398 if (GetParam().auto_tune_flow_control_window) { 410 if (GetParam().auto_tune_flow_control_window) {
399 copt.push_back(kAFCW); 411 copt.push_back(kAFCW);
400 copt.push_back(kIFW5); 412 copt.push_back(kIFW5);
401 } 413 }
402 if (GetParam().disable_hpack_dynamic_table) { 414 if (GetParam().disable_hpack_dynamic_table) {
403 copt.push_back(kDHDT); 415 copt.push_back(kDHDT);
404 } 416 }
417 if (GetParam().force_hol_blocking) {
418 client_config_.SetForceHolBlocking();
419 QuicConfigPeer::SetReceivedForceHolBlocking(&server_config_);
420 }
405 client_config_.SetConnectionOptionsToSend(copt); 421 client_config_.SetConnectionOptionsToSend(copt);
406 422
407 // Start the server first, because CreateQuicClient() attempts 423 // Start the server first, because CreateQuicClient() attempts
408 // to connect to the server. 424 // to connect to the server.
409 StartServer(); 425 StartServer();
410 426
411 client_.reset(CreateQuicClient(client_writer_)); 427 client_.reset(CreateQuicClient(client_writer_));
412 static EpollEvent event(EPOLLOUT, false); 428 static EpollEvent event(EPOLLOUT, false);
413 client_writer_->Initialize( 429 client_writer_->Initialize(
414 reinterpret_cast<QuicEpollConnectionHelper*>( 430 reinterpret_cast<QuicEpollConnectionHelper*>(
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 bool server_started_; 588 bool server_started_;
573 QuicConfig client_config_; 589 QuicConfig client_config_;
574 QuicConfig server_config_; 590 QuicConfig server_config_;
575 QuicVersionVector client_supported_versions_; 591 QuicVersionVector client_supported_versions_;
576 QuicVersionVector server_supported_versions_; 592 QuicVersionVector server_supported_versions_;
577 QuicVersion negotiated_version_; 593 QuicVersion negotiated_version_;
578 bool strike_register_no_startup_period_; 594 bool strike_register_no_startup_period_;
579 size_t chlo_multiplier_; 595 size_t chlo_multiplier_;
580 QuicTestServer::StreamFactory* stream_factory_; 596 QuicTestServer::StreamFactory* stream_factory_;
581 bool support_server_push_; 597 bool support_server_push_;
598 bool force_hol_blocking_;
582 }; 599 };
583 600
584 // Run all end to end tests with all supported versions. 601 // Run all end to end tests with all supported versions.
585 INSTANTIATE_TEST_CASE_P(EndToEndTests, 602 INSTANTIATE_TEST_CASE_P(EndToEndTests,
586 EndToEndTest, 603 EndToEndTest,
587 ::testing::ValuesIn(GetTestParams())); 604 ::testing::ValuesIn(GetTestParams()));
588 605
589 TEST_P(EndToEndTest, SimpleRequestResponse) { 606 TEST_P(EndToEndTest, SimpleRequestResponse) {
590 ASSERT_TRUE(Initialize()); 607 ASSERT_TRUE(Initialize());
591 608
(...skipping 2225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 client_->WaitForResponse(); 2834 client_->WaitForResponse();
2818 // TODO(fayang): Fix this test to work with stateless rejects. 2835 // TODO(fayang): Fix this test to work with stateless rejects.
2819 if (!BothSidesSupportStatelessRejects()) { 2836 if (!BothSidesSupportStatelessRejects()) {
2820 VerifyCleanConnection(true); 2837 VerifyCleanConnection(true);
2821 } 2838 }
2822 } 2839 }
2823 2840
2824 } // namespace 2841 } // namespace
2825 } // namespace test 2842 } // namespace test
2826 } // namespace net 2843 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/test_tools/quic_test_utils.h ('k') | net/tools/quic/quic_simple_server_session_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698