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

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

Issue 2487613002: Landing Recent QUIC changes until 12:43 PM, Nov 5, 2016 UTC+8 (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/test_tools/reliable_quic_stream_peer.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 <cstdint> 8 #include <cstdint>
9 #include <list> 9 #include <list>
10 #include <memory> 10 #include <memory>
(...skipping 19 matching lines...) Expand all
30 #include "net/quic/core/quic_server_id.h" 30 #include "net/quic/core/quic_server_id.h"
31 #include "net/quic/core/quic_session.h" 31 #include "net/quic/core/quic_session.h"
32 #include "net/quic/core/quic_utils.h" 32 #include "net/quic/core/quic_utils.h"
33 #include "net/quic/test_tools/crypto_test_utils.h" 33 #include "net/quic/test_tools/crypto_test_utils.h"
34 #include "net/quic/test_tools/quic_config_peer.h" 34 #include "net/quic/test_tools/quic_config_peer.h"
35 #include "net/quic/test_tools/quic_connection_peer.h" 35 #include "net/quic/test_tools/quic_connection_peer.h"
36 #include "net/quic/test_tools/quic_flow_controller_peer.h" 36 #include "net/quic/test_tools/quic_flow_controller_peer.h"
37 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" 37 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
38 #include "net/quic/test_tools/quic_session_peer.h" 38 #include "net/quic/test_tools/quic_session_peer.h"
39 #include "net/quic/test_tools/quic_spdy_session_peer.h" 39 #include "net/quic/test_tools/quic_spdy_session_peer.h"
40 #include "net/quic/test_tools/quic_stream_peer.h"
40 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" 41 #include "net/quic/test_tools/quic_stream_sequencer_peer.h"
41 #include "net/quic/test_tools/quic_test_utils.h" 42 #include "net/quic/test_tools/quic_test_utils.h"
42 #include "net/quic/test_tools/reliable_quic_stream_peer.h"
43 #include "net/test/gtest_util.h" 43 #include "net/test/gtest_util.h"
44 #include "net/tools/epoll_server/epoll_server.h" 44 #include "net/tools/epoll_server/epoll_server.h"
45 #include "net/tools/quic/quic_epoll_connection_helper.h" 45 #include "net/tools/quic/quic_epoll_connection_helper.h"
46 #include "net/tools/quic/quic_in_memory_cache.h" 46 #include "net/tools/quic/quic_in_memory_cache.h"
47 #include "net/tools/quic/quic_packet_writer_wrapper.h" 47 #include "net/tools/quic/quic_packet_writer_wrapper.h"
48 #include "net/tools/quic/quic_server.h" 48 #include "net/tools/quic/quic_server.h"
49 #include "net/tools/quic/quic_simple_server_stream.h" 49 #include "net/tools/quic/quic_simple_server_stream.h"
50 #include "net/tools/quic/quic_socket_utils.h" 50 #include "net/tools/quic/quic_socket_utils.h"
51 #include "net/tools/quic/quic_spdy_client_stream.h" 51 #include "net/tools/quic/quic_spdy_client_stream.h"
52 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" 52 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h"
(...skipping 26 matching lines...) Expand all
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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 // Run all end to end tests with all supported versions. 589 // Run all end to end tests with all supported versions.
611 INSTANTIATE_TEST_CASE_P(EndToEndTests, 590 INSTANTIATE_TEST_CASE_P(EndToEndTests,
612 EndToEndTest, 591 EndToEndTest,
613 ::testing::ValuesIn(GetTestParams())); 592 ::testing::ValuesIn(GetTestParams()));
614 593
615 TEST_P(EndToEndTest, HandshakeSuccessful) { 594 TEST_P(EndToEndTest, HandshakeSuccessful) {
616 ASSERT_TRUE(Initialize()); 595 ASSERT_TRUE(Initialize());
617 client_->client()->WaitForCryptoHandshakeConfirmed(); 596 client_->client()->WaitForCryptoHandshakeConfirmed();
618 QuicCryptoStream* crypto_stream = 597 QuicCryptoStream* crypto_stream =
619 QuicSessionPeer::GetCryptoStream(client_->client()->session()); 598 QuicSessionPeer::GetCryptoStream(client_->client()->session());
620 QuicStreamSequencer* sequencer = 599 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(crypto_stream);
621 ReliableQuicStreamPeer::sequencer(crypto_stream); 600 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer,
622 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer &&
623 FLAGS_quic_reduce_sequencer_buffer_memory_life_time,
624 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); 601 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
625 server_thread_->Pause(); 602 server_thread_->Pause();
626 QuicDispatcher* dispatcher = 603 QuicDispatcher* dispatcher =
627 QuicServerPeer::GetDispatcher(server_thread_->server()); 604 QuicServerPeer::GetDispatcher(server_thread_->server());
628 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); 605 QuicSession* server_session = dispatcher->session_map().begin()->second.get();
629 crypto_stream = QuicSessionPeer::GetCryptoStream(server_session); 606 crypto_stream = QuicSessionPeer::GetCryptoStream(server_session);
630 sequencer = ReliableQuicStreamPeer::sequencer(crypto_stream); 607 sequencer = QuicStreamPeer::sequencer(crypto_stream);
631 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer && 608 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer,
632 FLAGS_quic_reduce_sequencer_buffer_memory_life_time,
633 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); 609 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
634 } 610 }
635 611
636 TEST_P(EndToEndTest, SimpleRequestResponse) { 612 TEST_P(EndToEndTest, SimpleRequestResponse) {
637 ASSERT_TRUE(Initialize()); 613 ASSERT_TRUE(Initialize());
638 614
639 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 615 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
640 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); 616 EXPECT_EQ("200", client_->response_headers()->find(":status")->second);
641 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos()); 617 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos());
642 } 618 }
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 1229
1254 // TODO(rch): this test seems to cause net_unittests timeouts :| 1230 // TODO(rch): this test seems to cause net_unittests timeouts :|
1255 TEST_P(EndToEndTest, DISABLED_MultipleTermination) { 1231 TEST_P(EndToEndTest, DISABLED_MultipleTermination) {
1256 ASSERT_TRUE(Initialize()); 1232 ASSERT_TRUE(Initialize());
1257 1233
1258 // Set the offset so we won't frame. Otherwise when we pick up termination 1234 // Set the offset so we won't frame. Otherwise when we pick up termination
1259 // before HTTP framing is complete, we send an error and close the stream, 1235 // before HTTP framing is complete, we send an error and close the stream,
1260 // and the second write is picked up as writing on a closed stream. 1236 // and the second write is picked up as writing on a closed stream.
1261 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); 1237 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
1262 ASSERT_TRUE(stream != nullptr); 1238 ASSERT_TRUE(stream != nullptr);
1263 ReliableQuicStreamPeer::SetStreamBytesWritten(3, stream); 1239 QuicStreamPeer::SetStreamBytesWritten(3, stream);
1264 1240
1265 client_->SendData("bar", true); 1241 client_->SendData("bar", true);
1266 client_->WaitForWriteToFlush(); 1242 client_->WaitForWriteToFlush();
1267 1243
1268 // By default the stream protects itself from writes after terminte is set. 1244 // By default the stream protects itself from writes after terminte is set.
1269 // Override this to test the server handling buggy clients. 1245 // Override this to test the server handling buggy clients.
1270 ReliableQuicStreamPeer::SetWriteSideClosed(false, 1246 QuicStreamPeer::SetWriteSideClosed(false, client_->GetOrCreateStream());
1271 client_->GetOrCreateStream());
1272 1247
1273 EXPECT_QUIC_BUG(client_->SendData("eep", true), "Fin already buffered"); 1248 EXPECT_QUIC_BUG(client_->SendData("eep", true), "Fin already buffered");
1274 } 1249 }
1275 1250
1276 TEST_P(EndToEndTest, Timeout) { 1251 TEST_P(EndToEndTest, Timeout) {
1277 client_config_.SetIdleNetworkTimeout(QuicTime::Delta::FromMicroseconds(500), 1252 client_config_.SetIdleNetworkTimeout(QuicTime::Delta::FromMicroseconds(500),
1278 QuicTime::Delta::FromMicroseconds(500)); 1253 QuicTime::Delta::FromMicroseconds(500));
1279 // Note: we do NOT ASSERT_TRUE: we may time out during initial handshake: 1254 // Note: we do NOT ASSERT_TRUE: we may time out during initial handshake:
1280 // that's enough to validate timeout in this case. 1255 // that's enough to validate timeout in this case.
1281 Initialize(); 1256 Initialize();
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after
2219 ~ServerStreamWithErrorResponseBody() override {} 2194 ~ServerStreamWithErrorResponseBody() override {}
2220 2195
2221 protected: 2196 protected:
2222 void SendErrorResponse() override { 2197 void SendErrorResponse() override {
2223 DVLOG(1) << "Sending error response for stream " << id(); 2198 DVLOG(1) << "Sending error response for stream " << id();
2224 SpdyHeaderBlock headers; 2199 SpdyHeaderBlock headers;
2225 headers[":status"] = "500"; 2200 headers[":status"] = "500";
2226 headers["content-length"] = base::UintToString(response_body_.size()); 2201 headers["content-length"] = base::UintToString(response_body_.size());
2227 // This method must call CloseReadSide to cause the test case, StopReading 2202 // This method must call CloseReadSide to cause the test case, StopReading
2228 // is not sufficient. 2203 // is not sufficient.
2229 ReliableQuicStreamPeer::CloseReadSide(this); 2204 QuicStreamPeer::CloseReadSide(this);
2230 SendHeadersAndBody(std::move(headers), response_body_); 2205 SendHeadersAndBody(std::move(headers), response_body_);
2231 } 2206 }
2232 2207
2233 string response_body_; 2208 string response_body_;
2234 }; 2209 };
2235 2210
2236 class StreamWithErrorFactory : public QuicTestServer::StreamFactory { 2211 class StreamWithErrorFactory : public QuicTestServer::StreamFactory {
2237 public: 2212 public:
2238 explicit StreamWithErrorFactory(string response_body) 2213 explicit StreamWithErrorFactory(string response_body)
2239 : response_body_(std::move(response_body)) {} 2214 : response_body_(std::move(response_body)) {}
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
2519 // Tell the client to not close the stream if it receives an early response. 2494 // Tell the client to not close the stream if it receives an early response.
2520 client_->set_allow_bidirectional_data(true); 2495 client_->set_allow_bidirectional_data(true);
2521 // Send the headers. 2496 // Send the headers.
2522 client_->SendMessage(headers, "", /*fin=*/false); 2497 client_->SendMessage(headers, "", /*fin=*/false);
2523 2498
2524 // Receive the response and let the server close writing. 2499 // Receive the response and let the server close writing.
2525 client_->WaitForInitialResponse(); 2500 client_->WaitForInitialResponse();
2526 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); 2501 EXPECT_EQ("500", client_->response_headers()->find(":status")->second);
2527 2502
2528 // Receive the reset stream from server on early response. 2503 // Receive the reset stream from server on early response.
2529 ReliableQuicStream* stream = 2504 QuicStream* stream =
2530 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1); 2505 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1);
2531 // The stream is reset by server's reset stream. 2506 // The stream is reset by server's reset stream.
2532 EXPECT_EQ(stream, nullptr); 2507 EXPECT_EQ(stream, nullptr);
2533 } 2508 }
2534 2509
2535 TEST_P(EndToEndTest, Trailers) { 2510 TEST_P(EndToEndTest, Trailers) {
2536 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames). 2511 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames).
2537 ASSERT_TRUE(Initialize()); 2512 ASSERT_TRUE(Initialize());
2538 client_->client()->WaitForCryptoHandshakeConfirmed(); 2513 client_->client()->WaitForCryptoHandshakeConfirmed();
2539 2514
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2636 2611
2637 client_->client()->set_response_listener( 2612 client_->client()->set_response_listener(
2638 std::unique_ptr<QuicClientBase::ResponseListener>( 2613 std::unique_ptr<QuicClientBase::ResponseListener>(
2639 new TestResponseListener)); 2614 new TestResponseListener));
2640 2615
2641 DVLOG(1) << "send request for /push_example"; 2616 DVLOG(1) << "send request for /push_example";
2642 EXPECT_EQ(kBody, client_->SendSynchronousRequest( 2617 EXPECT_EQ(kBody, client_->SendSynchronousRequest(
2643 "https://example.com/push_example")); 2618 "https://example.com/push_example"));
2644 QuicHeadersStream* headers_stream = 2619 QuicHeadersStream* headers_stream =
2645 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); 2620 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session());
2646 QuicStreamSequencer* sequencer = 2621 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(headers_stream);
2647 ReliableQuicStreamPeer::sequencer(headers_stream);
2648 // Headers stream's sequencer buffer shouldn't be released because server push 2622 // Headers stream's sequencer buffer shouldn't be released because server push
2649 // hasn't finished yet. 2623 // hasn't finished yet.
2650 EXPECT_TRUE(QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); 2624 EXPECT_TRUE(QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
2651 2625
2652 for (const string& url : push_urls) { 2626 for (const string& url : push_urls) {
2653 DVLOG(1) << "send request for pushed stream on url " << url; 2627 DVLOG(1) << "send request for pushed stream on url " << url;
2654 string expected_body = "This is server push response body for " + url; 2628 string expected_body = "This is server push response body for " + url;
2655 string response_body = client_->SendSynchronousRequest(url); 2629 string response_body = client_->SendSynchronousRequest(url);
2656 DVLOG(1) << "response body " << response_body; 2630 DVLOG(1) << "response body " << response_body;
2657 EXPECT_EQ(expected_body, response_body); 2631 EXPECT_EQ(expected_body, response_body);
2658 } 2632 }
2659 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer && 2633 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer,
2660 FLAGS_quic_reduce_sequencer_buffer_memory_life_time,
2661 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); 2634 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
2662 } 2635 }
2663 2636
2664 TEST_P(EndToEndTestServerPush, ServerPushUnderLimit) { 2637 TEST_P(EndToEndTestServerPush, ServerPushUnderLimit) {
2665 // Tests that sending a request which has 4 push resources will trigger server 2638 // Tests that sending a request which has 4 push resources will trigger server
2666 // to push those 4 resources and client can handle pushed resources and match 2639 // to push those 4 resources and client can handle pushed resources and match
2667 // them with requests later. 2640 // them with requests later.
2668 ASSERT_TRUE(Initialize()); 2641 ASSERT_TRUE(Initialize());
2669 2642
2670 client_->client()->WaitForCryptoHandshakeConfirmed(); 2643 client_->client()->WaitForCryptoHandshakeConfirmed();
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
2953 } 2926 }
2954 } 2927 }
2955 2928
2956 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) { 2929 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) {
2957 // Tests that when client side has no active request and no waiting 2930 // Tests that when client side has no active request and no waiting
2958 // PUSH_PROMISE, its headers stream's sequencer buffer should be released. 2931 // PUSH_PROMISE, its headers stream's sequencer buffer should be released.
2959 ASSERT_TRUE(Initialize()); 2932 ASSERT_TRUE(Initialize());
2960 client_->SendSynchronousRequest("/foo"); 2933 client_->SendSynchronousRequest("/foo");
2961 QuicHeadersStream* headers_stream = 2934 QuicHeadersStream* headers_stream =
2962 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); 2935 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session());
2963 QuicStreamSequencer* sequencer = 2936 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(headers_stream);
2964 ReliableQuicStreamPeer::sequencer(headers_stream); 2937 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer,
2965 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer &&
2966 FLAGS_quic_reduce_sequencer_buffer_memory_life_time,
2967 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); 2938 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
2968 } 2939 }
2969 2940
2970 class EndToEndBufferedPacketsTest : public EndToEndTest { 2941 class EndToEndBufferedPacketsTest : public EndToEndTest {
2971 public: 2942 public:
2972 EndToEndBufferedPacketsTest() : EndToEndTest() {
2973 FLAGS_quic_buffer_packet_till_chlo = true;
2974 }
2975
2976 void CreateClientWithWriter() override { 2943 void CreateClientWithWriter() override {
2977 LOG(ERROR) << "create client with reorder_writer_ "; 2944 LOG(ERROR) << "create client with reorder_writer_ ";
2978 reorder_writer_ = new PacketReorderingWriter(); 2945 reorder_writer_ = new PacketReorderingWriter();
2979 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_)); 2946 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_));
2980 } 2947 }
2981 2948
2982 void SetUp() override { 2949 void SetUp() override {
2983 // Don't initialize client writer in base class. 2950 // Don't initialize client writer in base class.
2984 server_writer_ = new PacketDroppingTestWriter(); 2951 server_writer_ = new PacketDroppingTestWriter();
2985 } 2952 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3023 client_->WaitForResponse(); 2990 client_->WaitForResponse();
3024 EXPECT_EQ(kBarResponseBody, client_->response_body()); 2991 EXPECT_EQ(kBarResponseBody, client_->response_body());
3025 QuicConnectionStats client_stats = 2992 QuicConnectionStats client_stats =
3026 client_->client()->session()->connection()->GetStats(); 2993 client_->client()->session()->connection()->GetStats();
3027 EXPECT_EQ(0u, client_stats.packets_lost); 2994 EXPECT_EQ(0u, client_stats.packets_lost);
3028 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); 2995 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos());
3029 } 2996 }
3030 } // namespace 2997 } // namespace
3031 } // namespace test 2998 } // namespace test
3032 } // namespace net 2999 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/test_tools/reliable_quic_stream_peer.cc ('k') | net/tools/quic/quic_client_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698