| 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after 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 2486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2958 QuicHeadersStream* headers_stream = | 2937 QuicHeadersStream* headers_stream = |
| 2959 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); | 2938 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); |
| 2960 QuicStreamSequencer* sequencer = | 2939 QuicStreamSequencer* sequencer = |
| 2961 ReliableQuicStreamPeer::sequencer(headers_stream); | 2940 ReliableQuicStreamPeer::sequencer(headers_stream); |
| 2962 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, | 2941 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, |
| 2963 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 2942 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 2964 } | 2943 } |
| 2965 | 2944 |
| 2966 class EndToEndBufferedPacketsTest : public EndToEndTest { | 2945 class EndToEndBufferedPacketsTest : public EndToEndTest { |
| 2967 public: | 2946 public: |
| 2968 EndToEndBufferedPacketsTest() : EndToEndTest() { | |
| 2969 FLAGS_quic_buffer_packet_till_chlo = true; | |
| 2970 } | |
| 2971 | |
| 2972 void CreateClientWithWriter() override { | 2947 void CreateClientWithWriter() override { |
| 2973 LOG(ERROR) << "create client with reorder_writer_ "; | 2948 LOG(ERROR) << "create client with reorder_writer_ "; |
| 2974 reorder_writer_ = new PacketReorderingWriter(); | 2949 reorder_writer_ = new PacketReorderingWriter(); |
| 2975 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_)); | 2950 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_)); |
| 2976 } | 2951 } |
| 2977 | 2952 |
| 2978 void SetUp() override { | 2953 void SetUp() override { |
| 2979 // Don't initialize client writer in base class. | 2954 // Don't initialize client writer in base class. |
| 2980 server_writer_ = new PacketDroppingTestWriter(); | 2955 server_writer_ = new PacketDroppingTestWriter(); |
| 2981 } | 2956 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3019 client_->WaitForResponse(); | 2994 client_->WaitForResponse(); |
| 3020 EXPECT_EQ(kBarResponseBody, client_->response_body()); | 2995 EXPECT_EQ(kBarResponseBody, client_->response_body()); |
| 3021 QuicConnectionStats client_stats = | 2996 QuicConnectionStats client_stats = |
| 3022 client_->client()->session()->connection()->GetStats(); | 2997 client_->client()->session()->connection()->GetStats(); |
| 3023 EXPECT_EQ(0u, client_stats.packets_lost); | 2998 EXPECT_EQ(0u, client_stats.packets_lost); |
| 3024 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); | 2999 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); |
| 3025 } | 3000 } |
| 3026 } // namespace | 3001 } // namespace |
| 3027 } // namespace test | 3002 } // namespace test |
| 3028 } // namespace net | 3003 } // namespace net |
| OLD | NEW |