| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |