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 |