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

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

Issue 2484603002: Deprecate FLAGS_quic_buffer_packet_till_chlo. (Closed)
Patch Set: Created 4 years, 1 month 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_server_session_base_test.cc ('k') | net/tools/quic/quic_dispatcher.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 <cstdint> 8 #include <cstdint>
9 #include <list> 9 #include <list>
10 #include <memory> 10 #include <memory>
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 // Run all tests with the cross products of all versions. 79 // Run all tests with the cross products of all versions.
80 struct TestParams { 80 struct TestParams {
81 TestParams(const QuicVersionVector& client_supported_versions, 81 TestParams(const QuicVersionVector& client_supported_versions,
82 const QuicVersionVector& server_supported_versions, 82 const QuicVersionVector& server_supported_versions,
83 QuicVersion negotiated_version, 83 QuicVersion negotiated_version,
84 bool client_supports_stateless_rejects, 84 bool client_supports_stateless_rejects,
85 bool server_uses_stateless_rejects_if_peer_supported, 85 bool server_uses_stateless_rejects_if_peer_supported,
86 QuicTag congestion_control_tag, 86 QuicTag congestion_control_tag,
87 bool disable_hpack_dynamic_table, 87 bool disable_hpack_dynamic_table,
88 bool force_hol_blocking, 88 bool force_hol_blocking,
89 bool use_cheap_stateless_reject, 89 bool use_cheap_stateless_reject)
90 bool buffer_packet_till_chlo)
91 : client_supported_versions(client_supported_versions), 90 : client_supported_versions(client_supported_versions),
92 server_supported_versions(server_supported_versions), 91 server_supported_versions(server_supported_versions),
93 negotiated_version(negotiated_version), 92 negotiated_version(negotiated_version),
94 client_supports_stateless_rejects(client_supports_stateless_rejects), 93 client_supports_stateless_rejects(client_supports_stateless_rejects),
95 server_uses_stateless_rejects_if_peer_supported( 94 server_uses_stateless_rejects_if_peer_supported(
96 server_uses_stateless_rejects_if_peer_supported), 95 server_uses_stateless_rejects_if_peer_supported),
97 congestion_control_tag(congestion_control_tag), 96 congestion_control_tag(congestion_control_tag),
98 disable_hpack_dynamic_table(disable_hpack_dynamic_table), 97 disable_hpack_dynamic_table(disable_hpack_dynamic_table),
99 force_hol_blocking(force_hol_blocking), 98 force_hol_blocking(force_hol_blocking),
100 use_cheap_stateless_reject(use_cheap_stateless_reject), 99 use_cheap_stateless_reject(use_cheap_stateless_reject) {}
101 buffer_packet_till_chlo(buffer_packet_till_chlo) {}
102 100
103 friend ostream& operator<<(ostream& os, const TestParams& p) { 101 friend ostream& operator<<(ostream& os, const TestParams& p) {
104 os << "{ server_supported_versions: " 102 os << "{ server_supported_versions: "
105 << QuicVersionVectorToString(p.server_supported_versions); 103 << QuicVersionVectorToString(p.server_supported_versions);
106 os << " client_supported_versions: " 104 os << " client_supported_versions: "
107 << QuicVersionVectorToString(p.client_supported_versions); 105 << QuicVersionVectorToString(p.client_supported_versions);
108 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); 106 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version);
109 os << " client_supports_stateless_rejects: " 107 os << " client_supports_stateless_rejects: "
110 << p.client_supports_stateless_rejects; 108 << p.client_supports_stateless_rejects;
111 os << " server_uses_stateless_rejects_if_peer_supported: " 109 os << " server_uses_stateless_rejects_if_peer_supported: "
112 << p.server_uses_stateless_rejects_if_peer_supported; 110 << p.server_uses_stateless_rejects_if_peer_supported;
113 os << " congestion_control_tag: " 111 os << " congestion_control_tag: "
114 << QuicUtils::TagToString(p.congestion_control_tag); 112 << QuicUtils::TagToString(p.congestion_control_tag);
115 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table; 113 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table;
116 os << " force_hol_blocking: " << p.force_hol_blocking; 114 os << " force_hol_blocking: " << p.force_hol_blocking;
117 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject; 115 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject
118 os << " buffer_packet_till_chlo: " << p.buffer_packet_till_chlo << " }"; 116 << " }";
119 return os; 117 return os;
120 } 118 }
121 119
122 QuicVersionVector client_supported_versions; 120 QuicVersionVector client_supported_versions;
123 QuicVersionVector server_supported_versions; 121 QuicVersionVector server_supported_versions;
124 QuicVersion negotiated_version; 122 QuicVersion negotiated_version;
125 bool client_supports_stateless_rejects; 123 bool client_supports_stateless_rejects;
126 bool server_uses_stateless_rejects_if_peer_supported; 124 bool server_uses_stateless_rejects_if_peer_supported;
127 QuicTag congestion_control_tag; 125 QuicTag congestion_control_tag;
128 bool disable_hpack_dynamic_table; 126 bool disable_hpack_dynamic_table;
129 bool force_hol_blocking; 127 bool force_hol_blocking;
130 bool use_cheap_stateless_reject; 128 bool use_cheap_stateless_reject;
131 bool buffer_packet_till_chlo;
132 }; 129 };
133 130
134 // Constructs various test permutations. 131 // Constructs various test permutations.
135 std::vector<TestParams> GetTestParams() { 132 std::vector<TestParams> GetTestParams() {
136 // Divide the versions into buckets in which the intra-frame format 133 // Divide the versions into buckets in which the intra-frame format
137 // is compatible. When clients encounter QUIC version negotiation 134 // is compatible. When clients encounter QUIC version negotiation
138 // they simply retransmit all packets using the new version's 135 // they simply retransmit all packets using the new version's
139 // QUIC framing. However, they are unable to change the intra-frame 136 // QUIC framing. However, they are unable to change the intra-frame
140 // layout (for example to change HTTP/2 headers to SPDY/3). So 137 // layout (for example to change HTTP/2 headers to SPDY/3). So
141 // these tests need to ensure that clients are never attempting 138 // these tests need to ensure that clients are never attempting
(...skipping 14 matching lines...) Expand all
156 } else { 153 } else {
157 // Versions: 34+ 154 // Versions: 34+
158 // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting 155 // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting
159 // wire formats. 156 // wire formats.
160 version_buckets[2].push_back(version); 157 version_buckets[2].push_back(version);
161 } 158 }
162 } 159 }
163 160
164 // This must be kept in sync with the number of nested for-loops below as it 161 // This must be kept in sync with the number of nested for-loops below as it
165 // is used to prune the number of tests that are run. 162 // is used to prune the number of tests that are run.
166 const int kMaxEnabledOptions = 6; 163 const int kMaxEnabledOptions = 5;
167 int max_enabled_options = 0; 164 int max_enabled_options = 0;
168 std::vector<TestParams> params; 165 std::vector<TestParams> params;
169 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { 166 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
170 for (bool client_supports_stateless_rejects : {true, false}) { 167 for (bool client_supports_stateless_rejects : {true, false}) {
171 for (const QuicTag congestion_control_tag : {kRENO, kTBBR, kQBIC}) { 168 for (const QuicTag congestion_control_tag : {kRENO, kTBBR, kQBIC}) {
172 for (bool disable_hpack_dynamic_table : {false}) { 169 for (bool disable_hpack_dynamic_table : {false}) {
173 for (bool force_hol_blocking : {true, false}) { 170 for (bool force_hol_blocking : {true, false}) {
174 for (bool use_cheap_stateless_reject : {true, false}) { 171 for (bool use_cheap_stateless_reject : {true, false}) {
175 for (bool buffer_packet_till_chlo : {true, false}) { 172 int enabled_options = 0;
176 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) { 173 if (force_hol_blocking) {
177 // Doing stateless reject while not buffering packet 174 ++enabled_options;
178 // before CHLO is not allowed. 175 }
179 break; 176 if (congestion_control_tag != kQBIC) {
177 ++enabled_options;
178 }
179 if (disable_hpack_dynamic_table) {
180 ++enabled_options;
181 }
182 if (client_supports_stateless_rejects) {
183 ++enabled_options;
184 }
185 if (server_uses_stateless_rejects_if_peer_supported) {
186 ++enabled_options;
187 }
188 if (use_cheap_stateless_reject) {
189 ++enabled_options;
190 }
191 CHECK_GE(kMaxEnabledOptions, enabled_options);
192 if (enabled_options > max_enabled_options) {
193 max_enabled_options = enabled_options;
194 }
195
196 // Run tests with no options, a single option, or all the
197 // options enabled to avoid a combinatorial explosion.
198 if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) {
199 continue;
200 }
201
202 for (const QuicVersionVector& client_versions : version_buckets) {
203 CHECK(!client_versions.empty());
204 if (FilterSupportedVersions(client_versions).empty()) {
205 continue;
180 } 206 }
181 int enabled_options = 0; 207 // Add an entry for server and client supporting all
182 if (force_hol_blocking) { 208 // versions.
183 ++enabled_options; 209 params.push_back(TestParams(
184 } 210 client_versions, all_supported_versions,
185 if (congestion_control_tag != kQBIC) { 211 client_versions.front(), client_supports_stateless_rejects,
186 ++enabled_options; 212 server_uses_stateless_rejects_if_peer_supported,
187 } 213 congestion_control_tag, disable_hpack_dynamic_table,
188 if (disable_hpack_dynamic_table) { 214 force_hol_blocking, use_cheap_stateless_reject));
189 ++enabled_options;
190 }
191 if (client_supports_stateless_rejects) {
192 ++enabled_options;
193 }
194 if (server_uses_stateless_rejects_if_peer_supported) {
195 ++enabled_options;
196 }
197 if (buffer_packet_till_chlo) {
198 ++enabled_options;
199 }
200 if (use_cheap_stateless_reject) {
201 ++enabled_options;
202 }
203 CHECK_GE(kMaxEnabledOptions, enabled_options);
204 if (enabled_options > max_enabled_options) {
205 max_enabled_options = enabled_options;
206 }
207 215
208 // Run tests with no options, a single option, or all the 216 // Run version negotiation tests tests with no options, or
209 // options enabled to avoid a combinatorial explosion. 217 // all the options enabled to avoid a combinatorial
218 // explosion.
210 if (enabled_options > 1 && 219 if (enabled_options > 1 &&
211 enabled_options < kMaxEnabledOptions) { 220 enabled_options < kMaxEnabledOptions) {
212 continue; 221 continue;
213 } 222 }
214 223
215 for (const QuicVersionVector& client_versions : 224 // Test client supporting all versions and server supporting
216 version_buckets) { 225 // 1 version. Simulate an old server and exercise version
217 CHECK(!client_versions.empty()); 226 // downgrade in the client. Protocol negotiation should
218 if (FilterSupportedVersions(client_versions).empty()) { 227 // occur. Skip the i = 0 case because it is essentially the
228 // same as the default case.
229 for (size_t i = 1; i < client_versions.size(); ++i) {
230 QuicVersionVector server_supported_versions;
231 server_supported_versions.push_back(client_versions[i]);
232 if (FilterSupportedVersions(server_supported_versions)
233 .empty()) {
219 continue; 234 continue;
220 } 235 }
221 // Add an entry for server and client supporting all
222 // versions.
223 params.push_back(TestParams( 236 params.push_back(TestParams(
224 client_versions, all_supported_versions, 237 client_versions, server_supported_versions,
225 client_versions.front(), 238 server_supported_versions.front(),
226 client_supports_stateless_rejects, 239 client_supports_stateless_rejects,
227 server_uses_stateless_rejects_if_peer_supported, 240 server_uses_stateless_rejects_if_peer_supported,
228 congestion_control_tag, disable_hpack_dynamic_table, 241 congestion_control_tag, disable_hpack_dynamic_table,
229 force_hol_blocking, use_cheap_stateless_reject, 242 force_hol_blocking, use_cheap_stateless_reject));
230 buffer_packet_till_chlo));
231
232 // Run version negotiation tests tests with no options, or
233 // all the options enabled to avoid a combinatorial
234 // explosion.
235 if (enabled_options > 1 &&
236 enabled_options < kMaxEnabledOptions) {
237 continue;
238 }
239
240 // Test client supporting all versions and server supporting
241 // 1 version. Simulate an old server and exercise version
242 // downgrade in the client. Protocol negotiation should
243 // occur. Skip the i = 0 case because it is essentially the
244 // same as the default case.
245 for (size_t i = 1; i < client_versions.size(); ++i) {
246 QuicVersionVector server_supported_versions;
247 server_supported_versions.push_back(client_versions[i]);
248 if (FilterSupportedVersions(server_supported_versions)
249 .empty()) {
250 continue;
251 }
252 params.push_back(TestParams(
253 client_versions, server_supported_versions,
254 server_supported_versions.front(),
255 client_supports_stateless_rejects,
256 server_uses_stateless_rejects_if_peer_supported,
257 congestion_control_tag, disable_hpack_dynamic_table,
258 force_hol_blocking, use_cheap_stateless_reject,
259 buffer_packet_till_chlo));
260 } // End of version for loop. 243 } // End of version for loop.
261 } // End of 2nd version for loop. 244 } // End of 2nd version for loop.
262 } // End of buffer_packet_till_chlo loop.
263 } // End of use_cheap_stateless_reject for loop. 245 } // End of use_cheap_stateless_reject for loop.
264 } // End of force_hol_blocking loop. 246 } // End of force_hol_blocking loop.
265 } // End of disable_hpack_dynamic_table for loop. 247 } // End of disable_hpack_dynamic_table for loop.
266 } // End of congestion_control_tag for loop. 248 } // End of congestion_control_tag for loop.
267 } // End of client_supports_stateless_rejects for loop. 249 } // End of client_supports_stateless_rejects for loop.
268 CHECK_EQ(kMaxEnabledOptions, max_enabled_options); 250 CHECK_EQ(kMaxEnabledOptions, max_enabled_options);
269 } // End of server_uses_stateless_rejects_if_peer_supported for loop. 251 } // End of server_uses_stateless_rejects_if_peer_supported for loop.
270 return params; 252 return params;
271 } 253 }
272 254
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 server_writer_ = new PacketDroppingTestWriter(); 428 server_writer_ = new PacketDroppingTestWriter();
447 } 429 }
448 430
449 void TearDown() override { 431 void TearDown() override {
450 ASSERT_TRUE(initialized_) << "You must call Initialize() in every test " 432 ASSERT_TRUE(initialized_) << "You must call Initialize() in every test "
451 << "case. Otherwise, your test will leak memory."; 433 << "case. Otherwise, your test will leak memory.";
452 StopServer(); 434 StopServer();
453 } 435 }
454 436
455 void StartServer() { 437 void StartServer() {
456 FLAGS_quic_buffer_packet_till_chlo = GetParam().buffer_packet_till_chlo;
457 FLAGS_quic_use_cheap_stateless_rejects = 438 FLAGS_quic_use_cheap_stateless_rejects =
458 GetParam().use_cheap_stateless_reject; 439 GetParam().use_cheap_stateless_reject;
459 if (!FLAGS_quic_buffer_packet_till_chlo) { 440
460 FLAGS_quic_limit_num_new_sessions_per_epoll_loop = false;
461 }
462 auto test_server = 441 auto test_server =
463 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(), 442 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(),
464 server_config_, server_supported_versions_); 443 server_config_, server_supported_versions_);
465 server_thread_.reset(new ServerThread(test_server, server_address_, 444 server_thread_.reset(new ServerThread(test_server, server_address_,
466 strike_register_no_startup_period_)); 445 strike_register_no_startup_period_));
467 if (chlo_multiplier_ != 0) { 446 if (chlo_multiplier_ != 0) {
468 server_thread_->server()->SetChloMultiplier(chlo_multiplier_); 447 server_thread_->server()->SetChloMultiplier(chlo_multiplier_);
469 } 448 }
470 server_thread_->Initialize(); 449 server_thread_->Initialize();
471 server_address_ = 450 server_address_ =
(...skipping 2486 matching lines...) Expand 10 before | Expand all | Expand 10 after
2958 QuicHeadersStream* headers_stream = 2937 QuicHeadersStream* headers_stream =
2959 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); 2938 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session());
2960 QuicStreamSequencer* sequencer = 2939 QuicStreamSequencer* sequencer =
2961 ReliableQuicStreamPeer::sequencer(headers_stream); 2940 ReliableQuicStreamPeer::sequencer(headers_stream);
2962 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, 2941 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer,
2963 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); 2942 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
2964 } 2943 }
2965 2944
2966 class EndToEndBufferedPacketsTest : public EndToEndTest { 2945 class EndToEndBufferedPacketsTest : public EndToEndTest {
2967 public: 2946 public:
2968 EndToEndBufferedPacketsTest() : EndToEndTest() {
2969 FLAGS_quic_buffer_packet_till_chlo = true;
2970 }
2971
2972 void CreateClientWithWriter() override { 2947 void CreateClientWithWriter() override {
2973 LOG(ERROR) << "create client with reorder_writer_ "; 2948 LOG(ERROR) << "create client with reorder_writer_ ";
2974 reorder_writer_ = new PacketReorderingWriter(); 2949 reorder_writer_ = new PacketReorderingWriter();
2975 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_)); 2950 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_));
2976 } 2951 }
2977 2952
2978 void SetUp() override { 2953 void SetUp() override {
2979 // Don't initialize client writer in base class. 2954 // Don't initialize client writer in base class.
2980 server_writer_ = new PacketDroppingTestWriter(); 2955 server_writer_ = new PacketDroppingTestWriter();
2981 } 2956 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3019 client_->WaitForResponse(); 2994 client_->WaitForResponse();
3020 EXPECT_EQ(kBarResponseBody, client_->response_body()); 2995 EXPECT_EQ(kBarResponseBody, client_->response_body());
3021 QuicConnectionStats client_stats = 2996 QuicConnectionStats client_stats =
3022 client_->client()->session()->connection()->GetStats(); 2997 client_->client()->session()->connection()->GetStats();
3023 EXPECT_EQ(0u, client_stats.packets_lost); 2998 EXPECT_EQ(0u, client_stats.packets_lost);
3024 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); 2999 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos());
3025 } 3000 }
3026 } // namespace 3001 } // namespace
3027 } // namespace test 3002 } // namespace test
3028 } // namespace net 3003 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_server_session_base_test.cc ('k') | net/tools/quic/quic_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698