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

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

Issue 2236973002: Landing Recent QUIC changes until 4AM, Aug 7, 2016 UTC-4 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: flip quic_sequencer_buffer_retire_block_in_time to true 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 | « net/tools/quic/chlo_extractor_test.cc ('k') | net/tools/quic/quic_client_base.h » ('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 30 matching lines...) Expand all
41 #include "net/tools/epoll_server/epoll_server.h" 41 #include "net/tools/epoll_server/epoll_server.h"
42 #include "net/tools/quic/quic_epoll_connection_helper.h" 42 #include "net/tools/quic/quic_epoll_connection_helper.h"
43 #include "net/tools/quic/quic_in_memory_cache.h" 43 #include "net/tools/quic/quic_in_memory_cache.h"
44 #include "net/tools/quic/quic_packet_writer_wrapper.h" 44 #include "net/tools/quic/quic_packet_writer_wrapper.h"
45 #include "net/tools/quic/quic_server.h" 45 #include "net/tools/quic/quic_server.h"
46 #include "net/tools/quic/quic_simple_server_stream.h" 46 #include "net/tools/quic/quic_simple_server_stream.h"
47 #include "net/tools/quic/quic_socket_utils.h" 47 #include "net/tools/quic/quic_socket_utils.h"
48 #include "net/tools/quic/quic_spdy_client_stream.h" 48 #include "net/tools/quic/quic_spdy_client_stream.h"
49 #include "net/tools/quic/test_tools/http_message.h" 49 #include "net/tools/quic/test_tools/http_message.h"
50 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" 50 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h"
51 #include "net/tools/quic/test_tools/packet_reordering_writer.h"
51 #include "net/tools/quic/test_tools/quic_client_peer.h" 52 #include "net/tools/quic/test_tools/quic_client_peer.h"
52 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h" 53 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h"
53 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" 54 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h"
54 #include "net/tools/quic/test_tools/quic_server_peer.h" 55 #include "net/tools/quic/test_tools/quic_server_peer.h"
55 #include "net/tools/quic/test_tools/quic_test_client.h" 56 #include "net/tools/quic/test_tools/quic_test_client.h"
56 #include "net/tools/quic/test_tools/quic_test_server.h" 57 #include "net/tools/quic/test_tools/quic_test_server.h"
57 #include "net/tools/quic/test_tools/server_thread.h" 58 #include "net/tools/quic/test_tools/server_thread.h"
58 #include "testing/gtest/include/gtest/gtest.h" 59 #include "testing/gtest/include/gtest/gtest.h"
59 60
60 using base::IntToString; 61 using base::IntToString;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 94
94 // Run all tests with the cross products of all versions. 95 // Run all tests with the cross products of all versions.
95 struct TestParams { 96 struct TestParams {
96 TestParams(const QuicVersionVector& client_supported_versions, 97 TestParams(const QuicVersionVector& client_supported_versions,
97 const QuicVersionVector& server_supported_versions, 98 const QuicVersionVector& server_supported_versions,
98 QuicVersion negotiated_version, 99 QuicVersion negotiated_version,
99 bool client_supports_stateless_rejects, 100 bool client_supports_stateless_rejects,
100 bool server_uses_stateless_rejects_if_peer_supported, 101 bool server_uses_stateless_rejects_if_peer_supported,
101 QuicTag congestion_control_tag, 102 QuicTag congestion_control_tag,
102 bool disable_hpack_dynamic_table, 103 bool disable_hpack_dynamic_table,
103 bool force_hol_blocking) 104 bool force_hol_blocking,
105 bool use_cheap_stateless_reject,
106 bool buffer_packet_till_chlo)
104 : client_supported_versions(client_supported_versions), 107 : client_supported_versions(client_supported_versions),
105 server_supported_versions(server_supported_versions), 108 server_supported_versions(server_supported_versions),
106 negotiated_version(negotiated_version), 109 negotiated_version(negotiated_version),
107 client_supports_stateless_rejects(client_supports_stateless_rejects), 110 client_supports_stateless_rejects(client_supports_stateless_rejects),
108 server_uses_stateless_rejects_if_peer_supported( 111 server_uses_stateless_rejects_if_peer_supported(
109 server_uses_stateless_rejects_if_peer_supported), 112 server_uses_stateless_rejects_if_peer_supported),
110 congestion_control_tag(congestion_control_tag), 113 congestion_control_tag(congestion_control_tag),
111 disable_hpack_dynamic_table(disable_hpack_dynamic_table), 114 disable_hpack_dynamic_table(disable_hpack_dynamic_table),
112 force_hol_blocking(force_hol_blocking) {} 115 force_hol_blocking(force_hol_blocking),
116 use_cheap_stateless_reject(use_cheap_stateless_reject),
117 buffer_packet_till_chlo(buffer_packet_till_chlo) {}
113 118
114 friend ostream& operator<<(ostream& os, const TestParams& p) { 119 friend ostream& operator<<(ostream& os, const TestParams& p) {
115 os << "{ server_supported_versions: " 120 os << "{ server_supported_versions: "
116 << QuicVersionVectorToString(p.server_supported_versions); 121 << QuicVersionVectorToString(p.server_supported_versions);
117 os << " client_supported_versions: " 122 os << " client_supported_versions: "
118 << QuicVersionVectorToString(p.client_supported_versions); 123 << QuicVersionVectorToString(p.client_supported_versions);
119 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); 124 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version);
120 os << " client_supports_stateless_rejects: " 125 os << " client_supports_stateless_rejects: "
121 << p.client_supports_stateless_rejects; 126 << p.client_supports_stateless_rejects;
122 os << " server_uses_stateless_rejects_if_peer_supported: " 127 os << " server_uses_stateless_rejects_if_peer_supported: "
123 << p.server_uses_stateless_rejects_if_peer_supported; 128 << p.server_uses_stateless_rejects_if_peer_supported;
124 os << " congestion_control_tag: " 129 os << " congestion_control_tag: "
125 << QuicUtils::TagToString(p.congestion_control_tag); 130 << QuicUtils::TagToString(p.congestion_control_tag);
126 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table; 131 os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table;
127 os << " force_hol_blocking: " << p.force_hol_blocking << " }"; 132 os << " force_hol_blocking: " << p.force_hol_blocking;
133 os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject;
134 os << " buffer_packet_till_chlo: " << p.buffer_packet_till_chlo << " }";
128 return os; 135 return os;
129 } 136 }
130 137
131 QuicVersionVector client_supported_versions; 138 QuicVersionVector client_supported_versions;
132 QuicVersionVector server_supported_versions; 139 QuicVersionVector server_supported_versions;
133 QuicVersion negotiated_version; 140 QuicVersion negotiated_version;
134 bool client_supports_stateless_rejects; 141 bool client_supports_stateless_rejects;
135 bool server_uses_stateless_rejects_if_peer_supported; 142 bool server_uses_stateless_rejects_if_peer_supported;
136 QuicTag congestion_control_tag; 143 QuicTag congestion_control_tag;
137 bool disable_hpack_dynamic_table; 144 bool disable_hpack_dynamic_table;
138 bool force_hol_blocking; 145 bool force_hol_blocking;
146 bool use_cheap_stateless_reject;
147 bool buffer_packet_till_chlo;
139 }; 148 };
140 149
141 // Constructs various test permutations. 150 // Constructs various test permutations.
142 vector<TestParams> GetTestParams() { 151 vector<TestParams> GetTestParams() {
143 // Divide the versions into buckets in which the intra-frame format 152 // Divide the versions into buckets in which the intra-frame format
144 // is compatible. When clients encounter QUIC version negotiation 153 // is compatible. When clients encounter QUIC version negotiation
145 // they simply retransmit all packets using the new version's 154 // they simply retransmit all packets using the new version's
146 // QUIC framing. However, they are unable to change the intra-frame 155 // QUIC framing. However, they are unable to change the intra-frame
147 // 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
148 // these tests need to ensure that clients are never attempting 157 // these tests need to ensure that clients are never attempting
149 // to do 0-RTT across incompatible versions. Chromium only supports 158 // to do 0-RTT across incompatible versions. Chromium only supports
150 // a single version at a time anyway. :) 159 // a single version at a time anyway. :)
151 QuicVersionVector all_supported_versions = QuicSupportedVersions(); 160 QuicVersionVector all_supported_versions = AllSupportedVersions();
152 QuicVersionVector version_buckets[4]; 161 QuicVersionVector version_buckets[4];
153 162
154 for (const QuicVersion version : all_supported_versions) { 163 for (const QuicVersion version : all_supported_versions) {
155 if (version <= QUIC_VERSION_30) { 164 if (version <= QUIC_VERSION_30) {
156 // Versions: 30 165 // Versions: 30
157 // v26 adds a hash of the expected leaf cert in the XLCT tag. 166 // v26 adds a hash of the expected leaf cert in the XLCT tag.
158 version_buckets[0].push_back(version); 167 version_buckets[0].push_back(version);
159 } else if (version <= QUIC_VERSION_32) { 168 } else if (version <= QUIC_VERSION_32) {
160 // Versions: 31-32 169 // Versions: 31-32
161 // v31 adds a hash of the CHLO into the proof signature. 170 // v31 adds a hash of the CHLO into the proof signature.
162 version_buckets[1].push_back(version); 171 version_buckets[1].push_back(version);
163 } else if (version <= QUIC_VERSION_33) { 172 } else if (version <= QUIC_VERSION_33) {
164 // Versions: 33 173 // Versions: 33
165 // v33 adds a diversification nonce into the hkdf. 174 // v33 adds a diversification nonce into the hkdf.
166 version_buckets[2].push_back(version); 175 version_buckets[2].push_back(version);
167 } else { 176 } else {
168 // Versions: 34+ 177 // Versions: 34+
169 // 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
170 // wire formats. 179 // wire formats.
171 version_buckets[3].push_back(version); 180 version_buckets[3].push_back(version);
172 } 181 }
173 } 182 }
174 183
175 // 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
176 // is used to prune the number of tests that are run. 185 // is used to prune the number of tests that are run.
177 const int kMaxEnabledOptions = 4; 186 const int kMaxEnabledOptions = 6;
178 int max_enabled_options = 0; 187 int max_enabled_options = 0;
179 vector<TestParams> params; 188 vector<TestParams> params;
180 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { 189 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
181 for (bool client_supports_stateless_rejects : {true, false}) { 190 for (bool client_supports_stateless_rejects : {true, false}) {
182 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) { 191 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) {
183 for (bool disable_hpack_dynamic_table : {false}) { 192 for (bool disable_hpack_dynamic_table : {false}) {
184 for (bool force_hol_blocking : {true, false}) { 193 for (bool force_hol_blocking : {true, false}) {
185 int enabled_options = 0; 194 for (bool use_cheap_stateless_reject : {true, false}) {
186 if (force_hol_blocking) { 195 for (bool buffer_packet_till_chlo : {true, false}) {
187 ++enabled_options; 196 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) {
188 } 197 // Doing stateless reject while not buffering packet
189 if (congestion_control_tag != kQBIC) { 198 // before CHLO is not allowed.
190 ++enabled_options; 199 break;
191 } 200 }
192 if (disable_hpack_dynamic_table) { 201 int enabled_options = 0;
193 ++enabled_options; 202 if (force_hol_blocking) {
194 } 203 ++enabled_options;
195 if (client_supports_stateless_rejects) { 204 }
196 ++enabled_options; 205 if (congestion_control_tag != kQBIC) {
197 } 206 ++enabled_options;
198 if (server_uses_stateless_rejects_if_peer_supported) { 207 }
199 ++enabled_options; 208 if (disable_hpack_dynamic_table) {
200 } 209 ++enabled_options;
201 CHECK_GE(kMaxEnabledOptions, enabled_options); 210 }
202 if (enabled_options > max_enabled_options) { 211 if (client_supports_stateless_rejects) {
203 max_enabled_options = enabled_options; 212 ++enabled_options;
204 } 213 }
214 if (server_uses_stateless_rejects_if_peer_supported) {
215 ++enabled_options;
216 }
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 }
205 227
206 // Run tests with no options, a single option, or all the options 228 // Run tests with no options, a single option, or all the
207 // enabled to avoid a combinatorial explosion. 229 // options enabled to avoid a combinatorial explosion.
208 if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) { 230 if (enabled_options > 1 &&
209 continue; 231 enabled_options < kMaxEnabledOptions) {
210 } 232 continue;
233 }
211 234
212 for (const QuicVersionVector& client_versions : version_buckets) { 235 for (const QuicVersionVector& client_versions :
213 CHECK(!client_versions.empty()); 236 version_buckets) {
214 // Add an entry for server and client supporting all versions. 237 CHECK(!client_versions.empty());
215 params.push_back(TestParams( 238 // Add an entry for server and client supporting all versions.
216 client_versions, all_supported_versions, 239 params.push_back(TestParams(
217 client_versions.front(), client_supports_stateless_rejects, 240 client_versions, all_supported_versions,
218 server_uses_stateless_rejects_if_peer_supported, 241 client_versions.front(),
219 congestion_control_tag, disable_hpack_dynamic_table, 242 client_supports_stateless_rejects,
220 force_hol_blocking)); 243 server_uses_stateless_rejects_if_peer_supported,
244 congestion_control_tag, disable_hpack_dynamic_table,
245 force_hol_blocking, use_cheap_stateless_reject,
246 buffer_packet_till_chlo));
221 247
222 // Run version negotiation tests tests with no options, or all 248 // Run version negotiation tests tests with no options, or all
223 // the options enabled to avoid a combinatorial explosion. 249 // the options enabled to avoid a combinatorial explosion.
224 if (enabled_options > 0 && enabled_options < kMaxEnabledOptions) { 250 if (enabled_options > 0 &&
225 continue; 251 enabled_options < kMaxEnabledOptions) {
226 } 252 continue;
253 }
227 254
228 // Test client supporting all versions and server 255 // Test client supporting all versions and server supporting 1
229 // supporting 1 version. Simulate an old server and 256 // version. Simulate an old server and exercise version
230 // exercise version downgrade in the client. Protocol 257 // downgrade in the client. Protocol negotiation should occur.
231 // negotiation should occur. Skip the i = 0 case 258 // Skip the i = 0 case because it is essentially the same as
232 // because it is essentially the same as the default 259 // the default case.
233 // case. 260 for (size_t i = 1; i < client_versions.size(); ++i) {
234 for (size_t i = 1; i < client_versions.size(); ++i) { 261 QuicVersionVector server_supported_versions;
235 QuicVersionVector server_supported_versions; 262 server_supported_versions.push_back(client_versions[i]);
236 server_supported_versions.push_back(client_versions[i]); 263 params.push_back(TestParams(
237 params.push_back(TestParams( 264 client_versions, server_supported_versions,
238 client_versions, server_supported_versions, 265 server_supported_versions.front(),
239 server_supported_versions.front(), 266 client_supports_stateless_rejects,
240 client_supports_stateless_rejects, 267 server_uses_stateless_rejects_if_peer_supported,
241 server_uses_stateless_rejects_if_peer_supported, 268 congestion_control_tag, disable_hpack_dynamic_table,
242 congestion_control_tag, disable_hpack_dynamic_table, 269 force_hol_blocking, use_cheap_stateless_reject,
243 force_hol_blocking)); 270 buffer_packet_till_chlo));
244 } 271 } // End of version for loop.
245 } 272 } // End of 2nd version for loop.
246 } 273 } // End of buffer_packet_till_chlo loop.
247 } 274 } // End of use_cheap_stateless_reject for loop.
248 } 275 } // End of force_hol_blocking loop.
249 } 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.
250 CHECK_EQ(kMaxEnabledOptions, max_enabled_options); 279 CHECK_EQ(kMaxEnabledOptions, max_enabled_options);
251 } 280 } // End of server_uses_stateless_rejects_if_peer_supported for loop.
252 return params; 281 return params;
253 } 282 }
254 283
255 class ServerDelegate : public PacketDroppingTestWriter::Delegate { 284 class ServerDelegate : public PacketDroppingTestWriter::Delegate {
256 public: 285 public:
257 explicit ServerDelegate(QuicDispatcher* dispatcher) 286 explicit ServerDelegate(QuicDispatcher* dispatcher)
258 : dispatcher_(dispatcher) {} 287 : dispatcher_(dispatcher) {}
259 ~ServerDelegate() override {} 288 ~ServerDelegate() override {}
260 void OnCanWrite() override { dispatcher_->OnCanWrite(); } 289 void OnCanWrite() override { dispatcher_->OnCanWrite(); }
261 290
(...skipping 13 matching lines...) Expand all
275 private: 304 private:
276 QuicClient* client_; 305 QuicClient* client_;
277 }; 306 };
278 307
279 class EndToEndTest : public ::testing::TestWithParam<TestParams> { 308 class EndToEndTest : public ::testing::TestWithParam<TestParams> {
280 protected: 309 protected:
281 EndToEndTest() 310 EndToEndTest()
282 : initialized_(false), 311 : initialized_(false),
283 server_address_(IPEndPoint(Loopback4(), 0)), 312 server_address_(IPEndPoint(Loopback4(), 0)),
284 server_hostname_("test.example.com"), 313 server_hostname_("test.example.com"),
314 client_writer_(nullptr),
315 server_writer_(nullptr),
285 server_started_(false), 316 server_started_(false),
286 strike_register_no_startup_period_(false), 317 strike_register_no_startup_period_(false),
287 chlo_multiplier_(0), 318 chlo_multiplier_(0),
288 stream_factory_(nullptr), 319 stream_factory_(nullptr),
289 support_server_push_(false) { 320 support_server_push_(false) {
290 client_supported_versions_ = GetParam().client_supported_versions; 321 client_supported_versions_ = GetParam().client_supported_versions;
291 server_supported_versions_ = GetParam().server_supported_versions; 322 server_supported_versions_ = GetParam().server_supported_versions;
292 negotiated_version_ = GetParam().negotiated_version; 323 negotiated_version_ = GetParam().negotiated_version;
293 324
294 VLOG(1) << "Using Configuration: " << GetParam(); 325 VLOG(1) << "Using Configuration: " << GetParam();
(...skipping 20 matching lines...) Expand all
315 AddToCache("/foo", 200, kFooResponseBody); 346 AddToCache("/foo", 200, kFooResponseBody);
316 AddToCache("/bar", 200, kBarResponseBody); 347 AddToCache("/bar", 200, kBarResponseBody);
317 } 348 }
318 349
319 ~EndToEndTest() override { 350 ~EndToEndTest() override {
320 // TODO(rtenneti): port RecycleUnusedPort if needed. 351 // TODO(rtenneti): port RecycleUnusedPort if needed.
321 // RecycleUnusedPort(server_address_.port()); 352 // RecycleUnusedPort(server_address_.port());
322 QuicInMemoryCachePeer::ResetForTests(); 353 QuicInMemoryCachePeer::ResetForTests();
323 } 354 }
324 355
356 virtual void CreateClientWithWriter() {
357 client_.reset(CreateQuicClient(client_writer_));
358 }
359
325 QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) { 360 QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) {
326 QuicTestClient* client = new QuicTestClient( 361 QuicTestClient* client = new QuicTestClient(
327 server_address_, server_hostname_, client_config_, 362 server_address_, server_hostname_, client_config_,
328 client_supported_versions_, CryptoTestUtils::ProofVerifierForTesting()); 363 client_supported_versions_, CryptoTestUtils::ProofVerifierForTesting());
329 client->UseWriter(writer); 364 client->UseWriter(writer);
330 client->Connect(); 365 client->Connect();
331 return client; 366 return client;
332 } 367 }
333 368
334 void set_smaller_flow_control_receive_window() { 369 void set_smaller_flow_control_receive_window() {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 copt.push_back(kSPSH); 422 copt.push_back(kSPSH);
388 } 423 }
389 if (GetParam().client_supports_stateless_rejects) { 424 if (GetParam().client_supports_stateless_rejects) {
390 copt.push_back(kSREJ); 425 copt.push_back(kSREJ);
391 } 426 }
392 if (GetParam().disable_hpack_dynamic_table) { 427 if (GetParam().disable_hpack_dynamic_table) {
393 copt.push_back(kDHDT); 428 copt.push_back(kDHDT);
394 } 429 }
395 if (GetParam().force_hol_blocking) { 430 if (GetParam().force_hol_blocking) {
396 client_config_.SetForceHolBlocking(); 431 client_config_.SetForceHolBlocking();
397 QuicConfigPeer::SetReceivedForceHolBlocking(&server_config_);
398 } 432 }
399 client_config_.SetConnectionOptionsToSend(copt); 433 client_config_.SetConnectionOptionsToSend(copt);
400 434
401 // Start the server first, because CreateQuicClient() attempts 435 // Start the server first, because CreateQuicClient() attempts
402 // to connect to the server. 436 // to connect to the server.
403 StartServer(); 437 StartServer();
404 438
405 client_.reset(CreateQuicClient(client_writer_)); 439 CreateClientWithWriter();
406 static EpollEvent event(EPOLLOUT, false); 440 static EpollEvent event(EPOLLOUT, false);
407 client_writer_->Initialize( 441 if (client_writer_ != nullptr) {
408 reinterpret_cast<QuicEpollConnectionHelper*>( 442 client_writer_->Initialize(
409 QuicConnectionPeer::GetHelper( 443 reinterpret_cast<QuicEpollConnectionHelper*>(
410 client_->client()->session()->connection())), 444 QuicConnectionPeer::GetHelper(
411 QuicConnectionPeer::GetAlarmFactory( 445 client_->client()->session()->connection())),
412 client_->client()->session()->connection()), 446 QuicConnectionPeer::GetAlarmFactory(
413 new ClientDelegate(client_->client())); 447 client_->client()->session()->connection()),
414 448 new ClientDelegate(client_->client()));
449 }
415 initialized_ = true; 450 initialized_ = true;
416 return client_->client()->connected(); 451 return client_->client()->connected();
417 } 452 }
418 453
419 void SetUp() override { 454 void SetUp() override {
420 // The ownership of these gets transferred to the QuicPacketWriterWrapper 455 // The ownership of these gets transferred to the QuicPacketWriterWrapper
421 // when Initialize() is executed. 456 // when Initialize() is executed.
422 client_writer_ = new PacketDroppingTestWriter(); 457 client_writer_ = new PacketDroppingTestWriter();
423 server_writer_ = new PacketDroppingTestWriter(); 458 server_writer_ = new PacketDroppingTestWriter();
424 } 459 }
425 460
426 void TearDown() override { 461 void TearDown() override {
427 ASSERT_TRUE(initialized_) << "You must call Initialize() in every test " 462 ASSERT_TRUE(initialized_) << "You must call Initialize() in every test "
428 << "case. Otherwise, your test will leak memory."; 463 << "case. Otherwise, your test will leak memory.";
429 StopServer(); 464 StopServer();
430 } 465 }
431 466
432 void StartServer() { 467 void StartServer() {
468 FLAGS_quic_buffer_packet_till_chlo = GetParam().buffer_packet_till_chlo;
469 FLAGS_quic_use_cheap_stateless_rejects =
470 GetParam().use_cheap_stateless_reject;
433 server_thread_.reset(new ServerThread( 471 server_thread_.reset(new ServerThread(
434 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(), 472 new QuicTestServer(CryptoTestUtils::ProofSourceForTesting(),
435 server_config_, server_supported_versions_), 473 server_config_, server_supported_versions_),
436 server_address_, strike_register_no_startup_period_)); 474 server_address_, strike_register_no_startup_period_));
437 if (chlo_multiplier_ != 0) { 475 if (chlo_multiplier_ != 0) {
438 server_thread_->server()->SetChloMultiplier(chlo_multiplier_); 476 server_thread_->server()->SetChloMultiplier(chlo_multiplier_);
439 } 477 }
440 server_thread_->Initialize(); 478 server_thread_->Initialize();
441 server_address_ = 479 server_address_ =
442 IPEndPoint(server_address_.address(), server_thread_->GetPort()); 480 IPEndPoint(server_address_.address(), server_thread_->GetPort());
(...skipping 2337 matching lines...) Expand 10 before | Expand all | Expand 10 after
2780 client_->client()->WaitForCryptoHandshakeConfirmed(); 2818 client_->client()->WaitForCryptoHandshakeConfirmed();
2781 SetPacketLossPercentage(1); 2819 SetPacketLossPercentage(1);
2782 client_->SendRequest("/huge_response"); 2820 client_->SendRequest("/huge_response");
2783 client_->WaitForResponse(); 2821 client_->WaitForResponse();
2784 // TODO(fayang): Fix this test to work with stateless rejects. 2822 // TODO(fayang): Fix this test to work with stateless rejects.
2785 if (!BothSidesSupportStatelessRejects()) { 2823 if (!BothSidesSupportStatelessRejects()) {
2786 VerifyCleanConnection(true); 2824 VerifyCleanConnection(true);
2787 } 2825 }
2788 } 2826 }
2789 2827
2828 class EndToEndBufferedPacketsTest : public EndToEndTest {
2829 public:
2830 EndToEndBufferedPacketsTest() : EndToEndTest() {
2831 FLAGS_quic_buffer_packet_till_chlo = true;
2832 }
2833
2834 void CreateClientWithWriter() override {
2835 LOG(ERROR) << "create client with reorder_writer_ ";
2836 reorder_writer_ = new PacketReorderingWriter();
2837 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_));
2838 }
2839
2840 void SetUp() override {
2841 // Don't initialize client writer in base class.
2842 server_writer_ = new PacketDroppingTestWriter();
2843 }
2844
2845 protected:
2846 PacketReorderingWriter* reorder_writer_;
2847 };
2848
2849 INSTANTIATE_TEST_CASE_P(EndToEndBufferedPacketsTests,
2850 EndToEndBufferedPacketsTest,
2851 testing::ValuesIn(GetTestParams()));
2852
2853 TEST_P(EndToEndBufferedPacketsTest, Buffer0RttRequest) {
2854 ASSERT_TRUE(Initialize());
2855 if (negotiated_version_ <= QUIC_VERSION_32) {
2856 // Since no 0-rtt for v32 and under, and this test relies on 0-rtt, skip
2857 // this test if QUIC doesn't do 0-rtt.
2858 return;
2859 }
2860 // Finish one request to make sure handshake established.
2861 client_->SendSynchronousRequest("/foo");
2862 // Disconnect for next 0-rtt request.
2863 client_->Disconnect();
2864
2865 // Client get valid STK now. Do a 0-rtt request.
2866 // Buffer a CHLO till another packets sent out.
2867 reorder_writer_->SetDelay(1);
2868 // Only send out a CHLO.
2869 client_->client()->Initialize();
2870 client_->client()->StartConnect();
2871 ASSERT_TRUE(client_->client()->connected());
2872 // Send a request before handshake finishes.
2873 HTTPMessage request(HttpConstants::HTTP_1_1, HttpConstants::GET, "/bar");
2874 client_->SendMessage(request);
2875 client_->WaitForResponse();
2876 EXPECT_EQ(kBarResponseBody, client_->response_body());
2877 QuicConnectionStats client_stats =
2878 client_->client()->session()->connection()->GetStats();
2879 EXPECT_EQ(0u, client_stats.packets_lost);
2880 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos());
2881 }
2882
2790 } // namespace 2883 } // namespace
2791 } // namespace test 2884 } // namespace test
2792 } // namespace net 2885 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/chlo_extractor_test.cc ('k') | net/tools/quic/quic_client_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698