| 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 <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 body->clear(); | 63 body->clear(); |
| 64 body->reserve(length); | 64 body->reserve(length); |
| 65 for (int i = 0; i < length; ++i) { | 65 for (int i = 0; i < length; ++i) { |
| 66 body->append(1, static_cast<char>(32 + i % (126 - 32))); | 66 body->append(1, static_cast<char>(32 + i % (126 - 32))); |
| 67 } | 67 } |
| 68 } | 68 } |
| 69 | 69 |
| 70 // Run all tests with the cross products of all versions | 70 // Run all tests with the cross products of all versions |
| 71 // and all values of FLAGS_pad_quic_handshake_packets. | 71 // and all values of FLAGS_pad_quic_handshake_packets. |
| 72 struct TestParams { | 72 struct TestParams { |
| 73 TestParams(QuicVersion version, | 73 TestParams(const QuicVersionVector& client_supported_versions, |
| 74 const QuicVersionVector& server_supported_versions, |
| 75 QuicVersion negotiated_version, |
| 74 bool use_padding) | 76 bool use_padding) |
| 75 : version(version), | 77 : client_supported_versions(client_supported_versions), |
| 78 server_supported_versions(server_supported_versions), |
| 79 negotiated_version(negotiated_version), |
| 76 use_padding(use_padding) { | 80 use_padding(use_padding) { |
| 77 } | 81 } |
| 78 | 82 |
| 79 QuicVersion version; | 83 QuicVersionVector client_supported_versions; |
| 84 QuicVersionVector server_supported_versions; |
| 85 QuicVersion negotiated_version; |
| 80 bool use_padding; | 86 bool use_padding; |
| 81 }; | 87 }; |
| 82 | 88 |
| 83 // Constructs all the various test permutations. | 89 // Constructs various test permutations. |
| 84 vector<TestParams> GetTestParams() { | 90 vector<TestParams> GetTestParams() { |
| 85 vector<TestParams> params; | 91 vector<TestParams> params; |
| 86 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | 92 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 87 params.push_back(TestParams(kSupportedQuicVersions[i], true)); | 93 |
| 88 params.push_back(TestParams(kSupportedQuicVersions[i], false)); | 94 // Add an entry for server and client supporting all versions. |
| 95 params.push_back(TestParams(all_supported_versions, all_supported_versions, |
| 96 all_supported_versions[0], true)); |
| 97 params.push_back(TestParams(all_supported_versions, all_supported_versions, |
| 98 all_supported_versions[0], false)); |
| 99 |
| 100 // Test client supporting 1 version and server supporting all versions. |
| 101 // Simulate an old client and exercise version downgrade in the server. |
| 102 // No protocol negotiation should occur. Skip the i = 0 case because it |
| 103 // is essentially the same as the default case. |
| 104 for (size_t i = 1; i < all_supported_versions.size(); ++i) { |
| 105 QuicVersionVector client_supported_versions; |
| 106 client_supported_versions.push_back(all_supported_versions[i]); |
| 107 params.push_back(TestParams(client_supported_versions, |
| 108 all_supported_versions, |
| 109 client_supported_versions[0], |
| 110 true)); |
| 111 params.push_back(TestParams(client_supported_versions, |
| 112 all_supported_versions, |
| 113 client_supported_versions[0], |
| 114 false)); |
| 115 } |
| 116 |
| 117 // Test client supporting all versions and server supporting 1 version. |
| 118 // Simulate an old server and exercise version downgrade in the client. |
| 119 // Protocol negotiation should occur. Skip the i = 0 case because it is |
| 120 // essentially the same as the default case. |
| 121 for (size_t i = 1; i < all_supported_versions.size(); ++i) { |
| 122 QuicVersionVector server_supported_versions; |
| 123 server_supported_versions.push_back(all_supported_versions[i]); |
| 124 params.push_back(TestParams(all_supported_versions, |
| 125 server_supported_versions, |
| 126 server_supported_versions[0], |
| 127 true)); |
| 128 params.push_back(TestParams(all_supported_versions, |
| 129 server_supported_versions, |
| 130 server_supported_versions[0], |
| 131 false)); |
| 89 } | 132 } |
| 90 return params; | 133 return params; |
| 91 } | 134 } |
| 92 | 135 |
| 93 class EndToEndTest : public ::testing::TestWithParam<TestParams> { | 136 class EndToEndTest : public ::testing::TestWithParam<TestParams> { |
| 94 protected: | 137 protected: |
| 95 EndToEndTest() | 138 EndToEndTest() |
| 96 : server_hostname_("example.com"), | 139 : server_hostname_("example.com"), |
| 97 server_started_(false), | 140 server_started_(false), |
| 98 strike_register_no_startup_period_(false) { | 141 strike_register_no_startup_period_(false) { |
| 99 net::IPAddressNumber ip; | 142 net::IPAddressNumber ip; |
| 100 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); | 143 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); |
| 101 server_address_ = IPEndPoint(ip, 0); | 144 server_address_ = IPEndPoint(ip, 0); |
| 102 FLAGS_track_retransmission_history = true; | 145 FLAGS_track_retransmission_history = true; |
| 103 client_config_.SetDefaults(); | 146 client_config_.SetDefaults(); |
| 104 server_config_.SetDefaults(); | 147 server_config_.SetDefaults(); |
| 105 | 148 |
| 106 QuicInMemoryCachePeer::ResetForTests(); | 149 QuicInMemoryCachePeer::ResetForTests(); |
| 107 AddToCache("GET", kLargeRequest, "HTTP/1.1", "200", "OK", kFooResponseBody); | 150 AddToCache("GET", kLargeRequest, "HTTP/1.1", "200", "OK", kFooResponseBody); |
| 108 AddToCache("GET", "https://www.google.com/foo", | 151 AddToCache("GET", "https://www.google.com/foo", |
| 109 "HTTP/1.1", "200", "OK", kFooResponseBody); | 152 "HTTP/1.1", "200", "OK", kFooResponseBody); |
| 110 AddToCache("GET", "https://www.google.com/bar", | 153 AddToCache("GET", "https://www.google.com/bar", |
| 111 "HTTP/1.1", "200", "OK", kBarResponseBody); | 154 "HTTP/1.1", "200", "OK", kBarResponseBody); |
| 112 version_ = GetParam().version; | 155 |
| 113 FLAGS_pad_quic_handshake_packets = | 156 client_supported_versions_ = GetParam().client_supported_versions; |
| 114 GetParam().use_padding; | 157 server_supported_versions_ = GetParam().server_supported_versions; |
| 158 negotiated_version_ = GetParam().negotiated_version; |
| 159 FLAGS_pad_quic_handshake_packets = GetParam().use_padding; |
| 160 LOG(INFO) << "server running " << QuicVersionVectorToString( |
| 161 server_supported_versions_); |
| 162 LOG(INFO) << "client running " << QuicVersionVectorToString( |
| 163 client_supported_versions_); |
| 164 LOG(INFO) << "negotiated_version_ " << QuicVersionToString( |
| 165 negotiated_version_); |
| 166 LOG(INFO) << "use_padding " << GetParam().use_padding; |
| 115 } | 167 } |
| 116 | 168 |
| 117 virtual ~EndToEndTest() { | 169 virtual ~EndToEndTest() { |
| 170 // TODO(rtenneti): port RecycleUnusedPort if needed. |
| 171 // RecycleUnusedPort(server_address_.port()); |
| 118 QuicInMemoryCachePeer::ResetForTests(); | 172 QuicInMemoryCachePeer::ResetForTests(); |
| 119 } | 173 } |
| 120 | 174 |
| 121 virtual QuicTestClient* CreateQuicClient(QuicTestWriter* writer) { | 175 virtual QuicTestClient* CreateQuicClient(QuicTestWriter* writer) { |
| 122 QuicTestClient* client = new QuicTestClient(server_address_, | 176 QuicTestClient* client = new QuicTestClient(server_address_, |
| 123 server_hostname_, | 177 server_hostname_, |
| 124 false, // not secure | 178 false, // not secure |
| 125 client_config_, | 179 client_config_, |
| 126 version_); | 180 client_supported_versions_); |
| 127 client->UseWriter(writer); | 181 client->UseWriter(writer); |
| 128 client->Connect(); | 182 client->Connect(); |
| 129 return client; | 183 return client; |
| 130 } | 184 } |
| 131 | 185 |
| 132 virtual bool Initialize() { | 186 virtual bool Initialize() { |
| 133 // Start the server first, because CreateQuicClient() attempts | 187 // Start the server first, because CreateQuicClient() attempts |
| 134 // to connect to the server. | 188 // to connect to the server. |
| 135 StartServer(); | 189 StartServer(); |
| 136 client_.reset(CreateQuicClient(client_writer_)); | 190 client_.reset(CreateQuicClient(client_writer_)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 148 client_writer_ = new PacketDroppingTestWriter(); | 202 client_writer_ = new PacketDroppingTestWriter(); |
| 149 server_writer_ = new PacketDroppingTestWriter(); | 203 server_writer_ = new PacketDroppingTestWriter(); |
| 150 } | 204 } |
| 151 | 205 |
| 152 virtual void TearDown() { | 206 virtual void TearDown() { |
| 153 StopServer(); | 207 StopServer(); |
| 154 } | 208 } |
| 155 | 209 |
| 156 void StartServer() { | 210 void StartServer() { |
| 157 server_thread_.reset(new ServerThread(server_address_, server_config_, | 211 server_thread_.reset(new ServerThread(server_address_, server_config_, |
| 212 server_supported_versions_, |
| 158 strike_register_no_startup_period_)); | 213 strike_register_no_startup_period_)); |
| 159 server_thread_->Start(); | 214 server_thread_->Start(); |
| 160 server_thread_->listening()->Wait(); | 215 server_thread_->listening()->Wait(); |
| 161 server_address_ = IPEndPoint(server_address_.address(), | 216 server_address_ = IPEndPoint(server_address_.address(), |
| 162 server_thread_->GetPort()); | 217 server_thread_->GetPort()); |
| 163 QuicDispatcher* dispatcher = | 218 QuicDispatcher* dispatcher = |
| 164 QuicServerPeer::GetDispatcher(server_thread_->server()); | 219 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 165 server_writer_->SetConnectionHelper( | 220 server_writer_->SetConnectionHelper( |
| 166 QuicDispatcherPeer::GetHelper(dispatcher)); | 221 QuicDispatcherPeer::GetHelper(dispatcher)); |
| 167 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_); | 222 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 | 265 |
| 211 IPEndPoint server_address_; | 266 IPEndPoint server_address_; |
| 212 string server_hostname_; | 267 string server_hostname_; |
| 213 scoped_ptr<ServerThread> server_thread_; | 268 scoped_ptr<ServerThread> server_thread_; |
| 214 scoped_ptr<QuicTestClient> client_; | 269 scoped_ptr<QuicTestClient> client_; |
| 215 PacketDroppingTestWriter* client_writer_; | 270 PacketDroppingTestWriter* client_writer_; |
| 216 PacketDroppingTestWriter* server_writer_; | 271 PacketDroppingTestWriter* server_writer_; |
| 217 bool server_started_; | 272 bool server_started_; |
| 218 QuicConfig client_config_; | 273 QuicConfig client_config_; |
| 219 QuicConfig server_config_; | 274 QuicConfig server_config_; |
| 220 QuicVersion version_; | 275 QuicVersionVector client_supported_versions_; |
| 276 QuicVersionVector server_supported_versions_; |
| 277 QuicVersion negotiated_version_; |
| 221 bool strike_register_no_startup_period_; | 278 bool strike_register_no_startup_period_; |
| 222 }; | 279 }; |
| 223 | 280 |
| 224 // Run all end to end tests with all supported versions. | 281 // Run all end to end tests with all supported versions. |
| 225 INSTANTIATE_TEST_CASE_P(EndToEndTests, | 282 INSTANTIATE_TEST_CASE_P(EndToEndTests, |
| 226 EndToEndTest, | 283 EndToEndTest, |
| 227 ::testing::ValuesIn(GetTestParams())); | 284 ::testing::ValuesIn(GetTestParams())); |
| 228 | 285 |
| 229 TEST_P(EndToEndTest, SimpleRequestResponse) { | 286 TEST_P(EndToEndTest, SimpleRequestResponse) { |
| 230 ASSERT_TRUE(Initialize()); | 287 ASSERT_TRUE(Initialize()); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 ASSERT_TRUE(Initialize()); | 362 ASSERT_TRUE(Initialize()); |
| 306 // Set things up so we have a small payload, to guarantee fragmentation. | 363 // Set things up so we have a small payload, to guarantee fragmentation. |
| 307 // A congestion feedback frame can't be split into multiple packets, make sure | 364 // A congestion feedback frame can't be split into multiple packets, make sure |
| 308 // that our packet have room for at least this amount after the normal headers | 365 // that our packet have room for at least this amount after the normal headers |
| 309 // are added. | 366 // are added. |
| 310 | 367 |
| 311 // TODO(rch) handle this better when we have different encryption options. | 368 // TODO(rch) handle this better when we have different encryption options. |
| 312 const size_t kStreamDataLength = 3; | 369 const size_t kStreamDataLength = 3; |
| 313 const QuicStreamId kStreamId = 1u; | 370 const QuicStreamId kStreamId = 1u; |
| 314 const QuicStreamOffset kStreamOffset = 0u; | 371 const QuicStreamOffset kStreamOffset = 0u; |
| 315 size_t stream_payload_size = | 372 size_t stream_payload_size = QuicFramer::GetMinStreamFrameSize( |
| 316 QuicFramer::GetMinStreamFrameSize( | 373 negotiated_version_, kStreamId, kStreamOffset, true) + kStreamDataLength; |
| 317 version_, kStreamId, kStreamOffset, true) + kStreamDataLength; | |
| 318 size_t min_payload_size = | 374 size_t min_payload_size = |
| 319 std::max(kCongestionFeedbackFrameSize, stream_payload_size); | 375 std::max(kCongestionFeedbackFrameSize, stream_payload_size); |
| 320 bool use_short_hash = version_ >= QUIC_VERSION_11; | |
| 321 size_t ciphertext_size = | 376 size_t ciphertext_size = |
| 322 NullEncrypter(use_short_hash).GetCiphertextSize(min_payload_size); | 377 NullEncrypter(false).GetCiphertextSize(min_payload_size); |
| 323 // TODO(satyashekhar): Fix this when versioning is implemented. | 378 // TODO(satyashekhar): Fix this when versioning is implemented. |
| 324 client_->options()->max_packet_length = | 379 client_->options()->max_packet_length = |
| 325 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 380 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 326 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + | 381 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + |
| 327 ciphertext_size; | 382 ciphertext_size; |
| 328 | 383 |
| 329 // Make sure our request is too large to fit in one packet. | 384 // Make sure our request is too large to fit in one packet. |
| 330 EXPECT_GT(strlen(kLargeRequest), min_payload_size); | 385 EXPECT_GT(strlen(kLargeRequest), min_payload_size); |
| 331 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest)); | 386 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest)); |
| 332 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); | 387 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); |
| 333 } | 388 } |
| 334 | 389 |
| 335 TEST_P(EndToEndTest, MultipleFramesRandomOrder) { | 390 TEST_P(EndToEndTest, MultipleFramesRandomOrder) { |
| 336 ASSERT_TRUE(Initialize()); | 391 ASSERT_TRUE(Initialize()); |
| 337 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 392 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 338 SetReorderPercentage(50); | 393 SetReorderPercentage(50); |
| 339 // Set things up so we have a small payload, to guarantee fragmentation. | 394 // Set things up so we have a small payload, to guarantee fragmentation. |
| 340 // A congestion feedback frame can't be split into multiple packets, make sure | 395 // A congestion feedback frame can't be split into multiple packets, make sure |
| 341 // that our packet have room for at least this amount after the normal headers | 396 // that our packet have room for at least this amount after the normal headers |
| 342 // are added. | 397 // are added. |
| 343 | 398 |
| 344 // TODO(rch) handle this better when we have different encryption options. | 399 // TODO(rch) handle this better when we have different encryption options. |
| 345 const size_t kStreamDataLength = 3; | 400 const size_t kStreamDataLength = 3; |
| 346 const QuicStreamId kStreamId = 1u; | 401 const QuicStreamId kStreamId = 1u; |
| 347 const QuicStreamOffset kStreamOffset = 0u; | 402 const QuicStreamOffset kStreamOffset = 0u; |
| 348 size_t stream_payload_size = | 403 size_t stream_payload_size = QuicFramer::GetMinStreamFrameSize( |
| 349 QuicFramer::GetMinStreamFrameSize( | 404 negotiated_version_, kStreamId, kStreamOffset, true) + kStreamDataLength; |
| 350 version_, kStreamId, kStreamOffset, true) + kStreamDataLength; | |
| 351 size_t min_payload_size = | 405 size_t min_payload_size = |
| 352 std::max(kCongestionFeedbackFrameSize, stream_payload_size); | 406 std::max(kCongestionFeedbackFrameSize, stream_payload_size); |
| 353 bool use_short_hash = version_ >= QUIC_VERSION_11; | |
| 354 size_t ciphertext_size = | 407 size_t ciphertext_size = |
| 355 NullEncrypter(use_short_hash).GetCiphertextSize(min_payload_size); | 408 NullEncrypter(false).GetCiphertextSize(min_payload_size); |
| 356 // TODO(satyashekhar): Fix this when versioning is implemented. | 409 // TODO(satyashekhar): Fix this when versioning is implemented. |
| 357 client_->options()->max_packet_length = | 410 client_->options()->max_packet_length = |
| 358 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 411 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 359 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + | 412 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + |
| 360 ciphertext_size; | 413 ciphertext_size; |
| 361 | 414 |
| 362 // Make sure our request is too large to fit in one packet. | 415 // Make sure our request is too large to fit in one packet. |
| 363 EXPECT_GT(strlen(kLargeRequest), min_payload_size); | 416 EXPECT_GT(strlen(kLargeRequest), min_payload_size); |
| 364 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest)); | 417 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest)); |
| 365 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); | 418 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 client_->SendSynchronousRequest("/bar"); | 750 client_->SendSynchronousRequest("/bar"); |
| 698 | 751 |
| 699 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); | 752 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); |
| 700 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); | 753 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); |
| 701 } | 754 } |
| 702 | 755 |
| 703 } // namespace | 756 } // namespace |
| 704 } // namespace test | 757 } // namespace test |
| 705 } // namespace tools | 758 } // namespace tools |
| 706 } // namespace net | 759 } // namespace net |
| OLD | NEW |